diff --git a/Makefile b/Makefile index 13244ecbd..5c4e326b3 100644 --- a/Makefile +++ b/Makefile @@ -29,8 +29,10 @@ COMPARE ?= 0 TEST ?= 0 # Enables -fanalyzer C flag to analyze in depth potential UBs ANALYZE ?= 0 -# Count unused warnings as errors. Used by RH-Hideout's repo +# Count unused warnings as errors. Used by cawtds's repo UNUSED_ERROR ?= 0 +# Count deprecated warnings as errors. Used by cawtds's repo +DEPRECATED_ERROR ?= 0 # Adds -Og and -g flags, which optimize the build for debugging and include debug info respectively DEBUG ?= 0 # Adds -flto flag, which increases link time but results in a more efficient binary (especially in audio processing) @@ -177,6 +179,13 @@ ifeq ($(UNUSED_ERROR),0) override CFLAGS += -Wno-error=unused-variable -Wno-error=unused-const-variable -Wno-error=unused-parameter -Wno-error=unused-function -Wno-error=unused-but-set-parameter -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=unused-local-typedefs endif endif + +ifeq ($(DEPRECATED_ERROR),0) + ifneq ($(GITHUB_REPOSITORY_OWNER),cawtds) + override CFLAGS += -Wno-error=deprecated-declarations + endif +endif + LIBPATH := -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_ARMCC) -mthumb -print-file-name=libc.a))" LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall # Enable debug info if set @@ -225,7 +234,9 @@ endif LEARNSET_HELPERS_DIR := $(TOOLS_DIR)/learnset_helpers LEARNSET_HELPERS_DATA_DIR := $(LEARNSET_HELPERS_DIR)/porymoves_files LEARNSET_HELPERS_BUILD_DIR := $(LEARNSET_HELPERS_DIR)/build -ALL_LEARNABLES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_learnables.json +ALL_LEARNABLES_JSON := $(DATA_SRC_SUBDIR)/pokemon/all_learnables.json +ALL_TUTORS_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_tutors.json +ALL_TEACHING_TYPES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_teaching_types.json # wild_encounters.h is generated by a Python script WILD_ENCOUNTERS_TOOL_DIR := $(TOOLS_DIR)/wild_encounters @@ -240,10 +251,6 @@ $(DATA_SRC_SUBDIR)/wild_encounters.h: $(DATA_SRC_SUBDIR)/wild_encounters.json $( $(INCLUDE_DIRS)/constants/script_commands.h: $(MISC_TOOL_DIR)/make_scr_cmd_constants.py $(DATA_ASM_SUBDIR)/script_cmd_table.inc python3 $(MISC_TOOL_DIR)/make_scr_cmd_constants.py -$(C_BUILDDIR)/wild_encounter.o: c_dep += $(DATA_SRC_SUBDIR)/wild_encounters.h -$(C_BUILDDIR)/trainer_see.o: c_dep += $(INCLUDE_DIRS)/constants/script_commands.h -$(C_BUILDDIR)/vs_seeker.o: c_dep += $(INCLUDE_DIRS)/constants/script_commands.h - PERL := perl SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c @@ -256,7 +263,7 @@ MAKEFLAGS += --no-print-directory # Delete files that weren't built properly .DELETE_ON_ERROR: -RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck tidyrelease generated clean-generated +RULES_NO_SCAN += libagbsyscall clean clean-assets tidy tidymodern tidycheck tidyrelease generated clean-generated clean-teachables clean-teachables_intermediates .PHONY: all rom agbcc modern compare check debug release .PHONY: $(RULES_NO_SCAN) @@ -429,11 +436,19 @@ generated: $(AUTO_GEN_TARGETS) %.smol: % ; $(SMOL) -w $< $@ %.rl: % ; $(GFX) $< $@ -clean-generated: +clean-teachables_intermediates: + rm -f $(DATA_SRC_SUBDIR)/tutor_moves.h + rm -f $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h + @rm -Rf $(LEARNSET_HELPERS_BUILD_DIR) + @echo "rm -Rf " + +clean-generated: clean-teachables_intermediates @rm -f $(AUTO_GEN_TARGETS) @echo "rm -f " - @rm -f $(ALL_LEARNABLES_JSON) - @echo "rm -f " + +clean-teachables: clean-teachables_intermediates + rm -f $(ALL_LEARNABLES_JSON) + @touch $(C_SUBDIR)/pokemon.c $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast $(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member @@ -449,6 +464,7 @@ $(TEST_BUILDDIR)/%.o: CFLAGS := -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mt # Dependency rules (for the *.c & *.s sources to .o files) # Have to be explicit or else missing files won't be reported. +$(C_BUILDDIR)/pokemon.o: $(C_SUBDIR)/pokemon.c $(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h # As a side effect, they're evaluated immediately instead of when the rule is invoked. # It doesn't look like $(shell) can be deferred so there might not be a better way (Icedude_907: there is soon). @@ -468,6 +484,7 @@ $(C_BUILDDIR)/%.d: $(C_SUBDIR)/%.c $(SCANINC) -M $@ $(INCLUDE_SCANINC_ARGS) -I tools/agbcc/include $< ifneq ($(NODEP),1) +-include $(ALL_TUTORS_JSON), $(ALL_TEACHING_TYPES_JSON), -include $(addprefix $(OBJ_DIR)/,$(C_SRCS:.c=.d)) endif @@ -523,16 +540,25 @@ $(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) $(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt $(RAMSCRGEN) ewram_data $< ENGLISH > $@ -TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(shell find data/ -type f -name '*.inc') $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(C_SUBDIR)/pokemon.c +TEACHABLE_DEPS := $(ALL_LEARNABLES_JSON) $(INCLUDE_DIRS)/constants/tms_hms.h $(INCLUDE_DIRS)/config/pokemon.h $(DATA_SRC_SUBDIR)/pokemon/special_movesets.json $(INCLUDE_DIRS)/config/pokedex_plus_hgss.h $(LEARNSET_HELPERS_DIR)/make_teachables.py $(LEARNSET_HELPERS_BUILD_DIR): @mkdir -p $@ -$(ALL_LEARNABLES_JSON): $(wildcard $(LEARNSET_HELPERS_DATA_DIR)/*.json) | $(LEARNSET_HELPERS_BUILD_DIR) +$(ALL_LEARNABLES_JSON): | $(wildcard $(LEARNSET_HELPERS_DATA_DIR)/*.json) python3 $(LEARNSET_HELPERS_DIR)/make_learnables.py $(LEARNSET_HELPERS_DATA_DIR) $@ -$(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) - python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $< +$(ALL_TUTORS_JSON): $(shell find data/ -type f -name '*.inc') $(LEARNSET_HELPERS_DIR)/make_tutors.py | $(LEARNSET_HELPERS_BUILD_DIR) + python3 $(LEARNSET_HELPERS_DIR)/make_tutors.py $@ + +$(ALL_TEACHING_TYPES_JSON): $(wildcard $(DATA_SRC_SUBDIR)/pokemon/species_info/*_families.h) $(LEARNSET_HELPERS_DIR)/make_teaching_types.py | $(LEARNSET_HELPERS_BUILD_DIR) + python3 $(LEARNSET_HELPERS_DIR)/make_teaching_types.py $@ + +$(DATA_SRC_SUBDIR)/pokemon/teachable_learnsets.h: $(TEACHABLE_DEPS) | $(ALL_TUTORS_JSON) $(ALL_TEACHING_TYPES_JSON) + python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $(LEARNSET_HELPERS_BUILD_DIR) + +$(DATA_SRC_SUBDIR)/tutor_moves.h: | $(ALL_TUTORS_JSON) + python3 $(LEARNSET_HELPERS_DIR)/make_teachables.py $(LEARNSET_HELPERS_BUILD_DIR) # Linker script LD_SCRIPT := ld_script_modern.ld diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 45d262bbe..b368c9bd4 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1,76 +1,77 @@ @ commands .macro attackcanceler - .byte 0x0 + .byte B_SCR_OP_ATTACKCANCELER .endm - .macro accuracycheck failInstr:req, move:req - .byte 0x1 + .macro accuracycheck failInstr:req + .byte B_SCR_OP_ACCURACYCHECK .4byte \failInstr - .2byte \move .endm .macro printattackstring - .byte 0x2 + .byte B_SCR_OP_PRINTATTACKSTRING .endm - .macro unused_0x3 - .byte 0x3 + .macro printselectionstringfromtable ptr:req + .byte B_SCR_OP_PRINTSELECTIONSTRINGFROMTABLE + .4byte \ptr .endm .macro critcalc - .byte 0x4 + .warning "critcalc macro has been deprecated, please remove from scripts" + .byte B_SCR_OP_CRITCALC .endm .macro damagecalc - .byte 0x5 + .byte B_SCR_OP_DAMAGECALC .endm .macro typecalc - .byte 0x6 + .byte B_SCR_OP_TYPECALC .endm .macro adjustdamage - .byte 0x7 + .byte B_SCR_OP_ADJUSTDAMAGE .endm .macro multihitresultmessage - .byte 0x8 + .byte B_SCR_OP_MULTIHITRESULTMESSAGE .endm .macro attackanimation - .byte 0x9 + .byte B_SCR_OP_ATTACKANIMATION .endm .macro waitanimation - .byte 0xa + .byte B_SCR_OP_WAITANIMATION .endm .macro healthbarupdate battler:req updateState:req - .byte 0xb + .byte B_SCR_OP_HEALTHBARUPDATE .byte \battler .byte \updateState .endm .macro datahpupdate battler:req updateState:req - .byte 0xc + .byte B_SCR_OP_DATAHPUPDATE .byte \battler .byte \updateState .endm .macro critmessage - .byte 0xd + .byte B_SCR_OP_CRITMESSAGE .endm .macro effectivenesssound - .byte 0xe + .byte B_SCR_OP_EFFECTIVENESSSOUND .endm .macro resultmessage - .byte 0xf + .byte B_SCR_OP_RESULTMESSAGE .endm .macro printstring id:req - .byte 0x10 + .byte B_SCR_OP_PRINTSTRING .2byte \id .endm @@ -79,36 +80,33 @@ .endm .macro printselectionstring id:req - .byte 0x11 + .byte B_SCR_OP_PRINTSELECTIONSTRING .2byte \id .endm .macro waitmessage time:req - .byte 0x12 + .byte B_SCR_OP_WAITMESSAGE .2byte \time .endm .macro printfromtable ptr:req - .byte 0x13 + .byte B_SCR_OP_PRINTFROMTABLE .4byte \ptr .endm - .macro printselectionstringfromtable ptr:req - .byte 0x14 - .4byte \ptr + .macro setpreattackadditionaleffect + .byte B_SCR_OP_SETPREATTACKADDITIONALEFFECT .endm .macro setadditionaleffects - 1: - .byte 0x15 - jumpifhalfword CMP_EQUAL, sMOVE_EFFECT, MOVE_EFFECT_CONTINUE, 1b + .byte B_SCR_OP_SETADDITIONALEFFECTS .endm .macro seteffectprimary battler:req, effectBattler:req, moveEffect=0 .if \moveEffect != 0 setmoveeffect \moveEffect .endif - .byte 0x16 + .byte B_SCR_OP_SETEFFECTPRIMARY .byte \battler .byte \effectBattler .endm @@ -117,71 +115,71 @@ .if \moveEffect != 0 setmoveeffect \moveEffect .endif - .byte 0x17 + .byte B_SCR_OP_SETEFFECTSECONDARY .byte \battler .byte \effectBattler .endm .macro clearvolatile battler:req, volatile:req - .byte 0x18 + .byte B_SCR_OP_CLEARVOLATILE .byte \battler .byte \volatile .endm .macro tryfaintmon battler:req - .byte 0x19 + .byte B_SCR_OP_TRYFAINTMON .byte \battler .byte FALSE .4byte NULL .endm .macro tryfaintmon_spikes battler:req, instr:req - .byte 0x19 + .byte B_SCR_OP_TRYFAINTMON .byte \battler .byte TRUE .4byte \instr .endm .macro dofaintanimation battler:req - .byte 0x1a + .byte B_SCR_OP_DOFAINTANIMATION .byte \battler .endm .macro cleareffectsonfaint battler:req - .byte 0x1b + .byte B_SCR_OP_CLEAREFFECTSONFAINT .byte \battler .endm .macro jumpifstatus battler:req, flags:req, jumpInstr:req - .byte 0x1c + .byte B_SCR_OP_JUMPIFSTATUS .byte \battler .4byte \flags .4byte \jumpInstr .endm .macro jumpifvolatile battler:req, volatile:req, jumpInstr:req - .byte 0x1d + .byte B_SCR_OP_JUMPIFVOLATILE .byte \battler .byte \volatile .4byte \jumpInstr .endm .macro jumpifability battler:req, ability:req, jumpInstr:req - .byte 0x1e + .byte B_SCR_OP_JUMPIFABILITY .byte \battler .2byte \ability .4byte \jumpInstr .endm .macro jumpifsideaffecting battler:req, flags:req, jumpInstr:req - .byte 0x1f + .byte B_SCR_OP_JUMPIFSIDEAFFECTING .byte \battler .4byte \flags .4byte \jumpInstr .endm .macro jumpifstat battler:req, comparison:req, stat:req, value:req, jumpInstr:req - .byte 0x20 + .byte B_SCR_OP_JUMPIFSTAT .byte \battler .byte \comparison .byte \stat @@ -190,7 +188,7 @@ .endm .macro jumpifstatignorecontrary battler:req, comparison:req, stat:req, value:req, jumpInstr:req - .byte 0x21 + .byte B_SCR_OP_JUMPIFSTATIGNORECONTRARY .byte \battler .byte \comparison .byte \stat @@ -199,7 +197,7 @@ .endm .macro jumpbasedontype battler:req, type:req, jumpIfType:req, jumpInstr:req - .byte 0x22 + .byte B_SCR_OP_JUMPBASEDONTYPE .byte \battler .byte \type .byte \jumpIfType @@ -215,36 +213,36 @@ .endm .macro getexp battler:req - .byte 0x23 + .byte B_SCR_OP_GETEXP .byte \battler .endm .macro checkteamslost jumpInstr:req - .byte 0x24 + .byte B_SCR_OP_CHECKTEAMSLOST .4byte \jumpInstr .endm .macro movevaluescleanup - .byte 0x25 + .byte B_SCR_OP_MOVEVALUESCLEANUP .endm .macro setmultihit value:req - .byte 0x26 + .byte B_SCR_OP_SETMULTIHIT .byte \value .endm .macro decrementmultihit loopInstr:req - .byte 0x27 + .byte B_SCR_OP_DECREMENTMULTIHIT .4byte \loopInstr .endm .macro goto instr:req - .byte 0x28 + .byte B_SCR_OP_GOTO .4byte \instr .endm .macro jumpifbyte comparison:req, bytePtr:req, value:req, jumpInstr:req - .byte 0x29 + .byte B_SCR_OP_JUMPIFBYTE .byte \comparison .4byte \bytePtr .byte \value @@ -252,7 +250,7 @@ .endm .macro jumpifhalfword comparison:req, halfwordPtr:req, value:req, jumpInstr:req - .byte 0x2a + .byte B_SCR_OP_JUMPIFHALFWORD .byte \comparison .4byte \halfwordPtr .2byte \value @@ -260,7 +258,7 @@ .endm .macro jumpifword comparison:req, wordPtr:req, value:req, jumpInstr:req - .byte 0x2b + .byte B_SCR_OP_JUMPIFWORD .byte \comparison .4byte \wordPtr .4byte \value @@ -268,7 +266,7 @@ .endm .macro jumpifarrayequal array1:req, array2:req, size:req, jumpInstr:req - .byte 0x2c + .byte B_SCR_OP_JUMPIFARRAYEQUAL .4byte \array1 .4byte \array2 .byte \size @@ -276,7 +274,7 @@ .endm .macro jumpifarraynotequal array1:req, array2:req, size:req, jumpInstr:req - .byte 0x2d + .byte B_SCR_OP_JUMPIFARRAYNOTEQUAL .4byte \array1 .4byte \array2 .byte \size @@ -284,32 +282,32 @@ .endm .macro setbyte bytePtr:req, value:req - .byte 0x2e + .byte B_SCR_OP_SETBYTE .4byte \bytePtr .byte \value .endm .macro addbyte bytePtr:req, value:req - .byte 0x2f + .byte B_SCR_OP_ADDBYTE .4byte \bytePtr .byte \value .endm .macro subbyte bytePtr:req, value:req - .byte 0x30 + .byte B_SCR_OP_SUBBYTE .4byte \bytePtr .byte \value .endm .macro copyarray dest:req, src:req, size:req - .byte 0x31 + .byte B_SCR_OP_COPYARRAY .4byte \dest .4byte \src .byte \size .endm .macro copyarraywithindex dest:req, src:req, indexPtr:req, size:req - .byte 0x32 + .byte B_SCR_OP_COPYARRAYWITHINDEX .4byte \dest .4byte \src .4byte \indexPtr @@ -317,120 +315,121 @@ .endm .macro orbyte bytePtr:req, value:req - .byte 0x33 + .byte B_SCR_OP_ORBYTE .4byte \bytePtr .byte \value .endm .macro orhalfword halfwordPtr:req, value:req - .byte 0x34 + .byte B_SCR_OP_ORHALFWORD .4byte \halfwordPtr .2byte \value .endm .macro orword wordPtr:req, value:req - .byte 0x35 + .byte B_SCR_OP_ORWORD .4byte \wordPtr .4byte \value .endm .macro bicbyte bytePtr:req, value:req - .byte 0x36 + .byte B_SCR_OP_BICBYTE .4byte \bytePtr .byte \value .endm .macro bichalfword halfwordPtr:req, value:req - .byte 0x37 + .byte B_SCR_OP_BICHALFWORD .4byte \halfwordPtr .2byte \value .endm .macro bicword wordPtr:req, value:req - .byte 0x38 + .byte B_SCR_OP_BICWORD .4byte \wordPtr .4byte \value .endm .macro pause frames:req - .byte 0x39 + .byte B_SCR_OP_PAUSE .2byte \frames .endm .macro setchargingturn - .byte 0x40 + .byte B_SCR_OP_SETCHARGINGTURN .endm .macro waitstate - .byte 0x3a + .byte B_SCR_OP_WAITSTATE .endm .macro isdmgblockedbydisguise - .byte 0x3b + .byte B_SCR_OP_ISDMGBLOCKEDBYDISGUISE .endm .macro return - .byte 0x3c + .byte B_SCR_OP_RETURN .endm .macro end - .byte 0x3d + .byte B_SCR_OP_END .endm .macro end2 - .byte 0x3e + .byte B_SCR_OP_END2 .endm .macro end3 - .byte 0x3f + .byte B_SCR_OP_END3 .endm .macro call instr:req - .byte 0x41 + .byte B_SCR_OP_CALL .4byte \instr .endm .macro setroost - .byte 0x42 + .byte B_SCR_OP_SETROOST .endm .macro jumpifabilitypresent ability:req, jumpInstr:req - .byte 0x43 + .byte B_SCR_OP_JUMPIFABILITYPRESENT .2byte \ability .4byte \jumpInstr .endm .macro endselectionscript - .byte 0x44 + .byte B_SCR_OP_ENDSELECTIONSCRIPT .endm .macro playanimation battler:req, animId:req, argPtr=NULL - .byte 0x45 + .byte B_SCR_OP_PLAYANIMATION .byte \battler .byte \animId .4byte \argPtr .endm .macro playanimation_var battler:req, animIdPtr:req, argPtr=NULL - .byte 0x46 + .byte B_SCR_OP_PLAYANIMATION_VAR .byte \battler .4byte \animIdPtr .4byte \argPtr .endm .macro jumpfifsemiinvulnerable battler:req, state:req, jumpInstr:req - .byte 0x47 + .byte B_SCR_OP_JUMPFIFSEMIINVULNERABLE .byte \battler .byte \state .4byte \jumpInstr .endm - .macro unused_0x48 - .byte 0x48 + .macro trainerslidein position:req + .byte B_SCR_OP_TRAINERSLIDEIN + .byte \position .endm .macro moveend endMode:req, endState:req - .byte 0x49 + .byte B_SCR_OP_MOVEEND .byte \endMode .byte \endState .endm @@ -468,141 +467,140 @@ .endm .macro sethealblock failInstr:req - .byte 0x4a + .byte B_SCR_OP_SETHEALBLOCK .4byte \failInstr .endm .macro returnatktoball - .byte 0x4b + .byte B_SCR_OP_RETURNATKTOBALL .endm .macro getswitchedmondata battler:req - .byte 0x4c + .byte B_SCR_OP_GETSWITCHEDMONDATA .byte \battler .endm .macro switchindataupdate battler:req - .byte 0x4d + .byte B_SCR_OP_SWITCHINDATAUPDATE .byte \battler .endm .macro switchinanim battler:req, dontClearTransform:req, dontClearSubstitute:req - .byte 0x4e + .byte B_SCR_OP_SWITCHINANIM .byte \battler .byte \dontClearTransform .byte \dontClearSubstitute .endm .macro jumpifcantswitch battler:req, jumpInstr:req - .byte 0x4f + .byte B_SCR_OP_JUMPIFCANTSWITCH .byte \battler .4byte \jumpInstr .endm .macro openpartyscreen battler:req, failInstr:req - .byte 0x50 + .byte B_SCR_OP_OPENPARTYSCREEN .byte \battler .4byte \failInstr .endm .macro switchhandleorder battler:req, state:req - .byte 0x51 + .byte B_SCR_OP_SWITCHHANDLEORDER .byte \battler .byte \state .endm .macro switchineffects battler:req - .byte 0x52 + .byte B_SCR_OP_SWITCHINEFFECTS .byte \battler .endm - .macro trainerslidein position:req - .byte 0x53 - .byte \position + .macro switchinevents + .byte B_SCR_OP_SWITCHINEVENTS .endm .macro playse song:req - .byte 0x54 + .byte B_SCR_OP_PLAYSE .2byte \song .endm .macro fanfare song:req - .byte 0x55 + .byte B_SCR_OP_FANFARE .2byte \song .endm .macro playfaintcry battler:req - .byte 0x56 + .byte B_SCR_OP_PLAYFAINTCRY .byte \battler .endm .macro endlinkbattle - .byte 0x57 + .byte B_SCR_OP_ENDLINKBATTLE .endm .macro returntoball battler:req, changingForm:req - .byte 0x58 + .byte B_SCR_OP_RETURNTOBALL .byte \battler .byte \changingForm .endm .macro handlelearnnewmove learnedMoveInstr:req, nothingToLearnInstr:req, isFirstMove:req - .byte 0x59 + .byte B_SCR_OP_HANDLELEARNNEWMOVE .4byte \learnedMoveInstr .4byte \nothingToLearnInstr .byte \isFirstMove .endm .macro yesnoboxlearnmove forgotMoveInstr:req - .byte 0x5a + .byte B_SCR_OP_YESNOBOXLEARNMOVE .4byte \forgotMoveInstr .endm .macro yesnoboxstoplearningmove noInstr:req - .byte 0x5b + .byte B_SCR_OP_YESNOBOXSTOPLEARNINGMOVE .4byte \noInstr .endm .macro hitanimation battler:req - .byte 0x5c + .byte B_SCR_OP_HITANIMATION .byte \battler .endm .macro getmoneyreward - .byte 0x5d + .byte B_SCR_OP_GETMONEYREWARD .endm .macro updatebattlermoves battler:req - .byte 0x5e + .byte B_SCR_OP_UPDATEBATTLERMOVES .byte \battler .endm .macro swapattackerwithtarget - .byte 0x5f + .byte B_SCR_OP_SWAPATTACKERWITHTARGET .endm .macro incrementgamestat stat:req - .byte 0x60 + .byte B_SCR_OP_INCREMENTGAMESTAT .byte \stat .endm .macro drawpartystatussummary battler:req - .byte 0x61 + .byte B_SCR_OP_DRAWPARTYSTATUSSUMMARY .byte \battler .endm .macro hidepartystatussummary battler:req - .byte 0x62 + .byte B_SCR_OP_HIDEPARTYSTATUSSUMMARY .byte \battler .endm .macro jumptocalledmove notChosenMove:req - .byte 0x63 + .byte B_SCR_OP_JUMPTOCALLEDMOVE .byte \notChosenMove .endm .macro statusanimation battler:req, status=0, isVolatile=FALSE - .byte 0x64 + .byte B_SCR_OP_STATUSANIMATION .byte \battler .4byte \status .byte \isVolatile @@ -612,150 +610,158 @@ statusanimation \battler, \volatile, TRUE .endm + .macro futuresighttargetfailure failInstr:req + .byte B_SCR_OP_FUTURESIGHTTARGETFAILURE + .4byte \failInstr + .endm + + .macro getpossiblenexttarget jumpInstr:req + .byte B_SCR_OP_GETPOSSIBLENEXTTARGET + .4byte \jumpInstr + .endm + .macro yesnobox - .byte 0x67 + .byte B_SCR_OP_YESNOBOX .endm .macro cancelallactions - .byte 0x68 + .byte B_SCR_OP_CANCELALLACTIONS .endm .macro setgravity failInstr:req - .byte 0x69 + .byte B_SCR_OP_SETGRAVITY .4byte \failInstr .endm .macro removeitem battler:req - .byte 0x6a + .byte B_SCR_OP_REMOVEITEM .byte \battler .endm .macro atknameinbuff1 - .byte 0x6b + .byte B_SCR_OP_ATKNAMEINBUFF1 .endm .macro drawlvlupbox - .byte 0x6c + .byte B_SCR_OP_DRAWLVLUPBOX .endm .macro resetsentmonsvalue - .byte 0x6d + .byte B_SCR_OP_RESETSENTMONSVALUE .endm .macro setatktoplayer0 - .byte 0x6e + .byte B_SCR_OP_SETATKTOPLAYER0 .endm .macro makevisible battler:req - .byte 0x6f + .byte B_SCR_OP_MAKEVISIBLE .byte \battler .endm .macro recordability battler:req - .byte 0x70 + .byte B_SCR_OP_RECORDABILITY .byte \battler .endm .macro buffermovetolearn - .byte 0x71 + .byte B_SCR_OP_BUFFERMOVETOLEARN .endm .macro jumpifplayerran jumpInstr:req - .byte 0x72 + .byte B_SCR_OP_JUMPIFPLAYERRAN .4byte \jumpInstr .endm .macro hpthresholds battler:req - .byte 0x73 + .byte B_SCR_OP_HPTHRESHOLDS .byte \battler .endm .macro hpthresholds2 battler:req - .byte 0x74 + .byte B_SCR_OP_HPTHRESHOLDS2 .byte \battler .endm .macro useitemonopponent - .byte 0x75 + .byte B_SCR_OP_USEITEMONOPPONENT .endm .macro unused_0x78 - .byte 0x76 + .byte B_SCR_OP_UNUSED_0X78 .endm .macro setprotectlike - .byte 0x77 + .byte B_SCR_OP_SETPROTECTLIKE .endm .macro tryexplosion - .byte 0x78 + .byte B_SCR_OP_TRYEXPLOSION .endm .macro setatkhptozero - .byte 0x79 + .byte B_SCR_OP_SETATKHPTOZERO .endm .macro jumpifnexttargetvalid jumpInstr:req - .byte 0x7a + .byte B_SCR_OP_JUMPIFNEXTTARGETVALID .4byte \jumpInstr .endm .macro tryhealhalfhealth battler:req, failInstr:req - .byte 0x7b + .byte B_SCR_OP_TRYHEALHALFHEALTH .byte \battler .4byte \failInstr .endm .macro trymirrormove - .byte 0x7c + .byte B_SCR_OP_UNUSED_0X7E .endm - .macro setfieldweather weather:req - .byte 0x7d - .byte \weather + .macro setfieldweather + .byte B_SCR_OP_SETFIELDWEATHER .endm .macro setreflect - .byte 0x7e + .byte B_SCR_OP_SETREFLECT .endm .macro setseeded - .byte 0x7f + .byte B_SCR_OP_SETSEEDED .endm .macro manipulatedamage mode:req - .byte 0x80 + .byte B_SCR_OP_MANIPULATEDAMAGE .byte \mode .endm .macro trysetrest - .byte 0x81 + .byte B_SCR_OP_TRYSETREST .endm .macro unused_0x82 - .byte 0x82 + .byte B_SCR_OP_UNUSED_0X82 .endm .macro unused_0x83 - .byte 0x83 + .byte B_SCR_OP_UNUSED_0X83 .endm .macro jumpifuproarwakes jumpInstr:req - .byte 0x84 + .byte B_SCR_OP_JUMPIFUPROARWAKES .4byte \jumpInstr .endm - .macro stockpile id:req - .byte 0x85 - .byte \id + .macro stockpile + .byte B_SCR_OP_STOCKPILE .endm .macro stockpiletobasedamage - .byte 0x86 + .byte B_SCR_OP_STOCKPILETOBASEDAMAGE .endm .macro stockpiletohpheal failInstr:req - .byte 0x87 + .byte B_SCR_OP_STOCKPILETOHPHEAL .4byte \failInstr .endm @@ -764,11 +770,11 @@ .endm .macro unused_0x88 - .byte 0x88 + .byte B_SCR_OP_UNUSED_0X88 .endm .macro statbuffchange battler:req, flags:req, failInstr:req, stats=0 - .byte 0x89 + .byte B_SCR_OP_STATBUFFCHANGE .byte \battler .2byte \flags .4byte \failInstr @@ -776,15 +782,15 @@ .endm .macro normalisebuffs - .byte 0x8a + .byte B_SCR_OP_NORMALISEBUFFS .endm .macro setbide - .byte 0x8b + .byte B_SCR_OP_SETBIDE .endm .macro twoturnmoveschargestringandanimation - .byte 0x8c + .byte B_SCR_OP_TWOTURNMOVESCHARGESTRINGANDANIMATION .4byte 1f @animation then attack string @default - attack string then animation printsavedstring @@ -801,265 +807,263 @@ .endm .macro trynonvolatilestatus - .byte 0x8d + .byte B_SCR_OP_TRYNONVOLATILESTATUS .endm .macro initmultihitstring - .byte 0x8e + .byte B_SCR_OP_INITMULTIHITSTRING .endm .macro forcerandomswitch failInstr:req - .byte 0x8f + .byte B_SCR_OP_FORCERANDOMSWITCH .4byte \failInstr .endm .macro tryconversiontypechange failInstr:req - .byte 0x90 + .byte B_SCR_OP_TRYCONVERSIONTYPECHANGE .4byte \failInstr .endm .macro givepaydaymoney - .byte 0x91 + .byte B_SCR_OP_GIVEPAYDAYMONEY .endm .macro setlightscreen - .byte 0x92 + .byte B_SCR_OP_SETLIGHTSCREEN .endm .macro tryKO failInstr:req - .byte 0x93 + .byte B_SCR_OP_TRYKO .4byte \failInstr .endm .macro checknonvolatiletrigger nonVolatile:req, failInstr:req - .byte 0x94 + .byte B_SCR_OP_CHECKNONVOLATILETRIGGER .2byte \nonVolatile .4byte \failInstr .endm .macro copybidedmg - .byte 0x95 + .byte B_SCR_OP_COPYBIDEDMG .endm .macro animatewildpokemonafterfailedpokeball battler:req - .byte 0x96 + .byte B_SCR_OP_ANIMATEWILDPOKEMONAFTERFAILEDPOKEBALL .byte \battler .endm .macro tryinfatuating failInstr:req - .byte 0x97 + .byte B_SCR_OP_TRYINFATUATING .4byte \failInstr .endm .macro updatestatusicon battler:req - .byte 0x98 + .byte B_SCR_OP_UPDATESTATUSICON .byte \battler .endm .macro setmist - .byte 0x99 + .byte B_SCR_OP_SETMIST .endm .macro setfocusenergy battler:req - .byte 0x9a + .byte B_SCR_OP_SETFOCUSENERGY .byte \battler .endm .macro transformdataexecution - .byte 0x9b + .byte B_SCR_OP_TRANSFORMDATAEXECUTION .endm .macro setsubstitute - .byte 0x9c + .byte B_SCR_OP_SETSUBSTITUTE .endm .macro mimicattackcopy failInstr:req - .byte 0x9d + .byte B_SCR_OP_MIMICATTACKCOPY .4byte \failInstr .endm .macro setcalledmove - .byte 0x9e + .byte B_SCR_OP_SETCALLEDMOVE .endm .macro unused_0x9f - .byte 0x9f + .byte B_SCR_OP_UNUSED_0X9F .endm .macro unused_0xA0 - .byte 0xa0 + .byte B_SCR_OP_UNUSED_0XA0 .endm - .macro counterdamagecalculator failInstr:req - .byte 0xa1 - .4byte \failInstr + .macro unused_0xA1 + .byte B_SCR_OP_UNUSED_0XA1 .endm - .macro mirrorcoatdamagecalculator failInstr:req - .byte 0xa2 - .4byte \failInstr + .macro unused_0xA2 + .byte B_SCR_OP_UNUSED_0XA2 .endm .macro disablelastusedattack failInstr:req - .byte 0xa3 + .byte B_SCR_OP_DISABLELASTUSEDATTACK .4byte \failInstr .endm .macro trysetencore failInstr:req - .byte 0xa4 + .byte B_SCR_OP_TRYSETENCORE .4byte \failInstr .endm .macro painsplitdmgcalc failInstr:req - .byte 0xa5 + .byte B_SCR_OP_PAINSPLITDMGCALC .4byte \failInstr .endm .macro settypetorandomresistance failInstr:req - .byte 0xa6 + .byte B_SCR_OP_SETTYPETORANDOMRESISTANCE .4byte \failInstr .endm .macro setalwayshitflag - .byte 0xa7 + .byte B_SCR_OP_SETALWAYSHITFLAG .endm .macro copymovepermanently failInstr:req - .byte 0xa8 + .byte B_SCR_OP_COPYMOVEPERMANENTLY .4byte \failInstr .endm .macro trychoosesleeptalkmove failInstr:req - .byte 0xa9 + .byte B_SCR_OP_UNUSED_0XA9 .4byte \failInstr .endm .macro trysetdestinybond failInstr:req - .byte 0xaa + .byte B_SCR_OP_UNUSED_AA .4byte \failInstr .endm .macro unused_0xab - .byte 0xab + .byte B_SCR_OP_UNUSED_0XAB .endm .macro settailwind failInstr:req - .byte 0xac + .byte B_SCR_OP_SETTAILWIND .4byte \failInstr .endm .macro tryspiteppreduce failInstr:req - .byte 0xad + .byte B_SCR_OP_TRYSPITEPPREDUCE .4byte \failInstr .endm .macro healpartystatus - .byte 0xae + .byte B_SCR_OP_HEALPARTYSTATUS .endm .macro cursetarget failInstr:req - .byte 0xaf + .byte B_SCR_OP_CURSETARGET .4byte \failInstr .endm .macro trysetspikes failInstr:req - .byte 0xb0 + .byte B_SCR_OP_TRYSETSPIKES .4byte \failInstr .endm .macro setvolatile battler:req, volatile:req, value=TRUE - .byte 0xb1 + .byte B_SCR_OP_SETVOLATILE .byte \battler .byte \volatile .byte \value .endm .macro trysetperishsong failInstr:req - .byte 0xb2 + .byte B_SCR_OP_TRYSETPERISHSONG .4byte \failInstr .endm - .macro handlerollout - .byte 0xb3 + .macro unused_0xb3 + .byte B_SCR_OP_UNUSED_0XB3 .endm .macro jumpifconfusedandstatmaxed stat:req, jumpInstr:req - .byte 0xb4 + .byte B_SCR_OP_JUMPIFCONFUSEDANDSTATMAXED .byte \stat .4byte \jumpInstr .endm - .macro handlefurycutter - .byte 0xb5 + .macro unused_0xb5 + .byte B_SCR_OP_UNUSED_0XB5 .endm .macro setembargo failInstr:req - .byte 0xb6 + .byte B_SCR_OP_SETEMBARGO .4byte \failInstr .endm .macro presentdamagecalculation - .byte 0xb7 + .byte B_SCR_OP_PRESENTDAMAGECALCULATION .endm .macro setsafeguard - .byte 0xb8 + .byte B_SCR_OP_SETSAFEGUARD .endm .macro magnitudedamagecalculation - .byte 0xb9 + .byte B_SCR_OP_MAGNITUDEDAMAGECALCULATION .endm .macro jumpifnopursuitswitchdmg jumpInstr:req - .byte 0xba + .byte B_SCR_OP_JUMPIFNOPURSUITSWITCHDMG .4byte \jumpInstr .endm .macro tryactivateitem battler:req, flag:req - .byte 0xbb + .byte B_SCR_OP_TRYACTIVATEITEM .byte \battler .byte \flag .endm .macro halvehp failInstr:req - .byte 0xbc + .byte B_SCR_OP_HALVEHP .4byte \failInstr .endm .macro copyfoestats - .byte 0xbd + .byte B_SCR_OP_COPYFOESTATS .endm .macro rapidspinfree - .byte 0xbe + .byte B_SCR_OP_RAPIDSPINFREE .endm .macro recoverbasedonsunlight failInstr:req - .byte 0xc0 + .byte B_SCR_OP_RECOVERBASEDONSUNLIGHT .4byte \failInstr .endm .macro setstickyweb failInstr:req - .byte 0xc1 + .byte B_SCR_OP_SETSTICKYWEB .4byte \failInstr .endm .macro selectfirstvalidtarget - .byte 0xc2 + .byte B_SCR_OP_SELECTFIRSTVALIDTARGET .endm .macro setfutureattack - .byte 0xc3 + .byte B_SCR_OP_SETFUTUREATTACK .endm .macro trydobeatup endInstr:req, failInstr:req - .byte 0xc4 + .byte B_SCR_OP_TRYDOBEATUP .4byte \endInstr .4byte \failInstr .endm .macro setsemiinvulnerablebit clear=FALSE - .byte 0xc5 + .byte B_SCR_OP_SETSEMIINVULNERABLEBIT .byte \clear .endm @@ -1067,289 +1071,276 @@ setsemiinvulnerablebit TRUE .endm - .macro tryfiretwoturnmovenowbyeffect battler:req, checkChargeTurnEffects:req, jumpInstr:req - .byte 0xc6 - .byte \battler - .byte \checkChargeTurnEffects - .4byte \jumpInstr - .endm - - .macro tryfiretwoturnmovewithoutcharging battler:req, jumpInstr:req - tryfiretwoturnmovenowbyeffect \battler, TRUE, \jumpInstr - .endm - - .macro tryfiretwoturnmoveaftercharging battler:req, jumpInstr:req - tryfiretwoturnmovenowbyeffect \battler, FALSE, \jumpInstr + .macro unused_0xC6 + .byte B_SCR_OP_UNUSED_0XC6 .endm .macro unused_0xC7 - .byte 0xc7 + .byte B_SCR_OP_UNUSED_0XC7 .endm .macro unused_c8 - .byte 0xc8 + .byte B_SCR_OP_UNUSED_C8 .endm .macro trymemento failInstr:req - .byte 0xc9 + .byte B_SCR_OP_TRYMEMENTO .4byte \failInstr .endm .macro setforcedtarget - .byte 0xca + .byte B_SCR_OP_SETFORCEDTARGET .endm - .macro setcharge battler:req - .byte 0xcb + .macro unused_0xcb battler:req + .byte B_SCR_OP_UNUSED_0XCB .byte \battler .endm - .macro callenvironmentattack - .byte 0xcc + .macro unused_0xCC + .byte B_SCR_OP_UNUSED_0XCC .endm .macro curestatuswithmove failInstr:req - .byte 0xcd + .byte B_SCR_OP_CURESTATUSWITHMOVE .4byte \failInstr .endm .macro settorment failInstr:req - .byte 0xce + .byte B_SCR_OP_SETTORMENT .4byte \failInstr .endm - .macro jumpifnodamage jumpInstr:req - .byte 0xcf - .4byte \jumpInstr + .macro unused_0xcf + .byte B_SCR_OP_UNUSED_0XCF .endm .macro settaunt failInstr:req - .byte 0xd0 + .byte B_SCR_OP_SETTAUNT .4byte \failInstr .endm .macro trysethelpinghand failInstr:req - .byte 0xd1 + .byte B_SCR_OP_TRYSETHELPINGHAND .4byte \failInstr .endm .macro tryswapitems failInstr:req - .byte 0xd2 + .byte B_SCR_OP_TRYSWAPITEMS .4byte \failInstr .endm .macro trycopyability battler:req, failInstr:req - .byte 0xd3 + .byte B_SCR_OP_TRYCOPYABILITY .byte \battler .4byte \failInstr .endm .macro trywish failInstr:req - .byte 0xd4 + .byte B_SCR_OP_TRYWISH .4byte \failInstr .endm .macro settoxicspikes failInstr:req - .byte 0xd5 + .byte B_SCR_OP_SETTOXICSPIKES .4byte \failInstr .endm .macro setgastroacid failInstr:req - .byte 0xd6 + .byte B_SCR_OP_SETGASTROACID .4byte \failInstr .endm .macro setyawn failInstr:req - .byte 0xd7 + .byte B_SCR_OP_SETYAWN .4byte \failInstr .endm - .macro setdamagetohealthdifference failInstr:req - .byte 0xd8 - .4byte \failInstr + .macro Cmd_unused0xd8 + .byte B_SCR_OP_UNUSED0XD8 .endm .macro setroom - .byte 0xd9 + .byte B_SCR_OP_SETROOM .endm .macro tryswapabilities failInstr:req - .byte 0xda + .byte B_SCR_OP_TRYSWAPABILITIES .4byte \failInstr .endm .macro tryimprison failInstr:req - .byte 0xdb + .byte B_SCR_OP_TRYIMPRISON .4byte \failInstr .endm .macro setstealthrock failInstr:req - .byte 0xdc + .byte B_SCR_OP_SETSTEALTHROCK .4byte \failInstr .endm .macro trysetvolatile battler:req, _volatile:req, failInstr:req - .byte 0xdd + .byte B_SCR_OP_TRYSETVOLATILE .byte \battler .byte \_volatile .4byte \failInstr .endm .macro assistattackselect failInstr:req - .byte 0xde + .byte B_SCR_OP_UNUSED_0XDE .4byte \failInstr .endm .macro trysetmagiccoat failInstr:req - .byte 0xdf + .byte B_SCR_OP_TRYSETMAGICCOAT .4byte \failInstr .endm .macro trysetsnatch failInstr:req - .byte 0xe0 + .byte B_SCR_OP_TRYSETSNATCH .4byte \failInstr .endm .macro unused2 ptr:req - .byte 0xe1 + .byte B_SCR_OP_UNUSED2 .4byte \ptr .endm .macro switchoutabilities battler:req - .byte 0xe2 + .byte B_SCR_OP_SWITCHOUTABILITIES .byte \battler .endm .macro jumpifhasnohp battler:req, jumpInstr:req - .byte 0xe3 + .byte B_SCR_OP_JUMPIFHASNOHP .byte \battler .4byte \jumpInstr .endm .macro unused_0xE4 - .byte 0xe4 + .byte B_SCR_OP_UNUSED_0XE4 .endm .macro pickup - .byte 0xe5 + .byte B_SCR_OP_PICKUP .endm .macro unused_0xE6 - .byte 0xe6 + .byte B_SCR_OP_UNUSED_0XE6 .endm .macro unused_0xE7 - .byte 0xe7 + .byte B_SCR_OP_UNUSED_0XE7 .endm .macro settypebasedhalvers failInstr:req - .byte 0xe8 + .byte B_SCR_OP_SETTYPEBASEDHALVERS .4byte \failInstr .endm .macro jumpifsubstituteblocks jumpInstr:req - .byte 0xe9 + .byte B_SCR_OP_JUMPIFSUBSTITUTEBLOCKS .4byte \jumpInstr .endm .macro tryrecycleitem failInstr:req - .byte 0xea + .byte B_SCR_OP_TRYRECYCLEITEM .4byte \failInstr .endm .macro settypetoenvironment failInstr:req - .byte 0xeb + .byte B_SCR_OP_SETTYPETOENVIRONMENT .4byte \failInstr .endm .macro pursuitdoubles failInstr:req - .byte 0xec + .byte B_SCR_OP_PURSUITDOUBLES .4byte \failInstr .endm .macro snatchsetbattlers - .byte 0xed + .byte B_SCR_OP_SNATCHSETBATTLERS .endm - .macro removescreens - .byte 0xee + .macro unused_0xee + .byte B_SCR_OP_UNUSED_0XEE .endm .macro handleballthrow - .byte 0xef + .byte B_SCR_OP_HANDLEBALLTHROW .endm .macro givecaughtmon passInstr:req - .byte 0xf0 + .byte B_SCR_OP_GIVECAUGHTMON .4byte \passInstr .endm .macro trysetcaughtmondexflags failInstr:req - .byte 0xf1 + .byte B_SCR_OP_TRYSETCAUGHTMONDEXFLAGS .4byte \failInstr .endm .macro displaydexinfo - .byte 0xf2 + .byte B_SCR_OP_DISPLAYDEXINFO .endm .macro trygivecaughtmonnick - .byte 0xf3 + .byte B_SCR_OP_TRYGIVECAUGHTMONNICK .endm - .macro unused_0xf4 - .byte 0xf4 + .macro sortbattlers + .byte B_SCR_OP_SORTBATTLERS .endm .macro removeattackerstatus1 - .byte 0xf5 + .byte B_SCR_OP_REMOVEATTACKERSTATUS1 .endm .macro finishaction - .byte 0xf6 + .byte B_SCR_OP_FINISHACTION .endm .macro finishturn - .byte 0xf7 + .byte B_SCR_OP_FINISHTURN .endm .macro trainerslideout position:req - .byte 0xf8 + .byte B_SCR_OP_TRAINERSLIDEOUT .byte \position .endm .macro settelekinesis failInstr:req - .byte 0xf9 + .byte B_SCR_OP_SETTELEKINESIS .4byte \failInstr .endm .macro swapstatstages stat:req - .byte 0xfa + .byte B_SCR_OP_SWAPSTATSTAGES .byte \stat .endm .macro averagestats stat:req - .byte 0xfb + .byte B_SCR_OP_AVERAGESTATS .byte \stat .endm .macro jumpifcaptivateaffected jumpInstr:req - .byte 0xfc + .byte B_SCR_OP_JUMPIFCAPTIVATEAFFECTED .4byte \jumpInstr .endm .macro setnonvolatilestatus trigger:req - .byte 0xfd + .byte B_SCR_OP_SETNONVOLATILESTATUS .byte \trigger .endm .macro tryoverwriteability failInstr:req - .byte 0xfe + .byte B_SCR_OP_TRYOVERWRITEABILITY .4byte \failInstr .endm .macro callnative func:req - .byte 0xff + .byte B_SCR_OP_CALLNATIVE .4byte \func .endm @@ -1373,11 +1364,6 @@ callnative BS_JumpIfIntimidateAbilityPrevented .endm - .macro metalburstdamagecalculator failInstr:req - callnative BS_CalcMetalBurstDmg - .4byte \failInstr - .endm - .macro allyswitchswapbattlers callnative BS_AllySwitchSwapBattler .endm @@ -1405,9 +1391,10 @@ .4byte \restoreBattlerInstr .endm - .macro itemcurestatus jumpInstr:req + .macro itemcurestatus jumpInstr:req, restoreBattlerInstr:req callnative BS_ItemCureStatus .4byte \jumpInstr + .4byte \restoreBattlerInstr .endm .macro itemincreasestat @@ -1460,9 +1447,8 @@ .4byte \ptr .endm - .macro jumpifcantloseitem battler:req, ptr:req + .macro jumpifcantloseitem ptr:req callnative BS_JumpIfCantLoseItem - .byte \battler .4byte \ptr .endm @@ -1490,13 +1476,6 @@ .4byte \jumpInstr .endm - .macro jumpifelectricabilityaffected battler:req, ability:req, jumpInstr:req - callnative BS_JumpIfElectricAbilityAffected - .byte \battler - .2byte \ability - .4byte \jumpInstr - .endm - .macro setterrain failInstr:req callnative BS_SetTerrain .4byte \failInstr @@ -1667,14 +1646,14 @@ .4byte \failInstr .endm - .macro jumpifteainvulnerable battler:req, jumpInstr:req - callnative BS_TeatimeInvul + .macro jumpifnoberry battler:req, jumpInstr:req + callnative BS_JumpIfNoBerry .byte \battler .4byte \jumpInstr .endm - .macro jumpifteanoberry failInstr:req - callnative BS_TeatimeTargets + .macro checkteatimetargets failInstr:req + callnative BS_CheckTeaTimeTargets .4byte \failInstr .endm @@ -1732,10 +1711,6 @@ callnative BS_WaitFanfare .endm - .macro setbeakblast - callnative BS_SetBeakBlast - .endm - .macro cantarshotwork failInstr:req callnative BS_CanTarShotWork .4byte \failInstr @@ -1745,11 +1720,6 @@ callnative BS_RemoveTerrain .endm - .macro tryspectralthiefsteal jumpInstr:req - callnative BS_TrySpectralThiefSteal - .4byte \jumpInstr - .endm - .macro spectralthiefprintstats callnative BS_SpectralThiefPrintStats .endm @@ -1774,8 +1744,8 @@ .4byte \failInstr .endm - .macro jumpifcriticalhit failInstr:req - callnative BS_JumpIfCriticalHit + .macro jumpifnotcriticalhit failInstr:req + callnative BS_JumpIfNotCriticalHit .4byte \failInstr .endm @@ -1809,7 +1779,6 @@ .macro setmoveeffect effect:req sethword sMOVE_EFFECT, \effect - sethword sSAVED_MOVE_EFFECT, \effect .endm .macro sethword dst:req, value:req @@ -1877,10 +1846,6 @@ manipulatedamage DMG_1_8_TARGET_HP .endm - .macro dmgtomaxattackerhp - manipulatedamage DMG_FULL_ATTACKER_HP - .endm - .macro jumpifflowerveil jumpInstr:req jumpifnottype BS_TARGET, TYPE_GRASS, 1f jumpifability BS_TARGET_SIDE, ABILITY_FLOWER_VEIL, \jumpInstr @@ -1893,8 +1858,8 @@ 1: .endm - .macro jumpifabilitycantbesuppressed battler:req, jumpInstr:req - callnative BS_JumpIfAbilityCantBeSuppressed + .macro jumpifabilitycantbereactivated battler:req, jumpInstr:req + callnative BS_JumpIfAbilityCantBeReactivated .byte \battler .4byte \jumpInstr .endm @@ -1904,11 +1869,6 @@ .byte \battler .endm - .macro trysynchronoise jumpInstr:req - callnative BS_TrySynchronoise - .4byte \jumpInstr - .endm - .macro jumpifroarfails jumpInstr:req callnative BS_JumpIfRoarFails .4byte \jumpInstr @@ -1973,11 +1933,6 @@ .byte \battler .endm - .macro setspriteignore0hp ignore0HP:req - callnative BS_SetSpriteIgnore0Hp - .byte \ignore0HP - .endm - .macro updatenick callnative BS_UpdateNick .endm @@ -2123,12 +2078,14 @@ callnative BS_InstantHpDrop .endm - .macro clearstatus + .macro clearstatus battler:req callnative BS_ClearStatus + .byte \battler .endm - .macro restoremovepp + .macro restoremovepp battler:req callnative BS_RestoreMovePp + .byte \battler .endm .macro tryactivatereceiver battler:req @@ -2329,11 +2286,6 @@ .4byte \failInstr .endm - .macro jumpifnotrototilleraffected jumpInstr:req - callnative BS_JumpIfNotRototillerAffected - .4byte \jumpInstr - .endm - .macro consumeberry battler:req, fromBattler:req callnative BS_ConsumeBerry .byte \battler @@ -2376,11 +2328,6 @@ callnative BS_TryResetNegativeStatStages .endm - .macro jumpiflastuseditemberry jumpInstr:req - callnative BS_JumpIfLastUsedItemBerry - .4byte \jumpInstr - .endm - .macro savebattleritem callnative BS_SaveBattlerItem .endm @@ -2473,3 +2420,9 @@ .byte \gen .4byte \jumpInstr .endm + + .macro tryactivateabilitywithabilityshield battler:req, switchedItems=FALSE + callnative BS_TryActivateAbilityWithAbilityShield + .byte \battler + .byte \switchedItems + .endm diff --git a/constants/constants.inc b/constants/constants.inc index 1f8f1cda2..e7561f429 100644 --- a/constants/constants.inc +++ b/constants/constants.inc @@ -1,3 +1,2 @@ .include "constants/gba_constants.inc" .include "constants/global.inc" - .include "constants/tms_hms.inc" diff --git a/constants/tms_hms.inc b/constants/tms_hms.inc deleted file mode 100644 index 4ce6d9032..000000000 --- a/constants/tms_hms.inc +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef GUARD_CONSTANTS_TMS_HMS_INC -#define GUARD_CONSTANTS_TMS_HMS_INC - -#include "constants/tms_hms.h" - -/* Expands to: -* enum_start ITEM_TM01 -* enum ITEM_TM_FOCUS_PUNCH -* ... -* enum_start ITEM_HM01 -* enum ITEM_HM_CUT -* ... */ -#define EQUIV_TM(id) enum ITEM_TM_ ## id; -#define EQUIV_HM(id) enum ITEM_HM_ ## id; - enum_start ITEM_TM01 -FOREACH_TM(EQUIV_TM) - enum_start ITEM_HM01 -FOREACH_HM(EQUIV_HM) -#undef EQUIV_TM -#undef EQUIV_HM - -#endif @ GUARD_CONSTANTS_TMS_HMS_INC diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e45c00ac2..2d79c8aac 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -29344,6 +29344,16 @@ gBattleAnimGeneral_Swamp:: blendoff end +gBattleAnimGeneral_SwapToSubstitute:: + createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, FALSE + waitforvisualfinish + end + +gBattleAnimGeneral_SwapFromSubstitute:: + createvisualtask AnimTask_SwapMonSpriteToFromSubstitute, 2, TRUE + waitforvisualfinish + end + SnatchMoveTrySwapFromSubstitute: createvisualtask AnimTask_IsAttackerBehindSubstitute, 2 jumprettrue SnatchMoveSwapSubstituteForMon diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 091f7f30a..0c03e2e3b 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -4,6 +4,7 @@ #include "constants/battle.h" #include "constants/pokemon.h" @#include "constants/battle_arena.h" +#include "constants/battle_move_resolution.h" #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" #include "constants/battle_string_ids.h" @@ -66,14 +67,14 @@ BattleScript_LeftoverBirchString:: BattleScript_EffectFickleBeam:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause ficklebeamdamagecalculation - goto BattleScript_HitFromCritCalc + goto BattleScript_HitFromDamageCalc BattleScript_FickleBeamDoubled:: pause B_WAIT_TIME_SHORTEST printstring STRINGID_FICKLEBEAMDOUBLED waitmessage B_WAIT_TIME_LONG - goto BattleScript_HitFromCritCalc + goto BattleScript_HitFromDamageCalc BattleScript_Terastallization:: @ TODO: no string prints in S/V, but right now this helps with clarity @@ -122,7 +123,7 @@ BattleScript_LowerAtkSpAtkEnd: BattleScript_EffectSpicyExtract:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_DEF, MIN_STAT_STAGE, BattleScript_SpicyExtract_CheckShouldSkipAttackAnim goto BattleScript_ButItFailed @@ -166,11 +167,6 @@ BattleScript_EffectTidyUpDoMoveAnimation:: restoretarget goto BattleScript_EffectDragonDanceFromStatUp -BattleScript_EffectUpperHand:: - attackcanceler - tryupperhand BattleScript_ButItFailed - goto BattleScript_HitFromAccCheck - BattleScript_EffectShedTail:: attackcanceler waitstate @@ -187,7 +183,12 @@ BattleScript_EffectShedTail:: waitmessage B_WAIT_TIME_LONG moveendto MOVEEND_ATTACKER_VISIBLE moveendfrom MOVEEND_TARGET_VISIBLE - goto BattleScript_MoveSwitchOpenPartyScreen + call BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim + switchinanim BS_ATTACKER, FALSE, TRUE + waitstate + switchineffects BS_ATTACKER + switchinevents + end BattleScript_EffectPsychicNoise:: printstring STRINGID_PKMNPREVENTEDFROMHEALING @@ -248,12 +249,6 @@ BattleScript_EffectDoodleMoveEnd: restoreattacker goto BattleScript_MoveEnd -BattleScript_EffectGlaiveRush:: - call BattleScript_EffectHit_Ret - jumpifmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE, BattleScript_TryFaintMon - setvolatile BS_ATTACKER, VOLATILE_GLAIVE_RUSH, 2 - goto BattleScript_TryFaintMon - BattleScript_SyrupBombActivates:: printstring STRINGID_TARGETCOVEREDINSTICKYCANDYSYRUP waitmessage B_WAIT_TIME_LONG @@ -269,49 +264,6 @@ BattleScript_SyrupBombEndTurn:: BattleScript_SyrupBombTurnDmgEnd: end2 -BattleScript_EffectChillyReception:: - printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE - waitmessage B_WAIT_TIME_LONG - attackcanceler - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalSun - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_EffectChillyReceptionBlockedByPrimalRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_EffectChillyReceptionBlockedByStrongWinds - call BattleScript_EffectChillyReceptionPlayAnimation - #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL - setfieldweather BATTLE_WEATHER_HAIL - #else - setfieldweather BATTLE_WEATHER_SNOW - #endif - call BattleScript_MoveWeatherChangeRet - goto BattleScript_MoveSwitch -BattleScript_EffectChillyReceptionPlayAnimation: - attackanimation - waitanimation - return -BattleScript_EffectChillyReceptionBlockedByPrimalSun: - call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed - call BattleScript_ExtremelyHarshSunlightWasNotLessenedRet - goto BattleScript_MoveSwitch -BattleScript_EffectChillyReceptionBlockedByPrimalRain: - call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed - call BattleScript_NoReliefFromHeavyRainRet - goto BattleScript_MoveSwitch -BattleScript_EffectChillyReceptionBlockedByStrongWinds: - call BattleScript_EffectChillyReceptionTrySwitchWeatherFailed - call BattleScript_MysteriousAirCurrentBlowsOnRet - goto BattleScript_MoveSwitch -BattleScript_EffectChillyReceptionTrySwitchWeatherFailed: - jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed - jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed - call BattleScript_EffectChillyReceptionPlayAnimation - return - -BattleScript_CheckPrimalWeather: - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn - return - BattleScript_MoveSwitchPursuitEnd: call BattleScript_MoveSwitchPursuitRet end @@ -324,17 +276,26 @@ BattleScript_MoveSwitchPursuitRet: jumpifnopursuitswitchdmg BattleScript_MoveSwitchOpenPartyScreen return -BattleScript_MoveSwitch: +BattleScript_MoveSwitch:: jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_MoveSwitchEnd jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_MoveSwitchEnd printstring STRINGID_PKMNWENTBACK waitmessage B_WAIT_TIME_SHORT BattleScript_MoveSwitchOpenPartyScreen:: - openpartyscreen BS_ATTACKER, BattleScript_MoveSwitchEnd - switchoutabilities BS_ATTACKER + call BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim + switchinanim BS_ATTACKER, FALSE, FALSE + waitstate + switchineffects BS_ATTACKER + switchinevents +BattleScript_MoveSwitchEnd: + end + +BattleScript_MoveSwitchOpenPartyScreenReturnWithNoAnim: + openpartyscreen BS_ATTACKER, BattleScript_MoveSwitchEnd waitstate - switchhandleorder BS_ATTACKER, 2 returntoball BS_ATTACKER, FALSE + switchoutabilities BS_ATTACKER + switchhandleorder BS_ATTACKER, 2 getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -342,11 +303,7 @@ BattleScript_MoveSwitchOpenPartyScreen:: printstring STRINGID_EMPTYSTRING3 waitmessage 1 printstring STRINGID_SWITCHINMON - switchinanim BS_ATTACKER, FALSE, TRUE - waitstate - switchineffects BS_ATTACKER -BattleScript_MoveSwitchEnd: - end + return BattleScript_EffectPledge:: attackcanceler @@ -411,7 +368,6 @@ BattleScript_EffectHit_Pledge:: printstring STRINGID_THETWOMOVESBECOMEONE waitmessage B_WAIT_TIME_LONG call BattleScript_EffectHit_RetFromAccCheck - tryfaintmon BS_TARGET return BattleScript_MoveEffectSaltCure:: @@ -432,9 +388,9 @@ BattleScript_SaltCureExtraDamage:: BattleScript_EffectCorrosiveGas:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifsubstituteblocks BattleScript_CorrosiveGasFail - jumpifcantloseitem BS_TARGET, BattleScript_CorrosiveGasFail + jumpifcantloseitem BattleScript_CorrosiveGasFail attackanimation waitanimation jumpifability BS_TARGET, ABILITY_STICKY_HOLD, BattleScript_StickyHoldActivates @@ -480,6 +436,7 @@ BattleScript_EffectRevivalBlessingSendOut: switchinanim BS_SCRIPTING, FALSE, FALSE waitstate switchineffects BS_SCRIPTING + switchinevents goto BattleScript_MoveEnd BattleScript_StealthRockActivates:: @@ -494,107 +451,24 @@ BattleScript_SpikesActivates:: waitmessage B_WAIT_TIME_LONG return -BattleScript_EffectAttackUpUserAlly:: - jumpifnoally BS_ATTACKER, BattleScript_EffectAttackUp - attackcanceler - jumpifstat BS_ATTACKER, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_EffectAttackUpUserAlly_Works - jumpifstat BS_ATTACKER_PARTNER, CMP_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_ButItFailed -BattleScript_EffectAttackUpUserAlly_Works: - attackanimation - waitanimation - setstatchanger STAT_ATK, 1, FALSE - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_TryAlly - printfromtable gStatUpStringIds - waitmessage B_WAIT_TIME_LONG -BattleScript_EffectAttackUpUserAlly_TryAlly: - setallytonexttarget BattleScript_EffectAttackUpUserAlly_TryAlly_ -BattleScript_EffectAttackUpUserAlly_End: - goto BattleScript_MoveEnd -BattleScript_EffectAttackUpUserAlly_TryAlly_: - jumpifblockedbysoundproof BS_ATTACKER_PARTNER, BattleScript_EffectAttackUpUserAlly_TryAllyBlocked - setstatchanger STAT_ATK, 1, FALSE - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectAttackUpUserAlly_End - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectAttackUpUserAlly_AllyString - pause B_WAIT_TIME_SHORTEST - printstring STRINGID_TARGETSTATWONTGOHIGHER - waitmessage B_WAIT_TIME_LONG - goto BattleScript_EffectAttackUpUserAlly_End -BattleScript_EffectAttackUpUserAlly_AllyString: - printfromtable gStatUpStringIds - waitmessage B_WAIT_TIME_LONG - goto BattleScript_EffectAttackUpUserAlly_End - -BattleScript_EffectAttackUpUserAlly_TryAllyBlocked: - copybyte sBATTLER, gBattlerTarget - call BattleScript_AbilityPopUpTarget - printstring STRINGID_PKMNSXBLOCKSY2 - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - BattleScript_EffectTeatime:: attackcanceler - jumpifteanoberry BattleScript_ButItFailed -@ at least one battler is affected + checkteatimetargets BattleScript_ButItFailed attackanimation waitanimation - setbyte gBattlerTarget, 0 -BattleScript_TeatimeLoop: - jumpifelectricabilityaffected BS_TARGET, ABILITY_LIGHTNING_ROD, BattleScript_Teatimerod - jumpifelectricabilityaffected BS_TARGET, ABILITY_VOLT_ABSORB, BattleScript_Teatimesorb - jumpifelectricabilityaffected BS_TARGET, ABILITY_MOTOR_DRIVE, BattleScript_Teatimemotor - jumpifteainvulnerable BS_TARGET, BattleScript_Teatimevul @ in semi-invulnerable state OR held item is not a Berry - setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries - consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems + movevaluescleanup + goto BattleScript_EffectTeatimeGetTarget +BattleScript_EffectTeatimeNextTarget: + jumpifnoberry BS_TARGET, BattleScript_EffectTeatimeGetTarget + setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries + consumeberry BS_TARGET, TRUE @ consume the berry, then restore the item from changedItems setbyte sBERRY_OVERRIDE, FALSE removeitem BS_TARGET - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd -BattleScript_Teatimevul: - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd -BattleScript_Teatimesorb: - call BattleScript_AbilityPopUpTarget - tryhealquarterhealth BS_TARGET, BattleScript_Teatimesorb_end - healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE - datahpupdate BS_TARGET, PASSIVE_HP_UPDATE - printstring STRINGID_PKMNREGAINEDHEALTH - waitmessage B_WAIT_TIME_LONG -BattleScript_Teatimesorb_end: - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd -BattleScript_Teatimerod: - call BattleScript_AbilityPopUpTarget - setstatchanger STAT_SPATK, 1, FALSE - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer - printfromtable gStatUpStringIds - waitmessage B_WAIT_TIME_LONG - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd -BattleScript_Teatimemotor: - call BattleScript_AbilityPopUpTarget - setstatchanger STAT_SPEED, 1, FALSE - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_TeatimeBuffer - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, 0x2, BattleScript_TeatimeBuffer - printfromtable gStatUpStringIds - waitmessage B_WAIT_TIME_LONG - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd -BattleScript_TeatimeBuffer: - moveendto MOVEEND_NEXT_TARGET - jumpifnexttargetvalid BattleScript_TeatimeLoop - moveendcase MOVEEND_CLEAR_BITS - goto BattleScript_MoveEnd + moveendcase MOVEEND_NEXT_TARGET +BattleScript_EffectTeatimeGetTarget: + getpossiblenexttarget BattleScript_EffectTeatimeNextTarget + moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_2 + end BattleScript_AffectionBasedEndurance:: playanimation BS_TARGET, B_ANIM_AFFECTION_HANGED_ON @@ -629,7 +503,7 @@ BattleScript_AffectionBasedStatus_HealFrostbiteString: printstring STRINGID_ATTACKERHEALEDITSFROSTBITE BattleScript_AffectionBasedStatusHeal_Continue: waitmessage B_WAIT_TIME_LONG - clearstatus + clearstatus BS_ATTACKER waitstate updatestatusicon BS_ATTACKER waitstate @@ -651,7 +525,7 @@ BattleScript_EffectShellTrap:: BattleScript_EffectCourtChange:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause swapsidestatuses attackanimation waitanimation @@ -660,7 +534,6 @@ BattleScript_EffectCourtChange:: goto BattleScript_MoveEnd BattleScript_BeakBlastSetUp:: - setbeakblast flushtextbox playanimation BS_ATTACKER, B_ANIM_BEAK_BLAST_SETUP, NULL printstring STRINGID_HEATUPBEAK @@ -676,7 +549,7 @@ BattleScript_BeakBlastBurn:: BattleScript_EffectSkyDrop:: attackcanceler jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_SkyDropTurn2 - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifsubstituteblocks BattleScript_ButItFailed jumpiftargetally BattleScript_ButItFailed jumpifunder200 BattleScript_SkyDropWork @@ -693,14 +566,14 @@ BattleScript_SkyDropTurn2: call BattleScript_TwoTurnMovesSecondTurnRet clearskydrop BattleScript_SkyDropChangedTarget jumpiftype BS_TARGET, TYPE_FLYING, BattleScript_SkyDropFlyingType - goto BattleScript_HitFromCritCalc + goto BattleScript_HitFromDamageCalc BattleScript_SkyDropFlyingType: makevisible BS_TARGET printstring STRINGID_ITDOESNTAFFECT waitmessage B_WAIT_TIME_LONG makevisible BS_ATTACKER jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused - jumpifvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock + jumpifvolatile BS_TARGET, VOLATILE_RAMPAGE_TURNS, BattleScript_SkyDropFlyingConfuseLock goto BattleScript_MoveEnd BattleScript_SkyDropChangedTarget: pause B_WAIT_TIME_SHORT @@ -710,10 +583,17 @@ BattleScript_SkyDropChangedTarget: makevisible BS_ATTACKER goto BattleScript_MoveEnd +BattleScript_FirstChargingTurnAfterAttackString: + setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP + setchargingturn + twoturnmoveschargestringandanimation + setadditionaleffects @ only onChargeTurnOnly effects will work here + return + BattleScript_SkyDropFlyingConfuseLock: seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION BattleScript_SkyDropFlyingAlreadyConfused: - clearvolatile BS_TARGET, VOLATILE_LOCK_CONFUSE + clearvolatile BS_TARGET, VOLATILE_RAMPAGE_TURNS jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_MoveEnd setbyte BS_ATTACKER, BS_TARGET goto BattleScript_ThrashConfuses @@ -721,11 +601,10 @@ BattleScript_SkyDropFlyingAlreadyConfused: BattleScript_EffectFling:: attackcanceler setlastuseditem BS_ATTACKER - accuracycheck BattleScript_FlingMissed, ACC_CURR_MOVE + accuracycheck BattleScript_FlingMissed pause B_WAIT_TIME_SHORT printstring STRINGID_PKMNFLUNG waitmessage B_WAIT_TIME_SHORT - critcalc damagecalc adjustdamage removeitem BS_ATTACKER @@ -740,11 +619,10 @@ BattleScript_EffectFling:: waitmessage B_WAIT_TIME_MED resultmessage waitmessage B_WAIT_TIME_MED - jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry tryflingholdeffect goto BattleScript_FlingEnd -BattleScript_EffectFlingConsumeBerry: +BattleScript_EffectFlingConsumeBerry:: savebattleritem battleritemtolastuseditem setbyte sBERRY_OVERRIDE, 1 @ override the requirements for eating berries @@ -754,7 +632,6 @@ BattleScript_EffectFlingConsumeBerry: setbyte sBERRY_OVERRIDE, 0 restorebattleritem BattleScript_FlingEnd: - tryfaintmon BS_TARGET trysymbiosis BS_ATTACKER goto BattleScript_MoveEnd @@ -762,6 +639,13 @@ BattleScript_FlingFailConsumeItem:: removeitem BS_ATTACKER goto BattleScript_ButItFailed +BattleScript_TargetAvoidsAttackConsumeFlingItem:: + pause B_WAIT_TIME_SHORT + printfromtable gMissStringIds + waitmessage B_WAIT_TIME_LONG + removeitem BS_ATTACKER + return + BattleScript_FlingBlockedByShieldDust:: printstring STRINGID_ITEMWASUSEDUP waitmessage B_WAIT_TIME_LONG @@ -784,7 +668,7 @@ BattleScript_EffectClangorousSoul:: BattleScript_EffectOctolock:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause trysetoctolock BattleScript_ButItFailed attackanimation waitanimation @@ -807,16 +691,16 @@ BattleScript_OctlockTurnDmgEnd: BattleScript_EffectPoltergeist:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause setpoltergeistmessage BattleScript_ButItFailed printstring STRINGID_ABOUTTOUSEPOLTERGEIST waitmessage B_WAIT_TIME_LONG - goto BattleScript_HitFromCritCalc + goto BattleScript_HitFromDamageCalc BattleScript_EffectTarShot:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause cantarshotwork BattleScript_ButItFailed setstatchanger STAT_SPEED, 1, TRUE attackanimation @@ -832,7 +716,7 @@ BattleScript_TryTarShot: BattleScript_EffectNoRetreat:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifvolatile BS_TARGET, VOLATILE_NO_RETREAT, BattleScript_ButItFailed setvolatile BS_TARGET, VOLATILE_NO_RETREAT attackanimation @@ -908,9 +792,9 @@ BattleScript_StuffCheeksEnd: BattleScript_EffectDecorate:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 12, BattleScript_DecorateBoost - jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, 12, BattleScript_DecorateBoost + accuracycheck BattleScript_MoveMissedPause + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_DecorateBoost + jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_DecorateBoost goto BattleScript_ButItFailed BattleScript_DecorateBoost: attackanimation @@ -935,7 +819,6 @@ BattleScript_EffectCoaching:: setallytonexttarget EffectCoaching_CheckAllyStats goto BattleScript_ButItFailed EffectCoaching_CheckAllyStats: - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MAX_STAT_STAGE, BattleScript_CoachingWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, MAX_STAT_STAGE, BattleScript_CoachingWorks goto BattleScript_ButItFailed @ ally at max atk, def @@ -1016,7 +899,7 @@ BattleScript_EffectLifeDewHealing: BattleScript_EffectAllySwitch:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryallyswitch BattleScript_ButItFailed attackanimation waitanimation @@ -1028,7 +911,7 @@ BattleScript_EffectAllySwitch:: BattleScript_EffectFairyLock:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause trysetfairylock BattleScript_ButItFailed attackanimation waitanimation @@ -1058,7 +941,6 @@ BattleScript_DefDown_Ret: BattleScript_EffectPurify:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_PurifyWorks goto BattleScript_ButItFailed BattleScript_PurifyWorks: @@ -1075,12 +957,13 @@ BattleScript_EffectStrengthSap:: setstatchanger STAT_ATK, 1, TRUE attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, MIN_STAT_STAGE, BattleScript_StrengthSapTryLower pause B_WAIT_TIME_SHORT statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_MoveEnd BattleScript_StrengthSapTryLower: getstatvalue STAT_ATK @@ -1182,38 +1065,12 @@ BattleScript_VCreateTrySpeed: BattleScript_VCreateStatLossRet: return -BattleScript_SpectralThiefSteal:: - setbyte sB_ANIM_TURN, 1 - playmoveanimation MOVE_SPECTRAL_THIEF - waitanimation - setbyte sB_ANIM_TURN, 0 - printstring STRINGID_SPECTRALTHIEFSTEAL - waitmessage B_WAIT_TIME_LONG - setbyte sB_ANIM_ARG2, 0 - spectralthiefprintstats - flushtextbox - goto BattleScript_EffectSpectralThiefFromDamage - -BattleScript_EffectSpectralThief:: - attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - tryspectralthiefsteal BattleScript_SpectralThiefSteal -BattleScript_EffectSpectralThiefFromDamage: - critcalc - damagecalc - adjustdamage - call BattleScript_Hit_RetFromAtkAnimation - tryfaintmon BS_TARGET - moveendall - end - BattleScript_EffectPartingShot:: attackcanceler jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_EffectPartingShotTryAtk jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_EffectPartingShotTryAtk: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE @@ -1231,7 +1088,6 @@ BattleScript_EffectPartingShotSwitch: BattleScript_EffectPowder:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_POWDER, BattleScript_ButItFailed setvolatile BS_TARGET, VOLATILE_POWDER attackanimation @@ -1259,6 +1115,7 @@ BattleScript_EffectAromaticMistWontGoHigher: pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER waitmessage B_WAIT_TIME_LONG + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_EffectAromaticMistEnd BattleScript_EffectMagneticFlux:: @@ -1298,6 +1155,7 @@ BattleScript_EffectMagneticFluxEnd: BattleScript_EffectGearUp:: attackcanceler + savetarget setbyte gBattleCommunication, 0 BattleScript_EffectGearUpStart: jumpifability BS_TARGET, ABILITY_MINUS, BattleScript_EffectGearUpCheckStats @@ -1328,6 +1186,7 @@ BattleScript_EffectGearUpLoop: jumpifbytenotequal gBattlerTarget, gBattlerAttacker, BattleScript_EffectGearUpEnd setallytonexttarget BattleScript_EffectGearUpStart BattleScript_EffectGearUpEnd: + restoretarget jumpifbyte CMP_NOT_EQUAL, gBattleCommunication, 0, BattleScript_MoveEnd goto BattleScript_ButItFailed @@ -1351,7 +1210,7 @@ BattleScript_MoveEffectFeint:: BattleScript_EffectThirdType:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause trythirdtype BattleScript_ButItFailed attackanimation waitanimation @@ -1362,6 +1221,7 @@ BattleScript_EffectThirdType:: BattleScript_EffectFlowerShield:: attackcanceler savetarget + setbyte gBattlerTarget, 0 selectfirstvalidtarget BattleScript_FlowerShieldIsAnyValidTarget: jumpifvolatile BS_TARGET, VOLATILE_SEMI_INVULNERABLE, BattleScript_FlowerShieldCheckNextTarget @@ -1394,7 +1254,7 @@ BattleScript_FlowerShieldMoveTargetEnd: moveendto MOVEEND_NEXT_TARGET jumpifnexttargetvalid BattleScript_FlowerShieldLoop restoretarget - moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_1 + moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_2 end BattleScript_EffectRototiller:: @@ -1403,14 +1263,12 @@ BattleScript_EffectRototiller:: @ at least one battler is affected attackanimation waitanimation - savetarget - setbyte gBattlerTarget, 0 + goto BattleScript_EffectRototillerGetTarget BattleScript_RototillerLoop: - movevaluescleanup jumpifstat BS_TARGET, CMP_LESS_THAN, STAT_ATK, MAX_STAT_STAGE, BattleScript_RototillerCheckAffected jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MAX_STAT_STAGE, BattleScript_RototillerCantRaiseMultipleStats BattleScript_RototillerCheckAffected: - jumpifnotrototilleraffected BattleScript_RototillerNoEffect + jumpifmoveresultflags MOVE_RESULT_NO_EFFECT, BattleScript_EffectRototillerGetTarget setstatchanger STAT_ATK, 1, FALSE statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerTrySpAtk, BIT_SPATK jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerTrySpAtk @@ -1418,45 +1276,51 @@ BattleScript_RototillerCheckAffected: waitmessage B_WAIT_TIME_LONG BattleScript_RototillerTrySpAtk:: setstatchanger STAT_SPATK, 1, FALSE - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RototillerMoveTargetEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RototillerMoveTargetEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectRototillerMoves + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectRototillerMoves printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG -BattleScript_RototillerMoveTargetEnd: - moveendto MOVEEND_NEXT_TARGET - addbyte gBattlerTarget, 1 - jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_RototillerLoop - restoretarget +BattleScript_EffectRototillerMoves: + moveendcase MOVEEND_NEXT_TARGET +BattleScript_EffectRototillerGetTarget: + getpossiblenexttarget BattleScript_RototillerLoop + moveendfrom MOVEEND_ITEM_EFFECTS_ATTACKER_2 end BattleScript_RototillerCantRaiseMultipleStats: + saveattacker copybyte gBattlerAttacker, gBattlerTarget printstring STRINGID_STATSWONTINCREASE2 + restoreattacker waitmessage B_WAIT_TIME_LONG - goto BattleScript_RototillerMoveTargetEnd + goto BattleScript_EffectRototillerGetTarget BattleScript_RototillerNoEffect: pause B_WAIT_TIME_SHORT printstring STRINGID_NOEFFECTONTARGET waitmessage B_WAIT_TIME_LONG - goto BattleScript_RototillerMoveTargetEnd + goto BattleScript_EffectRototillerGetTarget BattleScript_EffectBestow:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed trybestow BattleScript_ButItFailed attackanimation waitanimation printstring STRINGID_BESTOWITEMGIVING waitmessage B_WAIT_TIME_LONG + tryactivateabilitywithabilityshield BS_TARGET, FALSE tryactivateitem BS_TARGET, ACTIVATION_ON_USABLE_AGAIN trysymbiosis BS_ATTACKER goto BattleScript_MoveEnd +BattleScript_ActivateSwitchInAbility:: + switchinabilities BS_SCRIPTING + return + BattleScript_EffectAfterYou:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryafteryou BattleScript_ButItFailed attackanimation waitanimation @@ -1474,7 +1338,7 @@ BattleScript_MoveEffectFlameBurst:: BattleScript_EffectPowerTrick:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause powertrick attackanimation waitanimation @@ -1484,7 +1348,7 @@ BattleScript_EffectPowerTrick:: BattleScript_EffectPsychoShift:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifstatus BS_ATTACKER, STATUS1_ANY, BattleScript_EffectPsychoShiftCanWork goto BattleScript_ButItFailed BattleScript_EffectPsychoShiftCanWork: @@ -1504,13 +1368,6 @@ BattleScript_EffectPsychoShiftCanWork: updatestatusicon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectSynchronoise:: - attackcanceler - pause B_WAIT_TIME_MED - trysynchronoise BattleScript_MoveEnd - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc - BattleScript_ItDoesntAffectFoe:: savetarget copybyte gBattlerTarget, sBATTLER @@ -1532,21 +1389,29 @@ BattleScript_EffectHitEnemyHealAlly:: BattleScript_EffectDefog:: setstatchanger STAT_EVASION, 1, TRUE attackcanceler + jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogAfterSubstituteCheck jumpifsubstituteblocks BattleScript_DefogIfCanClearHazards +BattleScript_DefogAfterSubstituteCheck: jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_EVASION, MIN_STAT_STAGE, BattleScript_DefogWorks BattleScript_DefogIfCanClearHazards: trydefog FALSE, BattleScript_ButItFailed BattleScript_DefogWorks: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause + jumpifgenconfiglowerthan CONFIG_DEFOG_EFFECT_CLEARING, GEN_5, BattleScript_DefogWorksAfterSubstituteCheck + jumpifsubstituteblocks BattleScript_DefogTryHazardsWithAnim +BattleScript_DefogWorksAfterSubstituteCheck: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_DefogTryHazardsWithAnim jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_DefogDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_DefogTryHazardsWithAnim pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_DefogPrintString BattleScript_DefogDoAnim:: attackanimation waitanimation + call BattleScript_SwapFromSubstitute statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_DefogTryHazards + call BattleScript_SwapToSubstitute BattleScript_DefogPrintString:: printfromtable gStatDownStringIds waitmessage B_WAIT_TIME_LONG @@ -1572,10 +1437,10 @@ BattleScript_EffectInstruct:: tryinstruct BattleScript_ButItFailed attackanimation waitanimation - copybyte gBattlerAttacker, gBattlerTarget - copybyte gBattlerTarget, gEffectBattler printstring STRINGID_USEDINSTRUCTEDMOVE waitmessage B_WAIT_TIME_LONG + copybyte gBattlerAttacker, gBattlerTarget + copybyte gBattlerTarget, gEffectBattler jumptocalledmove TRUE BattleScript_EffectAutotomize:: @@ -1622,7 +1487,7 @@ BattleScript_EffectToxicThread:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed checknonvolatiletrigger MOVE_EFFECT_POISON, BattleScript_EffectStatDownFromAccCheck - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause attackanimation waitanimation setstatchanger STAT_SPEED, 1, TRUE @@ -1649,7 +1514,7 @@ BattleScript_EffectVenomDrenchCanBeUsed: jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_SPATK, MIN_STAT_STAGE, BattleScript_VenomDrenchDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPEED, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_VenomDrenchDoMoveAnim:: - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE @@ -1677,7 +1542,7 @@ BattleScript_EffectNobleRoar:: jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_NobleRoarDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_SPATK, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_NobleRoarDoMoveAnim:: - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE @@ -1769,7 +1634,7 @@ BattleScript_GrowthEnd: BattleScript_EffectSoak:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifability BS_TARGET, ABILITY_MULTITYPE, BattleScript_ButItFailed jumpifability BS_TARGET, ABILITY_RKS_SYSTEM, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed @@ -1782,7 +1647,7 @@ BattleScript_EffectSoak:: BattleScript_EffectReflectType:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryreflecttype BattleScript_ButItFailed attackanimation waitanimation @@ -1792,7 +1657,7 @@ BattleScript_EffectReflectType:: BattleScript_EffectElectrify:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryelectrify BattleScript_ButItFailed attackanimation waitanimation @@ -1968,7 +1833,6 @@ BattleScript_EffectPsychicTerrain:: BattleScript_EffectTopsyTurvy:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_ATK, 6, BattleScript_EffectTopsyTurvyWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_DEF, 6, BattleScript_EffectTopsyTurvyWorks jumpifstat BS_TARGET, CMP_NOT_EQUAL, STAT_SPATK, 6, BattleScript_EffectTopsyTurvyWorks @@ -1986,7 +1850,7 @@ BattleScript_EffectTopsyTurvyWorks: BattleScript_EffectIonDeluge:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause orword gFieldStatuses, STATUS_FIELD_ION_DELUGE attackanimation waitanimation @@ -1996,7 +1860,7 @@ BattleScript_EffectIonDeluge:: BattleScript_EffectQuash:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryquash BattleScript_ButItFailed attackanimation waitanimation @@ -2008,7 +1872,6 @@ BattleScript_EffectHealPulse:: attackcanceler jumpifvolatile BS_ATTACKER, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents @ stops pollen puff jumpifvolatile BS_TARGET, VOLATILE_HEAL_BLOCK, BattleScript_MoveUsedHealBlockPrevents - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifsubstituteblocks BattleScript_ButItFailed tryhealpulse BattleScript_AlreadyAtFullHp attackanimation @@ -2021,7 +1884,7 @@ BattleScript_EffectHealPulse:: BattleScript_EffectEntrainment:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryentrainment BattleScript_ButItFailed attackanimation waitanimation @@ -2043,15 +1906,6 @@ BattleScript_EffectLuckyChant:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectMetalBurst:: - attackcanceler - metalburstdamagecalculator BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectHealingWish:: attackcanceler jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_ButItFailed @@ -2061,12 +1915,11 @@ BattleScript_EffectHealingWish:: setatkhptozero tryfaintmon BS_ATTACKER storehealingwish BS_ATTACKER - jumpifgenconfiglowerthan GEN_CONFIG_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4 -BattleScript_EffectHealingWishEnd: - moveendall - end + jumpifgenconfiglowerthan CONFIG_HEALING_WISH_SWITCH, GEN_5, BattleScript_EffectHealingWishGen4 + goto BattleScript_MoveEnd + BattleScript_EffectHealingWishGen4: - openpartyscreen BS_ATTACKER, BattleScript_EffectHealingWishEnd + openpartyscreen BS_ATTACKER, BattleScript_MoveEnd waitstate switchhandleorder BS_ATTACKER, 2 returnatktoball @@ -2082,26 +1935,25 @@ BattleScript_EffectHealingWishGen4: switchinanim BS_ATTACKER, FALSE, TRUE waitstate switchineffects BS_ATTACKER - goto BattleScript_EffectHealingWishEnd + switchinevents + goto BattleScript_MoveEnd BattleScript_HealingWishActivates:: setbyte cMULTISTRING_CHOOSER, 0 goto BattleScript_EffectHealingWishRestore BattleScript_LunarDanceActivates:: setbyte cMULTISTRING_CHOOSER, 1 - restoremovepp + restoremovepp BS_SCRIPTING BattleScript_EffectHealingWishRestore: printfromtable gHealingWishStringIds waitmessage B_WAIT_TIME_LONG - playanimation BS_ATTACKER, B_ANIM_WISH_HEAL + playanimation BS_SCRIPTING, B_ANIM_WISH_HEAL waitanimation - dmgtomaxattackerhp - manipulatedamage DMG_CHANGE_SIGN - healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE - datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE - clearstatus + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + clearstatus BS_SCRIPTING, waitstate - updatestatusicon BS_ATTACKER + updatestatusicon BS_SCRIPTING waitstate printstring STRINGID_HEALINGWISHHEALED waitmessage B_WAIT_TIME_LONG @@ -2109,7 +1961,7 @@ BattleScript_EffectHealingWishRestore: BattleScript_EffectOverwriteAbility:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause tryoverwriteability BattleScript_ButItFailed attackanimation waitanimation @@ -2126,7 +1978,6 @@ BattleScript_EffectOverwriteAbility:: BattleScript_EffectPowerSplit:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_ATK averagestats STAT_SPATK attackanimation @@ -2137,7 +1988,6 @@ BattleScript_EffectPowerSplit:: BattleScript_EffectGuardSplit:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON averagestats STAT_DEF averagestats STAT_SPDEF attackanimation @@ -2148,7 +1998,6 @@ BattleScript_EffectGuardSplit:: BattleScript_EffectHeartSwap:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_DEF swapstatstages STAT_SPEED @@ -2164,7 +2013,6 @@ BattleScript_EffectHeartSwap:: BattleScript_EffectPowerSwap:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_ATK swapstatstages STAT_SPATK attackanimation @@ -2175,7 +2023,6 @@ BattleScript_EffectPowerSwap:: BattleScript_EffectGuardSwap:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstatstages STAT_DEF swapstatstages STAT_SPDEF attackanimation @@ -2186,7 +2033,6 @@ BattleScript_EffectGuardSwap:: BattleScript_EffectSpeedSwap:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON swapstats STAT_SPEED attackanimation waitanimation @@ -2196,7 +2042,6 @@ BattleScript_EffectSpeedSwap:: BattleScript_EffectTelekinesis:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, NO_ACC_CALC_CHECK_LOCK_ON settelekinesis BattleScript_ButItFailed attackanimation waitanimation @@ -2224,7 +2069,7 @@ BattleScript_EffectStickyWeb:: BattleScript_EffectGastroAcid:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifvolatile BS_TARGET, VOLATILE_GASTRO_ACID, BattleScript_ButItFailed setgastroacid BattleScript_ButItFailed attackanimation @@ -2301,7 +2146,7 @@ BattleScript_EffectAquaRing:: BattleScript_EffectEmbargo:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause setembargo BattleScript_ButItFailed attackanimation waitanimation @@ -2339,14 +2184,14 @@ BattleScript_TryTailwindAbilitiesLoop_WindRider: BattleScript_TryTailwindAbilitiesLoop_WindPower: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 2 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG goto BattleScript_TryTailwindAbilitiesLoop_Increment BattleScript_EffectMiracleEye:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause setvolatile BS_TARGET, VOLATILE_MIRACLE_EYE goto BattleScript_IdentifiedFoe @@ -2393,12 +2238,12 @@ BattleScript_EffectCaptivate:: jumpifcaptivateaffected BattleScript_CaptivateCheckAcc goto BattleScript_ButItFailed BattleScript_CaptivateCheckAcc: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause goto BattleScript_EffectStatDownFromStatBuffChange BattleScript_EffectHealBlock:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects sethealblock BattleScript_ButItFailed attackanimation @@ -2424,16 +2269,13 @@ BattleScript_EffectPlaceholder:: BattleScript_EffectHit:: attackcanceler BattleScript_HitFromAccCheck:: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE -BattleScript_HitFromAtkString:: -BattleScript_HitFromCritCalc:: - critcalc + accuracycheck BattleScript_MoveMissedPause + setpreattackadditionaleffect +BattleScript_HitFromDamageCalc:: damagecalc adjustdamage BattleScript_HitFromAtkAnimation:: call BattleScript_Hit_RetFromAtkAnimation -BattleScript_TryFaintMon:: - tryfaintmon BS_TARGET BattleScript_MoveEnd:: moveendall end @@ -2441,9 +2283,7 @@ BattleScript_MoveEnd:: BattleScript_EffectHit_Ret:: attackcanceler BattleScript_EffectHit_RetFromAccCheck:: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE -BattleScript_EffectHit_RetFromCritCalc:: - critcalc + accuracycheck BattleScript_MoveMissedPause damagecalc adjustdamage BattleScript_Hit_RetFromAtkAnimation:: @@ -2467,8 +2307,8 @@ BattleScript_EffectNaturalGift:: jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailed jumpifability BS_ATTACKER, ABILITY_KLUTZ, BattleScript_ButItFailed jumpifvolatile BS_ATTACKER, VOLATILE_EMBARGO, BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - call BattleScript_HitFromCritCalc + accuracycheck BattleScript_MoveMissedPause + call BattleScript_HitFromDamageCalc BattleScript_MakeMoveMissed:: setmoveresultflags MOVE_RESULT_MISSED @@ -2592,14 +2432,10 @@ BattleScript_EffectAbsorb:: BattleScript_EffectAbsorbRet: return -BattleScript_EffectExplosion:: - attackcanceler +BattleScript_Explosion:: tryexplosion setatkhptozero - waitstate - jumpiffainted BS_TARGET, TRUE, BattleScript_MoveEnd - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc + return BattleScript_FaintAttackerForExplosion:: tryfaintmon BS_ATTACKER @@ -2613,7 +2449,9 @@ BattleScript_MaxHp50Recoil:: BattleScript_EffectDreamEater:: attackcanceler +.if B_DREAM_EATER_SUBSTITUTE < GEN_5 jumpifsubstituteblocks BattleScript_DoesntAffectTargetAtkString +.endif jumpifstatus BS_TARGET, STATUS1_SLEEP, BattleScript_HitFromAccCheck jumpifability BS_TARGET, ABILITY_COMATOSE, BattleScript_HitFromAccCheck goto BattleScript_DoesntAffectTargetAtkString @@ -2647,18 +2485,22 @@ BattleScript_EffectEvasionUp:: BattleScript_EffectStatUp:: attackcanceler BattleScript_EffectStatUpAfterAtkCanceler:: - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatUpEnd jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatUpAttackAnim pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_StatUpPrintString BattleScript_StatUpAttackAnim:: attackanimation waitanimation BattleScript_StatUpDoAnim:: - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd + statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_StatUpEnd BattleScript_StatUpPrintString:: + saveattacker + copybyte gBattlerAttacker, gBattlerTarget printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG + restoreattacker BattleScript_StatUpEnd:: goto BattleScript_MoveEnd @@ -2693,16 +2535,19 @@ BattleScript_EffectSpecialDefenseDown:: BattleScript_EffectEvasionDown:: setstatchanger STAT_EVASION, 1, TRUE + goto BattleScript_EffectStatDown + BattleScript_EffectStatDown: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed BattleScript_EffectStatDownFromAccCheck: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause BattleScript_EffectStatDownFromStatBuffChange: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR | STAT_CHANGE_ONLY_CHECKING, BattleScript_StatDownEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_StatDownDoAnim jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_CHANGE_EMPTY, BattleScript_StatDownEnd pause B_WAIT_TIME_SHORT + setmoveresultflags MOVE_RESULT_MISSED @ TODO: Is this even necessary? goto BattleScript_StatDownPrintString BattleScript_StatDownDoAnim:: attackanimation @@ -2777,8 +2622,7 @@ BattleScript_EffectRoar:: jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut jumpifvolatile BS_TARGET, VOLATILE_ROOT, BattleScript_PrintMonIsRooted jumpiftargetdynamaxed BattleScript_RoarBlockedByDynamax - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_ButItFailed forcerandomswitch BattleScript_ButItFailed @@ -2925,7 +2769,7 @@ BattleScript_EffectConfuse:: jumpifsubstituteblocks BattleScript_ButItFailed jumpifvolatile BS_TARGET, VOLATILE_CONFUSION, BattleScript_AlreadyConfused jumpifterrainaffected BS_TARGET, STATUS_FIELD_MISTY_TERRAIN, BattleScript_MistyTerrainPrevents - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed jumpifsafeguard BattleScript_SafeguardProtected attackanimation waitanimation @@ -3046,30 +2890,16 @@ BattleScript_AlreadyParalyzed:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_PowerHerbActivation: +BattleScript_PowerHerbActivation:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_POWERHERB waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER + trygulpmissile @ Edge case for Cramorant ability Gulp Missile return -BattleScript_EffectTwoTurnsAttack:: - jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_TwoTurnMovesSecondTurn - tryfiretwoturnmovewithoutcharging BS_ATTACKER, BattleScript_EffectHit @ e.g. Solar Beam - call BattleScript_FirstChargingTurn - tryfiretwoturnmoveaftercharging BS_ATTACKER, BattleScript_TwoTurnMovesSecondTurn @ e.g. Electro Shot - jumpifholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_TwoTurnMovesSecondPowerHerbActivates, TRUE - goto BattleScript_MoveEnd - BattleScript_EffectGeomancy:: - jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_GeomancySecondTurn - call BattleScript_FirstChargingTurn - jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_POWER_HERB, BattleScript_MoveEnd - call BattleScript_PowerHerbActivation -BattleScript_GeomancySecondTurn: attackcanceler - setbyte sB_ANIM_TURN, 1 - clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPATK, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_GeomancyDoMoveAnim jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPEED, MAX_STAT_STAGE, BattleScript_CantRaiseMultipleStats @@ -3096,12 +2926,8 @@ BattleScript_GeomancyTrySpeed:: BattleScript_GeomancyEnd:: goto BattleScript_MoveEnd -BattleScript_FirstChargingTurn:: - attackcanceler +BattleScript_TwoTurnMoveCharging:: waitmessage B_WAIT_TIME_LONG -BattleScript_FirstChargingTurnAfterAttackString: - setsemiinvulnerablebit @ only for moves with EFFECT_SEMI_INVULNERABLE/EFFECT_SKY_DROP - setchargingturn twoturnmoveschargestringandanimation setadditionaleffects @ only onChargeTurnOnly effects will work here return @@ -3111,8 +2937,8 @@ BattleScript_TwoTurnMovesSecondPowerHerbActivates: trygulpmissile @ Edge case for Cramorant ability Gulp Missile BattleScript_FromTwoTurnMovesSecondTurnRet: call BattleScript_TwoTurnMovesSecondTurnRet - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc + accuracycheck BattleScript_MoveMissedPause + goto BattleScript_HitFromDamageCalc BattleScript_TwoTurnMovesSecondTurn:: attackcanceler @@ -3153,19 +2979,9 @@ BattleScript_MoveUsedMustRecharge:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectRage:: - attackcanceler - accuracycheck BattleScript_RageMiss, ACC_CURR_MOVE - seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_RAGE - goto BattleScript_HitFromAtkString -BattleScript_RageMiss:: - clearvolatile BS_ATTACKER, VOLATILE_RAGE - goto BattleScript_MoveMissedPause - BattleScript_EffectMimic:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON mimicattackcopy BattleScript_ButItFailed attackanimation waitanimation @@ -3177,7 +2993,7 @@ BattleScript_EffectLeechSeed:: attackcanceler pause B_WAIT_TIME_SHORT jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_DoLeechSeed, ACC_CURR_MOVE + accuracycheck BattleScript_DoLeechSeed BattleScript_DoLeechSeed:: setseeded attackanimation @@ -3197,7 +3013,6 @@ BattleScript_EffectDoNothing:: BattleScript_EffectHoldHands:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifbyteequal gBattlerTarget, gBattlerAttacker, BattleScript_ButItFailed attackanimation waitanimation @@ -3221,7 +3036,7 @@ BattleScript_EffectHappyHour:: BattleScript_EffectDisable:: attackcanceler jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed disablelastusedattack BattleScript_ButItFailed attackanimation waitanimation @@ -3229,18 +3044,9 @@ BattleScript_EffectDisable:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectCounter:: - attackcanceler - counterdamagecalculator BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectEncore:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects trysetencore BattleScript_ButItFailed attackanimation @@ -3251,7 +3057,6 @@ BattleScript_EffectEncore:: BattleScript_EffectPainSplit:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON painsplitdmgcalc BattleScript_ButItFailed attackanimation waitanimation @@ -3270,8 +3075,8 @@ BattleScript_EffectSnore:: waitmessage B_WAIT_TIME_LONG statusanimation BS_ATTACKER BattleScript_DoSnore:: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc + accuracycheck BattleScript_MoveMissedPause + goto BattleScript_HitFromDamageCalc BattleScript_EffectConversion2:: attackcanceler @@ -3285,7 +3090,7 @@ BattleScript_EffectConversion2:: BattleScript_EffectLockOn:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed setalwayshitflag attackanimation waitanimation @@ -3318,7 +3123,7 @@ BattleScript_MoveEffectEerieSpell:: BattleScript_EffectSpite:: attackcanceler - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed tryspiteppreduce BattleScript_ButItFailed attackanimation waitanimation @@ -3343,7 +3148,7 @@ BattleScript_HealBellSoundproof:: waitmessage B_WAIT_TIME_LONG BattleScript_CheckHealBellMon2Unaffected:: jumpifbyte CMP_NO_COMMON_BITS, cMULTISTRING_CHOOSER, B_MSG_BELL_SOUNDPROOF_PARTNER, BattleScript_PartyHealEnd - printstring STRINGID_PKMNSXBLOCKSY2 + printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG BattleScript_PartyHealEnd:: updatestatusicon BS_ATTACKER_WITH_PARTNER @@ -3361,12 +3166,11 @@ BattleScript_MoveEffectAromatherapy:: BattleScript_EffectMeanLook:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_ESCAPE_PREVENTION, BattleScript_ButItFailed jumpifsubstituteblocks BattleScript_ButItFailed -.if B_GHOSTS_ESCAPE >= GEN_6 + jumpifgenconfiglowerthan CONFIG_GHOSTS_ESCAPE, GEN_6, BattleScript_EffectMeanLookGen5 jumpiftype BS_TARGET, TYPE_GHOST, BattleScript_ButItFailed -.endif +BattleScript_EffectMeanLookGen5: attackanimation waitanimation seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_PREVENT_ESCAPE @@ -3392,11 +3196,11 @@ BattleScript_NightmareWorked:: BattleScript_EffectMinimize:: attackcanceler setvolatile BS_ATTACKER, VOLATILE_MINIMIZE -.if B_MINIMIZE_EVASION >= GEN_5 + jumpifgenconfiglowerthan CONFIG_MINIMIZE_EVASION, GEN_5, BattleScript_EffectMinimizeGen4 setstatchanger STAT_EVASION, 2, FALSE -.else + goto BattleScript_EffectStatUpAfterAtkCanceler +BattleScript_EffectMinimizeGen4: setstatchanger STAT_EVASION, 1, FALSE -.endif goto BattleScript_EffectStatUpAfterAtkCanceler BattleScript_EffectCurse:: @@ -3432,7 +3236,6 @@ BattleScript_GhostCurse:: getmovetarget BattleScript_DoGhostCurse:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON cursetarget BattleScript_ButItFailed setbyte sB_ANIM_TURN, 0 attackanimation @@ -3465,7 +3268,6 @@ BattleScript_EffectSpikes:: BattleScript_EffectForesight:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON jumpifvolatile BS_TARGET, VOLATILE_FORESIGHT, BattleScript_ButItFailed setvolatile BS_TARGET, VOLATILE_FORESIGHT BattleScript_IdentifiedFoe: @@ -3478,52 +3280,16 @@ BattleScript_IdentifiedFoe: BattleScript_EffectPerishSong:: attackcanceler trysetperishsong BattleScript_ButItFailed - savetarget attackanimation waitanimation printstring STRINGID_FAINTINTHREE waitmessage B_WAIT_TIME_LONG - setbyte gBattlerTarget, 0 -BattleScript_PerishSongLoop:: - jumpifblockedbysoundproof BS_TARGET, BattleScript_PerishSongBlocked - jumpifpranksterblocked BattleScript_PerishSongNotAffected -BattleScript_PerishSongLoopIncrement:: - addbyte gBattlerTarget, 1 - jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_PerishSongLoop - restoretarget goto BattleScript_MoveEnd -BattleScript_PerishSongBlocked:: - copybyte sBATTLER, gBattlerTarget - printstring STRINGID_PKMNSXBLOCKSY2 - waitmessage B_WAIT_TIME_LONG - goto BattleScript_PerishSongLoopIncrement - -BattleScript_PerishSongNotAffected: - printstring STRINGID_ITDOESNTAFFECT - waitmessage B_WAIT_TIME_LONG - goto BattleScript_PerishSongLoopIncrement - -BattleScript_EffectSandstorm:: - attackcanceler - call BattleScript_CheckPrimalWeather - setfieldweather BATTLE_WEATHER_SANDSTORM - goto BattleScript_MoveWeatherChange - -BattleScript_EffectRollout:: - attackcanceler - jumpifvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS, BattleScript_RolloutCheckAccuracy -BattleScript_RolloutCheckAccuracy:: - accuracycheck BattleScript_RolloutHit, ACC_CURR_MOVE -BattleScript_RolloutHit:: - typecalc - handlerollout - goto BattleScript_HitFromCritCalc - BattleScript_EffectSwagger:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifconfusedandstatmaxed STAT_ATK, BattleScript_ButItFailed attackanimation waitanimation @@ -3538,26 +3304,20 @@ BattleScript_SwaggerTryConfuse: seteffectprimary BS_ATTACKER, BS_TARGET, MOVE_EFFECT_CONFUSION goto BattleScript_MoveEnd -BattleScript_EffectFuryCutter:: - attackcanceler - accuracycheck BattleScript_FuryCutterHit, ACC_CURR_MOVE -BattleScript_FuryCutterHit: - handlefurycutter - critcalc - damagecalc - jumpifmovehadnoeffect BattleScript_FuryCutterHit - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_TryDestinyKnotTarget: jumpifnoholdeffect BS_ATTACKER, HOLD_EFFECT_DESTINY_KNOT, BattleScript_TryDestinyKnotTargetRet playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation printstring STRINGID_DESTINYKNOTACTIVATES - tryinfatuating BattleScript_ButItFailed + tryinfatuating BattleScript_TryDestinyKnotTargetFailed volatileanimation BS_TARGET, VOLATILE_INFATUATION waitanimation waitmessage B_WAIT_TIME_LONG + goto BattleScript_TryDestinyKnotTargetRet +BattleScript_TryDestinyKnotTargetFailed: + pause B_WAIT_TIME_SHORT + printstring STRINGID_BUTITFAILED + waitmessage B_WAIT_TIME_LONG BattleScript_TryDestinyKnotTargetRet: return @@ -3576,7 +3336,7 @@ BattleScript_TryDestinyKnotAttacker: BattleScript_EffectAttract:: attackcanceler - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects tryinfatuating BattleScript_ButItFailed attackanimation @@ -3588,7 +3348,7 @@ BattleScript_EffectAttract:: BattleScript_EffectPresent:: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause typecalc presentdamagecalculation @@ -3603,8 +3363,8 @@ BattleScript_EffectMagnitude:: pause B_WAIT_TIME_SHORT printstring STRINGID_MAGNITUDESTRENGTH waitmessage B_WAIT_TIME_LONG - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - goto BattleScript_HitFromCritCalc + accuracycheck BattleScript_MoveMissedPause + goto BattleScript_HitFromDamageCalc BattleScript_EffectBatonPass:: attackcanceler @@ -3613,10 +3373,10 @@ BattleScript_EffectBatonPass:: attackanimation waitanimation openpartyscreen BS_ATTACKER, BattleScript_ButItFailed - switchoutabilities BS_ATTACKER waitstate - switchhandleorder BS_ATTACKER, 2 returntoball BS_ATTACKER, FALSE + switchoutabilities BS_ATTACKER + switchhandleorder BS_ATTACKER, 2 getswitchedmondata BS_ATTACKER switchindataupdate BS_ATTACKER hpthresholds BS_ATTACKER @@ -3626,6 +3386,7 @@ BattleScript_EffectBatonPass:: switchinanim BS_ATTACKER, FALSE, TRUE waitstate switchineffects BS_ATTACKER + switchinevents goto BattleScript_MoveEnd BattleScript_EffectMorningSun:: @@ -3636,94 +3397,67 @@ BattleScript_EffectShoreUp:: recoverbasedonsunlight BattleScript_AlreadyAtFullHp goto BattleScript_PresentHealTarget -BattleScript_EffectRainDance:: +BattleScript_EffectWeather:: attackcanceler - call BattleScript_CheckPrimalWeather - setfieldweather BATTLE_WEATHER_RAIN -BattleScript_MoveWeatherChange:: +BattleScript_EffectWeatherSetWeather: + setfieldweather attackanimation waitanimation call BattleScript_MoveWeatherChangeRet goto BattleScript_MoveEnd +BattleScript_ChillyReceptionMessage:: + printstring STRINGID_PKMNTELLCHILLINGRECEPTIONJOKE + waitmessage B_WAIT_TIME_LONG + return + +BattleScript_EffectWeatherAndSwitch:: + attackcanceler + jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_EffectWeatherSetWeather + jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_EffectWeatherSetWeather + setfieldweather + clearmoveresultflags MOVE_RESULT_NO_EFFECT + attackanimation + waitanimation + call BattleScript_MoveWeatherChangeRet + moveendall + goto BattleScript_MoveSwitch + BattleScript_MoveWeatherChangeRet:: printfromtable gMoveWeatherChangeStringIds waitmessage B_WAIT_TIME_LONG call BattleScript_ActivateWeatherAbilities return -BattleScript_EffectSunnyDay:: - attackcanceler - call BattleScript_CheckPrimalWeather - setfieldweather BATTLE_WEATHER_SUN - goto BattleScript_MoveWeatherChange +BattleScript_FailOnPrimalWeather:: + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn + return BattleScript_ExtremelyHarshSunlightWasNotLessened: - pause B_WAIT_TIME_SHORT - printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - -BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3: - pause B_WAIT_TIME_SHORT - printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED - waitmessage B_WAIT_TIME_LONG - end3 - -BattleScript_ExtremelyHarshSunlightWasNotLessenedRet: pause B_WAIT_TIME_SHORT printstring STRINGID_EXTREMELYHARSHSUNLIGHTWASNOTLESSENED waitmessage B_WAIT_TIME_LONG return BattleScript_NoReliefFromHeavyRain: - pause B_WAIT_TIME_SHORT - printstring STRINGID_NORELIEFROMHEAVYRAIN - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - -BattleScript_NoReliefFromHeavyRainEnd3: - pause B_WAIT_TIME_SHORT - printstring STRINGID_NORELIEFROMHEAVYRAIN - waitmessage B_WAIT_TIME_LONG - end3 - -BattleScript_NoReliefFromHeavyRainRet: pause B_WAIT_TIME_SHORT printstring STRINGID_NORELIEFROMHEAVYRAIN waitmessage B_WAIT_TIME_LONG return BattleScript_MysteriousAirCurrentBlowsOn: - pause B_WAIT_TIME_SHORT - printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd - -BattleScript_MysteriousAirCurrentBlowsOnEnd3: - pause B_WAIT_TIME_SHORT - printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON - waitmessage B_WAIT_TIME_LONG - end3 - -BattleScript_MysteriousAirCurrentBlowsOnRet: pause B_WAIT_TIME_SHORT printstring STRINGID_MYSTERIOUSAIRCURRENTBLOWSON waitmessage B_WAIT_TIME_LONG return -BattleScript_BlockedByPrimalWeatherEnd3:: +BattleScript_BlockedByPrimalWeather:: call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainEnd3 - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnEnd3 - end3 - -BattleScript_BlockedByPrimalWeatherRet:: - call BattleScript_AbilityPopUp - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessenedRet - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRainRet - jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOnRet + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_SUN_PRIMAL, BattleScript_ExtremelyHarshSunlightWasNotLessened + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_RAIN_PRIMAL, BattleScript_NoReliefFromHeavyRain + jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_STRONG_WINDS, BattleScript_MysteriousAirCurrentBlowsOn return BattleScript_EffectBellyDrum:: @@ -3749,15 +3483,6 @@ BattleScript_EffectPsychUp:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectMirrorCoat:: - attackcanceler - mirrorcoatdamagecalculator BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - clearmoveresultflags MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectFutureSight:: attackcanceler setfutureattack @@ -3768,7 +3493,7 @@ BattleScript_EffectFutureSight:: goto BattleScript_MoveEnd BattleScript_EffectTeleport:: - jumpifgenconfiglowerthan GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7 + jumpifgenconfiglowerthan CONFIG_TELEPORT_BEHAVIOR, GEN_8, BattleScript_EffectTeleportGen7 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EffectBatonPass jumpifside BS_ATTACKER, B_SIDE_PLAYER, BattleScript_EffectBatonPass goto BattleScript_DoEffectTeleport @@ -3787,35 +3512,16 @@ BattleScript_DoEffectTeleport:: goto BattleScript_MoveEnd BattleScript_EffectBeatUp:: + jumpifgenconfiglowerthan CONFIG_BEAT_UP, GEN_5, BattleScript_EffectBeatUpGen3 + goto BattleScript_EffectHit + +BattleScript_EffectBeatUpGen3: attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause pause B_WAIT_TIME_SHORT - setbyte gBattleCommunication, 0 -BattleScript_BeatUpLoop:: - movevaluescleanup - trydobeatup BattleScript_BeatUpEnd, BattleScript_ButItFailed + trydobeatup BattleScript_MoveEnd, BattleScript_ButItFailed printstring STRINGID_PKMNATTACK - critcalc - jumpifcriticalhit BattleScript_BeatUpAttack - manipulatedamage DMG_DOUBLED -BattleScript_BeatUpAttack:: - adjustdamage - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE - datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - moveendto MOVEEND_NEXT_TARGET - goto BattleScript_BeatUpLoop -BattleScript_BeatUpEnd:: - end + goto BattleScript_HitFromDamageCalc BattleScript_EffectDefenseCurl:: attackcanceler @@ -3881,17 +3587,16 @@ BattleScript_NotAffectedAbilityPopUp:: BattleScript_EffectStockpile:: attackcanceler - stockpile 0 + stockpile attackanimation waitanimation printstring STRINGID_PKMNSTOCKPILED waitmessage B_WAIT_TIME_LONG .if B_STOCKPILE_RAISES_DEFS < GEN_4 - goto BattleScript_EffectStockpileEnd + goto BattleScript_MoveEnd .endif - jumpifmovehadnoeffect BattleScript_EffectStockpileEnd jumpifstat BS_ATTACKER, CMP_LESS_THAN, STAT_DEF, MAX_STAT_STAGE, BattleScript_EffectStockpileDef - jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_EffectStockpileEnd + jumpifstat BS_ATTACKER, CMP_EQUAL, STAT_SPDEF, MAX_STAT_STAGE, BattleScript_MoveEnd BattleScript_EffectStockpileDef: setstatchanger STAT_DEF, 1, FALSE statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileSpDef, BIT_SPDEF @@ -3900,12 +3605,10 @@ BattleScript_EffectStockpileDef: waitmessage B_WAIT_TIME_LONG BattleScript_EffectStockpileSpDef:: setstatchanger STAT_SPDEF, 1, FALSE - statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_EffectStockpileEnd - jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_EffectStockpileEnd + statbuffchange BS_ATTACKER, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveEnd + jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_MoveEnd printfromtable gStatUpStringIds waitmessage B_WAIT_TIME_LONG -BattleScript_EffectStockpileEnd: - stockpile 1 goto BattleScript_MoveEnd BattleScript_MoveEffectStockpileWoreOff:: @@ -3926,12 +3629,11 @@ BattleScript_StockpileStatChangeDown_Ret: BattleScript_EffectSpitUp:: attackcanceler jumpifbyte CMP_EQUAL, cMISS_TYPE, B_MSG_PROTECTED, BattleScript_SpitUpFailProtect - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause damagecalc adjustdamage stockpiletobasedamage call BattleScript_Hit_RetFromAtkAnimation - tryfaintmon BS_TARGET removestockpilecounters goto BattleScript_MoveEnd @@ -3954,15 +3656,9 @@ BattleScript_EffectSwallow:: removestockpilecounters goto BattleScript_MoveEnd -BattleScript_EffectHail:: - attackcanceler - call BattleScript_CheckPrimalWeather - setfieldweather BATTLE_WEATHER_HAIL - goto BattleScript_MoveWeatherChange - BattleScript_EffectTorment:: attackcanceler - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects settorment BattleScript_ButItFailed attackanimation @@ -3974,7 +3670,7 @@ BattleScript_EffectTorment:: BattleScript_EffectFlatter:: attackcanceler jumpifsubstituteblocks BattleScript_MakeMoveMissed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause jumpifconfusedandstatmaxed STAT_SPATK, BattleScript_ButItFailed attackanimation waitanimation @@ -3997,7 +3693,7 @@ BattleScript_EffectDarkVoid:: BattleScript_EffectNonVolatileStatus:: attackcanceler trynonvolatilestatus - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed attackanimation waitanimation setnonvolatilestatus TRIGGER_ON_MOVE @@ -4053,9 +3749,7 @@ BattleScript_MementoTargetProtectEnd: tryfaintmon BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectFocusPunch:: - attackcanceler - jumpifnodamage BattleScript_HitFromAccCheck +BattleScript_FocusPunchLostFocus:: printstring STRINGID_PKMNLOSTFOCUS waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd @@ -4071,7 +3765,7 @@ BattleScript_EffectFollowMe:: BattleScript_EffectCharge:: attackcanceler - setcharge BS_ATTACKER + setvolatile BS_ATTACKER, VOLATILE_CHARGE_TIMER, 2 attackanimation waitanimation .if B_CHARGE_SPDEF_RAISE >= GEN_5 @@ -4089,7 +3783,7 @@ BattleScript_EffectChargeString: BattleScript_EffectTaunt:: attackcanceler jumpifability BS_TARGET_SIDE, ABILITY_AROMA_VEIL, BattleScript_AromaVeilProtects - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed settaunt BattleScript_ButItFailed attackanimation waitanimation @@ -4109,7 +3803,7 @@ BattleScript_EffectHelpingHand:: BattleScript_EffectTrick:: attackcanceler jumpifsubstituteblocks BattleScript_ButItFailed - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed tryswapitems BattleScript_ButItFailed attackanimation waitanimation @@ -4117,11 +3811,13 @@ BattleScript_EffectTrick:: waitmessage B_WAIT_TIME_LONG printfromtable gItemSwapStringIds waitmessage B_WAIT_TIME_LONG + tryactivateabilitywithabilityshield BS_TARGET, TRUE + tryactivateitem BS_ATTACKER, ACTIVATION_ON_USABLE_AGAIN + tryactivateitem BS_TARGET, ACTIVATION_ON_USABLE_AGAIN goto BattleScript_MoveEnd BattleScript_EffectRolePlay:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON trycopyability BS_ATTACKER, BattleScript_ButItFailed attackanimation waitanimation @@ -4167,41 +3863,24 @@ BattleScript_EffectRecycle:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectBrickBreak:: - attackcanceler - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - removescreens - critcalc - damagecalc - adjustdamage - jumpifbyte CMP_EQUAL, sB_ANIM_TURN, 0, BattleScript_BrickBreakAnim - clearmoveresultflags MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE -BattleScript_BrickBreakAnim:: - attackanimation +BattleScript_BreakScreens:: + playmoveanimation MOVE_NONE @use current move waitanimation - jumpifbyte CMP_LESS_THAN, sB_ANIM_TURN, 2, BattleScript_BrickBreakDoHit printstring STRINGID_THEWALLSHATTERED + return + +BattleScript_StealStats:: + playmoveanimation MOVE_SPECTRAL_THIEF + waitanimation + printstring STRINGID_SPECTRALTHIEFSTEAL waitmessage B_WAIT_TIME_LONG -BattleScript_BrickBreakDoHit:: - typecalc - effectivenesssound - hitanimation BS_TARGET - waitstate - healthbarupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE - datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE - critmessage - waitmessage B_WAIT_TIME_LONG - resultmessage - waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - setadditionaleffects - goto BattleScript_MoveEnd + spectralthiefprintstats + flushtextbox + return BattleScript_EffectYawn:: attackcanceler trynonvolatilestatus - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON setyawn BattleScript_ButItFailed attackanimation waitanimation @@ -4221,19 +3900,8 @@ BattleScript_PrintAbilityMadeIneffective:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectEndeavor:: - attackcanceler - setdamagetohealthdifference BattleScript_ButItFailed - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE - typecalc - jumpifmovehadnoeffect BattleScript_HitFromAtkAnimation - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectSkillSwap:: attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON tryswapabilities BattleScript_ButItFailed attackanimation waitanimation @@ -4313,7 +3981,7 @@ BattleScript_EffectTickle:: jumpifstat BS_TARGET, CMP_GREATER_THAN, STAT_ATK, MIN_STAT_STAGE, BattleScript_TickleDoMoveAnim jumpifstat BS_TARGET, CMP_EQUAL, STAT_DEF, MIN_STAT_STAGE, BattleScript_CantLowerMultipleStats BattleScript_TickleDoMoveAnim:: - accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE + accuracycheck BattleScript_ButItFailed attackanimation waitanimation setstatchanger STAT_ATK, 1, TRUE @@ -4535,6 +4203,7 @@ BattleScript_FaintedMonSendOutNew: jumpifbytenotequal sSHIFT_SWITCHED, sZero, BattleScript_FaintedMonShiftSwitched BattleScript_FaintedMonSendOutNewEnd: switchineffects BS_FAINTED + switchinevents jumpifbattletype BATTLE_TYPE_DOUBLE, BattleScript_FaintedMonEnd cancelallactions BattleScript_FaintedMonEnd:: @@ -4542,6 +4211,7 @@ BattleScript_FaintedMonEnd:: BattleScript_FaintedMonShiftSwitched: copybyte sSAVED_BATTLER, gBattlerTarget switchineffects BS_ATTACKER + switchinevents resetsentmonsvalue copybyte gBattlerTarget, sSAVED_BATTLER goto BattleScript_FaintedMonSendOutNewEnd @@ -4564,12 +4234,17 @@ BattleScript_HandleFaintedMonLoop:: hidepartystatussummary BS_FAINTED switchinanim BS_FAINTED, FALSE, FALSE waitstate + trytrainerslidemsglaston BS_FAINTED switchineffects BS_FAINTED_MULTIPLE_1 jumpifbytenotequal gBattlerFainted, gBattlersCount, BattleScript_HandleFaintedMonLoop BattleScript_HandleFaintedMonMultipleEnd:: - switchineffects BS_FAINTED_MULTIPLE_2 + switchinevents end2 +BattleScript_FirstTurnSwitchInEvents:: + switchinevents + end3 + BattleScript_LocalTrainerBattleWon:: jumpifbattletype BATTLE_TYPE_TWO_OPPONENTS, BattleScript_LocalTwoTrainersDefeated printstring STRINGID_PLAYERDEFEATEDTRAINER1 @@ -4776,11 +4451,11 @@ BattleScript_ActionSwitch:: end2 BattleScript_DoSwitchOut:: - switchoutabilities BS_ATTACKER undodynamax BS_ATTACKER waitstate returnatktoball waitstate + switchoutabilities BS_ATTACKER drawpartystatussummary BS_ATTACKER switchhandleorder BS_ATTACKER, 1 getswitchedmondata BS_ATTACKER @@ -4793,6 +4468,7 @@ BattleScript_DoSwitchOut:: switchinanim BS_ATTACKER, FALSE, FALSE waitstate switchineffects BS_ATTACKER + switchinevents moveendcase MOVEEND_STATUS_IMMUNITY_ABILITIES moveendcase MOVEEND_MIRROR_MOVE end2 @@ -4840,6 +4516,21 @@ BattleScript_LearnedNewMove:: BattleScript_LearnMoveReturn:: return +BattleScript_WeatherAbilityActivates:: + pause B_WAIT_TIME_SHORT + call BattleScript_AbilityPopUp + jumpifability BS_SCRIPTING, ABILITY_SAND_SPIT, BattleScript_SandSpitActivates + printfromtable gAbilityWeatherChangeStringId +BattleScript_WeatherAbilityActivatesContinue: + waitstate + playanimation_var BS_BATTLER_0, sB_ANIM_ARG1 + call BattleScript_ActivateWeatherAbilities + return + +BattleScript_SandSpitActivates:: + printstring STRINGID_ASANDSTORMKICKEDUP + goto BattleScript_WeatherAbilityActivatesContinue + BattleScript_WeatherContinues:: printfromtable gWeatherTurnStringIds waitmessage B_WAIT_TIME_LONG @@ -4902,6 +4593,11 @@ BattleScript_OverworldTerrain:: call BattleScript_ActivateTerrainEffects end3 +BattleScript_OverworldHazard:: + printfromtable gStartingStatusStringIds + waitmessage B_WAIT_TIME_LONG + end3 + BattleScript_SideStatusWoreOff:: printstring STRINGID_PKMNSXWOREOFF waitmessage B_WAIT_TIME_LONG @@ -4936,8 +4632,9 @@ BattleScript_MagicRoomEnds:: printstring STRINGID_MAGICROOMENDS waitmessage B_WAIT_TIME_LONG setbyte gBattlerTarget, 0 + sortbattlers BattleScript_MagicRoomHealingItemsLoop: - copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 + copyarraywithindex gBattlerAttacker, gBattlersBySpeed, gBattlerTarget, 1 tryactivateitem BS_ATTACKER, ACTIVATION_ON_USABLE_AGAIN addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop @@ -5012,6 +4709,7 @@ BattleScript_LeechSeedTurnDrain: healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE tryfaintmon BS_ATTACKER + tryactivateitem BS_ATTACKER, ACTIVATION_ON_HP_THRESHOLD return BattleScript_BideStoringEnergy:: @@ -5024,7 +4722,7 @@ BattleScript_BideAttack:: clearvolatile BS_ATTACKER, VOLATILE_MULTIPLETURNS printstring STRINGID_PKMNUNLEASHEDENERGY waitmessage B_WAIT_TIME_LONG - accuracycheck BattleScript_MoveMissed, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissed typecalc clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE copybidedmg @@ -5039,7 +4737,6 @@ BattleScript_BideAttack:: datahpupdate BS_TARGET, MOVE_DAMAGE_HP_UPDATE resultmessage waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET goto BattleScript_MoveEnd BattleScript_BideNoEnergyToAttack:: @@ -5059,6 +4756,7 @@ BattleScript_RoarSuccessSwitch:: waitstate printstring STRINGID_PKMNWASDRAGGEDOUT switchineffects BS_TARGET + switchinevents jumpifbyte CMP_EQUAL, sSWITCH_CASE, B_SWITCH_RED_CARD, BattleScript_RoarSuccessSwitch_Ret setbyte sSWITCH_CASE, B_SWITCH_NORMAL goto BattleScript_MoveEnd @@ -5081,9 +4779,9 @@ BattleScript_RoarSuccessRet: attackanimation waitanimation BattleScript_RoarSuccessRet_Ret: - switchoutabilities BS_TARGET returntoball BS_TARGET, FALSE waitstate + switchoutabilities BS_TARGET return BattleScript_WeaknessPolicy:: @@ -5189,62 +4887,13 @@ BattleScript_DestinyBondTakesLife:: tryfaintmon BS_ATTACKER return -BattleScript_DmgHazardsOnAttacker:: - healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE - datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE - call BattleScript_PrintHurtByDmgHazards - tryfaintmon BS_ATTACKER - tryfaintmon_spikes BS_ATTACKER, BattleScript_DmgHazardsOnAttackerFainted - return - -BattleScript_DmgHazardsOnAttackerFainted:: - setbyte sGIVEEXP_STATE, 0 - getexp BS_ATTACKER - moveendall - goto BattleScript_HandleFaintedMon - -BattleScript_DmgHazardsOnTarget:: - healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE - datahpupdate BS_TARGET, PASSIVE_HP_UPDATE - call BattleScript_PrintHurtByDmgHazards - tryfaintmon BS_TARGET - tryfaintmon_spikes BS_TARGET, BattleScript_DmgHazardsOnTargetFainted - return - -BattleScript_DmgHazardsOnTargetFainted:: - setbyte sGIVEEXP_STATE, 0 - getexp BS_TARGET - moveendall - goto BattleScript_HandleFaintedMon - -BattleScript_DmgHazardsOnBattlerScripting:: +BattleScript_DmgHazardsOnBattler:: healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE call BattleScript_PrintHurtByDmgHazards tryfaintmon BS_SCRIPTING - tryfaintmon_spikes BS_SCRIPTING, BattleScript_DmgHazardsOnBattlerScriptingFainted return -BattleScript_DmgHazardsOnBattlerScriptingFainted:: - setbyte sGIVEEXP_STATE, 0 - getexp BS_SCRIPTING - moveendall - goto BattleScript_HandleFaintedMon - -BattleScript_DmgHazardsOnFaintedBattler:: - healthbarupdate BS_FAINTED, PASSIVE_HP_UPDATE - datahpupdate BS_FAINTED, PASSIVE_HP_UPDATE - call BattleScript_PrintHurtByDmgHazards - tryfaintmon BS_FAINTED - tryfaintmon_spikes BS_FAINTED, BattleScript_DmgHazardsOnFaintedBattlerFainted - return - -BattleScript_DmgHazardsOnFaintedBattlerFainted:: - setbyte sGIVEEXP_STATE, 0 - getexp BS_FAINTED - moveendall - goto BattleScript_HandleFaintedMon - BattleScript_PrintHurtByDmgHazards:: printfromtable gDmgHazardsStringIds waitmessage B_WAIT_TIME_LONG @@ -5400,7 +5049,7 @@ BattleScript_AngerShellRet: BattleScript_WindPowerActivates:: call BattleScript_AbilityPopUp - setcharge BS_TARGET + setvolatile BS_TARGET, VOLATILE_CHARGE_TIMER, 1 printstring STRINGID_BEINGHITCHARGEDPKMNWITHPOWER waitmessage B_WAIT_TIME_LONG return @@ -5497,13 +5146,9 @@ BattleScript_DefogClearHazards:: BattleScript_MonTookFutureAttack:: printstring STRINGID_PKMNTOOKATTACK waitmessage B_WAIT_TIME_LONG - jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_FUTURE_SIGHT, BattleScript_CheckDoomDesireMiss - accuracycheck BattleScript_FutureAttackMiss, MOVE_FUTURE_SIGHT - goto BattleScript_FutureAttackAnimate -BattleScript_CheckDoomDesireMiss:: - accuracycheck BattleScript_FutureAttackMiss, MOVE_DOOM_DESIRE -BattleScript_FutureAttackAnimate:: - critcalc + futuresighttargetfailure BattleScript_DoFutureAttackResult + jumpifmovehadnoeffect BattleScript_FutureAttackEnd + accuracycheck BattleScript_MoveMissedPause damagecalc adjustdamage jumpifmovehadnoeffect BattleScript_DoFutureAttackResult @@ -5523,21 +5168,14 @@ BattleScript_DoFutureAttackHit:: BattleScript_DoFutureAttackResult: resultmessage waitmessage B_WAIT_TIME_LONG - tryfaintmon BS_TARGET - checkteamslost BattleScript_FutureAttackEnd BattleScript_FutureAttackEnd:: moveendcase MOVEEND_SET_VALUES moveendcase MOVEEND_RAGE moveendcase MOVEEND_ABILITIES - moveendcase MOVEEND_COLOR_CHANGE moveendcase MOVEEND_ITEM_EFFECTS_TARGET moveendfromto MOVEEND_SYMBIOSIS, MOVEEND_UPDATE_LAST_MOVES - goto BattleScript_FutureAttackClearResults -BattleScript_FutureAttackMiss:: - pause B_WAIT_TIME_SHORT - setmoveresultflags MOVE_RESULT_FAILED - resultmessage - waitmessage B_WAIT_TIME_LONG + moveendcase MOVEEND_COLOR_CHANGE + checkteamslost BattleScript_FutureAttackClearResults BattleScript_FutureAttackClearResults: setmoveresultflags 0 clearspecialstatuses @@ -5839,7 +5477,9 @@ BattleScript_MoveEffectClearSmog:: BattleScript_FocusPunchSetUp:: flushtextbox + call BattleScript_SwapFromSubstitute playanimation BS_ATTACKER, B_ANIM_FOCUS_PUNCH_SETUP + call BattleScript_SwapToSubstitute printstring STRINGID_PKMNTIGHTENINGFOCUS waitmessage B_WAIT_TIME_LONG end3 @@ -5875,7 +5515,7 @@ BattleScript_PrimalReversion:: printstring STRINGID_PKMNREVERTEDTOPRIMAL waitmessage B_WAIT_TIME_LONG switchinabilities BS_SCRIPTING - end3 + return BattleScript_PowerConstruct:: flushtextbox @@ -5921,10 +5561,6 @@ BattleScript_BattlerFormChangeNoPopup: handleformchange BS_SCRIPTING, 2 return -BattleScript_BattlerFormChangeEnd3:: - call BattleScript_BattlerFormChange - end3 - BattleScript_BattlerFormChangeEnd3NoPopup:: call BattleScript_BattlerFormChangeNoPopup end2 @@ -5933,7 +5569,7 @@ BattleScript_BattlerFormChangeEnd2:: call BattleScript_BattlerFormChange end2 -BattleScript_BattlerFormChangeWithStringEnd3:: +BattleScript_BattlerFormChangeWithString:: pause 5 call BattleScript_AbilityPopUpScripting flushtextbox @@ -5944,7 +5580,7 @@ BattleScript_BattlerFormChangeWithStringEnd3:: handleformchange BS_SCRIPTING, 2 printstring STRINGID_PKMNTRANSFORMED waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_AttackerFormChangeMoveEffect:: waitmessage 1 @@ -5973,7 +5609,7 @@ BattleScript_CudChewActivates:: end2 BattleScript_ApplyDisguiseFormChangeHPLoss:: - jumpifgenconfiglowerthan GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn + jumpifgenconfiglowerthan CONFIG_DISGUISE_HP_LOSS, GEN_8, BattleScript_ApplyDisguiseFormChangeHPLossReturn healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE BattleScript_ApplyDisguiseFormChangeHPLossReturn: @@ -6013,23 +5649,20 @@ BattleScript_IllusionOffAndTerastallization:: call BattleScript_IllusionOff goto BattleScript_Terastallization -BattleScript_IllusionOffEnd3:: - call BattleScript_IllusionOff - end3 - BattleScript_IllusionOff:: - setspriteignore0hp TRUE + call BattleScript_SwapFromSubstitute playanimation BS_SCRIPTING, B_ANIM_ILLUSION_OFF waitanimation + call BattleScript_SwapToSubstitute updatenick waitstate - setspriteignore0hp FALSE printstring STRINGID_ILLUSIONWOREOFF waitmessage B_WAIT_TIME_LONG return BattleScript_CottonDownActivates:: - copybyte sSAVED_BATTLER, gBattlerAttacker + saveattacker + savetarget call BattleScript_AbilityPopUpTarget copybyte gEffectBattler, gBattlerTarget swapattackerwithtarget @@ -6050,7 +5683,8 @@ BattleScript_CottonDownLoopIncrement: addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_CottonDownLoop swapattackerwithtarget - copybyte gBattlerAttacker, sSAVED_BATTLER + restoreattacker + restoretarget return BattleScript_AnticipationActivates:: @@ -6173,20 +5807,18 @@ BattleScript_MoveUsedIsParalyzed:: BattleScript_PowderMoveNoEffect:: pause B_WAIT_TIME_SHORT - jumpiftype BS_TARGET, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint - jumpifability BS_TARGET, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat - setlastuseditem BS_TARGET + jumpiftype BS_SCRIPTING, TYPE_GRASS, BattleScript_PowderMoveNoEffectPrint + jumpifability BS_SCRIPTING, ABILITY_OVERCOAT, BattleScript_PowderMoveNoEffectOvercoat + setlastuseditem BS_SCRIPTING printstring STRINGID_SAFETYGOGGLESPROTECTED goto BattleScript_PowderMoveNoEffectWaitMsg BattleScript_PowderMoveNoEffectOvercoat: - call BattleScript_AbilityPopUpTarget + call BattleScript_AbilityPopUp BattleScript_PowderMoveNoEffectPrint: - printstring STRINGID_ITDOESNTAFFECT + printstring STRINGID_SCR_ITDOESNTAFFECT BattleScript_PowderMoveNoEffectWaitMsg: waitmessage B_WAIT_TIME_LONG - cancelmultiturnmoves - setmoveresultflags MOVE_RESULT_FAILED - goto BattleScript_MoveEnd + return BattleScript_MoveUsedFlinched:: printstring STRINGID_PKMNFLINCHED @@ -6214,10 +5846,17 @@ BattleScript_PrintUproarOverTurns:: BattleScript_ThrashConfuses:: volatileanimation BS_ATTACKER, VOLATILE_CONFUSION + copybyte sBATTLER, gBattlerAttacker printstring STRINGID_PKMNFATIGUECONFUSION waitmessage B_WAIT_TIME_LONG end2 +BattleScript_ThrashConfusesRet:: + volatileanimation BS_SCRIPTING, VOLATILE_CONFUSION + printstring STRINGID_PKMNFATIGUECONFUSION + waitmessage B_WAIT_TIME_LONG + return + BattleScript_MoveUsedIsConfused:: printstring STRINGID_PKMNISCONFUSED waitmessage B_WAIT_TIME_LONG @@ -6342,6 +5981,7 @@ BattleScript_YawnMakesAsleepEnd2:: waitmessage B_WAIT_TIME_LONG updatestatusicon BS_EFFECT_BATTLER waitstate + tryactivateitem BS_EFFECT_BATTLER, ACTIVATION_ON_STATUS_CHANGE jumpfifsemiinvulnerable BS_EFFECT_BATTLER, STATE_SKY_DROP, BattleScript_YawnEnd makevisible BS_EFFECT_BATTLER skydropyawn @@ -6445,17 +6085,9 @@ BattleScript_ItemSteal:: playanimation BS_EFFECT_BATTLER, B_ANIM_ITEM_STEAL printstring STRINGID_PKMNSTOLEITEM waitmessage B_WAIT_TIME_LONG + tryactivateabilitywithabilityshield BS_ATTACKER, FALSE return -BattleScript_DrizzleActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PKMNMADEITRAIN - waitstate - playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - BattleScript_AbilityRaisesDefenderStat:: pause B_WAIT_TIME_SHORT statbuffchange BS_TARGET, STAT_CHANGE_ONLY_CHECKING, BattleScript_AbilityCantRaiseDefenderStat @@ -6536,11 +6168,16 @@ BattleScript_EmergencyExit:: pause B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN waitanimation + jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_EmergencyExitTrainer + setteleportoutcome BS_SCRIPTING + finishaction + return +BattleScript_EmergencyExitTrainer: openpartyscreen BS_SCRIPTING, BattleScript_EmergencyExitRet - switchoutabilities BS_SCRIPTING waitstate - switchhandleorder BS_SCRIPTING, 2 returntoball BS_SCRIPTING, FALSE + switchoutabilities BS_SCRIPTING + switchhandleorder BS_SCRIPTING, 2 getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING hpthresholds BS_SCRIPTING @@ -6548,48 +6185,12 @@ BattleScript_EmergencyExit:: switchinanim BS_SCRIPTING, FALSE, TRUE waitstate switchineffects BS_SCRIPTING + switchinevents BattleScript_EmergencyExitRet: return -BattleScript_EmergencyExitWild:: - pause 5 - call BattleScript_AbilityPopUpScripting - pause B_WAIT_TIME_LONG - playanimation BS_SCRIPTING, B_ANIM_SLIDE_OFFSCREEN - waitanimation - setteleportoutcome BS_SCRIPTING - finishaction - return - BattleScript_EmergencyExitEnd2:: - pause 5 - call BattleScript_AbilityPopUp - pause B_WAIT_TIME_LONG - playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN - waitanimation - openpartyscreen BS_ATTACKER, BattleScript_EmergencyExitRetEnd2 - switchoutabilities BS_ATTACKER - waitstate - switchhandleorder BS_ATTACKER, 2 - returntoball BS_ATTACKER, FALSE - getswitchedmondata BS_ATTACKER - switchindataupdate BS_ATTACKER - hpthresholds BS_ATTACKER - printstring STRINGID_SWITCHINMON - switchinanim BS_ATTACKER, FALSE, TRUE - waitstate - switchineffects BS_ATTACKER -BattleScript_EmergencyExitRetEnd2: - end2 - -BattleScript_EmergencyExitWildEnd2:: - pause 5 - call BattleScript_AbilityPopUp - pause B_WAIT_TIME_LONG - playanimation BS_ATTACKER, B_ANIM_SLIDE_OFFSCREEN - waitanimation - setteleportoutcome BS_ATTACKER - finishaction + call BattleScript_EmergencyExit end2 BattleScript_TraceActivates:: @@ -6599,7 +6200,7 @@ BattleScript_TraceActivates:: waitmessage B_WAIT_TIME_LONG settracedability BS_SCRIPTING switchinabilities BS_SCRIPTING - end3 + return BattleScript_ReceiverActivates:: call BattleScript_AbilityPopUp @@ -6665,24 +6266,6 @@ BattleScript_HealerActivates:: waitmessage B_WAIT_TIME_LONG end2 -BattleScript_SandstreamActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PKMNSXWHIPPEDUPSANDSTORM - waitstate - playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - -BattleScript_SandSpitActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_ASANDSTORMKICKEDUP - waitstate - playanimation BS_BATTLER_0, B_ANIM_SANDSTORM_CONTINUES - call BattleScript_ActivateWeatherAbilities - return - BattleScript_ShedSkinActivates:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXCUREDYPROBLEM @@ -6695,8 +6278,9 @@ BattleScript_ActivateWeatherAbilities: savetarget tryboosterenergy ON_WEATHER setbyte gBattlerAttacker, 0 + sortbattlers BattleScript_ActivateWeatherAbilities_Loop: - copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 + copyarraywithindex gBattlerTarget, gBattlersBySpeed, gBattlerAttacker, 1 activateweatherchangeabilities BS_TARGET addbyte gBattlerAttacker, 1 jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateWeatherAbilities_Loop @@ -6749,7 +6333,7 @@ BattleScript_IntimidateLoopIncrement: restoretarget restoreattacker pause B_WAIT_TIME_MED - end3 + return BattleScript_IntimidatePrevented:: copybyte sBATTLER, gBattlerTarget @@ -6801,60 +6385,25 @@ BattleScript_SupersweetSyrupLoopIncrement: restoretarget restoreattacker pause B_WAIT_TIME_MED - end3 + return BattleScript_SupersweetSyrupWontDecrease: printstring STRINGID_STATSWONTDECREASE goto BattleScript_SupersweetSyrupEffect_WaitString -BattleScript_DroughtActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_PKMNSXINTENSIFIEDSUN - waitstate - playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - -BattleScript_DesolateLandActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_EXTREMELYHARSHSUNLIGHT - waitstate - playanimation BS_BATTLER_0, B_ANIM_SUN_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - BattleScript_PrimalWeatherBlocksMove:: pause B_WAIT_TIME_SHORT printfromtable gPrimalWeatherBlocksStringIds waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_PrimordialSeaActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_HEAVYRAIN - waitstate - playanimation BS_BATTLER_0, B_ANIM_RAIN_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - -BattleScript_DeltaStreamActivates:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_MYSTERIOUSAIRCURRENT - waitstate - playanimation BS_ATTACKER, B_ANIM_STRONG_WINDS - end3 - BattleScript_ProtosynthesisActivates:: call BattleScript_AbilityPopUpScripting printstring STRINGID_SUNLIGHTACTIVATEDABILITY waitmessage B_WAIT_TIME_MED printstring STRINGID_STATWASHEIGHTENED waitmessage B_WAIT_TIME_MED - end3 + return BattleScript_QuarkDriveActivates:: call BattleScript_AbilityPopUp @@ -6862,34 +6411,34 @@ BattleScript_QuarkDriveActivates:: waitmessage B_WAIT_TIME_MED printstring STRINGID_STATWASHEIGHTENED waitmessage B_WAIT_TIME_MED - end3 + return BattleScript_RuinAbilityActivates:: call BattleScript_AbilityPopUp printstring STRINGID_ABILITYWEAKENEDSURROUNDINGMONSSTAT waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_SupremeOverlordActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_ATTACKERGAINEDSTRENGTHFROMTHEFALLEN waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_CostarActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNCOPIEDSTATCHANGES waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_ZeroToHeroActivates:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUpScripting printstring STRINGID_ZEROTOHEROTRANSFORMATION waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_CommanderActivates:: pause B_WAIT_TIME_SHORT @@ -6928,7 +6477,7 @@ BattleScript_CommanderSpeedIncrease: waitmessage B_WAIT_TIME_LONG BattleScript_CommanderEnd: restoreattacker - end3 + return BattleScript_HospitalityActivates:: pause B_WAIT_TIME_SHORT @@ -6938,7 +6487,7 @@ BattleScript_HospitalityActivates:: playanimation BS_EFFECT_BATTLER, B_ANIM_SIMPLE_HEAL healthbarupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE datahpupdate BS_EFFECT_BATTLER, PASSIVE_HP_UPDATE - end3 + return BattleScript_AttackWeakenedByStrongWinds:: pause B_WAIT_TIME_SHORT @@ -6951,25 +6500,7 @@ BattleScript_MimicryActivates:: call BattleScript_AbilityPopUp printstring STRINGID_BATTLERTYPECHANGEDTO waitmessage B_WAIT_TIME_SHORT - end3 - -BattleScript_SnowWarningActivatesHail:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_SNOWWARNINGHAIL - waitstate - playanimation BS_BATTLER_0, B_ANIM_HAIL_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 - -BattleScript_SnowWarningActivatesSnow:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUp - printstring STRINGID_SNOWWARNINGSNOW - waitstate - playanimation BS_BATTLER_0, B_ANIM_SNOW_CONTINUES - call BattleScript_ActivateWeatherAbilities - end3 + return BattleScript_ActivateTerrainEffects: saveattacker @@ -6977,8 +6508,9 @@ BattleScript_ActivateTerrainEffects: tryboosterenergy ON_TERRAIN resetterrainabilityflags setbyte gBattlerAttacker, 0 + sortbattlers BattleScript_ActivateTerrainSeed: - copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 + copyarraywithindex gBattlerTarget, gBattlersBySpeed, gBattlerAttacker, 1 tryterrainseed BS_TARGET, BattleScript_ActivateTerrainAbility removeitem BS_TARGET BattleScript_ActivateTerrainAbility: @@ -6996,7 +6528,7 @@ BattleScript_ElectricSurgeActivates:: waitmessage B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects - end3 + return BattleScript_MistySurgeActivates:: pause B_WAIT_TIME_SHORT @@ -7005,7 +6537,7 @@ BattleScript_MistySurgeActivates:: waitmessage B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects - end3 + return BattleScript_GrassySurgeActivates:: pause B_WAIT_TIME_SHORT @@ -7014,7 +6546,7 @@ BattleScript_GrassySurgeActivates:: waitmessage B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects - end3 + return BattleScript_PsychicSurgeActivates:: pause B_WAIT_TIME_SHORT @@ -7023,7 +6555,7 @@ BattleScript_PsychicSurgeActivates:: waitmessage B_WAIT_TIME_LONG playanimation BS_SCRIPTING, B_ANIM_RESTORE_BG call BattleScript_ActivateTerrainEffects - end3 + return BattleScript_BadDreamsActivates:: setbyte gBattlerTarget, 0 @@ -7085,42 +6617,35 @@ BattleScript_DampStopsExplosion:: BattleScript_MoveHPDrain:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - healthbarupdate BS_TARGET, PASSIVE_HP_UPDATE - datahpupdate BS_TARGET, PASSIVE_HP_UPDATE + healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE + datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE printstring STRINGID_PKMNRESTOREDHPUSING waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE - goto BattleScript_MoveEnd + return BattleScript_MoveStatDrain:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp - statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont -.if B_ABSORBING_ABILITY_STRING >= GEN_5 - printfromtable gStatUpStringIds + statbuffchange BS_SCRIPTING, STAT_CHANGE_ALLOW_PTR, BattleScript_MoveStatDrain_Cont + printstring STRINGID_SCRIPTINGSTATROSE waitmessage B_WAIT_TIME_LONG -.else - printstring STRINGID_TARGETABILITYSTATRAISE - waitmessage B_WAIT_TIME_LONG -.endif BattleScript_MoveStatDrain_Cont: clearsemiinvulnerablebit - goto BattleScript_MoveEnd + return BattleScript_MonMadeMoveUseless:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXMADEYUSELESS waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE - goto BattleScript_MoveEnd + return BattleScript_FlashFireBoost:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp printfromtable gFlashFireStringIds waitmessage B_WAIT_TIME_LONG - goto BattleScript_MoveEnd + return BattleScript_AbilityPreventsPhasingOut:: call BattleScript_AbilityPreventsPhasingOutRet @@ -7173,8 +6698,7 @@ BattleScript_SoundproofProtected:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSXBLOCKSY waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_DOESNT_AFFECT_FOE - goto BattleScript_MoveEnd + return BattleScript_IceFaceNullsDamage:: call BattleScript_TargetFormChangeWithString @@ -7191,8 +6715,7 @@ BattleScript_MoveUsedPsychicTerrainPrevents:: pause B_WAIT_TIME_SHORT printstring STRINGID_PSYCHICTERRAINPREVENTS waitmessage B_WAIT_TIME_LONG - setmoveresultflags MOVE_RESULT_NO_EFFECT - goto BattleScript_MoveEnd + return BattleScript_GrassyTerrainHeals:: printstring STRINGID_GRASSYTERRAINHEALS @@ -7217,6 +6740,7 @@ BattleScript_StickyHoldActivates:: BattleScript_StickyHoldActivatesRet:: pause B_WAIT_TIME_SHORT call BattleScript_AbilityPopUp + copybyte sBATTLER, gBattlerAbility printstring STRINGID_PKMNSXMADEYINEFFECTIVE waitmessage B_WAIT_TIME_LONG return @@ -7304,7 +6828,7 @@ BattleScript_BattlerAbilityStatRaiseOnSwitchIn:: printstring STRINGID_SCRIPTINGABILITYSTATRAISE waitmessage B_WAIT_TIME_LONG BattleScript_BattlerAbilityStatRaiseOnSwitchInRet: - end3 + return BattleScript_ScriptingAbilityStatRaise:: copybyte gBattlerAbility, sBATTLER @@ -7333,7 +6857,7 @@ BattleScript_WeakArmorDefPrintString: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesSpeed: - jumpifgenconfiglowerthan GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 + jumpifgenconfiglowerthan CONFIG_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 setstatchanger STAT_SPEED, 2, FALSE goto BattleScript_WeakArmorDoSpeed BattleScript_WeakArmorSetSpeedGen6: @@ -7383,7 +6907,7 @@ BattleScript_FellStingerRaisesAtkEnd: BattleScript_AttackerAbilityStatRaiseEnd3:: call BattleScript_AttackerAbilityStatRaise restoreattacker - end3 + return BattleScript_AttackerAbilityStatRaiseEnd2:: call BattleScript_AttackerAbilityStatRaise @@ -7391,12 +6915,6 @@ BattleScript_AttackerAbilityStatRaiseEnd2:: end2 BattleScript_SwitchInAbilityMsg:: - call BattleScript_AbilityPopUp - printfromtable gSwitchInAbilityStringIds - waitmessage B_WAIT_TIME_LONG - end3 - -BattleScript_SwitchInAbilityMsgRet:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds waitmessage B_WAIT_TIME_LONG @@ -7412,7 +6930,7 @@ BattleScript_ActivateAsOne:: call BattleScript_AbilityPopUp printfromtable gSwitchInAbilityStringIds waitmessage B_WAIT_TIME_LONG - end3 + return BattleScript_FriskMsgWithPopup:: copybyte gBattlerAbility, gBattlerAttacker @@ -7429,7 +6947,7 @@ BattleScript_FriskActivates:: tryfriskmessage restoreattacker restoretarget - end3 + return BattleScript_ImposterActivates:: call BattleScript_AbilityPopUp @@ -7440,7 +6958,7 @@ BattleScript_ImposterActivates:: waitmessage B_WAIT_TIME_LONG restoreattacker restoretarget - end3 + return BattleScript_HurtAttacker: healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE @@ -7574,13 +7092,6 @@ BattleScript_AbilityCuredStatus:: updatestatusicon BS_SCRIPTING return -BattleScript_AbilityCuredStatusEnd3:: - call BattleScript_AbilityPopUp - printstring STRINGID_PKMNSXCUREDITSYPROBLEM - waitmessage B_WAIT_TIME_LONG - updatestatusicon BS_SCRIPTING - end3 - BattleScript_BattlerShookOffTaunt:: call BattleScript_AbilityPopUp printstring STRINGID_PKMNSHOOKOFFTHETAUNT @@ -7638,10 +7149,6 @@ BattleScript_SubstituteFade:: printstring STRINGID_PKMNSUBSTITUTEFADED return -BattleScript_BerryCureStatusEnd2:: - call BattleScript_BerryCureStatusRet - end2 - BattleScript_BerryCureStatusRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printfromtable CureStatusBerryEffectStringID @@ -7653,7 +7160,6 @@ BattleScript_BerryCureStatusRet:: BattleScript_GemActivates:: playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT waitanimation - setlastuseditem BS_ATTACKER printstring STRINGID_GEMACTIVATES waitmessage B_WAIT_TIME_LONG removeitem BS_ATTACKER @@ -7662,16 +7168,11 @@ BattleScript_GemActivates:: BattleScript_BerryReduceDmg:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT waitanimation - setlastuseditem BS_SCRIPTING printstring STRINGID_BERRYDMGREDUCES waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING return -BattleScript_BerryCureConfusionEnd2:: - call BattleScript_BerryCureConfusionRet - end2 - BattleScript_BerryCureConfusionRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNSITEMSNAPPEDOUT @@ -7702,7 +7203,7 @@ BattleScript_WhiteHerbRet:: removeitem BS_SCRIPTING return -BattleScript_ItemHealHP_RemoveItemRet:: +BattleScript_ItemHealHP_RemoveItem:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp goto BattleScript_ItemHealHP_RemoveItemRet_Anim BattleScript_ItemHealHP_RemoveItemRet_AbilityPopUp: @@ -7716,21 +7217,7 @@ BattleScript_ItemHealHP_RemoveItemRet_Anim: removeitem BS_SCRIPTING return -BattleScript_ItemHealHP_RemoveItemEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp - goto BattleScript_ItemHealHP_RemoveItemEnd2_Anim -BattleScript_ItemHealHP_RemoveItemEnd2_AbilityPopUp: - call BattleScript_AbilityPopUpScripting -BattleScript_ItemHealHP_RemoveItemEnd2_Anim: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMRESTOREDHEALTH - waitmessage B_WAIT_TIME_LONG - healthbarupdate BS_ATTACKER, PASSIVE_HP_UPDATE - datahpupdate BS_ATTACKER, PASSIVE_HP_UPDATE - removeitem BS_ATTACKER - end2 - -BattleScript_BerryPPHealRet:: +BattleScript_BerryPPHeal:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryPPHeal_AbilityPopup goto BattleScript_BerryPPHeal_Anim BattleScript_BerryPPHeal_AbilityPopup: @@ -7742,19 +7229,10 @@ BattleScript_BerryPPHeal_Anim: removeitem BS_SCRIPTING return -BattleScript_BerryPPHealEnd2:: - call BattleScript_BerryPPHealRet - end2 - BattleScript_ItemHealHP_End2:: call BattleScript_ItemHealHP_Ret end2 -BattleScript_AirBalloonMsgIn:: - printstring STRINGID_AIRBALLOONFLOAT - waitmessage B_WAIT_TIME_LONG - end3 - BattleScript_AirBalloonMsgInRet:: printstring STRINGID_AIRBALLOONFLOAT waitmessage B_WAIT_TIME_LONG @@ -7829,22 +7307,7 @@ BattleScript_HangedOnMsg:: BattleScript_HangedOnMsgRet: return -BattleScript_BerryConfuseHealEnd2:: - jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryConfuseHealEnd2_AbilityPopup - goto BattleScript_BerryConfuseHealEnd2_Anim -BattleScript_BerryConfuseHealEnd2_AbilityPopup: - call BattleScript_AbilityPopUp -BattleScript_BerryConfuseHealEnd2_Anim: - playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_PKMNSITEMRESTOREDHEALTH - waitmessage B_WAIT_TIME_LONG - healthbarupdate BS_SCRIPTING, PASSIVE_HP_UPDATE - datahpupdate BS_SCRIPTING, PASSIVE_HP_UPDATE - seteffectprimary BS_SCRIPTING, BS_SCRIPTING, MOVE_EFFECT_CONFUSION - removeitem BS_SCRIPTING - end2 - -BattleScript_BerryConfuseHealRet:: +BattleScript_BerryConfuseHeal:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryConfuseHealRet_AbilityPopup goto BattleScript_BerryConfuseHealRet_Anim BattleScript_BerryConfuseHealRet_AbilityPopup: @@ -7859,10 +7322,6 @@ BattleScript_BerryConfuseHealRet_Anim: removeitem BS_SCRIPTING return -BattleScript_ConsumableStatRaiseEnd2:: - call BattleScript_ConsumableStatRaiseRet - end2 - BattleScript_ConsumableStatRaiseRet:: jumpifnotberry BS_SCRIPTING, BattleScript_ConsumableStatRaiseRet_Anim jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ConsumableStatRaiseRet_AbilityPopup @@ -7882,17 +7341,13 @@ BattleScript_ConsumableStatRaiseRet_Anim: BattleScript_ConsumableStatRaiseRet_End: return -BattleScript_BerryFocusEnergyRet:: +BattleScript_BerryFocusEnergy:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT printstring STRINGID_PKMNUSEDXTOGETPUMPED waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING return -BattleScript_BerryFocusEnergyEnd2:: - call BattleScript_BerryFocusEnergyRet - end2 - BattleScript_ActionSelectionItemsCantBeUsed:: printselectionstring STRINGID_ITEMSCANTBEUSEDNOW endselectionscript @@ -7923,7 +7378,7 @@ BattleScript_FlushMessageBox:: @ playse SE_ARENA_TIMEUP1 @ drawarenareftextbox @ arenajudgmentstring B_MSG_REF_COMMENCE_BATTLE -@ arenawaitmessage B_MSG_REF_COMMENCE_BATTLE +@ arenawaitmessage @ pause B_WAIT_TIME_LONG @ erasearenareftextbox @ volumeup @@ -7941,26 +7396,26 @@ BattleScript_FlushMessageBox:: @ pause B_WAIT_TIME_LONG @ drawarenareftextbox @ arenajudgmentstring B_MSG_REF_THATS_IT -@ arenawaitmessage B_MSG_REF_THATS_IT +@ arenawaitmessage @ pause B_WAIT_TIME_LONG @ setbyte gBattleCommunication, 0 @ Reset state for arenajudgmentwindow @ arenajudgmentwindow @ pause B_WAIT_TIME_LONG @ arenajudgmentwindow @ arenajudgmentstring B_MSG_REF_JUDGE_MIND -@ arenawaitmessage B_MSG_REF_JUDGE_MIND +@ arenawaitmessage @ arenajudgmentwindow @ arenajudgmentstring B_MSG_REF_JUDGE_SKILL -@ arenawaitmessage B_MSG_REF_JUDGE_SKILL +@ arenawaitmessage @ arenajudgmentwindow @ arenajudgmentstring B_MSG_REF_JUDGE_BODY -@ arenawaitmessage B_MSG_REF_JUDGE_BODY +@ arenawaitmessage @ arenajudgmentwindow @ jumpifbyte CMP_EQUAL, gBattleCommunication + 1, ARENA_RESULT_PLAYER_LOST, BattleScript_ArenaJudgmentPlayerLoses @ jumpifbyte CMP_EQUAL, gBattleCommunication + 1, ARENA_RESULT_TIE, BattleScript_ArenaJudgmentDraw @@ ARENA_RESULT_PLAYER_WON @ arenajudgmentstring B_MSG_REF_PLAYER_WON -@ arenawaitmessage B_MSG_REF_PLAYER_WON +@ arenawaitmessage @ arenajudgmentwindow @ erasearenareftextbox @ printstring STRINGID_DEFEATEDOPPONENTBYREFEREE @@ -7975,7 +7430,7 @@ BattleScript_FlushMessageBox:: @ @BattleScript_ArenaJudgmentPlayerLoses: @ arenajudgmentstring B_MSG_REF_OPPONENT_WON -@ arenawaitmessage B_MSG_REF_OPPONENT_WON +@ arenawaitmessage @ arenajudgmentwindow @ erasearenareftextbox @ printstring STRINGID_LOSTTOOPPONENTBYREFEREE @@ -7990,11 +7445,12 @@ BattleScript_FlushMessageBox:: @ @BattleScript_ArenaJudgmentDraw: @ arenajudgmentstring B_MSG_REF_DRAW -@ arenawaitmessage B_MSG_REF_DRAW +@ arenawaitmessage @ arenajudgmentwindow @ erasearenareftextbox @ printstring STRINGID_TIEDOPPONENTBYREFEREE @ waitmessage B_WAIT_TIME_LONG +@ arenabothmonslost @ playfaintcry BS_PLAYER1 @ waitcry @ dofaintanimation BS_PLAYER1 @@ -8005,7 +7461,6 @@ BattleScript_FlushMessageBox:: @ dofaintanimation BS_OPPONENT1 @ cleareffectsonfaint BS_OPPONENT1 @ waitanimation -@ arenabothmonslost @ end2 BattleScript_AskIfWantsToForfeitMatch:: @@ -8063,10 +7518,6 @@ BattleScript_OpportunistCopyStatChangeEnd: setbyte sSTAT_ANIM_PLAYED, FALSE return -BattleScript_OpportunistCopyStatChangeEnd3:: - call BattleScript_OpportunistCopyStatChange - end3 - BattleScript_TotemVar:: call BattleScript_TotemVar_Ret end2 @@ -8087,14 +7538,14 @@ BattleScript_AnnounceAirLockCloudNine:: printstring STRINGID_AIRLOCKACTIVATES waitmessage B_WAIT_TIME_LONG call BattleScript_ActivateWeatherAbilities - end3 + return BattleScript_ActivateTeraformZero:: call BattleScript_AbilityPopUp waitmessage B_WAIT_TIME_LONG jumpifhalfword CMP_COMMON_BITS, gBattleWeather, B_WEATHER_ANY, BattleScript_ActivateTeraformZero_RemoveWeather jumpifhalfword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_TERRAIN_ANY, BattleScript_ActivateTeraformZero_RemoveTerrain - goto BattleScript_ActivateTeraformZero_End + goto BattleScript_ActivateTeraformZero_Ret BattleScript_ActivateTeraformZero_RemoveWeather: removeweather printfromtable gWeatherEndsStringIds @@ -8112,16 +7563,17 @@ BattleScript_ActivateTeraformZeroEffects: tryboosterenergy ON_ANY resetterrainabilityflags setbyte gBattlerAttacker, 0 + sortbattlers BattleScript_ActivateTeraformZeroLoop: - copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 + copyarraywithindex gBattlerTarget, gBattlersBySpeed, gBattlerAttacker, 1 activateterrainchangeabilities BS_TARGET activateweatherchangeabilities BS_TARGET addbyte gBattlerAttacker, 1 jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateTeraformZeroLoop restoreattacker restoretarget -BattleScript_ActivateTeraformZero_End: - end3 +BattleScript_ActivateTeraformZero_Ret: + return BattleScript_QuickClawActivation:: flushtextbox @@ -8147,19 +7599,7 @@ BattleScript_CustapBerryActivation:: removeitem BS_ATTACKER end2 -BattleScript_MicleBerryActivateEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_MicleBerryActivateEnd2_Ripen - goto BattleScript_MicleBerryActivateEnd2_Anim -BattleScript_MicleBerryActivateEnd2_Ripen: - call BattleScript_AbilityPopUp -BattleScript_MicleBerryActivateEnd2_Anim: - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT - printstring STRINGID_MICLEBERRYACTIVATES - waitmessage B_WAIT_TIME_LONG - removeitem BS_ATTACKER - end2 - -BattleScript_MicleBerryActivateRet:: +BattleScript_MicleBerryActivate:: jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_MicleBerryActivateRet_Ripen goto BattleScript_MicleBerryActivateRet_Anim BattleScript_MicleBerryActivateRet_Ripen: @@ -8327,16 +7767,12 @@ BattleScript_RedCardActivates:: setbyte sSWITCH_CASE, B_SWITCH_RED_CARD forcerandomswitch BattleScript_RedCardEnd @ changes the current battle script. the rest happens in BattleScript_RoarSuccessSwitch_Ret, if switch is successful -BattleScript_RedCardEnd: - return BattleScript_RedCardIngrain: printstring STRINGID_PKMNANCHOREDITSELF BattleScript_RedCardIngrainContinue: waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING - restoretarget - restoreattacker - return + goto BattleScript_RedCardEnd BattleScript_RedCardSuctionCups: printstring STRINGID_PKMNANCHORSITSELFWITH goto BattleScript_RedCardIngrainContinue @@ -8344,6 +7780,11 @@ BattleScript_RedCardDynamaxed: printstring STRINGID_MOVEBLOCKEDBYDYNAMAX goto BattleScript_RedCardIngrainContinue +BattleScript_RedCardEnd: + restoretarget + restoreattacker + return + BattleScript_EjectButtonActivates:: makevisible BS_ATTACKER playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT @@ -8353,12 +7794,12 @@ BattleScript_EjectButtonActivates:: undodynamax BS_SCRIPTING makeinvisible BS_SCRIPTING openpartyscreen BS_SCRIPTING, BattleScript_EjectButtonEnd + waitstate + returntoball BS_SCRIPTING, FALSE copybyte sSAVED_BATTLER, sBATTLER switchoutabilities BS_SCRIPTING copybyte sBATTLER, sSAVED_BATTLER - waitstate switchhandleorder BS_SCRIPTING, 0x2 - returntoball BS_SCRIPTING, FALSE getswitchedmondata BS_SCRIPTING switchindataupdate BS_SCRIPTING hpthresholds BS_SCRIPTING @@ -8368,6 +7809,7 @@ BattleScript_EjectButtonActivates:: switchinanim BS_SCRIPTING, FALSE, TRUE waitstate switchineffects BS_SCRIPTING + switchinevents BattleScript_EjectButtonEnd: return @@ -8378,10 +7820,6 @@ BattleScript_EjectPackActivate_End2:: call BattleScript_EjectPackActivate_Ret end2 -BattleScript_EjectPackActivate_End3:: - call BattleScript_EjectPackActivate_Ret - end3 - BattleScript_EjectPackActivates:: jumpifcantswitch BS_SCRIPTING, BattleScript_EjectButtonEnd goto BattleScript_EjectPackActivate_Ret @@ -8393,28 +7831,18 @@ BattleScript_DoesntAffectTargetAtkString:: setmoveresultflags MOVE_RESULT_NO_EFFECT goto BattleScript_MoveEnd -BattleScript_WellBakedBodyActivates:: +BattleScript_DoesntAffectScripting:: pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUpTarget - setmoveresultflags MOVE_RESULT_NO_EFFECT - modifybattlerstatstage BS_TARGET, STAT_DEF, INCREASE, 1, BattleScript_WellBakedBodyEnd, ANIM_ON -BattleScript_WellBakedBodyEnd: - goto BattleScript_MoveEnd - -BattleScript_WindRiderActivatesMoveEnd:: - pause B_WAIT_TIME_SHORT - call BattleScript_AbilityPopUpTarget - setmoveresultflags MOVE_RESULT_NO_EFFECT - modifybattlerstatstage BS_TARGET, STAT_ATK, INCREASE, 1, BattleScript_WindRiderActivatesMoveEnd_End, ANIM_ON -BattleScript_WindRiderActivatesMoveEnd_End: - goto BattleScript_MoveEnd + printstring STRINGID_SCR_ITDOESNTAFFECT + waitmessage B_WAIT_TIME_LONG + return BattleScript_GoodAsGoldActivates:: - call BattleScript_AbilityPopUpTarget + call BattleScript_AbilityPopUp pause B_WAIT_TIME_SHORT - printstring STRINGID_ITDOESNTAFFECT + printstring STRINGID_SCR_ITDOESNTAFFECT waitmessage B_WAIT_TIME_MED - goto BattleScript_MoveEnd + return BattleScript_PastelVeilActivates:: setbyte gBattleCommunication, 0 @@ -8439,7 +7867,7 @@ BattleScript_PastelVeilLoopIncrement: goto BattleScript_PastelVeilEnd BattleScript_PastelVeilEnd: restoretarget - end3 + return BattleScript_NeutralizingGasExits:: saveattacker @@ -8448,10 +7876,10 @@ BattleScript_NeutralizingGasExits:: printstring STRINGID_NEUTRALIZINGGASOVER waitmessage B_WAIT_TIME_LONG setbyte gBattlerAttacker, 0 + sortbattlers BattleScript_NeutralizingGasExitsLoop: - copyarraywithindex gBattlerTarget, gBattlerByTurnOrder, gBattlerAttacker, 1 - jumpifabilitycantbesuppressed BS_TARGET, BattleScript_NeutralizingGasExitsLoopIncrement - jumpifability BS_TARGET, ABILITY_IMPOSTER, BattleScript_NeutralizingGasExitsLoopIncrement @ Imposter only activates when first entering the field + copyarraywithindex gBattlerTarget, gBattlersBySpeed, gBattlerAttacker, 1 + jumpifabilitycantbereactivated BS_TARGET, BattleScript_NeutralizingGasExitsLoopIncrement saveattacker switchinabilities BS_TARGET restoreattacker @@ -8471,6 +7899,7 @@ BattleScript_SymbiosisActivates:: call BattleScript_AbilityPopUp printstring STRINGID_SYMBIOSISITEMPASS waitmessage B_WAIT_TIME_LONG + tryactivateabilitywithabilityshield BS_EFFECT_BATTLER, FALSE return BattleScript_TargetAbilityStatRaiseRet:: @@ -8483,17 +7912,13 @@ BattleScript_TargetAbilityStatRaiseRet_End: restoreattacker return -@@@ MAX MOVES @@@ -BattleScript_EffectMaxMove:: - attackcanceler - accuracycheck BattleScript_ButItFailed, NO_ACC_CALC_CHECK_LOCK_ON - goto BattleScript_HitFromAtkString - BattleScript_EffectRaiseStatAllies:: savetarget copybyte gBattlerTarget, gBattlerAttacker + copybyte sSAVED_STAT_CHANGER, sSTATCHANGER BattleScript_RaiseSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_RaiseSideStatsIncrement + copybyte sSTATCHANGER, sSAVED_STAT_CHANGER statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_RaiseSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_RaiseSideStatsIncrement printfromtable gStatUpStringIds @@ -8508,8 +7933,10 @@ BattleScript_RaiseSideStatsEnd: BattleScript_EffectLowerStatFoes:: savetarget copybyte sBATTLER, gBattlerTarget + copybyte sSAVED_STAT_CHANGER, sSTATCHANGER BattleScript_LowerSideStatsLoop: jumpifabsent BS_TARGET, BattleScript_LowerSideStatsIncrement + copybyte sSTATCHANGER, sSAVED_STAT_CHANGER statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_LowerSideStatsIncrement jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_CHANGE, BattleScript_LowerSideStatsIncrement printfromtable gStatDownStringIds @@ -8778,16 +8205,14 @@ BattleScript_DynamaxEnds:: BattleScript_DynamaxEnds_Ret:: flushtextbox - setspriteignore0hp TRUE updatedynamax playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE waitanimation - setspriteignore0hp FALSE pause B_WAIT_TIME_SHORT return BattleScript_MoveBlockedByDynamax:: - accuracycheck BattleScript_MoveMissedPause, ACC_CURR_MOVE + accuracycheck BattleScript_MoveMissedPause pause B_WAIT_TIME_SHORT printstring STRINGID_MOVEBLOCKEDBYDYNAMAX waitmessage B_WAIT_TIME_LONG @@ -8799,6 +8224,12 @@ BattleScript_PokemonCantUseTheMove:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd +BattleScript_TargetAvoidsAttack:: + pause B_WAIT_TIME_SHORT + printfromtable gMissStringIds + waitmessage B_WAIT_TIME_LONG + return + BattleScript_CouldntFullyProtect:: printstring STRINGID_COULDNTFULLYPROTECT waitmessage B_WAIT_TIME_LONG @@ -8829,14 +8260,6 @@ BattleScript_BerserkGeneRet_End: removeitem BS_SCRIPTING return -BattleScript_BerserkGeneRetEnd2:: - call BattleScript_BerserkGeneRet - end2 - -BattleScript_BoosterEnergyEnd2:: - call BattleScript_BoosterEnergyRet - end2 - BattleScript_BoosterEnergyRet:: playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 call BattleScript_AbilityPopUpScripting @@ -8847,12 +8270,6 @@ BattleScript_BoosterEnergyRet:: removeitem BS_SCRIPTING return -BattleScript_EffectSnow:: - attackcanceler - call BattleScript_CheckPrimalWeather - setfieldweather BATTLE_WEATHER_SNOW - goto BattleScript_MoveWeatherChange - BattleScript_SleepClauseBlocked:: pause B_WAIT_TIME_SHORT setmoveresultflags MOVE_RESULT_FAILED @@ -8922,6 +8339,24 @@ BattleScript_NaturePowerAttackstring:: waitmessage B_WAIT_TIME_LONG return +BattleScript_SwapFromSubstitute:: + jumpifvolatile BS_SCRIPTING, VOLATILE_SUBSTITUTE, BattleScript_SwapFromSubstituteContinue + goto BattleScript_SwapFromSubstituteReturn +BattleScript_SwapFromSubstituteContinue: + playanimation BS_SCRIPTING, B_ANIM_SWAP_FROM_SUBSTITUTE + waitanimation +BattleScript_SwapFromSubstituteReturn: + return + +BattleScript_SwapToSubstitute:: + jumpifvolatile BS_SCRIPTING, VOLATILE_SUBSTITUTE, BattleScript_SwapToSubstituteContinue + goto BattleScript_SwapToSubstituteReturn +BattleScript_SwapToSubstituteContinue: + playanimation BS_SCRIPTING, B_ANIM_SWAP_TO_SUBSTITUTE + waitanimation +BattleScript_SwapToSubstituteReturn: + return + BattleScript_TooScaredToMove:: printstring STRINGID_MONTOOSCAREDTOMOVE waitmessage B_WAIT_TIME_LONG diff --git a/data/battle_scripts_2.s b/data/battle_scripts_2.s index df77f715c..c9fa4a089 100644 --- a/data/battle_scripts_2.s +++ b/data/battle_scripts_2.s @@ -1,4 +1,5 @@ #include "config/battle.h" +#include "constants/global.h" #include "constants/battle.h" #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" @@ -111,21 +112,31 @@ BattleScript_ItemRestoreHP_Party:: return BattleScript_ItemRestoreHP_SendOutRevivedBattler: + switchhandleorder BS_SCRIPTING, 0 + getswitchedmondata BS_SCRIPTING + switchindataupdate BS_SCRIPTING + trytoclearprimalweather switchinanim BS_SCRIPTING, FALSE, FALSE waitstate switchineffects BS_SCRIPTING + switchinevents end BattleScript_ItemCureStatus:: call BattleScript_UseItemMessage BattleScript_ItemCureStatusAfterItemMsg: - itemcurestatus BattleScript_ItemCureStatusEnd - updatestatusicon BS_SCRIPTING + itemcurestatus BattleScript_ItemCureStatusEnd, BattleScript_CureStatus_Battler printstring STRINGID_ITEMCUREDSPECIESSTATUS waitmessage B_WAIT_TIME_LONG BattleScript_ItemCureStatusEnd: end +BattleScript_CureStatus_Battler:: + updatestatusicon BS_SCRIPTING + printstring STRINGID_ITEMCUREDSPECIESSTATUS + waitmessage B_WAIT_TIME_LONG + end + BattleScript_ItemHealAndCureStatus:: call BattleScript_UseItemMessage itemrestorehp BattleScript_ItemCureStatusAfterItemMsg, BattleScript_ItemHealAndCureStatus_Battler @@ -175,6 +186,7 @@ BattleScript_ItemSetMist:: BattleScript_ItemSetFocusEnergy:: call BattleScript_UseItemMessage + itemincreasestat jumpifvolatile BS_ATTACKER, VOLATILE_DRAGON_CHEER, BattleScript_ButItFailed jumpifvolatile BS_ATTACKER, VOLATILE_FOCUS_ENERGY, BattleScript_ButItFailed setfocusenergy BS_ATTACKER @@ -194,11 +206,12 @@ BattleScript_ItemRestorePP:: BattleScript_ItemIncreaseAllStats:: call BattleScript_UseItemMessage + itemincreasestat call BattleScript_AllStatsUp end BattleScript_BallThrow:: - jumpifbattletype BATTLE_TYPE_OLD_MAN_TUTORIAL, BattleScript_OldManThrowBall + jumpifbattletype BATTLE_TYPE_CATCH_TUTORIAL, BattleScript_OldManThrowBall jumpifbattletype BATTLE_TYPE_POKEDUDE, BattleScript_PokedudeThrowBall printstring STRINGID_PLAYERUSEDITEM handleballthrow @@ -304,6 +317,19 @@ BattleScript_TrainerBSlideMsgEnd2:: call BattleScript_TrainerBSlideMsgRet end2 +BattleScript_TrainerPartnerSlideMsgRet:: + trainerslidein BS_PLAYER2 + handletrainerslidemsg BS_SCRIPTING, PRINT_SLIDE_MESSAGE + waitstate + trainerslideout BS_PLAYER2 + waitstate + handletrainerslidemsg BS_SCRIPTING, RESTORE_BATTLER_SLIDE_CONTROL + return + +BattleScript_TrainerPartnerSlideMsgEnd2:: + call BattleScript_TrainerPartnerSlideMsgRet + end2 + BattleScript_GhostBallDodge:: waitmessage B_WAIT_TIME_LONG printstring STRINGID_ITDODGEDBALL diff --git a/graphics/items/icon_palettes/thick_club.pal b/graphics/items/icon_palettes/bone.pal similarity index 100% rename from graphics/items/icon_palettes/thick_club.pal rename to graphics/items/icon_palettes/bone.pal diff --git a/graphics/items/icon_palettes/premier_ball.pal b/graphics/items/icon_palettes/premier_ball.pal new file mode 100644 index 000000000..696a4b385 --- /dev/null +++ b/graphics/items/icon_palettes/premier_ball.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +180 180 180 +49 49 49 +74 82 82 +123 123 131 +164 164 197 +222 205 246 +255 255 255 +156 74 57 +180 82 57 +222 90 57 +255 148 57 +255 213 57 +230 180 106 +255 255 148 +213 156 49 +255 238 82 diff --git a/graphics/items/icons/red_apricorn.png b/graphics/items/icons/apricorn.png similarity index 100% rename from graphics/items/icons/red_apricorn.png rename to graphics/items/icons/apricorn.png diff --git a/graphics/items/icons/black_apricorn.png b/graphics/items/icons/black_apricorn.png deleted file mode 100644 index 470e77fcf..000000000 Binary files a/graphics/items/icons/black_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/blue_apricorn.png b/graphics/items/icons/blue_apricorn.png deleted file mode 100644 index 9e1b19fb3..000000000 Binary files a/graphics/items/icons/blue_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/thick_club.png b/graphics/items/icons/bone.png similarity index 100% rename from graphics/items/icons/thick_club.png rename to graphics/items/icons/bone.png diff --git a/graphics/items/icons/bug_gem.png b/graphics/items/icons/bug_gem.png deleted file mode 100644 index 4d6904668..000000000 Binary files a/graphics/items/icons/bug_gem.png and /dev/null differ diff --git a/graphics/items/icons/burn_drive.png b/graphics/items/icons/burn_drive.png deleted file mode 100644 index 9486eff48..000000000 Binary files a/graphics/items/icons/burn_drive.png and /dev/null differ diff --git a/graphics/items/icons/chill_drive.png b/graphics/items/icons/chill_drive.png deleted file mode 100644 index d3d5e019c..000000000 Binary files a/graphics/items/icons/chill_drive.png and /dev/null differ diff --git a/graphics/items/icons/clever_feather.png b/graphics/items/icons/clever_feather.png deleted file mode 100644 index 3cc0a3d5f..000000000 Binary files a/graphics/items/icons/clever_feather.png and /dev/null differ diff --git a/graphics/items/icons/dark_gem.png b/graphics/items/icons/dark_gem.png deleted file mode 100644 index 8999ca25a..000000000 Binary files a/graphics/items/icons/dark_gem.png and /dev/null differ diff --git a/graphics/items/icons/metal_powder.png b/graphics/items/icons/ditto_powder.png similarity index 100% rename from graphics/items/icons/metal_powder.png rename to graphics/items/icons/ditto_powder.png diff --git a/graphics/items/icons/douse_drive.png b/graphics/items/icons/douse_drive.png deleted file mode 100644 index f59616159..000000000 Binary files a/graphics/items/icons/douse_drive.png and /dev/null differ diff --git a/graphics/items/icons/draco_plate.png b/graphics/items/icons/draco_plate.png deleted file mode 100644 index 21339c048..000000000 Binary files a/graphics/items/icons/draco_plate.png and /dev/null differ diff --git a/graphics/items/icons/dragon_gem.png b/graphics/items/icons/dragon_gem.png deleted file mode 100644 index f071726a1..000000000 Binary files a/graphics/items/icons/dragon_gem.png and /dev/null differ diff --git a/graphics/items/icons/dread_plate.png b/graphics/items/icons/dread_plate.png deleted file mode 100644 index 8679df524..000000000 Binary files a/graphics/items/icons/dread_plate.png and /dev/null differ diff --git a/graphics/items/icons/drive.png b/graphics/items/icons/drive.png new file mode 100644 index 000000000..3b8b1d480 Binary files /dev/null and b/graphics/items/icons/drive.png differ diff --git a/graphics/items/icons/earth_plate.png b/graphics/items/icons/earth_plate.png deleted file mode 100644 index e79dff33c..000000000 Binary files a/graphics/items/icons/earth_plate.png and /dev/null differ diff --git a/graphics/items/icons/electric_gem.png b/graphics/items/icons/electric_gem.png deleted file mode 100644 index e17e3f4d1..000000000 Binary files a/graphics/items/icons/electric_gem.png and /dev/null differ diff --git a/graphics/items/icons/ev_feather.png b/graphics/items/icons/ev_feather.png new file mode 100644 index 000000000..e0c9dcd4b Binary files /dev/null and b/graphics/items/icons/ev_feather.png differ diff --git a/graphics/items/icons/fairy_gem.png b/graphics/items/icons/fairy_gem.png deleted file mode 100644 index 5fe8f6ed9..000000000 Binary files a/graphics/items/icons/fairy_gem.png and /dev/null differ diff --git a/graphics/items/icons/fighting_gem.png b/graphics/items/icons/fighting_gem.png deleted file mode 100644 index 229376779..000000000 Binary files a/graphics/items/icons/fighting_gem.png and /dev/null differ diff --git a/graphics/items/icons/fire_gem.png b/graphics/items/icons/fire_gem.png deleted file mode 100644 index d6caa7d3d..000000000 Binary files a/graphics/items/icons/fire_gem.png and /dev/null differ diff --git a/graphics/items/icons/fist_plate.png b/graphics/items/icons/fist_plate.png deleted file mode 100644 index 7e6cb2b92..000000000 Binary files a/graphics/items/icons/fist_plate.png and /dev/null differ diff --git a/graphics/items/icons/flying_gem.png b/graphics/items/icons/flying_gem.png deleted file mode 100644 index eb328c85e..000000000 Binary files a/graphics/items/icons/flying_gem.png and /dev/null differ diff --git a/graphics/items/icons/genius_feather.png b/graphics/items/icons/genius_feather.png deleted file mode 100644 index 5b27a029e..000000000 Binary files a/graphics/items/icons/genius_feather.png and /dev/null differ diff --git a/graphics/items/icons/ghost_gem.png b/graphics/items/icons/ghost_gem.png deleted file mode 100644 index c4813ee29..000000000 Binary files a/graphics/items/icons/ghost_gem.png and /dev/null differ diff --git a/graphics/items/icons/grass_gem.png b/graphics/items/icons/grass_gem.png deleted file mode 100644 index 756a769ca..000000000 Binary files a/graphics/items/icons/grass_gem.png and /dev/null differ diff --git a/graphics/items/icons/grassy_seed.png b/graphics/items/icons/grassy_seed.png deleted file mode 100644 index 31f30aeb5..000000000 Binary files a/graphics/items/icons/grassy_seed.png and /dev/null differ diff --git a/graphics/items/icons/green_apricorn.png b/graphics/items/icons/green_apricorn.png deleted file mode 100644 index da60f8544..000000000 Binary files a/graphics/items/icons/green_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/ground_gem.png b/graphics/items/icons/ground_gem.png deleted file mode 100644 index 21fab57b0..000000000 Binary files a/graphics/items/icons/ground_gem.png and /dev/null differ diff --git a/graphics/items/icons/health_feather.png b/graphics/items/icons/health_feather.png deleted file mode 100644 index 584cc4f13..000000000 Binary files a/graphics/items/icons/health_feather.png and /dev/null differ diff --git a/graphics/items/icons/ice_gem.png b/graphics/items/icons/ice_gem.png deleted file mode 100644 index e9c28f050..000000000 Binary files a/graphics/items/icons/ice_gem.png and /dev/null differ diff --git a/graphics/items/icons/icicle_plate.png b/graphics/items/icons/icicle_plate.png deleted file mode 100644 index 7a74d45a5..000000000 Binary files a/graphics/items/icons/icicle_plate.png and /dev/null differ diff --git a/graphics/items/icons/insect_plate.png b/graphics/items/icons/insect_plate.png deleted file mode 100644 index 23bee9093..000000000 Binary files a/graphics/items/icons/insect_plate.png and /dev/null differ diff --git a/graphics/items/icons/iron_plate.png b/graphics/items/icons/iron_plate.png deleted file mode 100644 index d4a778e4d..000000000 Binary files a/graphics/items/icons/iron_plate.png and /dev/null differ diff --git a/graphics/items/icons/meadow_plate.png b/graphics/items/icons/meadow_plate.png deleted file mode 100644 index 6571446bb..000000000 Binary files a/graphics/items/icons/meadow_plate.png and /dev/null differ diff --git a/graphics/items/icons/mind_plate.png b/graphics/items/icons/mind_plate.png deleted file mode 100644 index 12af8f9ea..000000000 Binary files a/graphics/items/icons/mind_plate.png and /dev/null differ diff --git a/graphics/items/icons/misty_seed.png b/graphics/items/icons/misty_seed.png deleted file mode 100644 index 58764aca5..000000000 Binary files a/graphics/items/icons/misty_seed.png and /dev/null differ diff --git a/graphics/items/icons/muscle_feather.png b/graphics/items/icons/muscle_feather.png deleted file mode 100644 index 5ebf263b2..000000000 Binary files a/graphics/items/icons/muscle_feather.png and /dev/null differ diff --git a/graphics/items/icons/red_nectar.png b/graphics/items/icons/nectar.png similarity index 100% rename from graphics/items/icons/red_nectar.png rename to graphics/items/icons/nectar.png diff --git a/graphics/items/icons/normal_gem.png b/graphics/items/icons/normal_gem.png deleted file mode 100644 index 5d8cbf7bf..000000000 Binary files a/graphics/items/icons/normal_gem.png and /dev/null differ diff --git a/graphics/items/icons/pink_apricorn.png b/graphics/items/icons/pink_apricorn.png deleted file mode 100644 index 817e0140c..000000000 Binary files a/graphics/items/icons/pink_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/pink_nectar.png b/graphics/items/icons/pink_nectar.png deleted file mode 100644 index 9fbe0f76b..000000000 Binary files a/graphics/items/icons/pink_nectar.png and /dev/null differ diff --git a/graphics/items/icons/pixie_plate.png b/graphics/items/icons/pixie_plate.png deleted file mode 100644 index 4c34f22ab..000000000 Binary files a/graphics/items/icons/pixie_plate.png and /dev/null differ diff --git a/graphics/items/icons/flame_plate.png b/graphics/items/icons/plate.png similarity index 100% rename from graphics/items/icons/flame_plate.png rename to graphics/items/icons/plate.png diff --git a/graphics/items/icons/poison_gem.png b/graphics/items/icons/poison_gem.png deleted file mode 100644 index 8e7885527..000000000 Binary files a/graphics/items/icons/poison_gem.png and /dev/null differ diff --git a/graphics/items/icons/pretty_feather.png b/graphics/items/icons/pretty_feather.png index 69c66306d..ca305e11a 100644 Binary files a/graphics/items/icons/pretty_feather.png and b/graphics/items/icons/pretty_feather.png differ diff --git a/graphics/items/icons/psychic_gem.png b/graphics/items/icons/psychic_gem.png deleted file mode 100644 index b73184955..000000000 Binary files a/graphics/items/icons/psychic_gem.png and /dev/null differ diff --git a/graphics/items/icons/psychic_seed.png b/graphics/items/icons/psychic_seed.png deleted file mode 100644 index 4c90afb9c..000000000 Binary files a/graphics/items/icons/psychic_seed.png and /dev/null differ diff --git a/graphics/items/icons/purple_nectar.png b/graphics/items/icons/purple_nectar.png deleted file mode 100644 index f792b5ff5..000000000 Binary files a/graphics/items/icons/purple_nectar.png and /dev/null differ diff --git a/graphics/items/icons/quick_powder.png b/graphics/items/icons/quick_powder.png deleted file mode 100644 index fa56dcca7..000000000 Binary files a/graphics/items/icons/quick_powder.png and /dev/null differ diff --git a/graphics/items/icons/resist_feather.png b/graphics/items/icons/resist_feather.png deleted file mode 100644 index d71715162..000000000 Binary files a/graphics/items/icons/resist_feather.png and /dev/null differ diff --git a/graphics/items/icons/rock_gem.png b/graphics/items/icons/rock_gem.png deleted file mode 100644 index fdf634b73..000000000 Binary files a/graphics/items/icons/rock_gem.png and /dev/null differ diff --git a/graphics/items/icons/soft_sand.png b/graphics/items/icons/sand.png similarity index 100% rename from graphics/items/icons/soft_sand.png rename to graphics/items/icons/sand.png diff --git a/graphics/items/icons/shock_drive.png b/graphics/items/icons/shock_drive.png deleted file mode 100644 index 99f8e512c..000000000 Binary files a/graphics/items/icons/shock_drive.png and /dev/null differ diff --git a/graphics/items/icons/sky_plate.png b/graphics/items/icons/sky_plate.png deleted file mode 100644 index 0d2a910bc..000000000 Binary files a/graphics/items/icons/sky_plate.png and /dev/null differ diff --git a/graphics/items/icons/splash_plate.png b/graphics/items/icons/splash_plate.png deleted file mode 100644 index c75fe5473..000000000 Binary files a/graphics/items/icons/splash_plate.png and /dev/null differ diff --git a/graphics/items/icons/spooky_plate.png b/graphics/items/icons/spooky_plate.png deleted file mode 100644 index d3dbfaf0c..000000000 Binary files a/graphics/items/icons/spooky_plate.png and /dev/null differ diff --git a/graphics/items/icons/steel_gem.png b/graphics/items/icons/steel_gem.png deleted file mode 100644 index 65495811f..000000000 Binary files a/graphics/items/icons/steel_gem.png and /dev/null differ diff --git a/graphics/items/icons/stone_plate.png b/graphics/items/icons/stone_plate.png deleted file mode 100644 index 4aa9ba284..000000000 Binary files a/graphics/items/icons/stone_plate.png and /dev/null differ diff --git a/graphics/items/icons/swift_feather.png b/graphics/items/icons/swift_feather.png deleted file mode 100644 index 75af06017..000000000 Binary files a/graphics/items/icons/swift_feather.png and /dev/null differ diff --git a/graphics/items/icons/electric_seed.png b/graphics/items/icons/terrain_seed.png similarity index 100% rename from graphics/items/icons/electric_seed.png rename to graphics/items/icons/terrain_seed.png diff --git a/graphics/items/icons/toxic_plate.png b/graphics/items/icons/toxic_plate.png deleted file mode 100644 index f282c0f3a..000000000 Binary files a/graphics/items/icons/toxic_plate.png and /dev/null differ diff --git a/graphics/items/icons/type_gem.png b/graphics/items/icons/type_gem.png new file mode 100644 index 000000000..22be66dcb Binary files /dev/null and b/graphics/items/icons/type_gem.png differ diff --git a/graphics/items/icons/water_gem.png b/graphics/items/icons/water_gem.png deleted file mode 100644 index 555d92ccc..000000000 Binary files a/graphics/items/icons/water_gem.png and /dev/null differ diff --git a/graphics/items/icons/white_apricorn.png b/graphics/items/icons/white_apricorn.png deleted file mode 100644 index 976779af7..000000000 Binary files a/graphics/items/icons/white_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/yellow_apricorn.png b/graphics/items/icons/yellow_apricorn.png deleted file mode 100644 index 293b4054f..000000000 Binary files a/graphics/items/icons/yellow_apricorn.png and /dev/null differ diff --git a/graphics/items/icons/yellow_nectar.png b/graphics/items/icons/yellow_nectar.png deleted file mode 100644 index c097f4092..000000000 Binary files a/graphics/items/icons/yellow_nectar.png and /dev/null differ diff --git a/graphics/items/icons/zap_plate.png b/graphics/items/icons/zap_plate.png deleted file mode 100644 index 3e355ca99..000000000 Binary files a/graphics/items/icons/zap_plate.png and /dev/null differ diff --git a/graphics/pokemon/archeops/overworld.png b/graphics/pokemon/archeops/overworld.png index 6d8faa659..8ce62207a 100644 Binary files a/graphics/pokemon/archeops/overworld.png and b/graphics/pokemon/archeops/overworld.png differ diff --git a/graphics/pokemon/archeops/overworld_normal.pal b/graphics/pokemon/archeops/overworld_normal.pal index 772efa0e1..cc9c4dd1b 100644 --- a/graphics/pokemon/archeops/overworld_normal.pal +++ b/graphics/pokemon/archeops/overworld_normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -16 48 104 -48 80 152 -187 76 72 -212 214 224 -240 200 96 0 0 0 +255 255 255 +116 49 59 +173 69 77 +213 100 96 +128 87 54 +195 148 76 +240 200 96 +16 48 104 +52 84 181 48 128 240 -187 76 72 +15 70 74 +29 111 101 16 160 144 -16 48 104 -66 75 64 -240 200 96 -0 0 0 -0 0 0 -0 0 0 +255 0 0 diff --git a/graphics/pokemon/archeops/overworld_shiny.pal b/graphics/pokemon/archeops/overworld_shiny.pal index 92931a6cc..721761719 100644 --- a/graphics/pokemon/archeops/overworld_shiny.pal +++ b/graphics/pokemon/archeops/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -8 64 48 -8 111 95 -216 101 35 -220 220 240 -248 176 96 -0 1 0 -16 160 144 -158 72 47 -48 128 240 -48 80 152 -113 61 35 -241 200 100 -0 0 0 -0 0 0 0 0 0 +255 255 255 +116 49 59 +173 69 77 +213 100 96 +128 66 54 +195 114 76 +240 159 96 +10 39 30 +47 115 103 +29 188 132 +32 68 123 +51 112 155 +32 135 211 +255 0 0 diff --git a/graphics/pokemon/basculin/white_striped/anim_front.png b/graphics/pokemon/basculin/white_striped/anim_front.png index ed4c68034..7e5267a9e 100644 Binary files a/graphics/pokemon/basculin/white_striped/anim_front.png and b/graphics/pokemon/basculin/white_striped/anim_front.png differ diff --git a/graphics/pokemon/basculin/white_striped/back.png b/graphics/pokemon/basculin/white_striped/back.png index d8faa1575..5605656a0 100644 Binary files a/graphics/pokemon/basculin/white_striped/back.png and b/graphics/pokemon/basculin/white_striped/back.png differ diff --git a/graphics/pokemon/basculin/white_striped/normal.pal b/graphics/pokemon/basculin/white_striped/normal.pal index 5e82d654d..636a1bca4 100644 --- a/graphics/pokemon/basculin/white_striped/normal.pal +++ b/graphics/pokemon/basculin/white_striped/normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -72 80 80 -8 8 8 +240 240 240 224 224 224 160 160 160 +72 80 80 +0 0 0 +64 160 80 +40 112 48 +0 64 32 +64 80 80 32 48 56 16 16 16 -64 80 80 -120 168 168 -168 216 224 -64 160 80 -0 64 32 -40 112 48 -0 0 0 +211 235 233 +166 216 216 0 0 0 0 0 0 diff --git a/graphics/pokemon/basculin/white_striped/shiny.pal b/graphics/pokemon/basculin/white_striped/shiny.pal index 766d07db7..76c9db8c5 100644 --- a/graphics/pokemon/basculin/white_striped/shiny.pal +++ b/graphics/pokemon/basculin/white_striped/shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 +240 240 240 +251 251 216 +186 186 148 72 80 80 -8 8 8 -224 224 224 -160 160 160 +0 0 0 +120 168 56 +80 112 40 +40 64 0 +64 80 80 32 48 56 16 16 16 -64 80 80 -120 168 168 -168 216 224 -120 168 56 -40 64 0 -80 112 40 -0 0 0 +211 235 233 +166 216 216 0 0 0 0 0 0 diff --git a/graphics/pokemon/castform/back_gba.png b/graphics/pokemon/castform/back_gba.png new file mode 100644 index 000000000..6348a35e8 Binary files /dev/null and b/graphics/pokemon/castform/back_gba.png differ diff --git a/graphics/pokemon/castform/front_gba.png b/graphics/pokemon/castform/front_gba.png new file mode 100644 index 000000000..39bfaf426 Binary files /dev/null and b/graphics/pokemon/castform/front_gba.png differ diff --git a/graphics/pokemon/castform/icon_gba.png b/graphics/pokemon/castform/icon_gba.png new file mode 100644 index 000000000..56c62ad07 Binary files /dev/null and b/graphics/pokemon/castform/icon_gba.png differ diff --git a/graphics/pokemon/castform/normal_gba.pal b/graphics/pokemon/castform/normal_gba.pal new file mode 100644 index 000000000..3fe2b7692 --- /dev/null +++ b/graphics/pokemon/castform/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +90 82 82 +205 189 189 +230 222 222 +246 246 238 +0 0 0 +255 255 255 +222 222 246 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +148 148 148 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/rainy/back_gba.png b/graphics/pokemon/castform/rainy/back_gba.png new file mode 100644 index 000000000..70bad9130 Binary files /dev/null and b/graphics/pokemon/castform/rainy/back_gba.png differ diff --git a/graphics/pokemon/castform/rainy/front_gba.png b/graphics/pokemon/castform/rainy/front_gba.png new file mode 100644 index 000000000..155374035 Binary files /dev/null and b/graphics/pokemon/castform/rainy/front_gba.png differ diff --git a/graphics/pokemon/castform/rainy/normal_gba.pal b/graphics/pokemon/castform/rainy/normal_gba.pal new file mode 100644 index 000000000..914cdac62 --- /dev/null +++ b/graphics/pokemon/castform/rainy/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +57 65 90 +98 115 189 +115 139 213 +148 180 205 +0 0 0 +205 238 246 +180 197 222 +139 205 222 +131 180 197 +82 98 131 +197 197 197 +148 139 148 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/rainy/shiny_gba.pal b/graphics/pokemon/castform/rainy/shiny_gba.pal new file mode 100644 index 000000000..914cdac62 --- /dev/null +++ b/graphics/pokemon/castform/rainy/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +57 65 90 +98 115 189 +115 139 213 +148 180 205 +0 0 0 +205 238 246 +180 197 222 +139 205 222 +131 180 197 +82 98 131 +197 197 197 +148 139 148 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/shiny_gba.pal b/graphics/pokemon/castform/shiny_gba.pal new file mode 100644 index 000000000..2fa401dd6 --- /dev/null +++ b/graphics/pokemon/castform/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 90 90 +205 164 189 +230 197 222 +255 222 255 +0 0 0 +255 246 65 +230 180 32 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +148 148 148 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/snowy/back_gba.png b/graphics/pokemon/castform/snowy/back_gba.png new file mode 100644 index 000000000..b4f27cbe6 Binary files /dev/null and b/graphics/pokemon/castform/snowy/back_gba.png differ diff --git a/graphics/pokemon/castform/snowy/front_gba.png b/graphics/pokemon/castform/snowy/front_gba.png new file mode 100644 index 000000000..a75bf647e Binary files /dev/null and b/graphics/pokemon/castform/snowy/front_gba.png differ diff --git a/graphics/pokemon/castform/snowy/normal_gba.pal b/graphics/pokemon/castform/snowy/normal_gba.pal new file mode 100644 index 000000000..d1c64ac75 --- /dev/null +++ b/graphics/pokemon/castform/snowy/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +41 82 57 +123 82 189 +139 115 213 +148 180 205 +0 0 0 +197 180 255 +156 156 197 +139 205 172 +115 164 139 +98 74 115 +189 230 230 +82 115 106 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/snowy/shiny_gba.pal b/graphics/pokemon/castform/snowy/shiny_gba.pal new file mode 100644 index 000000000..d1c64ac75 --- /dev/null +++ b/graphics/pokemon/castform/snowy/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +41 82 57 +123 82 189 +139 115 213 +148 180 205 +0 0 0 +197 180 255 +156 156 197 +139 205 172 +115 164 139 +98 74 115 +189 230 230 +82 115 106 +74 82 74 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/sunny/back_gba.png b/graphics/pokemon/castform/sunny/back_gba.png new file mode 100644 index 000000000..83b27298a Binary files /dev/null and b/graphics/pokemon/castform/sunny/back_gba.png differ diff --git a/graphics/pokemon/castform/sunny/front_gba.png b/graphics/pokemon/castform/sunny/front_gba.png new file mode 100644 index 000000000..7e14f9892 Binary files /dev/null and b/graphics/pokemon/castform/sunny/front_gba.png differ diff --git a/graphics/pokemon/castform/sunny/normal_gba.pal b/graphics/pokemon/castform/sunny/normal_gba.pal new file mode 100644 index 000000000..af0cfbb93 --- /dev/null +++ b/graphics/pokemon/castform/sunny/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 49 41 +205 90 74 +238 123 74 +255 156 65 +0 0 0 +255 246 106 +230 213 106 +255 156 98 +213 131 74 +148 90 65 +213 205 230 +0 0 0 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/castform/sunny/overworld.png b/graphics/pokemon/castform/sunny/overworld.png index adafc6de7..977a3b204 100644 Binary files a/graphics/pokemon/castform/sunny/overworld.png and b/graphics/pokemon/castform/sunny/overworld.png differ diff --git a/graphics/pokemon/castform/sunny/overworld_normal.pal b/graphics/pokemon/castform/sunny/overworld_normal.pal index 5f4c2ae5f..f7bc725ad 100644 --- a/graphics/pokemon/castform/sunny/overworld_normal.pal +++ b/graphics/pokemon/castform/sunny/overworld_normal.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 255 163 233 +240 240 240 8 8 8 -121 79 32 -240 232 168 -224 184 112 -200 128 48 +64 64 80 146 54 13 253 126 69 -0 0 0 224 96 30 -231 105 40 +121 79 32 +200 128 48 +224 184 112 +194 176 143 +232 219 195 239 220 65 -64 64 80 -240 240 240 -197 197 148 -0 0 0 +240 232 168 +255 0 0 +255 0 210 diff --git a/graphics/pokemon/castform/sunny/overworld_shiny.pal b/graphics/pokemon/castform/sunny/overworld_shiny.pal index 7b6e2f1fb..5fec03977 100644 --- a/graphics/pokemon/castform/sunny/overworld_shiny.pal +++ b/graphics/pokemon/castform/sunny/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -144 208 208 +255 163 233 +234 209 213 8 8 8 -121 79 32 -240 232 168 -224 184 112 -200 128 48 -137 21 24 -241 81 85 -0 0 0 -211 43 42 -218 53 52 -255 160 108 64 64 80 -240 240 240 -197 197 148 -0 0 0 +85 23 18 +209 68 57 +156 54 42 +121 79 32 +206 99 42 +228 163 108 +188 134 139 +227 184 188 +243 164 143 +253 217 221 +255 0 0 +255 0 222 diff --git a/graphics/pokemon/castform/sunny/shiny_gba.pal b/graphics/pokemon/castform/sunny/shiny_gba.pal new file mode 100644 index 000000000..af0cfbb93 --- /dev/null +++ b/graphics/pokemon/castform/sunny/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +197 197 148 +98 49 41 +205 90 74 +238 123 74 +255 156 65 +0 0 0 +255 246 106 +230 213 106 +255 156 98 +213 131 74 +148 90 65 +213 205 230 +0 0 0 +90 90 82 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/chesnaught/overworld.png b/graphics/pokemon/chesnaught/overworld.png index 7902feaf5..99c5d10cb 100644 Binary files a/graphics/pokemon/chesnaught/overworld.png and b/graphics/pokemon/chesnaught/overworld.png differ diff --git a/graphics/pokemon/chespin/overworld.png b/graphics/pokemon/chespin/overworld.png index 5056ad774..92df00e97 100644 Binary files a/graphics/pokemon/chespin/overworld.png and b/graphics/pokemon/chespin/overworld.png differ diff --git a/graphics/pokemon/conkeldurr/overworld.png b/graphics/pokemon/conkeldurr/overworld.png index fa83edbdc..e1233f5dd 100644 Binary files a/graphics/pokemon/conkeldurr/overworld.png and b/graphics/pokemon/conkeldurr/overworld.png differ diff --git a/graphics/pokemon/conkeldurr/overworld_normal.pal b/graphics/pokemon/conkeldurr/overworld_normal.pal index 6e4935354..cbe2d171d 100644 --- a/graphics/pokemon/conkeldurr/overworld_normal.pal +++ b/graphics/pokemon/conkeldurr/overworld_normal.pal @@ -12,7 +12,7 @@ JASC-PAL 101 101 94 144 144 137 172 41 65 -0 0 0 +255 255 255 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/conkeldurr/overworld_shiny.pal b/graphics/pokemon/conkeldurr/overworld_shiny.pal index 4ed16e43f..5fe0a295b 100644 --- a/graphics/pokemon/conkeldurr/overworld_shiny.pal +++ b/graphics/pokemon/conkeldurr/overworld_shiny.pal @@ -12,7 +12,7 @@ JASC-PAL 103 92 90 144 144 137 214 66 61 -0 0 0 +255 255 255 0 0 0 0 0 0 0 0 0 diff --git a/graphics/pokemon/deerling/autumn/overworld.png b/graphics/pokemon/deerling/autumn/overworld.png index eda763b62..414a9001a 100644 Binary files a/graphics/pokemon/deerling/autumn/overworld.png and b/graphics/pokemon/deerling/autumn/overworld.png differ diff --git a/graphics/pokemon/deerling/autumn/overworld_normal.pal b/graphics/pokemon/deerling/autumn/overworld_normal.pal index ea85feef5..8efa2c7d4 100644 --- a/graphics/pokemon/deerling/autumn/overworld_normal.pal +++ b/graphics/pokemon/deerling/autumn/overworld_normal.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -216 145 19 -63 33 13 -132 91 14 -246 236 65 -246 228 194 -206 164 103 -63 33 13 -216 145 19 -99 99 99 -62 62 66 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +142 102 19 +201 171 66 +247 238 76 +211 172 114 +247 231 200 +79 68 49 +162 97 68 +211 141 66 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/autumn/overworld_shiny.pal b/graphics/pokemon/deerling/autumn/overworld_shiny.pal index e49a9a7f7..d6dce3387 100644 --- a/graphics/pokemon/deerling/autumn/overworld_shiny.pal +++ b/graphics/pokemon/deerling/autumn/overworld_shiny.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -232 128 24 -128 72 16 -160 112 32 -248 208 240 -246 228 194 -206 164 103 -63 33 13 -216 145 19 -99 99 99 -62 62 66 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +181 119 185 +233 177 226 +253 213 241 +211 172 114 +247 231 200 +79 68 49 +162 97 68 +211 141 66 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/overworld.png b/graphics/pokemon/deerling/overworld.png index e2bfd0d9d..8ae5bdd3c 100644 Binary files a/graphics/pokemon/deerling/overworld.png and b/graphics/pokemon/deerling/overworld.png differ diff --git a/graphics/pokemon/deerling/overworld_normal.pal b/graphics/pokemon/deerling/overworld_normal.pal index f5fd58d7c..d4cbaedaf 100644 --- a/graphics/pokemon/deerling/overworld_normal.pal +++ b/graphics/pokemon/deerling/overworld_normal.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 24 40 16 -240 129 184 -102 56 100 -142 102 19 -247 238 76 -194 96 140 -220 154 25 -194 96 140 -247 231 200 -211 172 114 -110 110 110 73 73 77 -0 0 0 -0 0 0 -0 0 0 +110 110 110 +142 102 19 +201 171 66 +247 238 76 +211 172 114 +247 231 200 +102 56 100 +194 96 140 +240 129 184 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/overworld_shiny.pal b/graphics/pokemon/deerling/overworld_shiny.pal index 551715227..bb3d829cf 100644 --- a/graphics/pokemon/deerling/overworld_shiny.pal +++ b/graphics/pokemon/deerling/overworld_shiny.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 24 40 16 -248 152 168 -136 64 64 -142 102 19 -248 208 240 -176 104 104 -248 152 232 -194 96 140 -247 231 200 -211 172 114 -110 110 110 73 73 77 -0 0 0 -0 0 0 -0 0 0 +110 110 110 +181 119 185 +233 177 226 +253 213 241 +211 172 114 +247 231 200 +102 56 100 +194 96 140 +240 129 184 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/summer/overworld.png b/graphics/pokemon/deerling/summer/overworld.png index fcbc6a19f..414a9001a 100644 Binary files a/graphics/pokemon/deerling/summer/overworld.png and b/graphics/pokemon/deerling/summer/overworld.png differ diff --git a/graphics/pokemon/deerling/summer/overworld_normal.pal b/graphics/pokemon/deerling/summer/overworld_normal.pal index 12c0a070e..9a16ed51f 100644 --- a/graphics/pokemon/deerling/summer/overworld_normal.pal +++ b/graphics/pokemon/deerling/summer/overworld_normal.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -63 168 40 -35 61 29 -132 91 14 -246 236 65 -43 97 38 -216 145 19 -246 228 194 -206 164 103 -99 99 99 -62 62 66 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +142 102 19 +201 171 66 +247 238 76 +211 172 114 +247 231 200 +23 33 25 +66 96 62 +118 184 52 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/summer/overworld_shiny.pal b/graphics/pokemon/deerling/summer/overworld_shiny.pal index 0c6f48254..416750f0c 100644 --- a/graphics/pokemon/deerling/summer/overworld_shiny.pal +++ b/graphics/pokemon/deerling/summer/overworld_shiny.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -64 176 64 -35 61 29 -132 91 14 -248 208 240 -48 120 64 -248 152 232 -246 228 194 -206 164 103 -99 99 99 -62 62 66 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +181 119 185 +233 177 226 +253 213 241 +211 172 114 +247 231 200 +23 33 25 +66 96 62 +118 184 52 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/winter/overworld.png b/graphics/pokemon/deerling/winter/overworld.png index 0b619b55a..414a9001a 100644 Binary files a/graphics/pokemon/deerling/winter/overworld.png and b/graphics/pokemon/deerling/winter/overworld.png differ diff --git a/graphics/pokemon/deerling/winter/overworld_normal.pal b/graphics/pokemon/deerling/winter/overworld_normal.pal index 0c74439bd..cf85bd05b 100644 --- a/graphics/pokemon/deerling/winter/overworld_normal.pal +++ b/graphics/pokemon/deerling/winter/overworld_normal.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -134 102 61 -37 26 13 -132 91 14 -246 236 65 -35 61 29 -102 61 36 -216 145 19 -134 102 61 -246 228 194 -206 164 103 -99 99 99 -62 62 66 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +142 102 19 +201 171 66 +247 238 76 +211 172 114 +247 231 200 +68 60 60 +131 115 99 +164 139 113 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/deerling/winter/overworld_shiny.pal b/graphics/pokemon/deerling/winter/overworld_shiny.pal index 1628855ed..50c642109 100644 --- a/graphics/pokemon/deerling/winter/overworld_shiny.pal +++ b/graphics/pokemon/deerling/winter/overworld_shiny.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 -18 32 11 -168 128 96 -37 26 13 -132 91 14 -248 208 240 -35 61 29 -120 80 72 -248 152 232 -134 102 61 -246 228 194 -206 164 103 -99 99 99 -62 62 66 -0 0 0 -0 0 0 +24 40 16 +73 73 77 +110 110 110 +181 119 185 +233 177 226 +253 213 241 +211 172 114 +247 231 200 +68 60 60 +131 115 99 +164 139 113 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/delphox/overworld.png b/graphics/pokemon/delphox/overworld.png index e490e31cd..dbf3da76e 100644 Binary files a/graphics/pokemon/delphox/overworld.png and b/graphics/pokemon/delphox/overworld.png differ diff --git a/graphics/pokemon/deoxys/attack/back_gba.png b/graphics/pokemon/deoxys/attack/back_gba.png new file mode 100644 index 000000000..6f9b3fd9e Binary files /dev/null and b/graphics/pokemon/deoxys/attack/back_gba.png differ diff --git a/graphics/pokemon/deoxys/attack/front_gba.png b/graphics/pokemon/deoxys/attack/front_gba.png new file mode 100644 index 000000000..67c092649 Binary files /dev/null and b/graphics/pokemon/deoxys/attack/front_gba.png differ diff --git a/graphics/pokemon/deoxys/attack/normal_gba.pal b/graphics/pokemon/deoxys/attack/normal_gba.pal new file mode 100644 index 000000000..e8921dd3d --- /dev/null +++ b/graphics/pokemon/deoxys/attack/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/attack/shiny_gba.pal b/graphics/pokemon/deoxys/attack/shiny_gba.pal new file mode 100644 index 000000000..666acaa3a --- /dev/null +++ b/graphics/pokemon/deoxys/attack/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 74 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/defense/back_gba.png b/graphics/pokemon/deoxys/defense/back_gba.png new file mode 100644 index 000000000..c1fcf4673 Binary files /dev/null and b/graphics/pokemon/deoxys/defense/back_gba.png differ diff --git a/graphics/pokemon/deoxys/defense/front_gba.png b/graphics/pokemon/deoxys/defense/front_gba.png new file mode 100644 index 000000000..5e2f38019 Binary files /dev/null and b/graphics/pokemon/deoxys/defense/front_gba.png differ diff --git a/graphics/pokemon/deoxys/defense/normal_gba.pal b/graphics/pokemon/deoxys/defense/normal_gba.pal new file mode 100644 index 000000000..e8921dd3d --- /dev/null +++ b/graphics/pokemon/deoxys/defense/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/defense/shiny_gba.pal b/graphics/pokemon/deoxys/defense/shiny_gba.pal new file mode 100644 index 000000000..666acaa3a --- /dev/null +++ b/graphics/pokemon/deoxys/defense/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 74 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +0 0 0 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/speed/back_gba.png b/graphics/pokemon/deoxys/speed/back_gba.png new file mode 100644 index 000000000..979936c64 Binary files /dev/null and b/graphics/pokemon/deoxys/speed/back_gba.png differ diff --git a/graphics/pokemon/deoxys/speed/front_gba.png b/graphics/pokemon/deoxys/speed/front_gba.png new file mode 100644 index 000000000..ab713aeea Binary files /dev/null and b/graphics/pokemon/deoxys/speed/front_gba.png differ diff --git a/graphics/pokemon/deoxys/speed/normal_gba.pal b/graphics/pokemon/deoxys/speed/normal_gba.pal new file mode 100644 index 000000000..90fcff114 --- /dev/null +++ b/graphics/pokemon/deoxys/speed/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +115 74 49 +213 106 106 +255 131 74 +255 172 131 +115 213 172 +131 164 156 +57 98 90 +82 74 65 +156 156 131 +139 8 205 +222 106 230 +123 115 82 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/deoxys/speed/shiny_gba.pal b/graphics/pokemon/deoxys/speed/shiny_gba.pal new file mode 100644 index 000000000..74b8fc777 --- /dev/null +++ b/graphics/pokemon/deoxys/speed/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +205 205 255 +106 90 24 +197 189 65 +255 222 57 +255 246 139 +115 213 172 +82 172 123 +57 98 90 +82 74 65 +156 156 131 +106 8 156 +0 98 230 +115 115 106 +197 197 213 +255 255 255 +24 24 24 diff --git a/graphics/pokemon/diggersby/overworld.png b/graphics/pokemon/diggersby/overworld.png index 03d6b5906..39f72f553 100644 Binary files a/graphics/pokemon/diggersby/overworld.png and b/graphics/pokemon/diggersby/overworld.png differ diff --git a/graphics/pokemon/espurr/overworld.png b/graphics/pokemon/espurr/overworld.png index f7ba8e08a..6df4dddb3 100644 Binary files a/graphics/pokemon/espurr/overworld.png and b/graphics/pokemon/espurr/overworld.png differ diff --git a/graphics/pokemon/flabebe/blue/overworld.png b/graphics/pokemon/flabebe/blue/overworld.png index cd98db3a5..09982c244 100644 Binary files a/graphics/pokemon/flabebe/blue/overworld.png and b/graphics/pokemon/flabebe/blue/overworld.png differ diff --git a/graphics/pokemon/flabebe/orange/overworld.png b/graphics/pokemon/flabebe/orange/overworld.png index 482ff4f29..cf7ca349d 100644 Binary files a/graphics/pokemon/flabebe/orange/overworld.png and b/graphics/pokemon/flabebe/orange/overworld.png differ diff --git a/graphics/pokemon/flabebe/overworld.png b/graphics/pokemon/flabebe/overworld.png index 3ad946f5f..9bb8f7f53 100644 Binary files a/graphics/pokemon/flabebe/overworld.png and b/graphics/pokemon/flabebe/overworld.png differ diff --git a/graphics/pokemon/flabebe/white/overworld.png b/graphics/pokemon/flabebe/white/overworld.png index 35b4b2f35..df004f2fe 100644 Binary files a/graphics/pokemon/flabebe/white/overworld.png and b/graphics/pokemon/flabebe/white/overworld.png differ diff --git a/graphics/pokemon/flabebe/yellow/overworld.png b/graphics/pokemon/flabebe/yellow/overworld.png index b0f7a47f7..43b620a76 100644 Binary files a/graphics/pokemon/flabebe/yellow/overworld.png and b/graphics/pokemon/flabebe/yellow/overworld.png differ diff --git a/graphics/pokemon/fletchinder/overworld.png b/graphics/pokemon/fletchinder/overworld.png index a98736535..949b3e308 100644 Binary files a/graphics/pokemon/fletchinder/overworld.png and b/graphics/pokemon/fletchinder/overworld.png differ diff --git a/graphics/pokemon/fletchling/overworld.png b/graphics/pokemon/fletchling/overworld.png index acfc95f61..4c35d25d1 100644 Binary files a/graphics/pokemon/fletchling/overworld.png and b/graphics/pokemon/fletchling/overworld.png differ diff --git a/graphics/pokemon/floette/blue/overworld.png b/graphics/pokemon/floette/blue/overworld.png index 034b33655..01dd29581 100644 Binary files a/graphics/pokemon/floette/blue/overworld.png and b/graphics/pokemon/floette/blue/overworld.png differ diff --git a/graphics/pokemon/floette/eternal/overworld.png b/graphics/pokemon/floette/eternal/overworld.png index 890288792..d8cd5c580 100644 Binary files a/graphics/pokemon/floette/eternal/overworld.png and b/graphics/pokemon/floette/eternal/overworld.png differ diff --git a/graphics/pokemon/floette/orange/overworld.png b/graphics/pokemon/floette/orange/overworld.png index f1559fcdc..b40d7c8c9 100644 Binary files a/graphics/pokemon/floette/orange/overworld.png and b/graphics/pokemon/floette/orange/overworld.png differ diff --git a/graphics/pokemon/floette/overworld.png b/graphics/pokemon/floette/overworld.png index 54f4dd54a..11be9e078 100644 Binary files a/graphics/pokemon/floette/overworld.png and b/graphics/pokemon/floette/overworld.png differ diff --git a/graphics/pokemon/floette/white/overworld.png b/graphics/pokemon/floette/white/overworld.png index af49bcc92..fbf3e297a 100644 Binary files a/graphics/pokemon/floette/white/overworld.png and b/graphics/pokemon/floette/white/overworld.png differ diff --git a/graphics/pokemon/floette/yellow/overworld.png b/graphics/pokemon/floette/yellow/overworld.png index 647e81497..6d515a766 100644 Binary files a/graphics/pokemon/floette/yellow/overworld.png and b/graphics/pokemon/floette/yellow/overworld.png differ diff --git a/graphics/pokemon/gliscor/anim_front.png b/graphics/pokemon/gliscor/anim_front.png index 8c12ed4ef..0454687c4 100644 Binary files a/graphics/pokemon/gliscor/anim_front.png and b/graphics/pokemon/gliscor/anim_front.png differ diff --git a/graphics/pokemon/gliscor/shiny.pal b/graphics/pokemon/gliscor/shiny.pal index 647a9cd6c..6faf8d1e9 100644 --- a/graphics/pokemon/gliscor/shiny.pal +++ b/graphics/pokemon/gliscor/shiny.pal @@ -15,5 +15,5 @@ JASC-PAL 168 144 0 248 216 0 64 64 80 -176 160 248 192 80 144 +104 104 120 diff --git a/graphics/pokemon/greninja/overworld.png b/graphics/pokemon/greninja/overworld.png index bb08608ca..6e14bb60e 100644 Binary files a/graphics/pokemon/greninja/overworld.png and b/graphics/pokemon/greninja/overworld.png differ diff --git a/graphics/pokemon/gurdurr/overworld.png b/graphics/pokemon/gurdurr/overworld.png index a2b8aabbf..38ffe3798 100644 Binary files a/graphics/pokemon/gurdurr/overworld.png and b/graphics/pokemon/gurdurr/overworld.png differ diff --git a/graphics/pokemon/gurdurr/overworld_normal.pal b/graphics/pokemon/gurdurr/overworld_normal.pal index 1219c452c..25acc5771 100644 --- a/graphics/pokemon/gurdurr/overworld_normal.pal +++ b/graphics/pokemon/gurdurr/overworld_normal.pal @@ -9,11 +9,11 @@ JASC-PAL 146 129 121 47 47 40 147 63 121 -104 40 71 +88 56 64 200 95 172 229 229 247 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +84 21 43 +131 41 57 +222 82 90 +161 48 74 0 0 0 diff --git a/graphics/pokemon/gurdurr/overworld_shiny.pal b/graphics/pokemon/gurdurr/overworld_shiny.pal index 09b2dfe70..25db2209b 100644 --- a/graphics/pokemon/gurdurr/overworld_shiny.pal +++ b/graphics/pokemon/gurdurr/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -153 210 164 -82 32 47 -136 40 51 -180 68 48 +152 208 160 +93 41 57 +238 98 16 7 7 7 -208 192 128 -174 151 96 +216 201 140 +175 152 96 47 47 40 -224 80 69 -104 40 71 +173 74 69 +96 88 62 +224 107 96 229 229 247 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +84 21 43 +131 41 57 +222 82 90 +178 81 60 0 0 0 diff --git a/graphics/pokemon/joltik/overworld.png b/graphics/pokemon/joltik/overworld.png index 1a94172c2..8e1dbc88a 100644 Binary files a/graphics/pokemon/joltik/overworld.png and b/graphics/pokemon/joltik/overworld.png differ diff --git a/graphics/pokemon/joltik/overworld_normal.pal b/graphics/pokemon/joltik/overworld_normal.pal index 28d37d4ea..4f7abf847 100644 --- a/graphics/pokemon/joltik/overworld_normal.pal +++ b/graphics/pokemon/joltik/overworld_normal.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 0 0 0 +57 42 14 +111 84 31 199 164 5 -104 71 5 245 218 55 -69 46 0 -18 33 55 -40 79 191 +28 45 99 87 95 227 -185 126 0 -218 218 236 -11 11 11 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +245 245 247 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/joltik/overworld_shiny.pal b/graphics/pokemon/joltik/overworld_shiny.pal index 93966ce50..4d5501cf3 100644 --- a/graphics/pokemon/joltik/overworld_shiny.pal +++ b/graphics/pokemon/joltik/overworld_shiny.pal @@ -1,19 +1,18 @@ JASC-PAL 0100 -16 +15 152 208 160 0 0 0 -184 184 24 -96 96 8 -216 224 80 -69 46 0 -18 33 55 -56 24 88 -184 72 216 -185 126 0 -218 218 236 -11 11 11 -0 0 0 -0 0 0 -0 0 0 -0 0 0 +56 57 14 +108 111 31 +170 179 4 +217 237 12 +38 28 43 +159 83 175 +255 255 255 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/leavanny/overworld.png b/graphics/pokemon/leavanny/overworld.png index 6e5e2b474..f159cf4dc 100644 Binary files a/graphics/pokemon/leavanny/overworld.png and b/graphics/pokemon/leavanny/overworld.png differ diff --git a/graphics/pokemon/lillipup/overworld.png b/graphics/pokemon/lillipup/overworld.png index ef8841471..14f876a2c 100644 Binary files a/graphics/pokemon/lillipup/overworld.png and b/graphics/pokemon/lillipup/overworld.png differ diff --git a/graphics/pokemon/litleo/overworld.png b/graphics/pokemon/litleo/overworld.png index 2c128f318..a419a8327 100644 Binary files a/graphics/pokemon/litleo/overworld.png and b/graphics/pokemon/litleo/overworld.png differ diff --git a/graphics/pokemon/manaphy/egg_sprite.png b/graphics/pokemon/manaphy/egg_sprite.png new file mode 100644 index 000000000..529cb311f Binary files /dev/null and b/graphics/pokemon/manaphy/egg_sprite.png differ diff --git a/graphics/pokemon/manaphy/hatch.png b/graphics/pokemon/manaphy/hatch.png new file mode 100644 index 000000000..bd4483477 Binary files /dev/null and b/graphics/pokemon/manaphy/hatch.png differ diff --git a/graphics/pokemon/manaphy/icon_egg.png b/graphics/pokemon/manaphy/icon_egg.png new file mode 100644 index 000000000..8f8947e1b Binary files /dev/null and b/graphics/pokemon/manaphy/icon_egg.png differ diff --git a/graphics/pokemon/mareanie/overworld.png b/graphics/pokemon/mareanie/overworld.png index d608833c7..35c9173e3 100644 Binary files a/graphics/pokemon/mareanie/overworld.png and b/graphics/pokemon/mareanie/overworld.png differ diff --git a/graphics/pokemon/mareanie/overworld_normal.pal b/graphics/pokemon/mareanie/overworld_normal.pal index 4cba6f123..5b572425d 100644 --- a/graphics/pokemon/mareanie/overworld_normal.pal +++ b/graphics/pokemon/mareanie/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 255 255 -228 193 86 -120 197 206 -179 144 188 -185 155 70 -166 161 169 -85 169 83 -69 114 171 -169 107 215 -147 69 175 -87 76 40 -77 58 85 -43 76 101 +175 218 176 16 16 16 -0 0 0 -0 0 0 +77 58 85 +136 92 152 +166 125 197 +179 144 188 +43 76 101 +84 148 186 +120 197 206 +122 82 12 +185 155 70 +228 193 86 +85 169 83 +166 161 169 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/mareanie/overworld_shiny.pal b/graphics/pokemon/mareanie/overworld_shiny.pal index 6b6569dd3..8b6269e8c 100644 --- a/graphics/pokemon/mareanie/overworld_shiny.pal +++ b/graphics/pokemon/mareanie/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 255 255 -228 193 86 -232 104 160 -179 144 188 -185 155 70 -166 161 169 -85 169 83 -192 56 112 -240 104 80 -208 56 80 -87 76 40 -128 40 48 -43 76 101 +175 218 176 16 16 16 -0 0 0 -0 0 0 +91 52 72 +204 134 107 +232 165 156 +226 191 172 +120 39 63 +186 70 43 +234 108 113 +122 82 12 +185 155 70 +228 193 86 +215 73 32 +166 161 169 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/pancham/overworld.png b/graphics/pokemon/pancham/overworld.png index 90d10d9bf..a54ddda99 100644 Binary files a/graphics/pokemon/pancham/overworld.png and b/graphics/pokemon/pancham/overworld.png differ diff --git a/graphics/pokemon/scatterbug/overworld.png b/graphics/pokemon/scatterbug/overworld.png index 2da700223..41de91798 100644 Binary files a/graphics/pokemon/scatterbug/overworld.png and b/graphics/pokemon/scatterbug/overworld.png differ diff --git a/graphics/pokemon/seismitoad/overworld.png b/graphics/pokemon/seismitoad/overworld.png index 780b69f64..4da0d4529 100644 Binary files a/graphics/pokemon/seismitoad/overworld.png and b/graphics/pokemon/seismitoad/overworld.png differ diff --git a/graphics/pokemon/seismitoad/overworld_shiny.pal b/graphics/pokemon/seismitoad/overworld_shiny.pal index 6f97a5d2f..41e3d1c57 100644 --- a/graphics/pokemon/seismitoad/overworld_shiny.pal +++ b/graphics/pokemon/seismitoad/overworld_shiny.pal @@ -5,14 +5,14 @@ JASC-PAL 55 55 55 87 87 87 0 0 0 -24 56 64 +31 72 64 232 128 56 11 55 112 24 112 104 32 160 136 176 104 32 -236 79 47 -172 47 25 +236 204 110 +153 115 64 33 33 33 0 0 0 0 0 0 diff --git a/graphics/pokemon/sewaddle/overworld.png b/graphics/pokemon/sewaddle/overworld.png index 4ea3161e9..eeb47aa54 100644 Binary files a/graphics/pokemon/sewaddle/overworld.png and b/graphics/pokemon/sewaddle/overworld.png differ diff --git a/graphics/pokemon/sewaddle/overworld_normal.pal b/graphics/pokemon/sewaddle/overworld_normal.pal index c7d535199..97d516fc1 100644 --- a/graphics/pokemon/sewaddle/overworld_normal.pal +++ b/graphics/pokemon/sewaddle/overworld_normal.pal @@ -1,11 +1,11 @@ JASC-PAL 0100 16 -152 208 160 -0 0 0 +115 202 202 +52 19 21 88 152 48 144 200 8 -88 152 48 +36 86 26 152 120 8 248 208 64 192 152 64 @@ -14,6 +14,6 @@ JASC-PAL 80 80 80 224 128 8 152 120 8 -0 0 0 +192 185 180 0 0 0 0 0 0 diff --git a/graphics/pokemon/sewaddle/overworld_shiny.pal b/graphics/pokemon/sewaddle/overworld_shiny.pal index 7b83b6196..35807a8de 100644 --- a/graphics/pokemon/sewaddle/overworld_shiny.pal +++ b/graphics/pokemon/sewaddle/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -0 0 0 +24 52 31 64 152 104 104 184 144 -88 152 48 +60 96 48 120 64 72 -240 248 168 -200 232 48 +206 252 139 +168 211 48 112 128 16 252 252 252 80 80 80 248 88 64 152 120 8 -0 0 0 +192 185 180 0 0 0 0 0 0 diff --git a/graphics/pokemon/spinda/anim_front_gba.png b/graphics/pokemon/spinda/anim_front_gba.png new file mode 100644 index 000000000..7ddfbef51 Binary files /dev/null and b/graphics/pokemon/spinda/anim_front_gba.png differ diff --git a/graphics/pokemon/spinda/back_gba.png b/graphics/pokemon/spinda/back_gba.png new file mode 100644 index 000000000..c5f699e2c Binary files /dev/null and b/graphics/pokemon/spinda/back_gba.png differ diff --git a/graphics/pokemon/spinda/icon_gba.png b/graphics/pokemon/spinda/icon_gba.png new file mode 100644 index 000000000..75699c7cb Binary files /dev/null and b/graphics/pokemon/spinda/icon_gba.png differ diff --git a/graphics/pokemon/spinda/normal_gba.pal b/graphics/pokemon/spinda/normal_gba.pal new file mode 100644 index 000000000..9b0ad5bfc --- /dev/null +++ b/graphics/pokemon/spinda/normal_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +49 164 82 +246 230 172 +230 213 164 +197 180 131 +172 148 106 +222 139 74 +222 106 57 +180 90 41 +156 57 24 +115 65 16 +172 65 90 +255 255 0 +255 255 0 +123 98 74 +90 65 49 +16 16 16 diff --git a/graphics/pokemon/spinda/shiny_gba.pal b/graphics/pokemon/spinda/shiny_gba.pal new file mode 100644 index 000000000..6aa748129 --- /dev/null +++ b/graphics/pokemon/spinda/shiny_gba.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +49 164 82 +246 230 172 +230 213 164 +197 180 131 +172 148 106 +180 197 90 +148 164 57 +115 131 24 +82 98 0 +49 65 0 +172 65 90 +255 255 0 +255 255 0 +123 98 74 +90 65 49 +16 16 16 diff --git a/graphics/pokemon/talonflame/overworld.png b/graphics/pokemon/talonflame/overworld.png index 43760d9e8..67fc802f4 100644 Binary files a/graphics/pokemon/talonflame/overworld.png and b/graphics/pokemon/talonflame/overworld.png differ diff --git a/graphics/pokemon/timburr/overworld.png b/graphics/pokemon/timburr/overworld.png index 4cdec74ce..b2a5b6cb1 100644 Binary files a/graphics/pokemon/timburr/overworld.png and b/graphics/pokemon/timburr/overworld.png differ diff --git a/graphics/pokemon/timburr/overworld_normal.pal b/graphics/pokemon/timburr/overworld_normal.pal index 48c26d478..54d826723 100644 --- a/graphics/pokemon/timburr/overworld_normal.pal +++ b/graphics/pokemon/timburr/overworld_normal.pal @@ -10,9 +10,9 @@ JASC-PAL 121 40 55 191 79 104 236 112 129 -95 47 40 +55 47 40 229 229 247 -138 87 79 +105 96 91 79 47 5 164 104 5 112 71 5 diff --git a/graphics/pokemon/timburr/overworld_shiny.pal b/graphics/pokemon/timburr/overworld_shiny.pal index d3ac821ec..44f957956 100644 --- a/graphics/pokemon/timburr/overworld_shiny.pal +++ b/graphics/pokemon/timburr/overworld_shiny.pal @@ -2,18 +2,18 @@ JASC-PAL 0100 16 152 208 160 -80 61 60 +96 88 62 208 192 128 2 2 2 175 151 96 2 2 2 -186 71 45 -186 71 45 -236 112 129 -80 61 60 +139 55 62 +173 74 69 +224 107 96 +93 41 57 213 210 213 186 71 45 79 47 5 -186 71 45 +164 104 5 112 71 5 218 172 87 diff --git a/graphics/pokemon/toxapex/overworld.png b/graphics/pokemon/toxapex/overworld.png index 2f8a61a72..49680f4e2 100644 Binary files a/graphics/pokemon/toxapex/overworld.png and b/graphics/pokemon/toxapex/overworld.png differ diff --git a/graphics/pokemon/toxapex/overworld_shiny.pal b/graphics/pokemon/toxapex/overworld_shiny.pal index a7aa04de7..eebdd9763 100644 --- a/graphics/pokemon/toxapex/overworld_shiny.pal +++ b/graphics/pokemon/toxapex/overworld_shiny.pal @@ -1,10 +1,10 @@ JASC-PAL 0100 16 -255 255 255 +129 201 163 217 210 97 208 112 136 -79 158 72 +210 94 50 184 64 88 234 129 66 144 56 56 diff --git a/graphics/pokemon/toxel/overworld.png b/graphics/pokemon/toxel/overworld.png index bfc91d819..519cc693a 100644 Binary files a/graphics/pokemon/toxel/overworld.png and b/graphics/pokemon/toxel/overworld.png differ diff --git a/graphics/pokemon/toxel/overworld_normal.pal b/graphics/pokemon/toxel/overworld_normal.pal index 43b6ce52b..b80c00c1e 100644 --- a/graphics/pokemon/toxel/overworld_normal.pal +++ b/graphics/pokemon/toxel/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -252 0 20 -52 40 56 -88 88 88 -152 120 164 -24 12 32 -252 252 252 -116 84 128 0 0 0 -156 92 188 -192 188 188 -104 52 128 +0 0 0 +76 52 88 +131 73 159 +170 113 198 96 96 140 +142 110 157 +188 170 197 +235 162 217 +192 188 188 248 248 248 -0 0 0 -0 0 0 -0 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/toxel/overworld_shiny.pal b/graphics/pokemon/toxel/overworld_shiny.pal index ab75d21dd..faa56a365 100644 --- a/graphics/pokemon/toxel/overworld_shiny.pal +++ b/graphics/pokemon/toxel/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -252 0 20 -49 41 57 -90 90 90 -156 123 164 -41 16 24 -255 255 255 -115 82 131 -0 0 0 -197 90 131 -197 189 189 -148 57 90 -98 98 139 -255 255 255 -0 0 0 0 0 0 0 0 0 +79 44 96 +209 74 100 +239 128 150 +96 96 140 +132 76 171 +179 139 208 +235 162 217 +192 188 188 +248 248 248 +255 0 0 +255 0 0 +255 0 0 +255 0 0 +255 0 0 diff --git a/graphics/pokemon/tsareena/overworld.png b/graphics/pokemon/tsareena/overworld.png index 0f7f8724e..d1e5be8d6 100644 Binary files a/graphics/pokemon/tsareena/overworld.png and b/graphics/pokemon/tsareena/overworld.png differ diff --git a/graphics/pokemon/tsareena/overworld_normal.pal b/graphics/pokemon/tsareena/overworld_normal.pal index 262496ab5..55b1a7899 100644 --- a/graphics/pokemon/tsareena/overworld_normal.pal +++ b/graphics/pokemon/tsareena/overworld_normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 255 255 -241 241 241 -232 230 95 -159 211 116 -197 197 197 -125 185 77 -114 172 67 -93 140 55 -137 137 137 -209 97 140 -196 71 119 -63 93 38 -174 58 103 -115 35 66 -44 64 27 +149 204 178 0 0 0 +44 64 27 +63 93 38 +93 140 55 +114 172 67 +159 211 116 +232 230 95 +209 97 140 +115 35 66 +174 58 103 +196 71 119 +87 72 110 +197 197 197 +241 241 241 +255 0 0 diff --git a/graphics/pokemon/tsareena/overworld_shiny.pal b/graphics/pokemon/tsareena/overworld_shiny.pal index c05e30b34..77c5cd603 100644 --- a/graphics/pokemon/tsareena/overworld_shiny.pal +++ b/graphics/pokemon/tsareena/overworld_shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -255 255 255 -248 240 184 -232 95 199 -216 160 232 -200 192 128 -176 104 200 -152 88 200 -152 0 208 -137 137 137 -209 97 140 -196 71 119 -112 56 144 -174 58 103 -115 35 66 -44 64 27 +149 204 178 0 0 0 +70 55 92 +88 69 118 +119 91 160 +142 118 178 +187 169 214 +114 89 141 +219 133 166 +150 46 86 +197 81 126 +207 106 145 +87 72 110 +193 188 79 +229 228 171 +255 0 0 diff --git a/graphics/pokemon/watchog/overworld.png b/graphics/pokemon/watchog/overworld.png index e9184c737..092d97f50 100644 Binary files a/graphics/pokemon/watchog/overworld.png and b/graphics/pokemon/watchog/overworld.png differ diff --git a/graphics/pokemon/whirlipede/overworld.png b/graphics/pokemon/whirlipede/overworld.png index d6cc3e73d..725b92fd6 100644 Binary files a/graphics/pokemon/whirlipede/overworld.png and b/graphics/pokemon/whirlipede/overworld.png differ diff --git a/graphics/pokemon/whirlipede/overworld_shiny.pal b/graphics/pokemon/whirlipede/overworld_shiny.pal index 18192596b..5f3a68caa 100644 --- a/graphics/pokemon/whirlipede/overworld_shiny.pal +++ b/graphics/pokemon/whirlipede/overworld_shiny.pal @@ -6,12 +6,12 @@ JASC-PAL 64 56 72 100 85 143 128 104 160 -88 152 136 +88 163 136 0 0 0 64 64 80 40 40 40 -168 128 64 -208 176 96 +209 128 175 +208 176 185 96 80 128 0 0 0 0 0 0 diff --git a/include/battle.h b/include/battle.h index 55d887a5d..abb92237a 100644 --- a/include/battle.h +++ b/include/battle.h @@ -3,6 +3,7 @@ // should they be included here or included individually by every file? #include "constants/battle_end_turn.h" +#include "constants/battle_switch_in.h" #include "constants/abilities.h" #include "constants/battle.h" #include "constants/form_change_types.h" @@ -12,7 +13,6 @@ #include "battle_message.h" #include "battle_util.h" #include "battle_script_commands.h" -#include "battle_ai_switch_items.h" #include "battle_gfx_sfx_util.h" #include "battle_util2.h" #include "battle_bg.h" @@ -51,7 +51,7 @@ // Used to exclude moves learned temporarily by Transform or Mimic #define MOVE_IS_PERMANENT(battler, moveSlot) \ (!(gBattleMons[battler].volatiles.transformed) \ - && !(gDisableStructs[battler].mimickedMoves & (1u << moveSlot))) + && !(gBattleMons[battler].volatiles.mimickedMoves & (1u << moveSlot))) // Battle Actions // These determine what each battler will do in a turn @@ -77,71 +77,6 @@ #define BATTLE_BUFFER_LINK_SIZE 0x1000 -// Cleared each time a mon leaves the field, either by switching out or fainting -struct DisableStruct -{ - u32 transformedMonPersonality; - bool8 transformedMonShininess; - u16 disabledMove; - u16 encoredMove; - u8 protectUses:4; - u8 stockpileCounter:4; - s8 stockpileDef; - s8 stockpileSpDef; - s8 stockpileBeforeDef; - s8 stockpileBeforeSpDef; - u8 substituteHP; - u8 encoredMovePos; - u16 disableTimer; - u16 encoreTimer; - u16 perishSongTimer; - u16 rolloutTimer; - u16 rolloutTimerStartValue; - u16 tauntTimer; - u8 furyCutterCounter; - u8 battlerPreventingEscape; - u8 battlerWithSureHit; - u8 isFirstTurn; - u8 mimickedMoves:4; - u8 chargeTimer:4; - u8 rechargeTimer; - u8 autotomizeCount; - u16 slowStartTimer; - u16 embargoTimer; - u16 magnetRiseTimer; - u16 telekinesisTimer; - u16 healBlockTimer; - u16 laserFocusTimer; - u16 throatChopTimer; - u8 wrapTurns; - u16 syrupBombTimer; - u16 tormentTimer; // used for G-Max Meltdown - u8 usedMoves:4; - u8 truantCounter:1; - u8 truantSwitchInHack:1; - u8 tarShot:1; - u8 octolock:1; - u8 cudChew:1; - u8 weatherAbilityDone:1; - u8 terrainAbilityDone:1; - u8 syrupBombIsShiny:1; - u8 usedProteanLibero:1; - u8 flashFireBoosted:1; - u8 boosterEnergyActivated:1; - u8 padding1:1; - u16 overwrittenAbility; // abilities overwritten during battle (keep separate from battle history in case of switching) - u8 roostActive:1; - u8 unburdenActive:1; - u8 neutralizingGas:1; - u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case - u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in - u8 hazardsDone:1; - u8 endured:1; - u8 tryEjectPack:1; - u8 octolockedBy:3; - u8 padding:5; -}; - // Fully Cleared each turn after end turn effects are done. A few things are cleared before end turn effects struct ProtectStruct { @@ -149,72 +84,66 @@ struct ProtectStruct u32 noValidMoves:1; u32 bounceMove:1; u32 stealMove:1; - u32 nonVolatileStatusImmobility:1; - u32 confusionSelfDmg:1; u32 chargingTurn:1; u32 fleeType:2; // 0: Normal, 1: FLEE_ITEM, 2: FLEE_ABILITY - u32 unableToUseMove:1; // Not to be confused with HITMARKER_UNABLE_TO_USE_MOVE (It is questionable though if there is a difference. Needs further research) u32 laggingTail:1; u32 palaceUnableToUseMove:1; u32 statRaised:1; u32 usedCustapBerry:1; // also quick claw - u32 touchedProtectLike:1; u32 disableEjectPack:1; u32 pranksterElevated:1; u32 quickDraw:1; - u32 beakBlastCharge:1; u32 quash:1; u32 shellTrap:1; u32 eatMirrorHerb:1; u32 activateOpportunist:2; // 2 - to copy stats. 1 - stats copied (do not repeat). 0 - no stats to copy - u16 usedAllySwitch:1; + u32 usedAllySwitch:1; + u32 lashOutAffected:1; + u32 assuranceDoubled:1; + u32 forcedSwitch:1; + u32 myceliumMight:1; + u32 survivedOHKO:1; // Used to keep track of effects that allow focus punch when surviving moves like Fissure + u32 padding1:1; // End of 32-bit bitfield u16 helpingHand:3; - u16 lashOutAffected:1; - u16 assuranceDoubled:1; - u16 myceliumMight:1; - u16 padding:10; + u16 revengeDoubled:4; + u16 padding2:9; // End of 16-bit bitfield u16 physicalDmg; u16 specialDmg; - u8 physicalBattlerId:4; - u8 specialBattlerId:4; + u8 physicalBattlerId:3; + u8 specialBattlerId:3; + u8 lastHitBySpecialMove:1; + u8 padding3:1; }; // Cleared at the start of HandleAction_ActionFinished struct SpecialStatus { - s32 physicalDmg; - s32 specialDmg; u8 changedStatsBattlerId; // Battler that was responsible for the latest stat change. Can be self. u8 statLowered:1; u8 abilityRedirected:1; u8 restoredBattlerSprite: 1; u8 faintedHasReplacement:1; u8 afterYou:1; - u8 enduredDamage:1; + u8 damagedByAttack:1; u8 dancerUsedMove:1; - u8 padding:1; + u8 criticalHit:1; // End of byte - u8 switchInAbilityDone:1; - u8 switchInItemDone:1; u8 instructedChosenTarget:3; + u8 neutralizingGasRemoved:1; u8 berryReduced:1; - u8 announceNeutralizingGas:1; // See Cmd_switchineffects - u8 neutralizingGasRemoved:1; // See VARIOUS_TRY_END_NEUTRALIZING_GAS - // End of byte - u8 gemParam; + u8 mindBlownRecoil:1; + u8 padding2:2; // End of byte + u8 gemParam:7; u8 gemBoost:1; - u8 rototillerAffected:1; // to be affected by rototiller + // End of byte u8 parentalBondState:2; u8 multiHitOn:1; u8 distortedTypeMatchups:1; u8 teraShellAbilityDone:1; - u8 criticalHit:1; - // End of byte u8 dancerOriginalTarget:3; - u8 unused:5; // End of byte }; @@ -255,22 +184,10 @@ struct FieldTimer u16 fairyLockTimer; }; -struct WishFutureKnock -{ - u16 futureSightCounter[MAX_BATTLERS_COUNT]; - u8 futureSightBattlerIndex[MAX_BATTLERS_COUNT]; - u8 futureSightPartyIndex[MAX_BATTLERS_COUNT]; - u16 futureSightMove[MAX_BATTLERS_COUNT]; - u16 wishCounter[MAX_BATTLERS_COUNT]; - u8 wishPartyId[MAX_BATTLERS_COUNT]; - u8 weatherDuration; - u8 knockedOffMons[NUM_BATTLE_SIDES]; // Each battler is represented by a bit. -}; - struct AI_SavedBattleMon { enum Ability ability; - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u16 heldItem; u16 species:15; u16 saved:1; @@ -280,11 +197,11 @@ struct AI_SavedBattleMon struct AiPartyMon { u16 species; - u16 item; - u16 heldEffect; + enum Item item; + enum HoldEffect heldEffect; enum Ability ability; u16 level; - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u32 status; u8 switchInCount; // Counts how many times this Pokemon has been sent out or switched into in a battle. u8 gender:2; @@ -299,12 +216,6 @@ struct AiPartyData // Opposing battlers - party mons. u8 count[NUM_BATTLE_SIDES]; }; -struct SwitchinCandidate -{ - struct BattlePokemon battleMon; - bool8 hypotheticalStatus; -}; - struct SimulatedDamage { u16 minimum; @@ -316,12 +227,12 @@ struct SimulatedDamage struct AiLogicData { enum Ability abilities[MAX_BATTLERS_COUNT]; - u16 items[MAX_BATTLERS_COUNT]; - u16 holdEffects[MAX_BATTLERS_COUNT]; + enum Item items[MAX_BATTLERS_COUNT]; + enum HoldEffect holdEffects[MAX_BATTLERS_COUNT]; u8 holdEffectParams[MAX_BATTLERS_COUNT]; - u16 lastUsedMove[MAX_BATTLERS_COUNT]; + enum Move lastUsedMove[MAX_BATTLERS_COUNT]; u8 hpPercents[MAX_BATTLERS_COUNT]; - u16 partnerMove; + enum Move partnerMove; u16 speedStats[MAX_BATTLERS_COUNT]; // Speed stats for all battles, calculated only once, same way as damages struct SimulatedDamage simulatedDmg[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex uq4_12_t effectiveness[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // attacker, target, moveIndex @@ -329,18 +240,21 @@ struct AiLogicData u8 moveLimitations[MAX_BATTLERS_COUNT]; u8 monToSwitchInId[MAX_BATTLERS_COUNT]; // ID of the mon to switch in. u8 mostSuitableMonId[MAX_BATTLERS_COUNT]; // Stores result of GetMostSuitableMonToSwitchInto, which decides which generic mon the AI would switch into if they decide to switch. This can be overruled by specific mons found in ShouldSwitch; the final resulting mon is stored in AI_monToSwitchIntoId. - struct SwitchinCandidate switchinCandidate; // Struct used for deciding which mon to switch to in battle_ai_switch_items.c - u8 weatherHasEffect:1; // The same as HasWeatherEffect(). Stored here, so it's called only once. - u8 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button - u8 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack - u8 predictingSwitch:1; // Determines whether AI will use switch predictions this turn or not - u8 aiPredictionInProgress:1; // Tracks whether the AI is in the middle of running prediction calculations - u8 aiCalcInProgress:1; - u8 predictingMove:1; // Determines whether AI will use move predictions this turn or not - u8 padding1:1; - u8 shouldSwitch:4; // Stores result of ShouldSwitch, which decides whether a mon should be switched out - u8 padding2:4; - u16 predictedMove[MAX_BATTLERS_COUNT]; + enum Move predictedMove[MAX_BATTLERS_COUNT]; + u8 resistBerryAffected[MAX_BATTLERS_COUNT][MAX_BATTLERS_COUNT][MAX_MON_MOVES]; // Tracks whether currently calc'd move is affected by a resist berry into given target + + // Flags + u32 weatherHasEffect:1; // The same as HasWeatherEffect(). Stored here, so it's called only once. + u32 ejectButtonSwitch:1; // Tracks whether current switch out was from Eject Button + u32 ejectPackSwitch:1; // Tracks whether current switch out was from Eject Pack + u32 predictingSwitch:1; // Determines whether AI will use switch predictions this turn or not + u32 aiPredictionInProgress:1; // Tracks whether the AI is in the middle of running prediction calculations + u32 aiCalcInProgress:1; + u32 predictingMove:1; // Determines whether AI will use move predictions this turn or not + u32 shouldConsiderExplosion:1; // Determines whether AI should consider explosion moves this turn + u32 shouldSwitch:4; // Stores result of ShouldSwitch, which decides whether a mon should be switched out + u32 shouldConsiderFinalGambit:1; // Determines whether AI should consider Final Gambit this turn + u32 padding2:19; }; struct AiThinkingStruct @@ -518,7 +432,8 @@ struct LinkBattlerHeader struct BattleEnigmaBerry battleEnigmaBerry; }; -enum IllusionState { +enum IllusionState +{ ILLUSION_NOT_SET, ILLUSION_OFF, ILLUSION_ON @@ -568,6 +483,20 @@ struct BattleVideo { rng_value_t rngSeed; }; +struct Wish +{ + u16 counter; + u8 partyId; +}; + +struct FutureSight +{ + u16 move; + u16 counter:10; + u16 battlerIndex:3; + u16 partyIndex:3; +}; + struct BattlerState { u8 targetsDone[MAX_BATTLERS_COUNT]; @@ -590,8 +519,13 @@ struct BattlerState u32 wasAboveHalfHp:1; // For Berserk, Emergency Exit, Wimp Out and Anger Shell. u32 commanderSpecies:11; u32 selectionScriptFinished:1; - u32 padding:3; + u32 lastMoveTarget:3; // The last target on which each mon used a move, for the sake of Instruct // End of Word + u16 hpOnSwitchout; + u16 switchIn:1; + u16 fainted:1; + u16 isFirstTurn:2; + u16 padding:12; }; struct PartyState @@ -605,7 +539,8 @@ struct PartyState u32 timesGotHit:5; u32 changedSpecies:11; // For forms when multiple mons can change into the same pokemon. u32 sentOut:1; - u32 padding:9; + u32 isKnockedOff:1; + u32 padding:8; u16 usedHeldItem; }; @@ -617,12 +552,15 @@ struct EventStates u32 arenaTurn:8; enum BattleSide battlerSide:4; enum BattlerId moveEndBattler:4; - enum FirstTurnEventsStates beforeFristTurn:8; + enum FirstTurnEventsStates beforeFirstTurn:8; enum FaintedActions faintedAction:8; enum BattlerId faintedActionBattler:4; - enum MoveSuccessOrder atkCanceller:8; + enum MoveSuccessOrder atkCanceler:8; + enum BattlerId atkCancelerBattler:4; enum BattleIntroStates battleIntro:8; - u32 padding:24; + enum SwitchInEvents switchIn:8; + u32 battlerSwitchIn:8; // SwitchInFirstEventBlock, SwitchInSecondEventBlock + u32 moveEndBlock:8; }; // Cleared at the beginning of the battle. Fields need to be cleared when needed manually otherwise. @@ -631,9 +569,12 @@ struct BattleStruct struct BattlerState battlerState[MAX_BATTLERS_COUNT]; struct PartyState partyState[NUM_BATTLE_SIDES][PARTY_SIZE]; struct EventStates eventState; + struct FutureSight futureSight[MAX_BATTLERS_COUNT]; + struct Wish wish[MAX_BATTLERS_COUNT]; u16 moveTarget[MAX_BATTLERS_COUNT]; u32 expShareExpValue; u32 expValue; + u8 weatherDuration; u8 expGettersOrder[PARTY_SIZE]; // First battlers which were sent out, then via exp-share u8 expGetterMonId; u8 expOrderId:3; @@ -668,17 +609,15 @@ struct BattleStruct u8 field_93; // related to choosing pokemon? u8 simulatedInputState[4]; // used by Oak/Old Man/Pokedude controllers, Wally States/Frames in pokeemerald u16 lastTakenMove[MAX_BATTLERS_COUNT]; // Last move that a battler was hit with. - u16 hpOnSwitchout[NUM_BATTLE_SIDES]; u32 savedBattleTypeFlags; u16 abilityPreventingSwitchout; u8 hpScale; u16 synchronizeMoveEffect; u8 anyMonHasTransformed:1; // Only used in battle_tv.c - u8 multipleSwitchInState:2; - u8 multipleSwitchInCursor:3; u8 sleepClauseNotBlocked:1; u8 isSkyBattle:1; - u8 multipleSwitchInSortedBattlers[MAX_BATTLERS_COUNT]; + u8 unableToUseMove:1; // for the current action only, to check if the battler failed to act at end turn use the DisableStruct member + u8 unused:4; void (*savedCallback)(void); u16 chosenItem[MAX_BATTLERS_COUNT]; u16 choicedMove[MAX_BATTLERS_COUNT]; @@ -689,20 +628,18 @@ struct BattleStruct struct LinkBattlerHeader linkBattlerHeader; struct BattleVideo battleVideo; } multiBuffer; - u8 startingStatus; // status to apply at battle start. defined in constants/battle.h u8 battlerKOAnimsRunning:3; u8 friskedAbility:1; // If identifies two mons, show the ability pop-up only once. u8 fickleBeamBoosted:1; u8 poisonPuppeteerConfusion:1; u8 toxicChainPriority:1; // If Toxic Chain will trigger on target, all other non volatiles will be blocked - u8 padding1:1; - u16 startingStatusTimer; + u8 battlersSorted:1; // To avoid unnessasery computation // struct BattleTvMovePoints tvMovePoints; // struct BattleTv tv; u8 AI_monToSwitchIntoId[MAX_BATTLERS_COUNT]; - s8 arenaMindPoints[2]; - s8 arenaSkillPoints[2]; - u16 arenaStartHp[2]; + s8 arenaMindPoints[NUM_BATTLE_SIDES]; + s8 arenaSkillPoints[NUM_BATTLE_SIDES]; + u16 arenaStartHp[NUM_BATTLE_SIDES]; u8 arenaLostPlayerMons; // Bits for party member, lost as in referee's decision, not by fainting. u8 arenaLostOpponentMons; u8 debugBattler; @@ -718,12 +655,10 @@ struct BattleStruct struct BattleGimmickData gimmick; const u8 *trainerSlideMsg; u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages - u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct enum Ability tracedAbility[MAX_BATTLERS_COUNT]; struct Illusion illusion[MAX_BATTLERS_COUNT]; u8 soulheartBattlerId; u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. - u8 metronomeItemCounter[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. u8 quickClawBattlerId; struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side) u8 blunderPolicy:1; // should blunder policy activate @@ -738,13 +673,12 @@ struct BattleStruct u8 moveInfoSpriteId; // move info, window gfx u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle. // When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without. - u16 beatUpSpecies[PARTY_SIZE]; + u16 beatUpSpecies[PARTY_SIZE]; // Species for Gen5+ Beat Up, otherwise party indexes u8 attackerBeforeBounce:2; u8 beatUpSlot:3; u8 pledgeMove:1; u8 effectsBeforeUsingMoveDone:1; // Mega Evo and Focus Punch/Shell Trap effects. - u8 spriteIgnore0Hp:1; - u8 bonusCritStages[MAX_BATTLERS_COUNT]; // G-Max Chi Strike boosts crit stages of allies. + u8 padding3:1; u8 itemPartyIndex[MAX_BATTLERS_COUNT]; u8 itemMoveIndex[MAX_BATTLERS_COUNT]; s32 aiDelayTimer; // Counts number of frames AI takes to choose an action. @@ -764,17 +698,14 @@ struct BattleStruct u16 prevTurnSpecies[MAX_BATTLERS_COUNT]; // Stores species the AI has in play at start of turn s16 passiveHpUpdate[MAX_BATTLERS_COUNT]; // non-move damage and healing s16 moveDamage[MAX_BATTLERS_COUNT]; - s16 critChance[MAX_BATTLERS_COUNT]; u16 moveResultFlags[MAX_BATTLERS_COUNT]; - u8 missStringId[MAX_BATTLERS_COUNT]; enum CalcDamageState noResultString[MAX_BATTLERS_COUNT]; u8 doneDoublesSpreadHit:1; u8 calculatedDamageDone:1; u8 calculatedSpreadMoveAccuracy:1; u8 printedStrongWindsWeakenedAttack:1; - u8 numSpreadTargets:2; - u8 noTargetPresent:1; - u8 padding2:1; + u8 numSpreadTargets:3; + u8 moldBreakerActive:1; struct MessageStatus slideMessageStatus; u8 trainerSlideSpriteIds[MAX_BATTLERS_COUNT]; u8 hazardsQueue[NUM_BATTLE_SIDES][HAZARDS_MAX_COUNT]; @@ -786,7 +717,11 @@ struct BattleStruct u16 flingItem; u8 incrementEchoedVoice:1; u8 echoedVoiceCounter:3; - u8 padding3:4; + u8 preAttackAnimPlayed:1; + u8 padding4:1; + u8 magicCoatActive:1; + u8 magicBounceActive:1; + u8 moveBouncer; // pokefirered u8 field_DA; // battle tower related u8 lastAttackerToFaintOpponent; @@ -813,17 +748,17 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define F_DYNAMIC_TYPE_IGNORE_PHYSICALITY (1 << 6) // If set, the dynamic type's physicality won't be used for certain move effects. #define F_DYNAMIC_TYPE_SET (1 << 7) // Set for all dynamic types to distinguish a dynamic type of Normal (0) from no dynamic type. -static inline bool32 IsBattleMovePhysical(u32 move) +static inline bool32 IsBattleMovePhysical(enum Move move) { return GetBattleMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL; } -static inline bool32 IsBattleMoveSpecial(u32 move) +static inline bool32 IsBattleMoveSpecial(enum Move move) { return GetBattleMoveCategory(move) == DAMAGE_CATEGORY_SPECIAL; } -static inline bool32 IsBattleMoveStatus(u32 move) +static inline bool32 IsBattleMoveStatus(enum Move move) { return GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS; } @@ -909,7 +844,7 @@ struct BattleScripting u8 specialTrainerBattleType; bool8 monCaught; s32 savedDmg; - u16 savedMoveEffect; // For moves hitting multiple targets. + u16 unused_0x2c; u16 moveEffect; u16 unused_0x30; u8 illusionNickHack; // To properly display nick in STRINGID_ENEMYABOUTTOSWITCHPKMN. @@ -1056,6 +991,7 @@ extern u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT]; extern u8 gBattlerPositions[MAX_BATTLERS_COUNT]; extern u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT]; extern u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT]; +extern u8 gBattlersBySpeed[MAX_BATTLERS_COUNT]; extern u8 gCurrentTurnActionNumber; extern u8 gCurrentActionFuncId; extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT]; @@ -1093,7 +1029,6 @@ extern u32 gHitMarker; extern u8 gBideTarget[MAX_BATTLERS_COUNT]; extern u32 gSideStatuses[NUM_BATTLE_SIDES]; extern struct SideTimer gSideTimers[NUM_BATTLE_SIDES]; -extern struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT]; extern u16 gPauseCounterBattle; extern u16 gPaydayMoney; extern u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT]; @@ -1101,12 +1036,12 @@ extern u8 gBattleOutcome; extern struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT]; extern struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT]; extern u16 gBattleWeather; -extern struct WishFutureKnock gWishFutureKnock; extern u16 gIntroSlideFlags; extern u8 gSentPokesToOpponent[2]; extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; extern struct BattleScripting gBattleScripting; extern struct BattleStruct *gBattleStruct; +extern struct StartingStatuses gStartingStatuses; extern struct AiBattleData *gAiBattleData; extern struct AiThinkingStruct *gAiThinkingStruct; extern struct AiLogicData *gAiLogicData; @@ -1151,9 +1086,9 @@ extern struct PokedudeBattlerState *gPokedudeBattlerStates[MAX_BATTLERS_COUNT]; static inline bool32 IsBattlerAlive(u32 battler) { - if (gBattleMons[battler].hp == 0) + if (battler >= gBattlersCount) return FALSE; - else if (battler >= gBattlersCount) + else if (gBattleMons[battler].hp == 0) return FALSE; else if (gAbsentBattlerFlags & (1u << battler)) return FALSE; @@ -1163,9 +1098,7 @@ static inline bool32 IsBattlerAlive(u32 battler) static inline bool32 IsBattlerTurnDamaged(u32 battler) { - return gSpecialStatuses[battler].physicalDmg != 0 - || gSpecialStatuses[battler].specialDmg != 0 - || gSpecialStatuses[battler].enduredDamage; + return gSpecialStatuses[battler].damagedByAttack; } static inline bool32 IsBattlerAtMaxHp(u32 battler) @@ -1173,12 +1106,12 @@ static inline bool32 IsBattlerAtMaxHp(u32 battler) return gBattleMons[battler].hp == gBattleMons[battler].maxHP; } -static inline u32 GetBattlerPosition(u32 battler) +static inline enum BattlerPosition GetBattlerPosition(u32 battler) { return gBattlerPositions[battler]; } -static inline u32 GetBattlerAtPosition(u32 position) +static inline u32 GetBattlerAtPosition(enum BattlerPosition position) { u32 battler; for (battler = 0; battler < gBattlersCount; battler++) @@ -1245,23 +1178,11 @@ static inline bool32 IsDoubleBattle(void) return (gBattleTypeFlags & BATTLE_TYPE_MORE_THAN_TWO_BATTLERS); } -static inline bool32 IsSpreadMove(u32 moveTarget) +static inline bool32 IsSpreadMove(enum MoveTarget moveTarget) { - return IsDoubleBattle() && (moveTarget == MOVE_TARGET_BOTH || moveTarget == MOVE_TARGET_FOES_AND_ALLY); -} - -static inline bool32 IsDoubleSpreadMove(void) -{ - return gBattleStruct->numSpreadTargets > 1 - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); -} - -static inline bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDef, u32 moveTarget) -{ - return battlerDef == battlerAtk - || !IsBattlerAlive(battlerDef) - || (battlerDef == BATTLE_PARTNER(battlerAtk) && (moveTarget == MOVE_TARGET_BOTH)); + if (!IsDoubleBattle()) + return FALSE; + return moveTarget == TARGET_BOTH || moveTarget == TARGET_FOES_AND_ALLY; } static inline u32 GetChosenMoveFromPosition(u32 battler) diff --git a/include/battle_ai_field_statuses.h b/include/battle_ai_field_statuses.h index 64608f637..aa8f4f2d1 100644 --- a/include/battle_ai_field_statuses.h +++ b/include/battle_ai_field_statuses.h @@ -14,5 +14,6 @@ enum FieldEffectOutcome bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult); bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome desiredResult); +s32 CalcWeatherScore(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData); #endif //GUARD_BATTLE_AI_FIELD_STATUSES_H diff --git a/include/battle_ai_items.h b/include/battle_ai_items.h new file mode 100644 index 000000000..0abd2eac5 --- /dev/null +++ b/include/battle_ai_items.h @@ -0,0 +1,6 @@ +#ifndef GUARD_BATTLE_AI_ITEMS_H +#define GUARD_BATTLE_AI_ITEMS_H + +bool32 ShouldUseItem(u32 battler); + +#endif // GUARD_BATTLE_AI_ITEMS_H diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index 4330f9d2b..a69069288 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -3,6 +3,7 @@ typedef s32 (*AiScoreFunc)(u32, u32, u32, s32); +typedef bool32 (*AiSwitchFunc)(u32); #define UNKNOWN_NO_OF_HITS UINT32_MAX @@ -28,6 +29,7 @@ enum StatChange STAT_CHANGE_SPEED_3, STAT_CHANGE_SPATK_3, STAT_CHANGE_SPDEF_3, + STAT_CHANGE_ATK_MAX, STAT_CHANGE_ACC, STAT_CHANGE_EVASION }; @@ -131,6 +133,10 @@ void Ai_InitPartyStruct(void); void Ai_UpdateSwitchInData(u32 battler); void Ai_UpdateFaintData(u32 battler); void SetAiLogicDataForTurn(struct AiLogicData *aiData); -void ResetDynamicAiFunc(void); +void ResetDynamicAiFunctions(void); +void AI_TrySwitchOrUseItem(u32 battler); +void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather, u32 fieldStatus); + +extern AiSwitchFunc gDynamicAiSwitchFunc; #endif // GUARD_BATTLE_AI_MAIN_H diff --git a/include/battle_ai_switch_items.h b/include/battle_ai_switch.h similarity index 78% rename from include/battle_ai_switch_items.h rename to include/battle_ai_switch.h index 35085563a..d37ebf090 100644 --- a/include/battle_ai_switch_items.h +++ b/include/battle_ai_switch.h @@ -1,5 +1,5 @@ -#ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H -#define GUARD_BATTLE_AI_SWITCH_ITEMS_H +#ifndef GUARD_BATTLE_AI_SWITCH_H +#define GUARD_BATTLE_AI_SWITCH_H enum ShouldSwitchScenario { @@ -33,19 +33,21 @@ enum ShouldSwitchScenario SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO, SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS, SHOULD_SWITCH_ALL_SCORES_BAD, + SHOULD_SWITCH_DYN_FUNC, }; enum SwitchType { SWITCH_AFTER_KO, - SWITCH_MID_BATTLE, + SWITCH_MID_BATTLE_FORCED, + SWITCH_MID_BATTLE_OPTIONAL, }; -void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); -void AI_TrySwitchOrUseItem(u32 battler); u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType); bool32 ShouldSwitch(u32 battler); -bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, enum Type type1, enum Type type2); void ModifySwitchAfterMoveScoring(u32 battler); +u32 AI_SelectRevivalBlessingMon(u32 battler); +bool32 IsSwitchinValid(u32 battler); +bool32 IsAceMon(u32 battler, u32 monPartyId); -#endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H +#endif // GUARD_BATTLE_AI_SWITCH_H diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 2c8760893..e79a2ff35 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -22,15 +22,23 @@ enum DamageCalcContext AI_ATTACKING, }; +enum AiConsiderEndure +{ + CONSIDER_ENDURE, + DONT_CONSIDER_ENDURE, +}; + // Higher priority at the bottom; note that these are used in the formula MAX_MON_MOVES ^ AiCompareMovesPriority, which must fit within a u32. // In expansion where MAX_MON_MOVES is 4, this means that AiCompareMovesPriority can range from 0 - 15 inclusive. enum AiCompareMovesPriority { PRIORITY_EFFECT, - PRIORITY_GUARANTEE, PRIORITY_ACCURACY, - PRIORITY_NOT_CHARGING, + PRIORITY_GUARANTEE, + PRIORITY_AVOID_SELF_SACRIFICE, PRIORITY_SPEED, + PRIORITY_NOT_CHARGING, + PRIORITY_RESIST_BERRY, }; enum AIPivot @@ -60,33 +68,33 @@ enum ConsiderPriority CONSIDER_PRIORITY, }; -static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations) +static inline bool32 IsMoveUnusable(u32 moveIndex, enum Move move, u32 moveLimitations) { return move == MOVE_NONE || move == MOVE_UNAVAILABLE || moveLimitations & 1u << moveIndex; } -typedef bool32 (*MoveFlag)(u32 move); +typedef bool32 (*MoveFlag)(enum Move move); -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); -bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); -bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, enum Move aiMove, enum Move playerMove, enum ConsiderPriority considerPriority); +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, enum Move aiMove, enum Move playerMove, enum ConsiderPriority considerPriority); bool32 AI_RandLessThan(u32 val); bool32 AI_IsBattlerGrounded(u32 battler); +enum MoveTarget AI_GetBattlerMoveTargetType(u32 battler, enum Move move); +enum Ability AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectDef, enum Move move); u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData); -bool32 IsAiVsAiBattle(void); -bool32 BattlerHasAi(u32 battlerId); +bool32 IsAiFlagPresent(u64 flag); bool32 IsAiBattlerAware(u32 battlerId); -bool32 CanAiPredictMove(void); -bool32 IsAiBattlerAssumingStab(void); -bool32 IsAiBattlerAssumingStatusMoves(void); -bool32 ShouldRecordStatusMove(u32 move); +bool32 CanAiPredictMove(u32 battlerId); +bool32 IsAiBattlerAssumingStab(u32 battlerId); +bool32 IsAiBattlerAssumingStatusMoves(u32 battlerId); +bool32 IsAiBattlerPredictingAbility(u32 battlerId); +bool32 ShouldRecordStatusMove(enum Move move); void ClearBattlerMoveHistory(u32 battlerId); -void RecordLastUsedMoveBy(u32 battlerId, u32 move); +void RecordLastUsedMoveBy(u32 battlerId, enum Move move); void RecordAllMoves(u32 battler); -void RecordKnownMove(u32 battlerId, u32 move); +void RecordKnownMove(u32 battlerId, enum Move move); void RecordAbilityBattle(u32 battlerId, enum Ability abilityId); void ClearBattlerAbilityHistory(u32 battlerId); void RecordItemEffectBattle(u32 battlerId, enum HoldEffect itemEffect); @@ -95,25 +103,29 @@ void SaveBattlerData(u32 battlerId); void SetBattlerData(u32 battlerId); void SetBattlerAiData(u32 battlerId, struct AiLogicData *aiData); void RestoreBattlerData(u32 battlerId); -u32 GetAIChosenMove(u32 battlerId); +enum Move GetAIChosenMove(u32 battlerId); u32 GetTotalBaseStat(u32 species); bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler); bool32 AI_BattlerAtMaxHp(u32 battler); u32 GetHealthPercentage(u32 battler); bool32 AI_CanBattlerEscape(u32 battler); bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef); -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority); +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler2, enum Move aiMoveConsidered, enum Move playerMoveConsidered, enum ConsiderPriority considerPriority); bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk); -u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk); -u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk, enum AiConsiderEndure considerEndure); +void GetBestDmgMovesFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum Move *bestMoves); +u32 GetMoveIndex(u32 battler, enum Move move); +bool32 IsBestDmgMove(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum Move move); +bool32 BestDmgMoveHasEffect(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum BattleMoveEffects moveEffect); u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext); -bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); +bool32 CanTargetMoveFaintAi(enum Move move, u32 battlerDef, u32 battlerAtk, u32 nHits); bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId); enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move); +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, enum Move move); u32 AI_GetWeather(void); -u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon); +u32 AI_GetSwitchinWeather(u32 battler); +u32 AI_GetSwitchinFieldStatus(u32 battler); enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum DamageCalcContext calcContext); @@ -122,30 +134,34 @@ bool32 HasDamagingMoveOfType(u32 battler, enum Type type); u32 GetBattlerSecondaryDamage(u32 battlerId); bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability); bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability); -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, enum Move move); bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex); -bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage); -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent); +bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, enum Move move, u32 healPercent); bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect); bool32 ShouldCureStatus(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); bool32 ShouldCureStatusWithItem(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData); -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex); -bool32 IsRecycleEncouragedItem(u32 item); -bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item); -bool32 IsStatBoostingBerry(u32 item); -bool32 CanKnockOffItem(u32 battler, u32 item); -bool32 IsAbilityOfRating(enum Ability ability, s8 rating); +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 IsRecycleEncouragedItem(enum Item item); +bool32 ShouldRestoreHpBerry(u32 battlerAtk, enum Item item); +bool32 IsStatBoostingBerry(enum Item item); +bool32 CanKnockOffItem(u32 fromBattler, u32 battler, enum Item item); +bool32 IsAbilityOfRating(enum Ability ability, s32 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability); -bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move); -bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move); -bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); +bool32 AI_MoveMakesContact(u32 battlerAtk, u32 battlerDef, enum Ability ability, enum HoldEffect holdEffect, enum Move move); +bool32 IsUnseenFistContactMove(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, enum Move chosenMove); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); bool32 IsAIUsingGimmick(u32 battler); void DecideTerastal(u32 battler); -bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move); +bool32 CanEndureHit(u32 battler, u32 battlerTarget, enum Move move); +bool32 ShouldFinalGambit(u32 battlerAtk, u32 battlerDef, bool32 aiIsFaster); +bool32 ShouldConsiderSelfSacrificeDamageEffect(u32 battlerAtk, u32 battlerDef, enum Move move, bool32 aiIsFaster); // stat stage checks bool32 AnyStatIsRaised(u32 battlerId); +bool32 AnyUsefulStatIsRaised(u32 battlerId); bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, enum Stat stat); bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat stat); bool32 AreBattlersStatsMaxed(u32 battler); @@ -153,60 +169,62 @@ u32 CountPositiveStatStages(u32 battlerId); u32 CountNegativeStatStages(u32 battlerId); // move checks -bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData); +bool32 AI_CanMoveBeBlockedByTarget(struct BattleContext *ctx); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category); -enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); -bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, u32 abilityDef); -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather); +enum MoveComparisonResult CompareMoveEffects(enum Move move1, enum Move move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); +struct SimulatedDamage AI_CalcDamageSaveBattlers(enum Move move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef); +bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, enum Ability abilityDef); +struct SimulatedDamage AI_CalcDamage(enum Move move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather, u32 fieldStatuses); bool32 AI_IsDamagedByRecoil(u32 battler); u32 GetNoOfHitsToKO(u32 dmg, s32 hp); u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef); -u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext); +u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, enum AiConsiderEndure considerEndure); u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); -uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef); -u16 *GetMovesArray(u32 battler); +uq4_12_t AI_GetMoveEffectiveness(enum Move move, u32 battlerAtk, u32 battlerDef); +enum Move *GetMovesArray(u32 battler); bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect); -bool32 HasMove(u32 battlerId, u32 move); -u32 GetIndexInMoveArray(u32 battler, u32 move); +bool32 HasMove(u32 battlerId, enum Move move); +u32 GetBattlerMoveIndexWithEffect(u32 battler, enum BattleMoveEffects effect); +bool32 HasPhysicalBestMove(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext); bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive); bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category); bool32 HasMoveWithType(u32 battler, enum Type type); bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects moveEffect); bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect); -bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect); +bool32 HasBattlerSideMoveWithEffect(u32 battler, enum BattleMoveEffects effect); bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 effect); -bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect); -bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); +bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, enum BattleMoveEffects effect); +bool32 HasNonVolatileMoveEffect(u32 battlerId, enum MoveEffect effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); -bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); -bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect); +bool32 HasMoveWithAdditionalEffect(u32 battlerId, enum MoveEffect moveEffect); +bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, enum MoveEffect moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); -bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception); +bool32 HasMoveWithMoveEffectExcept(u32 battlerId, enum MoveEffect moveEffect, enum BattleMoveEffects exception); bool32 HasMoveThatLowersOwnStats(u32 battlerId); bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus); bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); -bool32 IsNonVolatileStatusMove(u32 moveEffect); -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility); -bool32 IsHazardMove(u32 move); -bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); +bool32 IsNonVolatileStatusMove(enum Move move); +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, enum Move move, enum Ability atkAbility); +bool32 IsHazardMove(enum Move move); +bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, enum Move move); bool32 IsBattlerDamagedByStatus(u32 battler); -s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove); +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, enum Move move, enum Move predictedMove); bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef); bool32 ShouldSetWeather(u32 battler, u32 weather); bool32 ShouldClearWeather(u32 battler, u32 weather); bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus); bool32 ShouldClearFieldStatus(u32 battler, u32 fieldStatus); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); -bool32 IsHealingMove(u32 move); bool32 HasHealingEffect(u32 battler); -bool32 IsTrappingMove(u32 move); +bool32 IsTrappingMove(enum Move move); bool32 HasTrappingMoveEffect(u32 battler); -bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, enum Move move); bool32 HasChoiceEffect(u32 battler); bool32 HasThawingMove(u32 battler); +bool32 HasUsableWhileAsleepMove(u32 battler); bool32 IsStatRaisingEffect(enum BattleMoveEffects effect); bool32 IsStatLoweringEffect(enum BattleMoveEffects effect); bool32 IsSelfStatLoweringEffect(enum MoveEffect effect); @@ -216,26 +234,28 @@ bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); bool32 IsUngroundingEffect(enum BattleMoveEffects effect); bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag); -bool32 IsHazardClearingMove(u32 move); +bool32 IsHazardClearingMove(enum Move move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); +bool32 IsSelfSacrificeEffect(enum Move move); +u32 GetAIExplosionChanceFromHP(u32 hpPercent); // status checks -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability ability); +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, enum Move move, enum Ability ability); bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability); -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove); bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef); -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove); -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove); +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove); +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove); bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove); +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove); +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove); bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility); bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof); -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move); -bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, enum Move move); +bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, enum Move move); bool32 IsWakeupTurn(u32 battler); bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); @@ -243,14 +263,14 @@ bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); bool32 IsMoxieTypeAbility(enum Ability ability); bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability); bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability); -bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); -void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score, struct AiLogicData *aiData); +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData); +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score, struct AiLogicData *aiData); s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData); // partner logic bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef); // IsTargetingPartner includes a check to make sure the adjacent pokemon is truly a partner. -u32 GetAllyChosenMove(u32 battlerId); +enum Move GetAllyChosenMove(u32 battlerId); bool32 IsBattle1v1(void); // IsBattle1v1 is distinct from !IsDoubleBattle. If the player is fighting Maxie and Tabitha, with Steven as their partner, and both Tabitha and Steven have run out of Pokemon, the battle is 1v1, even though mechanically it is a Double Battle for how battlers and flags are set. // Most AI checks should be using IsBattle1v1; most engine checks should be using !IsDoubleBattle @@ -259,50 +279,61 @@ bool32 HasTwoOpponents(u32 battler); bool32 HasPartner(u32 battler); bool32 HasPartnerIgnoreFlags(u32 battler); // HasPartner respects the Attacks Partner AI flag; HasPartnerIgnoreFlags checks only if a live pokemon is adjacent. -bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); -bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove); -bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck); -bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck); -bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove); -bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); -bool32 PartnerMoveActivatesSleepClause(u32 move); -bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, enum Move move, enum Move partnerMove); +bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, enum Move move, enum Move partnerMove); +bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, enum Move partnerMove); +bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, enum Move partnerMove, enum BattleMoveEffects effectCheck); +bool32 PartnerMoveIs(u32 battlerAtkPartner, enum Move partnerMove, enum Move moveCheck); +bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, enum Move move, enum Move partnerMove); +bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, enum Move move, enum Move partnerMove); +bool32 PartnerMoveActivatesSleepClause(enum Move partnerMove); +bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, enum Move move); u32 GetFriendlyFireKOThreshold(u32 battler); -bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove); +bool32 IsAllyProtectingFromMove(u32 battlerAtk, enum Move attackerMove, enum Move allyMove); // party logic struct BattlePokemon *AllocSaveBattleMons(void); void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons); +struct AiLogicData *AllocSaveAiLogicData(void); +void FreeRestoreAiLogicData(struct AiLogicData *savedAiLogicData); s32 CountUsablePartyMons(u32 battlerId); bool32 IsPartyFullyHealedExceptBattler(u32 battler); bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category); bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category); +void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId); +u32 GetActiveBattlerIds(u32 battler, u32 *battlerIn1, u32 *battlerIn2); +bool32 IsPartyMonOnFieldOrChosenToSwitch(u32 partyIndex, u32 battlerIn1, u32 battlerIn2); // score increases -u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); -u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId); -u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat); -void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); +enum AIScore IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId); +enum AIScore IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId); +enum AIScore IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat); +void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +bool32 HasHPForDamagingSetup(u32 battlerAtk, u32 battlerDef, u32 hpThreshold); -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext); -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority ConsiderPriority); s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle); bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef); -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData); -void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score); -bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData); -u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData); +void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score); +bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, enum Move move, struct AiLogicData *aiData); +u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, enum Move move); bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); -u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); -u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); +enum Move GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); +enum Move GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget); +bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); +void SetBattlerFieldStatusForSwitchin(u32 battler); +bool32 ShouldInstructPartner(u32 battlerDef, enum Move move); +bool32 CanMoveBeBouncedBack(u32 battler, enum Move move); + +// Switching and item helpers +bool32 AiExpectsToFaintPlayer(u32 battler); // These are for the purpose of not doubling up on moves during double battles. // Used in GetAIEffectGroup for move effects and GetAIEffectGroupFromMove for additional effects diff --git a/include/battle_anim.h b/include/battle_anim.h index ca7326a96..d050c0be1 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -83,6 +83,24 @@ struct BattleAnimBackground const u32 *tilemap; }; +struct BattleAnimation +{ + struct CompressedSpriteSheet pic; + struct SpritePalette palette; +}; + +// Helper struct for link battles to show correct animations and transformations that can change their look +// Used by EmitBattleAnimation and EmitMoveAnimation +struct LinkBattleAnim +{ + u32 transformedMonPID; + u8 rolloutTimer; + u8 furyCutterCounter; + u8 syrupBombIsShiny:1; + u8 isTransformedMonShiny:1; + u8 padding:4; +}; + #define ANIM_ARGS_COUNT 8 // Linear Translation @@ -98,7 +116,7 @@ extern void (*gAnimScriptCallback)(void); extern bool8 gAnimScriptActive; extern u8 gAnimVisualTaskCount; extern u8 gAnimSoundTaskCount; -extern struct DisableStruct *gAnimDisableStructPtr; +extern struct LinkBattleAnim *gAnimDisableStructPtr; extern u16 gAnimMovePower; extern u8 gAnimFriendship; extern u16 gWeatherMoveAnim; @@ -482,7 +500,7 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) void ResetBattleAnimBg(u8); void LoadMoveBg(u16 bgId); void ClearBattleAnimationVars(void); -void DoMoveAnim(u16 move); +void DoMoveAnim(enum Move move); void LaunchBattleAnimation(u32 animType, u32 animId); void DestroyAnimSprite(struct Sprite *sprite); void DestroyAnimVisualTask(u8 taskId); diff --git a/include/battle_anim_scripts.h b/include/battle_anim_scripts.h index 34f5ef5d9..d614f20fa 100644 --- a/include/battle_anim_scripts.h +++ b/include/battle_anim_scripts.h @@ -1005,6 +1005,8 @@ extern const u8 gBattleAnimGeneral_TeraCharge[]; extern const u8 gBattleAnimGeneral_TeraActivate[]; extern const u8 gBattleAnimGeneral_SimpleHeal[]; extern const u8 gBattleAnimGeneral_PowerConstruct[]; +extern const u8 gBattleAnimGeneral_SwapToSubstitute[]; +extern const u8 gBattleAnimGeneral_SwapFromSubstitute[]; // pokefirered extern const u8 gBattleAnimGeneral_MonScared[]; extern const u8 gBattleAnimGeneral_GhostGetOut[]; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 98003ba60..47f9dde14 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -66,6 +66,22 @@ enum { REQUEST_TOUGH_RIBBON_BATTLE, }; +enum BattleController +{ + BATTLE_CONTROLLER_NONE, + BATTLE_CONTROLLER_PLAYER, + BATTLE_CONTROLLER_PLAYER_PARTNER, + BATTLE_CONTROLLER_OPPONENT, + BATTLE_CONTROLLER_LINK_PARTNER, + BATTLE_CONTROLLER_LINK_OPPONENT, + BATTLE_CONTROLLER_SAFARI, + BATTLE_CONTROLLER_WALLY, + BATTLE_CONTROLLER_RECORDED_PLAYER, + BATTLE_CONTROLLER_RECORDED_PARTNER, + BATTLE_CONTROLLER_RECORDED_OPPONENT, + BATTLE_CONTROLLERS_COUNT, +}; + // Accessors for gBattleControllerExecFlags. // // These are provided for documentation purposes, to make the battle @@ -193,14 +209,14 @@ struct HpAndStatus struct MovePpInfo { - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; }; struct ChooseMoveStruct { - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u8 currentPp[MAX_MON_MOVES]; u8 maxPp[MAX_MON_MOVES]; u16 species; @@ -222,7 +238,6 @@ enum CONTROLLER_TRAINERSLIDEBACK, CONTROLLER_FAINTANIMATION, CONTROLLER_PALETTEFADE, - CONTROLLER_SUCCESSBALLTHROWANIM, CONTROLLER_BALLTHROWANIM, CONTROLLER_PAUSE, CONTROLLER_MOVEANIMATION, @@ -272,6 +287,7 @@ extern struct UnusedControllerStruct gUnusedControllerStruct; extern void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(u32 battler); extern void (*gBattlerControllerEndFuncs[MAX_BATTLERS_COUNT])(u32 battler); extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; +extern u8 gBattlerBattleController[MAX_BATTLERS_COUNT]; // general functions void HandleLinkBattleSetup(void); @@ -281,6 +297,14 @@ bool32 IsValidForBattle(struct Pokemon *mon); void TryReceiveLinkBattleData(void); void PrepareBufferDataTransferLink(u32 battler, u32 bufferId, u16 size, u8 *data); void UpdateFriendshipFromXItem(u32 battler); +bool32 IsAiVsAiBattle(void); +bool32 BattlerIsPlayer(u32 battlerId); +bool32 BattlerIsPartner(u32 battlerId); +bool32 BattlerIsOpponent(u32 battlerId); +bool32 BattlerIsRecorded(u32 battlerId); +bool32 BattlerIsLink(u32 battlerId); +bool32 BattlerIsWally(u32 battlerId); +bool32 BattlerHasAi(u32 battlerId); // emitters void BtlController_EmitGetMonData(u32 battler, u32 bufferId, u8 requestId, u8 monToCheck); @@ -293,10 +317,10 @@ void BtlController_EmitTrainerSlide(u32 battler, u32 bufferId); void BtlController_EmitTrainerSlideBack(u32 battler, u32 bufferId); void BtlController_EmitFaintAnimation(u32 battler, u32 bufferId); void BtlController_EmitBallThrowAnim(u32 battler, u32 bufferId, u8 caseId); -void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit); +void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, enum Move move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, u8 multihit); void BtlController_EmitPrintString(u32 battler, u32 bufferId, enum StringID stringId); void BtlController_EmitPrintSelectionString(u32 battler, u32 bufferId, enum StringID stringId); -void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, u16 itemId); +void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, enum Item itemId); void BtlController_EmitYesNoBox(u32 battler, u32 bufferId); void BtlController_EmitChooseMove(u32 battler, u32 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData); void BtlController_EmitChooseItem(u32 battler, u32 bufferId, u8 *battlePartyOrder); @@ -321,7 +345,7 @@ void BtlController_EmitDrawPartyStatusSummary(u32 battler, u32 bufferId, struct void BtlController_EmitHidePartyStatusSummary(u32 battler, u32 bufferId); void BtlController_EmitEndBounceEffect(u32 battler, u32 bufferId); void BtlController_EmitSpriteInvisibility(u32 battler, u32 bufferId, bool8 isInvisible); -void BtlController_EmitBattleAnimation(u32 battler, u32 bufferId, u8 animationId, struct DisableStruct *disableStructPtr, u16 argument); +void BtlController_EmitBattleAnimation(u32 battler, u32 bufferId, u8 animationId, u16 argument); void BtlController_EmitLinkStandbyMsg(u32 battler, u32 bufferId, u8 mode, bool32 record); void BtlController_EmitResetActionMoveSelection(u32 battler, u32 bufferId, u8 caseId); void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome); @@ -343,17 +367,15 @@ void BtlController_HandleSetRawMonData(u32 battler); void BtlController_HandleLoadMonSprite(u32 battler); void BtlController_HandleSwitchInAnim(u32 battler); void BtlController_HandleReturnMonToBall(u32 battler); -void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority); -void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId); +void BtlController_HandleDrawTrainerPic(u32 battlerId, enum TrainerPicID trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority); +void BtlController_HandleTrainerSlide(u32 battler, enum TrainerPicID trainerPicId); void BtlController_HandleTrainerSlideBack(u32 battlerId, s16 data0, bool32 startAnim); void BtlController_HandleFaintAnimation(u32 battler); -void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); -void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture); +void BtlController_HandleBallThrowAnim(u32 battler); void BtlController_HandleMoveAnimation(u32 battler); void BtlController_HandlePrintString(u32 battler); void BtlController_HandlePrintStringPlayerOnly(u32 battler); void BtlController_HandleHealthBarUpdate(u32 battler); -void DoStatusIconUpdate(u32 battler); void BtlController_HandleStatusIconUpdate(u32 battler); void BtlController_HandleStatusAnimation(u32 battler); void BtlController_HandleHitAnimation(u32 battler); @@ -373,9 +395,8 @@ void BtlController_HandleBattleAnimation(u32 battler); void SetControllerToPlayer(u32 battler); void PlayerBufferExecCompleted(u32 battler); void SetBattleEndCallbacks(u32 battler); -void PlayerHandleBallThrowAnim(u32 battler); void PlayerHandleExpUpdate(u32 battler); -u32 LinkPlayerGetTrainerPicId(u32 multiplayerId); +enum TrainerPicID LinkPlayerGetTrainerPicId(u32 multiplayerId); void CB2_SetUpReshowBattleScreenAfterMenu(void); void CB2_SetUpReshowBattleScreenAfterMenu2(void); void Task_PlayerController_RestoreBgmAfterCry(u8 taskId); @@ -470,6 +491,7 @@ void BtlCtrl_RemoveVoiceoverMessageFrame(void); bool32 ShouldBattleRestrictionsApply(u32 battler); void FreeShinyStars(void); +enum BattleTrainer GetBattlerTrainer(enum BattlerId battler); // oak and old man controller diff --git a/include/battle_dynamax.h b/include/battle_dynamax.h index d9fa48706..516d7db21 100644 --- a/include/battle_dynamax.h +++ b/include/battle_dynamax.h @@ -7,14 +7,14 @@ bool32 CanDynamax(u32 battler); bool32 IsGigantamaxed(u32 battler); void ApplyDynamaxHPMultiplier(struct Pokemon *mon); void ActivateDynamax(u32 battler); -u16 GetNonDynamaxHP(u32 battler); -u16 GetNonDynamaxMaxHP(u32 battler); +u32 GetNonDynamaxHP(u32 battler); +u32 GetNonDynamaxMaxHP(u32 battler); void UndoDynamax(u32 battler); -bool32 IsMoveBlockedByMaxGuard(u32 move); +bool32 IsMoveBlockedByMaxGuard(enum Move move); -u16 GetMaxMove(u32 battler, u32 baseMove); -u32 GetMaxMovePower(u32 move); -bool32 IsMaxMove(u32 move); +enum Move GetMaxMove(u32 battler, enum Move baseMove); +u32 GetMaxMovePower(enum Move move); +bool32 IsMaxMove(enum Move move); void ChooseDamageNonTypesString(enum Type type); void BS_UpdateDynamax(void); diff --git a/include/battle_hold_effects.h b/include/battle_hold_effects.h index 51e63ea20..17c0cb5f4 100644 --- a/include/battle_hold_effects.h +++ b/include/battle_hold_effects.h @@ -4,11 +4,8 @@ struct HoldEffectInfo { u32 onSwitchIn:1; - u32 onSwitchInFirstTurn:1; u32 mirrorHerb:1; - u32 mirrorHerbFirstTurn:1; u32 whiteHerb:1; - u32 whiteHerbFirstTurn:1; u32 whiteHerbEndTurn:1; u32 onStatusChange:1; u32 onHpThreshold:1; @@ -21,7 +18,8 @@ struct HoldEffectInfo u32 orbs:1; u32 onEffect:1; u32 onFling:1; - u32 padding:14; + u32 boosterEnergy:1; + u32 padding:16; }; extern const struct HoldEffectInfo gHoldEffectsInfo[]; @@ -30,11 +28,8 @@ typedef bool32 (*ActivationTiming)(enum HoldEffect holdEffect); enum ItemEffect ItemBattleEffects(u32 primaryBattler, u32 secondaryBattler, enum HoldEffect holdEffect, ActivationTiming timing); bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect); -bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect); bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect); -bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect); bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect); -bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect); bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect); bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect); bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect); @@ -48,5 +43,6 @@ bool32 IsOnEffectActivation(enum HoldEffect holdEffect); bool32 IsForceTriggerItemActivation(enum HoldEffect holdEffect); bool32 IsOnBerryActivation(enum HoldEffect holdEffect); bool32 IsOnFlingActivation(enum HoldEffect holdEffect); +bool32 IsBoosterEnergyActivation(enum HoldEffect holdEffect); #endif // GUARD_BATTLE_HOLD_EFFECTS diff --git a/include/battle_main.h b/include/battle_main.h index beb461200..e05d883c6 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -56,13 +56,11 @@ enum FirstTurnEventsStates FIRST_TURN_EVENTS_TERRAIN, FIRST_TURN_EVENTS_STARTING_STATUS, FIRST_TURN_EVENTS_TOTEM_BOOST, - FIRST_TURN_EVENTS_NEUTRALIZING_GAS, - FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES, - FIRST_TURN_EVENTS_ITEM_EFFECTS, - FIRST_TURN_EVENTS_WHITE_HERB, - FIRST_TURN_EVENTS_OPPORTUNIST, - FIRST_TURN_EVENTS_MIRROR_HERB, - FIRST_TURN_EVENTS_EJECT_PACK, + FIRST_TURN_SWITCH_IN_EVENTS, + FIRST_TURN_FAINTED_BATTLERS, + FIRST_TURN_EVENTS_TRAINER_SLIDE_A, + FIRST_TURN_EVENTS_TRAINER_SLIDE_B, + FIRST_TURN_EVENTS_TRAINER_SLIDE_PARTNER, FIRST_TURN_EVENTS_END, }; @@ -93,7 +91,7 @@ void AnimSetCenterToCornerVecX(struct Sprite *sprite); void BeginBattleIntroDummy(void); void BeginBattleIntro(void); void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy); -const u8* FaintClearSetData(u32 battler); +const u8 *FaintClearSetData(u32 battler); void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); @@ -101,14 +99,14 @@ void SwitchPartyOrder(u32 battler); void SwapTurnOrder(u8 id1, u8 id2); u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect holdEffect); s32 GetChosenMovePriority(u32 battler, enum Ability ability); -s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move); -s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); -s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves); -s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves); +s32 GetBattleMovePriority(u32 battler, enum Ability ability, enum Move move); +s32 GetWhichBattlerFasterArgs(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); +s32 GetWhichBattlerFasterOrTies(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves); +s32 GetWhichBattlerFaster(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); -enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); -void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk); +enum Type GetDynamicMoveType(struct Pokemon *mon, enum Move move, u32 battler, enum MonState monInBattle); +void SetTypeBeforeUsingMove(enum Move move, u32 battlerAtk); bool32 IsWildMonSmart(void); u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer *trainer, bool32 firstTrainer, u32 battleTypeFlags); void ModifyPersonalityForNature(u32 *personality, u32 newNature); @@ -117,6 +115,7 @@ void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon bool32 CanPlayerForfeitNormalTrainerBattle(void); bool32 DidPlayerForfeitNormalTrainerBattle(void); void BattleDebug_WonBattle(void); +s32 Factorial(s32 n); extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/include/battle_move_resolution.h b/include/battle_move_resolution.h new file mode 100644 index 000000000..34c63f3c2 --- /dev/null +++ b/include/battle_move_resolution.h @@ -0,0 +1,9 @@ +#ifndef GUARD_BATTLE_MOVE_RESOLUTION_H +#define GUARD_BATTLE_MOVE_RESOLUTION_H + +#include "constants/battle_move_resolution.h" + +bool32 DoMoveEnd(enum MoveEndState endMode, enum MoveEndState endState); +void MoveValuesCleanUp(void); + +#endif // GUARD_BATTLE_MOVE_RESOLUTION_H diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 593ad94a7..23d0c0be6 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -18,7 +18,7 @@ struct StatFractions struct PickupItem { - u16 itemId; + enum Item itemId; u8 percentage[10]; }; @@ -40,9 +40,6 @@ union TRANSPARENT StatChangeFlags }; }; -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk); -s32 GetCritHitOdds(s32 critChanceIndex); bool32 HasBattlerActedThisTurn(u32 battler); u32 GetBattlerTurnOrderNum(u32 battler); bool32 NoAliveMonsForBattlerSide(u32 battler); @@ -55,8 +52,8 @@ void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battler); -bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move); -bool32 DoesDisguiseBlockMove(u32 battler, u32 move); +bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 DoesDisguiseBlockMove(u32 battler, enum Move move); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler, enum Ability ability); @@ -66,16 +63,11 @@ bool32 TryResetBattlerStatChanges(u8 battler); bool32 CanCamouflage(u8 battlerId); void StealTargetItem(u8 battlerStealer, u8 battlerItem); u8 GetCatchingBattler(void); -enum Stat GetHighestStatId(u32 battlerId); -bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, enum Type moveType); -bool32 IsMoveNotAllowedInSkyBattles(u32 move); -bool32 DoSwitchInAbilities(u32 battlerId); +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, enum Move move, enum Type moveType); u8 GetFirstFaintedPartyIndex(u8 battlerId); -bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler); void SaveBattlerTarget(u32 battler); void SaveBattlerAttacker(u32 battler); -bool32 CanBurnHitThaw(u16 move); -bool32 EmergencyExitCanBeTriggered(u32 battler); +bool32 CanBurnHitThaw(enum Move move); bool32 IsMonGettingExpSentOut(void); extern void (*const gBattleScriptingCommandsTable[])(void); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index f9920bca8..9eb4b0df3 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -3,11 +3,10 @@ extern const u8 BattleScript_SupersweetSyrupActivates[]; extern const u8 BattleScript_OpportunistCopyStatChange[]; -extern const u8 BattleScript_OpportunistCopyStatChangeEnd3[]; extern const u8 BattleScript_MirrorHerbCopyStatChange[]; extern const u8 BattleScript_MirrorHerbCopyStatChangeEnd2[]; extern const u8 BattleScript_NotAffected[]; -extern const u8 BattleScript_HitFromCritCalc[]; +extern const u8 BattleScript_HitFromDamageCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; extern const u8 BattleScript_MoveMissedPause[]; @@ -15,6 +14,7 @@ extern const u8 BattleScript_MoveMissedPause[]; extern const u8 BattleScript_MoveMissed[]; extern const u8 BattleScript_FlingFailConsumeItem[]; extern const u8 BattleScript_FlingBlockedByShieldDust[]; +extern const u8 BattleScript_EffectFlingConsumeBerry[]; extern const u8 BattleScript_FailedFromAtkCanceler[]; extern const u8 BattleScript_ButItFailed[]; extern const u8 BattleScript_StatUp[]; @@ -59,6 +59,7 @@ extern const u8 BattleScript_IceBodyHeal[]; extern const u8 BattleScript_OverworldStatusStarts[]; extern const u8 BattleScript_OverworldWeatherStarts[]; extern const u8 BattleScript_OverworldTerrain[]; +extern const u8 BattleScript_OverworldHazard[]; extern const u8 BattleScript_SideStatusWoreOff[]; extern const u8 BattleScript_SafeguardProtected[]; extern const u8 BattleScript_SafeguardEnds[]; @@ -81,10 +82,7 @@ extern const u8 BattleScript_SelectingDisabledMoveInPalace[]; extern const u8 BattleScript_SelectingUnusableMoveInPalace[]; extern const u8 BattleScript_EncoredNoMore[]; extern const u8 BattleScript_DestinyBondTakesLife[]; -extern const u8 BattleScript_DmgHazardsOnAttacker[]; -extern const u8 BattleScript_DmgHazardsOnTarget[]; -extern const u8 BattleScript_DmgHazardsOnBattlerScripting[]; -extern const u8 BattleScript_DmgHazardsOnFaintedBattler[]; +extern const u8 BattleScript_DmgHazardsOnBattler[]; extern const u8 BattleScript_PerishSongTakesLife[]; extern const u8 BattleScript_PerishSongCountGoesDown[]; extern const u8 BattleScript_AllStatsUpZMove[]; @@ -121,6 +119,7 @@ extern const u8 BattleScript_SnatchedMove[]; extern const u8 BattleScript_EnduredMsg[]; extern const u8 BattleScript_OneHitKOMsg[]; extern const u8 BattleScript_FocusPunchSetUp[]; +extern const u8 BattleScript_FocusPunchLostFocus[]; extern const u8 BattleScript_MoveUsedIsAsleep[]; extern const u8 BattleScript_MoveUsedWokeUp[]; extern const u8 BattleScript_MonWokeUpInUproar[]; @@ -136,6 +135,7 @@ extern const u8 BattleScript_MoveUsedIsParalyzed[]; extern const u8 BattleScript_MoveUsedFlinched[]; extern const u8 BattleScript_PrintUproarOverTurns[]; extern const u8 BattleScript_ThrashConfuses[]; +extern const u8 BattleScript_ThrashConfusesRet[]; extern const u8 BattleScript_MoveUsedIsConfused[]; extern const u8 BattleScript_MoveUsedIsConfusedNoMore[]; extern const u8 BattleScript_PrintPayDayMoneyString[]; @@ -167,15 +167,13 @@ extern const u8 BattleScript_MaxHp50Recoil[]; extern const u8 BattleScript_DoRecoil33[]; extern const u8 BattleScript_Recoil33End[]; extern const u8 BattleScript_ItemSteal[]; -extern const u8 BattleScript_DrizzleActivates[]; +extern const u8 BattleScript_WeatherAbilityActivates[]; extern const u8 BattleScript_TraceActivates[]; extern const u8 BattleScript_RainDishActivates[]; -extern const u8 BattleScript_SandstreamActivates[]; extern const u8 BattleScript_ShedSkinActivates[]; extern const u8 BattleScript_IntimidateActivates[]; extern const u8 BattleScript_IntimidatePrevented[]; extern const u8 BattleScript_IntimidateInReverse[]; -extern const u8 BattleScript_DroughtActivates[]; extern const u8 BattleScript_TookAttack[]; extern const u8 BattleScript_SturdyPreventsOHKO[]; extern const u8 BattleScript_DampStopsExplosion[]; @@ -199,7 +197,6 @@ extern const u8 BattleScript_AbilityStatusEffect[]; extern const u8 BattleScript_SynchronizeActivates[]; extern const u8 BattleScript_NoItemSteal[]; extern const u8 BattleScript_AbilityCuredStatus[]; -extern const u8 BattleScript_AbilityCuredStatusEnd3[]; extern const u8 BattleScript_IgnoresWhileAsleep[]; extern const u8 BattleScript_IgnoresAndUsesRandomMove[]; extern const u8 BattleScript_MoveUsedLoafingAround[]; @@ -207,27 +204,20 @@ extern const u8 BattleScript_TruantLoafingAround[]; extern const u8 BattleScript_IgnoresAndFallsAsleep[]; extern const u8 BattleScript_IgnoresAndHitsItself[]; extern const u8 BattleScript_SubstituteFade[]; -extern const u8 BattleScript_BerryCureStatusEnd2[]; extern const u8 BattleScript_BerryCureStatusRet[]; -extern const u8 BattleScript_BerryCureConfusionEnd2[]; extern const u8 BattleScript_BerryCureConfusionRet[]; extern const u8 BattleScript_WhiteHerbEnd2[]; extern const u8 BattleScript_WhiteHerbRet[]; -extern const u8 BattleScript_ItemHealHP_RemoveItemRet[]; -extern const u8 BattleScript_ItemHealHP_RemoveItemEnd2[]; -extern const u8 BattleScript_BerryPPHealEnd2[]; -extern const u8 BattleScript_BerryPPHealRet[]; +extern const u8 BattleScript_ItemHealHP_RemoveItem[]; +extern const u8 BattleScript_BerryPPHeal[]; extern const u8 BattleScript_ItemHealHP_End2[]; extern const u8 BattleScript_ItemHealHP_Ret[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItem[]; extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItemInPalace[]; extern const u8 BattleScript_HangedOnMsg[]; -extern const u8 BattleScript_BerryConfuseHealEnd2[]; -extern const u8 BattleScript_BerryConfuseHealRet[]; -extern const u8 BattleScript_ConsumableStatRaiseEnd2[]; +extern const u8 BattleScript_BerryConfuseHeal[]; extern const u8 BattleScript_ConsumableStatRaiseRet[]; -extern const u8 BattleScript_BerryFocusEnergyRet[]; -extern const u8 BattleScript_BerryFocusEnergyEnd2[]; +extern const u8 BattleScript_BerryFocusEnergy[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; extern const u8 BattleScript_AbilityAvoidsDamage[]; extern const u8 BattleScript_AbilityShieldProtects[]; @@ -272,7 +262,6 @@ extern const u8 BattleScript_AttackerAbilityStatRaiseEnd2[]; extern const u8 BattleScript_PoisonHealActivates[]; extern const u8 BattleScript_BadDreamsActivates[]; extern const u8 BattleScript_SwitchInAbilityMsg[]; -extern const u8 BattleScript_SwitchInAbilityMsgRet[]; extern const u8 BattleScript_ToxicSpikesPoisoned[]; extern const u8 BattleScript_ToxicSpikesBadlyPoisoned[]; extern const u8 BattleScript_ToxicSpikesAbsorbed[]; @@ -283,8 +272,6 @@ extern const u8 BattleScript_MummyActivates[]; extern const u8 BattleScript_WeakArmorActivates[]; extern const u8 BattleScript_FellStingerRaisesStat[]; extern const u8 BattleScript_RemoveTerrain[]; -extern const u8 BattleScript_SnowWarningActivatesHail[]; -extern const u8 BattleScript_SnowWarningActivatesSnow[]; extern const u8 BattleScript_PickupActivates[]; extern const u8 BattleScript_HarvestActivates[]; extern const u8 BattleScript_ImposterActivates[]; @@ -309,6 +296,8 @@ extern const u8 BattleScript_TrainerASlideMsgRet[]; extern const u8 BattleScript_TrainerASlideMsgEnd2[]; extern const u8 BattleScript_TrainerBSlideMsgRet[]; extern const u8 BattleScript_TrainerBSlideMsgEnd2[]; +extern const u8 BattleScript_TrainerPartnerSlideMsgRet[]; +extern const u8 BattleScript_TrainerPartnerSlideMsgEnd2[]; extern const u8 BattleScript_MoveEffectFeint[]; extern const u8 BattleScript_ProteanActivates[]; extern const u8 BattleScript_DazzlingProtected[]; @@ -322,7 +311,6 @@ extern const u8 BattleScript_PsychicSurgeActivates[]; extern const u8 BattleScript_GrassySurgeActivates[]; extern const u8 BattleScript_MistySurgeActivates[]; extern const u8 BattleScript_ElectricSurgeActivates[]; -extern const u8 BattleScript_EffectSpectralThief[]; extern const u8 BattleScript_EffectLifeDew[]; extern const u8 BattleScript_AbilityRaisesDefenderStat[]; extern const u8 BattleScript_PowderMoveNoEffect[]; @@ -344,7 +332,6 @@ extern const u8 BattleScript_WeaknessPolicy[]; extern const u8 BattleScript_TargetItemStatRaise[]; extern const u8 BattleScript_RockyHelmetActivates[]; extern const u8 BattleScript_ItemHurtEnd2[]; -extern const u8 BattleScript_AirBalloonMsgIn[]; extern const u8 BattleScript_AirBalloonMsgInRet[]; extern const u8 BattleScript_AirBalloonMsgPop[]; extern const u8 BattleScript_ItemHurtRet[]; @@ -353,15 +340,12 @@ extern const u8 BattleScript_FlameOrb[]; extern const u8 BattleScript_MoveEffectIncinerate[]; extern const u8 BattleScript_MoveEffectBugBite[]; extern const u8 BattleScript_IllusionOff[]; -extern const u8 BattleScript_IllusionOffEnd3[]; extern const u8 BattleScript_IllusionOffAndTerastallization[]; extern const u8 BattleScript_DancerActivates[]; extern const u8 BattleScript_AftermathDmg[]; extern const u8 BattleScript_BattlerFormChange[]; extern const u8 BattleScript_BattlerFormChangeEnd2[]; -extern const u8 BattleScript_BattlerFormChangeEnd3[]; extern const u8 BattleScript_AttackerFormChangeWithString[]; -extern const u8 BattleScript_BattlerFormChangeWithStringEnd3[]; extern const u8 BattleScript_TargetFormChange[]; extern const u8 BattleScript_AnticipationActivates[]; extern const u8 BattleScript_SlowStartEnds[]; @@ -373,9 +357,7 @@ extern const u8 BattleScript_FriskMsg[]; extern const u8 BattleScript_FriskMsgWithPopup[]; extern const u8 BattleScript_MoodyActivates[]; extern const u8 BattleScript_EmergencyExit[]; -extern const u8 BattleScript_EmergencyExitWild[]; extern const u8 BattleScript_EmergencyExitEnd2[]; -extern const u8 BattleScript_EmergencyExitWildEnd2[]; extern const u8 BattleScript_CheekPouchActivates[]; extern const u8 BattleScript_TotemVar[]; extern const u8 BattleScript_TotemFlaredToLife[]; @@ -384,7 +366,6 @@ extern const u8 BattleScript_ActivateTeraformZero[]; extern const u8 BattleScript_BattlerAbilityStatRaiseOnSwitchIn[]; extern const u8 BattleScript_CottonDownActivates[]; extern const u8 BattleScript_BallFetch[]; -extern const u8 BattleScript_SandSpitActivates[]; extern const u8 BattleScript_PerishBodyActivates[]; extern const u8 BattleScript_ActivateAsOne[]; extern const u8 BattleScript_RaiseStatOnFaintingTarget[]; @@ -392,7 +373,7 @@ extern const u8 BattleScript_QuickClawActivation[]; extern const u8 BattleScript_QuickDrawActivation[]; extern const u8 BattleScript_CustapBerryActivation[]; extern const u8 BattleScript_MicleBerryActivateEnd2[]; -extern const u8 BattleScript_MicleBerryActivateRet[]; +extern const u8 BattleScript_MicleBerryActivate[]; extern const u8 BattleScript_JabocaRowapBerryActivates[]; extern const u8 BattleScript_NotAffectedAbilityPopUp[]; extern const u8 BattleScript_BattlerShookOffTaunt[]; @@ -405,7 +386,6 @@ extern const u8 BattleScript_RedCardActivates[]; extern const u8 BattleScript_EjectButtonActivates[]; extern const u8 BattleScript_EjectPackActivate_Ret[]; extern const u8 BattleScript_EjectPackActivate_End2[]; -extern const u8 BattleScript_EjectPackActivate_End3[]; extern const u8 BattleScript_EjectPackActivates[]; extern const u8 BattleScript_MentalHerbCureRet[]; extern const u8 BattleScript_MentalHerbCureEnd2[]; @@ -414,19 +394,18 @@ extern const u8 BattleScript_ImmunityProtectedEnd2[]; extern const u8 BattleScript_MistyTerrainPrevents[]; extern const u8 BattleScript_ElectricTerrainPrevents[]; extern const u8 BattleScript_DoesntAffectTargetAtkString[]; +extern const u8 BattleScript_DoesntAffectScripting[]; extern const u8 BattleScript_GulpMissileGorging[]; extern const u8 BattleScript_GulpMissileGulping[]; extern const u8 BattleScript_GulpMissileFormChange[]; extern const u8 BattleScript_BattleBondActivatesOnMoveEndAttacker[]; extern const u8 BattleScript_EffectBattleBondStatIncrease[]; -extern const u8 BattleScript_DesolateLandActivates[]; -extern const u8 BattleScript_PrimordialSeaActivates[]; extern const u8 BattleScript_PrimalWeatherBlocksMove[]; -extern const u8 BattleScript_DeltaStreamActivates[]; +extern const u8 BattleScript_FailOnPrimalWeather[]; +extern const u8 BattleScript_PlayAnimAndMoveSwitch[]; extern const u8 BattleScript_MysteriousAirCurrentBlowsOn[]; extern const u8 BattleScript_AttackWeakenedByStrongWinds[]; -extern const u8 BattleScript_BlockedByPrimalWeatherEnd3[]; -extern const u8 BattleScript_BlockedByPrimalWeatherRet[]; +extern const u8 BattleScript_BlockedByPrimalWeather[]; extern const u8 BattleScript_PrimalReversion[]; extern const u8 BattleScript_HyperspaceFuryRemoveProtect[]; extern const u8 BattleScript_SelectingNotAllowedMoveGorillaTactics[]; @@ -455,8 +434,6 @@ extern const u8 BattleScript_RemoveElectricType[]; extern const u8 BattleScript_SeedSowerActivates[]; extern const u8 BattleScript_BerserkActivates[]; extern const u8 BattleScript_AngerShellActivates[]; -extern const u8 BattleScript_WellBakedBodyActivates[]; -extern const u8 BattleScript_WindRiderActivatesMoveEnd[]; extern const u8 BattleScript_WindPowerActivates[]; extern const u8 BattleScript_ProtosynthesisActivates[]; extern const u8 BattleScript_QuarkDriveActivates[]; @@ -472,17 +449,18 @@ extern const u8 BattleScript_ToxicDebrisActivates[]; extern const u8 BattleScript_EarthEaterActivates[]; extern const u8 BattleScript_MimicryActivates[]; extern const u8 BattleScript_IceFaceNullsDamage[]; -extern const u8 BattleScript_BattlerFormChangeWithStringEnd3[]; +extern const u8 BattleScript_BattlerFormChangeWithString[]; extern const u8 BattleScript_DampPreventsAftermath[]; extern const u8 BattleScript_HealingWishActivates[]; extern const u8 BattleScript_LunarDanceActivates[]; extern const u8 BattleScript_ShellTrapSetUp[]; extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_CouldntFullyProtect[]; +extern const u8 BattleScript_TargetAvoidsAttack[]; +extern const u8 BattleScript_TargetAvoidsAttackConsumeFlingItem[]; extern const u8 BattleScript_MoveEffectStockpileWoreOff[]; extern const u8 BattleScript_SpikesActivates[]; extern const u8 BattleScript_BerserkGeneRet[]; -extern const u8 BattleScript_BerserkGeneRetEnd2[]; extern const u8 BattleScript_TargetFormChangeWithStringNoPopup[]; extern const u8 BattleScript_DefDown[]; extern const u8 BattleScript_UltraBurst[]; @@ -502,7 +480,6 @@ extern const u8 BattleScript_EffectPsychicNoise[]; extern const u8 BattleScript_AromaVeilProtectsRet[]; extern const u8 BattleScript_LowerAtkSpAtk[]; extern const u8 BattleScript_Terastallization[]; -extern const u8 BattleScript_BoosterEnergyEnd2[]; extern const u8 BattleScript_BoosterEnergyRet[]; extern const u8 BattleScript_TeraShellDistortingTypeMatchups[]; extern const u8 BattleScript_TeraFormChange[]; @@ -520,6 +497,23 @@ extern const u8 BattleScript_AlreadyParalyzed[]; extern const u8 BattleScript_AlreadyBurned[]; extern const u8 BattleScript_PrintAbilityMadeIneffective[]; extern const u8 BattleScript_ItDoesntAffectFoe[]; +extern const u8 BattleScript_FirstTurnSwitchInEvents[]; +extern const u8 BattleScript_FickleBeamDoubled[]; +extern const u8 BattleScript_QuestionForfeitBattle[]; +extern const u8 BattleScript_ForfeitBattleGaveMoney[]; +extern const u8 BattleScript_AbilityPopUp[]; +extern const u8 BattleScript_Attackstring[]; +extern const u8 BattleScript_SubmoveAttackstring[]; +extern const u8 BattleScript_MetronomeAttackstring[]; +extern const u8 BattleScript_SleepTalkAttackstring[]; +extern const u8 BattleScript_NaturePowerAttackstring[]; +extern const u8 BattleScript_PokemonCantUseTheMove[]; +extern const u8 BattleScript_TwoTurnMoveCharging[]; +extern const u8 BattleScript_PowerHerbActivation[]; +extern const u8 BattleScript_Explosion[]; +extern const u8 BattleScript_ActivateSwitchInAbility[]; +extern const u8 BattleScript_BreakScreens[]; +extern const u8 BattleScript_StealStats[]; // zmoves extern const u8 BattleScript_ZMoveActivateDamaging[]; @@ -567,7 +561,6 @@ extern const u8 BattleScript_MoveBlockedByDynamax[]; // Battle move scripts extern const u8 BattleScript_EffectAbsorb[]; extern const u8 BattleScript_EffectAbsorbLiquidOoze[]; -extern const u8 BattleScript_EffectExplosion[]; extern const u8 BattleScript_EffectDreamEater[]; extern const u8 BattleScript_EffectAttackUp[]; extern const u8 BattleScript_EffectDefenseUp[]; @@ -616,9 +609,7 @@ extern const u8 BattleScript_EffectSpecialDefenseDown2[]; extern const u8 BattleScript_EffectAccuracyDown2[]; extern const u8 BattleScript_EffectEvasionDown2[]; extern const u8 BattleScript_EffectReflect[]; -extern const u8 BattleScript_EffectTwoTurnsAttack[]; extern const u8 BattleScript_EffectSubstitute[]; -extern const u8 BattleScript_EffectRage[]; extern const u8 BattleScript_EffectMimic[]; extern const u8 BattleScript_EffectLeechSeed[]; extern const u8 BattleScript_EffectDoNothing[]; @@ -626,7 +617,6 @@ extern const u8 BattleScript_EffectHoldHands[]; extern const u8 BattleScript_EffectCelebrate[]; extern const u8 BattleScript_EffectHappyHour[]; extern const u8 BattleScript_EffectDisable[]; -extern const u8 BattleScript_EffectCounter[]; extern const u8 BattleScript_EffectEncore[]; extern const u8 BattleScript_EffectPainSplit[]; extern const u8 BattleScript_EffectSnore[]; @@ -646,11 +636,8 @@ extern const u8 BattleScript_EffectProtect[]; extern const u8 BattleScript_EffectSpikes[]; extern const u8 BattleScript_EffectForesight[]; extern const u8 BattleScript_EffectPerishSong[]; -extern const u8 BattleScript_EffectSandstorm[]; extern const u8 BattleScript_EffectEndure[]; -extern const u8 BattleScript_EffectRollout[]; extern const u8 BattleScript_EffectSwagger[]; -extern const u8 BattleScript_EffectFuryCutter[]; extern const u8 BattleScript_EffectAttract[]; extern const u8 BattleScript_EffectPresent[]; extern const u8 BattleScript_EffectSafeguard[]; @@ -660,11 +647,9 @@ extern const u8 BattleScript_EffectCaptivate[]; extern const u8 BattleScript_EffectMorningSun[]; extern const u8 BattleScript_EffectSynthesis[]; extern const u8 BattleScript_EffectMoonlight[]; -extern const u8 BattleScript_EffectRainDance[]; -extern const u8 BattleScript_EffectSunnyDay[]; +extern const u8 BattleScript_EffectWeather[]; extern const u8 BattleScript_EffectBellyDrum[]; extern const u8 BattleScript_EffectPsychUp[]; -extern const u8 BattleScript_EffectMirrorCoat[]; extern const u8 BattleScript_EffectSkullBash[]; extern const u8 BattleScript_EffectFutureSight[]; extern const u8 BattleScript_EffectGust[]; @@ -678,12 +663,10 @@ extern const u8 BattleScript_EffectStockpile[]; extern const u8 BattleScript_EffectSpitUp[]; extern const u8 BattleScript_EffectSwallow[]; extern const u8 BattleScript_EffectOverwriteAbility[]; -extern const u8 BattleScript_EffectHail[]; extern const u8 BattleScript_EffectTorment[]; extern const u8 BattleScript_EffectFlatter[]; extern const u8 BattleScript_EffectNonVolatileStatus[]; extern const u8 BattleScript_EffectMemento[]; -extern const u8 BattleScript_EffectFocusPunch[]; extern const u8 BattleScript_EffectFollowMe[]; extern const u8 BattleScript_EffectCharge[]; extern const u8 BattleScript_EffectTaunt[]; @@ -694,9 +677,7 @@ extern const u8 BattleScript_EffectWish[]; extern const u8 BattleScript_EffectIngrain[]; extern const u8 BattleScript_EffectMagicCoat[]; extern const u8 BattleScript_EffectRecycle[]; -extern const u8 BattleScript_EffectBrickBreak[]; extern const u8 BattleScript_EffectYawn[]; -extern const u8 BattleScript_EffectEndeavor[]; extern const u8 BattleScript_EffectSkillSwap[]; extern const u8 BattleScript_EffectImprison[]; extern const u8 BattleScript_EffectRefresh[]; @@ -736,7 +717,6 @@ extern const u8 BattleScript_EffectHeartSwap[]; extern const u8 BattleScript_EffectPowerSplit[]; extern const u8 BattleScript_EffectGuardSplit[]; extern const u8 BattleScript_EffectStickyWeb[]; -extern const u8 BattleScript_EffectMetalBurst[]; extern const u8 BattleScript_EffectLuckyChant[]; extern const u8 BattleScript_EffectEntrainment[]; extern const u8 BattleScript_EffectHealPulse[]; @@ -769,7 +749,6 @@ extern const u8 BattleScript_FinalGambit[]; extern const u8 BattleScript_EffectAutotomize[]; extern const u8 BattleScript_EffectDefog[]; extern const u8 BattleScript_EffectHitEnemyHealAlly[]; -extern const u8 BattleScript_EffectSynchronoise[]; extern const u8 BattleScript_EffectPsychoShift[]; extern const u8 BattleScript_EffectPowerTrick[]; extern const u8 BattleScript_EffectAfterYou[]; @@ -817,34 +796,20 @@ extern const u8 BattleScript_EffectExtremeEvoboost[]; extern const u8 BattleScript_EffectDarkVoid[]; extern const u8 BattleScript_EffectVictoryDance[]; extern const u8 BattleScript_EffectTeatime[]; -extern const u8 BattleScript_EffectAttackUpUserAlly[]; extern const u8 BattleScript_EffectShellTrap[]; extern const u8 BattleScript_EffectRevivalBlessing[]; -extern const u8 BattleScript_EffectSnow[]; extern const u8 BattleScript_EffectTakeHeart[]; extern const u8 BattleScript_EffectCorrosiveGas[]; extern const u8 BattleScript_MoveEffectSaltCure[]; -extern const u8 BattleScript_EffectChillyReception[]; -extern const u8 BattleScript_EffectMaxMove[]; -extern const u8 BattleScript_EffectGlaiveRush[]; +extern const u8 BattleScript_ChillyReceptionMessage[]; +extern const u8 BattleScript_EffectWeatherAndSwitch[]; extern const u8 BattleScript_EffectBrickBreak[]; extern const u8 BattleScript_EffectDoodle[]; extern const u8 BattleScript_EffectFilletAway[]; extern const u8 BattleScript_EffectShedTail[]; -extern const u8 BattleScript_EffectUpperHand[]; extern const u8 BattleScript_EffectTidyUp[]; extern const u8 BattleScript_EffectSpicyExtract[]; extern const u8 BattleScript_EffectFickleBeam[]; -extern const u8 BattleScript_FickleBeamDoubled[]; -extern const u8 BattleScript_QuestionForfeitBattle[]; -extern const u8 BattleScript_ForfeitBattleGaveMoney[]; -extern const u8 BattleScript_AbilityPopUp[]; -extern const u8 BattleScript_Attackstring[]; -extern const u8 BattleScript_SubmoveAttackstring[]; -extern const u8 BattleScript_MetronomeAttackstring[]; -extern const u8 BattleScript_SleepTalkAttackstring[]; -extern const u8 BattleScript_NaturePowerAttackstring[]; -extern const u8 BattleScript_PokemonCantUseTheMove[]; extern const u8 BattleScript_GhostBallDodge[]; extern const u8 BattleScript_GhostGetOutGetOut[]; extern const u8 BattleScript_TooScaredToMove[]; diff --git a/include/battle_switch_in.h b/include/battle_switch_in.h new file mode 100644 index 000000000..fcbd20c72 --- /dev/null +++ b/include/battle_switch_in.h @@ -0,0 +1,8 @@ +#ifndef GUARD_BATTLE_SWITCH_IN +#define GUARD_BATTLE_SWITCH_IN + +#include "constants/battle_switch_in.h" + +bool32 DoSwitchInEvents(void); + +#endif // GUARD_BATTLE_SWITCH_IN diff --git a/include/battle_terastal.h b/include/battle_terastal.h index 6bfb74986..823759169 100644 --- a/include/battle_terastal.h +++ b/include/battle_terastal.h @@ -7,7 +7,7 @@ bool32 CanTerastallize(u32 battler); enum Type GetBattlerTeraType(u32 battler); void ExpendTypeStellarBoost(u32 battler, enum Type type); bool32 IsTypeStellarBoosted(u32 battler, enum Type type); -uq4_12_t GetTeraMultiplier(struct DamageContext *ctx); +uq4_12_t GetTeraMultiplier(struct BattleContext *ctx); u16 GetTeraTypeRGB(enum Type type); diff --git a/include/battle_util.h b/include/battle_util.h index 1481656fb..b6bc681f1 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -25,19 +25,11 @@ #define MOVE_LIMITATIONS_ALL 0xFFFF // Switches between simulated battle calc and actual battle combat -enum FunctionCallOption +enum ResultOption { CHECK_TRIGGER, // Check the function without running scripts / setting any flags. AI_CHECK, // Check the function without running scripts / setting any flags. Same as CHECK_TRIGGER but only used when additional data has to be fetched during ai calcs - RUN_SCRIPT, // Used during actual combat where a script has to be run / flags need to be set -}; - -enum MoveAbsorbed -{ - MOVE_ABSORBED_BY_NO_ABILITY, - MOVE_ABSORBED_BY_DRAIN_HP_ABILITY, - MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY, - MOVE_ABSORBED_BY_BOOST_FLASH_FIRE, + RUN_SCRIPT, }; enum FieldEffectCases @@ -52,19 +44,22 @@ enum AbilityEffect ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, ABILITYEFFECT_MOVE_END_ATTACKER, - ABILITYEFFECT_COLOR_CHANGE, // Color Change, Berserk, Anger Shell + ABILITYEFFECT_COLOR_CHANGE, // Color Change / Berserk / Anger Shell ABILITYEFFECT_MOVE_END, ABILITYEFFECT_IMMUNITY, ABILITYEFFECT_SYNCHRONIZE, ABILITYEFFECT_ATK_SYNCHRONIZE, ABILITYEFFECT_MOVE_END_OTHER, + ABILITYEFFECT_MOVE_END_FOES_FAINTED, // Moxie-like abilities / Battle Bond / Magician + + // On Switch in + ABILITYEFFECT_TERA_SHIFT, ABILITYEFFECT_NEUTRALIZINGGAS, - ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, + ABILITYEFFECT_UNNERVE, + ABILITYEFFECT_COMMANDER, // Commander / Hospitality / Costar ABILITYEFFECT_ON_WEATHER, ABILITYEFFECT_ON_TERRAIN, ABILITYEFFECT_OPPORTUNIST, - ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, - ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, }; enum ItemEffect @@ -98,40 +93,49 @@ struct TypePower enum MoveSuccessOrder { - CANCELLER_CLEAR_FLAGS, - CANCELLER_STANCE_CHANGE_1, - CANCELLER_SKY_DROP, - CANCELLER_RECHARGE, - CANCELLER_ASLEEP_OR_FROZEN, - CANCELLER_POWER_POINTS, - CANCELLER_OBEDIENCE, - CANCELLER_TRUANT, - CANCELLER_FLINCH, - CANCELLER_DISABLED, - CANCELLER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop - CANCELLER_TAUNTED, - CANCELLER_IMPRISONED, - CANCELLER_CONFUSED, - CANCELLER_GHOST, - CANCELLER_PARALYSED, - CANCELLER_INFATUATION, - CANCELLER_BIDE, - CANCELLER_Z_MOVES, - CANCELLER_CHOICE_LOCK, - CANCELLER_CALLSUBMOVE, - CANCELLER_THAW, - CANCELLER_STANCE_CHANGE_2, - CANCELLER_ATTACKSTRING, - CANCELLER_PPDEDUCTION, - CANCELLER_WEATHER_PRIMAL, - CANCELLER_MOVE_FAILURE, - CANCELLER_POWDER_STATUS, - CANCELLER_PRIORITY_BLOCK, - CANCELLER_PROTEAN, - CANCELLER_EXPLODING_DAMP, - CANCELLER_MULTIHIT_MOVES, - CANCELLER_MULTI_TARGET_MOVES, - CANCELLER_END, + CANCELER_STANCE_CHANGE_1, + CANCELER_CLEAR_FLAGS, + CANCELER_SKY_DROP, + CANCELER_RECHARGE, + CANCELER_CHILLY_RECEPTION, + CANCELER_ASLEEP_OR_FROZEN, + CANCELER_POWER_POINTS, + CANCELER_OBEDIENCE, + CANCELER_TRUANT, + CANCELER_FOCUS_GEN5, + CANCELER_FLINCH, + CANCELER_DISABLED, + CANCELER_VOLATILE_BLOCKED, // Gravity / Heal Block / Throat Chop + CANCELER_TAUNTED, + CANCELER_IMPRISONED, + CANCELER_CONFUSED, + CANCELER_GHOST, + CANCELER_PARALYZED, + CANCELER_INFATUATION, + CANCELER_BIDE, + CANCELER_Z_MOVES, + CANCELER_CHOICE_LOCK, + CANCELER_CALLSUBMOVE, + CANCELER_THAW, + CANCELER_STANCE_CHANGE_2, + CANCELER_ATTACKSTRING, + CANCELER_PPDEDUCTION, + CANCELER_SKY_BATTLE, + CANCELER_WEATHER_PRIMAL, + CANCELER_FOCUS_PRE_GEN5, + CANCELER_MOVE_FAILURE, + CANCELER_POWDER_STATUS, + CANCELER_PRIORITY_BLOCK, + CANCELER_PROTEAN, + CANCELER_EXPLODING_DAMP, + CANCELER_EXPLOSION, + CANCELER_CHARGING, + CANCELER_NO_TARGET, + CANCELER_TOOK_ATTACK, + CANCELER_TARGET_FAILURE, + CANCELER_NOT_FULLY_PROTECTED, + CANCELER_MULTIHIT_MOVES, + CANCELER_END, }; enum Obedience @@ -144,44 +148,64 @@ enum Obedience DISOBEYS_RANDOM_MOVE, }; -enum MoveCanceller +enum MoveCanceler { MOVE_STEP_SUCCESS, - MOVE_STEP_BREAK, // Breaks out of the function to run a script - MOVE_STEP_FAILURE, // Same as break but breaks out of it due to move failure and jumps to script that handles the failure - MOVE_STEP_REMOVES_STATUS, + MOVE_STEP_BREAK, // Runs script. Increments state + MOVE_STEP_PAUSE, // Runs script. Does not increment state + MOVE_STEP_FAILURE, // Move failed, jump to script that handles the failure +}; + +enum ImmunityHealStatusOutcome +{ + IMMUNITY_NO_EFFECT, + IMMUNITY_STATUS_CLEARED, + IMMUNITY_CONFUSION_CLEARED, + IMMUNITY_INFATUATION_CLEARED, + IMMUNITY_TAUNT_CLEARED, }; extern const struct TypePower gNaturalGiftTable[]; -struct DamageContext -{ - u32 battlerAtk:3; - u32 battlerDef:3; - u32 move:16; - enum Type moveType:5; - u32 isCrit:1; - u32 randomFactor:1; - u32 updateFlags:1; - u32 isAnticipation:1; - u32 padding1:1; - u32 weather:16; - u32 fixedBasePower:8; - u32 padding2:8; - u32 chosenMove:16; // May be different to 'move', e.g. for Z moves. - u32 padding3:16; - uq4_12_t typeEffectivenessModifier; - enum Ability abilityAtk; - enum Ability abilityDef; - enum HoldEffect holdEffectAtk; - enum HoldEffect holdEffectDef; -}; - struct BattleContext { u32 battlerAtk:3; u32 battlerDef:3; - u32 currentMove:16; + u32 fixedBasePower:8; + u32 weather:16; + u32 unused:2; + u32 fieldStatuses; + + enum Move move:13; + enum Move chosenMove:13; // May be different to 'move', e.g. for Z moves. + enum Type moveType:6; + + uq4_12_t typeEffectivenessModifier; + enum Ability abilityAtk; + enum Ability abilityDef; + enum HoldEffect holdEffectAtk; + enum HoldEffect holdEffectDef; + + // Flags + u32 isCrit:1; + u32 randomFactor:1; + u32 updateFlags:1; + u32 isAnticipation:1; + u32 isSelfInflicted:1; + u32 aiCalc:1; + u32 aiCheckBerryModifier:1; // Flags that KOing through a berry should be checked + u32 airBalloonBlocked:1; + u32 abilityBlocked:1; + u32 runScript:1; // Used during actual combat where scripts have to be run / flags need to be set + u32 padding:22; +}; + +// Helper struct to keep the arg list small and prevent constant recalculations of abilities/hold effects. +struct BattleCalcValues +{ + u32 battlerAtk:3; + u32 battlerDef:3; + enum Move move:16; u32 padding:10; enum Ability abilities[MAX_BATTLERS_COUNT]; enum HoldEffect holdEffects[MAX_BATTLERS_COUNT]; @@ -196,7 +220,7 @@ enum SleepClauseBlock enum SkyDropState { SKY_DROP_IGNORE, - SKY_DROP_ATTACKCANCELLER_CHECK, + SKY_DROP_ATTACKCANCELER_CHECK, SKY_DROP_GRAVITY_ON_AIRBORNE, SKY_DROP_CANCEL_MULTI_TURN_MOVES, SKY_DROP_STATUS_YAWN, @@ -208,17 +232,18 @@ enum SkyDropState enum EjectPackTiming { - FIRST_TURN, + START_OF_TURN, END_TURN, OTHER, }; void HandleAction_ThrowBall(void); +uq4_12_t CalcTypeEffectivenessMultiplierHelper(enum Move move, enum Type moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities); u32 GetCurrentBattleWeather(void); bool32 EndOrContinueWeather(void); -bool32 IsUnnerveBlocked(u32 battler, u32 itemId); -bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move); -bool32 HandleMoveTargetRedirection(void); +bool32 IsUnnerveBlocked(u32 battler, enum Item itemId); +bool32 IsAffectedByFollowMe(u32 battlerAtk, enum BattleSide defSide, enum Move move); +void DetermineTarget(enum MoveTarget moveTarget, bool32 overwriteTarget); void HandleAction_UseMove(void); void HandleAction_Switch(void); void HandleAction_UseItem(void); @@ -238,7 +263,7 @@ bool32 IsBattlerMarkedForControllerExec(u32 battler); void MarkBattlerForControllerExec(u32 battler); void MarkBattlerReceivedLinkData(u32 battler); const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState); -bool32 WasUnableToUseMove(u32 battler); +bool32 IsLastMonToMove(u32 battler); bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability); void PrepareStringBattle(enum StringID stringId, u32 battler); void ResetSentPokesToOpponentValue(void); @@ -251,60 +276,62 @@ void BattleScriptPop(void); u32 TrySetCantSelectMoveBattleScript(u32 battler); u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check); bool32 AreAllMovesUnusable(u32 battler); -u8 GetImprisonedMovesCount(u32 battler, u16 move); +u8 GetImprisonedMovesCount(u32 battler, enum Move move); s32 GetDrainedBigRootHp(u32 battler, s32 hp); bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck); -u32 DoEndTurnEffects(void); bool32 HandleFaintedMonActions(void); void TryClearRageAndFuryCutter(void); -enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx); +enum MoveCanceler AtkCanceler_MoveSuccessOrder(void); bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2); -bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability); +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, enum Ability ability); bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag); -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, enum Type moveType, enum FunctionCallOption option); +bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum ResultOption option); +bool32 CanTargetBlockPranksterMove(struct BattleContext *ctx, s32 movePriority); +bool32 CanPsychicTerrainProtectTarget(struct BattleContext *ctx, s32 movePriority); +bool32 CanMoveBeBlockedByTarget(struct BattleContext *ctx, s32 movePriority); +bool32 CanAbilityAbsorbMove(struct BattleContext *ctx); bool32 TryFieldEffects(enum FieldEffectCases caseId); -u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg); +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, enum Move move, bool32 shouldAbilityTrigger); bool32 TryPrimalReversion(u32 battler); bool32 IsNeutralizingGasOnField(void); bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability); -u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler); -u32 GetBattlerAbilityNoAbilityShield(u32 battler); -u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield); +enum Ability GetBattlerAbilityIgnoreMoldBreaker(u32 battler); +enum Ability GetBattlerAbilityNoAbilityShield(u32 battler); +enum Ability GetBattlerAbilityInternal(u32 battler, bool32 ignoreMoldBreaker, bool32 noAbilityShield); enum Ability GetBattlerAbility(u32 battler); u32 IsAbilityOnSide(u32 battler, enum Ability ability); u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability); u32 IsAbilityOnField(enum Ability ability); u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability); u32 IsAbilityPreventingEscape(u32 battler); -bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move); -u32 GetProtectType(enum ProtectMethod method); +bool32 IsBattlerProtected(struct BattleContext *ctx); +enum ProtectType GetProtectType(enum ProtectMethod method); bool32 CanBattlerEscape(u32 battler); // no ability check void BattleScriptExecute(const u8 *BS_ptr); void BattleScriptPushCursorAndCallback(const u8 *BS_ptr); void ClearVariousBattlerFlags(u32 battler); void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); -u32 GetBattleMoveTarget(u16 move, u8 setTarget); -u8 GetAttackerObedienceForAction(); +u32 GetBattleMoveTarget(enum Move move, enum MoveTarget moveTarget); +enum Obedience GetAttackerObedienceForAction(void); enum HoldEffect GetBattlerHoldEffect(u32 battler); enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); enum HoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); -enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, enum Ability ability); u32 GetBattlerHoldEffectParam(u32 battler); -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move); +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, enum Move move); +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, enum Move move); bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect holdEffect); -u32 GetMoveSlot(u16 *moves, u32 move); +u32 GetMoveSlot(u16 *moves, enum Move move); u32 GetBattlerWeight(u32 battler); -u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); -u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); -s32 CalculateMoveDamage(struct DamageContext *ctx); -s32 CalculateMoveDamageVars(struct DamageContext *ctx); -s32 DoFixedDamageMoveCalc(struct DamageContext *ctx); -s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg); -uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx); -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef); +s32 CalcCritChanceStage(struct BattleContext *ctx); +s32 CalcCritChanceStageGen1(struct BattleContext *ctx); +s32 CalculateMoveDamage(struct BattleContext *ctx); +s32 CalculateMoveDamageVars(struct BattleContext *ctx); +s32 DoFixedDamageMoveCalc(struct BattleContext *ctx); +s32 ApplyModifiersAfterDmgRoll(struct BattleContext *ctx, s32 dmg); +uq4_12_t CalcTypeEffectivenessMultiplier(struct BattleContext *ctx); +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(enum Move move, u16 speciesDef, enum Ability abilityDef); uq4_12_t GetTypeModifier(enum Type atkType, enum Type defType); uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, enum Type moveType); void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags); @@ -317,59 +344,68 @@ void ActivateUltraBurst(u32 battler); bool32 IsBattlerMegaEvolved(u32 battler); bool32 IsBattlerPrimalReverted(u32 battler); bool32 IsBattlerUltraBursted(u32 battler); -u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method); +u32 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method); bool32 TryRevertPartyMonFormChange(u32 partyIndex); bool32 TryBattleFormChange(u32 battler, enum FormChanges method); bool32 DoBattlersShareType(u32 battler1, u32 battler2); -bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId); +bool32 CanBattlerGetOrLoseItem(u32 fromBattler, u32 battler, enum Item itemId); u32 GetBattlerVisualSpecies(u32 battler); -bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID); +bool32 TryClearIllusion(u32 battler, enum Ability ability); u32 GetIllusionMonSpecies(u32 battler); struct Pokemon *GetIllusionMonPtr(u32 battler); void ClearIllusionMon(u32 battler); u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pokemon *partnerMon, u32 battler); -bool32 SetIllusionMon(struct Pokemon *mon, u32 battler); -u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID); +void SetIllusionMon(struct Pokemon *mon, u32 battler); +enum ImmunityHealStatusOutcome TryImmunityAbilityHealStatus(u32 battler); bool32 ShouldGetStatBadgeBoost(u16 flagId, u32 battler); uq4_12_t GetBadgeBoostModifier(void); -enum DamageCategory GetBattleMoveCategory(u32 move); -void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move); -bool32 CanFling(u32 battler); +enum DamageCategory GetBattleMoveCategory(enum Move move); +void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, enum Move move); +bool32 CanFling(u32 battlerAtk, u32 battlerDef); bool32 IsTelekinesisBannedSpecies(u16 species); -bool32 IsHealBlockPreventingMove(u32 battler, u32 move); -bool32 IsBelchPreventingMove(u32 battler, u32 move); -bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId); +bool32 IsHealBlockPreventingMove(u32 battler, enum Move move); +bool32 IsBelchPreventingMove(u32 battler, enum Move move); +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, enum Item itemId); bool32 IsPartnerMonFromSameTrainer(u32 battler); enum DamageCategory GetCategoryBasedOnStats(u32 battler); void SetShellSideArmCategory(void); -bool32 MoveIsAffectedBySheerForce(u32 move); -bool32 TestIfSheerForceAffected(u32 battler, u16 move); +bool32 MoveIsAffectedBySheerForce(enum Move move); +bool32 IsSheerForceAffected(enum Move move, enum Ability ability); void TryRestoreHeldItems(void); -bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item); -void TrySaveExchangedItem(u32 battler, u16 stolenItem); -bool32 IsPartnerMonFromSameTrainer(u32 battler); -bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes); +bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, enum Item item); +void TrySaveExchangedItem(u32 battler, enum Item stolenItem); +bool32 IsBattlerAffectedByHazards(u32 battler, enum HoldEffect holdEffect, bool32 toxicSpikes); void SortBattlersBySpeed(u8 *battlers, bool32 slowToFast); -bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Ability ability); -bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); +bool32 CompareStat(u32 battler, enum Stat statId, u32 cmpTo, u32 cmpKind, enum Ability ability); +bool32 BlocksPrankster(enum Move move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget); bool32 PickupHasValidTarget(u32 battler); bool32 CantPickupItem(u32 battler); bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags); -u32 GetBattlerMoveTargetType(u32 battler, u32 move); -bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move); +enum MoveTarget GetBattlerMoveTargetType(u32 battler, enum Move move); +bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, enum Move move); +u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); void CopyMonLevelAndBaseStatsToBattleMon(u32 battler, struct Pokemon *mon); void CopyMonAbilityAndTypesToBattleMon(u32 battler, struct Pokemon *mon); void RecalcBattlerStats(u32 battler, struct Pokemon *mon, bool32 isDynamaxing); bool32 IsGen6ExpShareEnabled(void); -bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect); -bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance); -bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect); -bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument); -bool32 MoveHasChargeTurnAdditionalEffect(u32 move); +bool32 MoveHasAdditionalEffect(enum Move move, enum MoveEffect moveEffect); +bool32 MoveHasAdditionalEffectWithChance(enum Move move, enum MoveEffect moveEffect, u32 chance); +bool32 MoveHasAdditionalEffectSelf(enum Move move, enum MoveEffect moveEffect); +bool32 IsMoveEffectRemoveSpeciesType(enum Move move, enum MoveEffect moveEffect, u32 argument); +bool32 MoveHasChargeTurnAdditionalEffect(enum Move move); bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef); -bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef); +bool32 IsBattlerUnaffectedByMove(u32 battler); bool32 MoodyCantRaiseStat(u32 stat); bool32 MoodyCantLowerStat(u32 stat); +bool32 IsPsychicTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses); +bool32 IsMistyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses); +bool32 IsGrassyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses); +bool32 IsElectricTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses); +bool32 IsAnyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses); +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses, u32 terrainFlag); +enum Stat GetHighestStatId(u32 battler); +enum Stat GetParadoxHighestStatId(u32 battler); +enum Stat GetParadoxBoostedStatId(u32 battler); bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause); bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef); @@ -377,64 +413,79 @@ bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability ability); bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef); -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option); +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum ResultOption option); bool32 CanBeConfused(u32 battler); -bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag); u32 GetBattlerAffectionHearts(u32 battler); void TryToRevertMimicryAndFlags(void); bool32 BattleArenaTurnEnd(void); u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc); +bool32 BattlerHasCopyableChanges(u32 battler); bool32 ChangeTypeBasedOnTerrain(u32 battler); void RemoveConfusionStatus(u32 battler); -u8 GetBattlerGender(u32 battler); +u32 GetBattlerGender(u32 battler); bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2); bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2); u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect); void GetBattlerTypes(u32 battler, bool32 ignoreTera, enum Type types[static 3]); enum Type GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera); -bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon); -bool8 IsMonBannedFromSkyBattles(u16 species); +bool32 CanMonParticipateInSkyBattle(struct Pokemon *mon); void RemoveBattlerType(u32 battler, enum Type type); -enum Type GetBattleMoveType(u32 move); +enum Type GetBattleMoveType(enum Move move); void TryActivateSleepClause(u32 battler, u32 indexInParty); -void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty); -bool32 IsSleepClauseActiveForSide(u32 battlerSide); -bool32 IsSleepClauseEnabled(); +void TryDeactivateSleepClause(enum BattleSide battlerSide, u32 indexInParty); +bool32 IsSleepClauseActiveForSide(enum BattleSide battlerSide); +bool32 IsSleepClauseEnabled(void); void ClearDamageCalcResults(void); u32 DoesDestinyBondFail(u32 battler); bool32 IsMoveEffectBlockedByTarget(enum Ability ability); +bool32 SetTargetToNextPursuiter(u32 battlerDef); bool32 IsPursuitTargetSet(void); void ClearPursuitValuesIfSet(u32 battler); void ClearPursuitValues(void); bool32 HasWeatherEffect(void); -bool32 IsAnyTargetAffected(u32 battlerAtk); -bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); +bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, enum Move move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void ChooseStatBoostAnimation(u32 battler); void UpdateStallMons(void); bool32 TrySwitchInEjectPack(enum EjectPackTiming timing); -u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); +bool32 EmergencyExitCanBeTriggered(u32 battler); +bool32 TryTriggerSymbiosis(u32 battler, u32 ally); +bool32 TrySymbiosis(u32 battler, enum Item itemId, bool32 moveEnd); +void BestowItem(u32 battlerAtk, u32 battlerDef); +ARM_FUNC u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile); void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue); -bool32 ItemHealMonVolatile(u32 battler, u16 itemId); -void PushHazardTypeToQueue(u32 side, enum Hazards hazardType); -bool32 IsHazardOnSide(u32 side, enum Hazards hazardType); -bool32 AreAnyHazardsOnSide(u32 side); -void RemoveAllHazardsFromField(u32 side); -bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType); -void RemoveHazardFromField(u32 side, enum Hazards hazardType); -bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option); -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect); +bool32 ItemHealMonVolatile(u32 battler, enum Item itemId); +void PushHazardTypeToQueue(enum BattleSide side, enum Hazards hazardType); +bool32 IsHazardOnSide(enum BattleSide side, enum Hazards hazardType); +bool32 AreAnyHazardsOnSide(enum BattleSide side); +void RemoveAllHazardsFromField(enum BattleSide side); +bool32 IsHazardOnSideAndClear(enum BattleSide side, enum Hazards hazardType); +void RemoveHazardFromField(enum BattleSide side, enum Hazards hazardType); +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum Move move, enum ResultOption option); +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, enum Move move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect); bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); -bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); +bool32 BreaksThroughSemiInvulnerablity(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum Move move); bool32 HasPartnerTrainer(u32 battler); -bool32 IsAffectedByPowderMove(u32 battler, u32 ability, enum HoldEffect holdEffect); -u32 GetNaturePowerMove(u32 battler); -u32 GetNaturePowerMove(u32 battler); +bool32 IsAffectedByPowderMove(u32 battler, enum Ability ability, enum HoldEffect holdEffect); +enum Move GetNaturePowerMove(u32 battler); void RemoveAbilityFlags(u32 battler); +void CheckSetUnburden(u32 battler); bool32 IsDazzlingAbility(enum Ability ability); bool32 IsAllowedToUseBag(void); bool32 IsAnyTargetTurnDamaged(u32 battlerAtk); +bool32 IsAnyTargetAffected(void); bool32 IsMimikyuDisguised(u32 battler); +bool32 IsDoubleSpreadMove(void); +bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDef); +void SetStartingStatus(enum StartingStatus status); +void ResetStartingStatuses(void); +bool32 IsUsableWhileAsleepEffect(enum BattleMoveEffects effect); +void SetWrapTurns(u32 battler, enum HoldEffect holdEffect); +bool32 ChangeOrderTargetAfterAttacker(void); +void TryUpdateEvolutionTracker(enum EvolutionConditions evolutionCondition, u32 upAmount, enum Move usedMove); +bool32 CanUseMoveConsecutively(u32 battler); +void TryResetConsecutiveUseCounter(u32 battler); +void SetOrClearRageVolatile(void); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/config/ai.h b/include/config/ai.h index 5a7ce4078..28b144388 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -24,6 +24,7 @@ #define SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE 50 #define SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE 100 #define SHOULD_SWITCH_ALL_SCORES_BAD_PERCENTAGE 100 +#define SHOULD_SWITCH_DYN_FUNC_PERCENTAGE 50 // Dynamic switching function switch chance // AI smart switching chances for bad statuses #define SHOULD_SWITCH_PERISH_SONG_PERCENTAGE 100 @@ -50,6 +51,8 @@ #define ALL_MOVES_BAD_STATUS_MOVES_BAD FALSE // If the AI has no moves that affect the target, ShouldSwitchIfAllMovesBad can prompt a switch. Enabling this config will ignore status moves that can affect the target when making this decision. #define AI_BAD_SCORE_THRESHOLD 90 // Move scores beneath this threshold are considered "bad" when deciding switching #define AI_GOOD_SCORE_THRESHOLD 100 // Move scores above this threshold are considered "good" when deciding switching +#define ALL_MOVES_BAD_NEEDS_GOOD_SWITCHIN FALSE // AI will only trigger ShouldSwitchIfAllMovesBad if they have a good switchin +#define ALL_SCORES_BAD_NEEDS_GOOD_SWITCHIN FALSE // AI will only trigger ShouldSwitchIfAllScoresBad if they have a good switchin // AI held item-based move scoring #define LOW_ACCURACY_THRESHOLD 75 // Moves with accuracy equal OR below this value are considered low accuracy @@ -62,10 +65,19 @@ #define SUCKER_PUNCH_CHANCE 50 // Chance for the AI to not use Sucker Punch if the player has a status move #define SUCKER_PUNCH_PREDICTION_CHANCE 50 // Additional chance for the AI to not use Sucker Punch if actively predicting a status move if SUCKER_PUNCH_CHANCE fails #define PRIORITIZE_LAST_CHANCE_CHANCE 50 // Chance the AI will prioritize Last Chance (priority move in the face of being outsped and KO'd) over Slow KO +#define LAST_MON_PREFERS_NOT_SACRIFICE FALSE // Whether the AI will be hesitant to use self-sacrificing moves (Explosion, Final Gambit) with their last mon +#define EXPLOSION_LOWER_HP_THRESHOLD 10 // HP percentage at or beneath which the AI has a 90% chance to explode; otherwise scales between this and higher threshold +#define EXPLOSION_HIGHER_HP_THRESHOLD 90 // HP percentage at or above which the AI has a 0% chance to explode; otherwise scales between this and lower threshold +#define EXPLOSION_MINIMUM_CHANCE 0 // Lowest possible percent chance of the AI using explosion based on its current HP +#define EXPLOSION_MAXIMUM_CHANCE 90 // Highest possible percent chance of the AI using explosion based on its current HP +#define FINAL_GAMBIT_CHANCE 50 // Chance for AI to consider using Final Gambit if it outspeeds the player and thinks it has more HP +#define SHOULD_PIVOT_BREAK_SASH_CHANCE 50 // Chance for ShouldPivot to return true when trying to break Multiscale and Focus Sash type effects while having a good switchin // AI damage calc considerations #define RISKY_AI_CRIT_STAGE_THRESHOLD 2 // Stat stages at which Risky will assume it gets a crit #define RISKY_AI_CRIT_THRESHOLD_GEN_1 128 // "Stat stage" at which Risky will assume it gets a crit with gen 1 mechanics (this translates to an X / 255 % crit threshold) +#define AI_DAMAGES_THROUGH_BERRIES TRUE // AI will see through resist berries when considering a certain KO threshold for the purposes damage calcs; this is considered when comparing best moves to KO to still pick the actual OHKO if needed +#define AI_IGNORE_BERRY_KO_THRESHOLD 2 // KO threshold AI must meet in order to treat it berry though it doesn't exist (ie. 2 means "If the AI can 2HKO with berry resisted attack + not-berry resisted next attack, ignore berry resistence when calcing first attack"). Requires AI_DAMAGES_THROUGH_BERRIES // AI prediction chances #define PREDICT_SWITCH_CHANCE 50 @@ -93,6 +105,9 @@ // AI_FLAG_SMART_SWITCHING settings #define SMART_SWITCHING_OMNISCIENT FALSE // AI will use omniscience for switching calcs, regardless of omniscience setting otherwise +// AI_FLAG_RANDOMIZE_SWITCHIN settings +#define RANDOMIZE_SWITCHIN_ANY_VALID TRUE // If AI has no good candidate mons, it will still choose randomly from all valid options rather than defaulting to the last one in party order + // Configurations specifically for AI_FLAG_DOUBLE_BATTLE. #define FRIENDLY_FIRE_RISKY_THRESHOLD 2 // AI_FLAG_RISKY acceptable number of hits to KO the partner via friendly fire #define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 // typical acceptable number of hits to KO the partner via friendly fire diff --git a/include/config/battle.h b/include/config/battle.h index 3a702ef22..2bf3343ae 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -36,7 +36,7 @@ #define B_SPORT_DMG_REDUCTION GEN_LATEST // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%. #define B_EXPLOSION_DEFENSE GEN_LATEST // In Gen5+, Self-Destruct and Explosion don't halve the targets' defense. #define B_PARENTAL_BOND_DMG GEN_LATEST // In Gen7+, Parental Bond's second hit does 25% of the initial hits damage. Before, it did 50%. -#define B_MULTIPLE_TARGETS_DMG GEN_LATEST // In Gen4+, damage dealt by moves that hit multiple targets at once is reduced to 75%. Before, it was 50%. +#define B_MULTIPLE_TARGETS_DMG GEN_LATEST // In Gen4+, damage dealt by moves that hit multiple targets at once is reduced to 75%. In Gen3, it was 50%, unless the move hit the entire field, in which case there was no reduction. // Type settings #define B_GHOSTS_ESCAPE GEN_LATEST // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle. @@ -54,24 +54,27 @@ #define B_UPROAR_IGNORE_SOUNDPROOF GEN_LATEST // In Gen5+, Uproar status ignores Soundproof. #define B_DISABLE_TURNS GEN_LATEST // Disable's turns. See Cmd_disablelastusedattack. #define B_TAILWIND_TURNS GEN_LATEST // In Gen5+, Tailwind lasts 4 turns instead of 3. -#define B_SLEEP_TURNS GEN_LATEST // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns. +#define B_SLEEP_TURNS GEN_LATEST // In Gen5+, sleep lasts for 2-4 turns instead of 2-5 turns. #define B_TAUNT_TURNS GEN_LATEST // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns. #define B_SPORT_TURNS GEN_LATEST // In Gen6+, Water/Mud Sport last 5 turns, even if the user switches out. #define B_MEGA_EVO_TURN_ORDER GEN_LATEST // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before. -#define B_RECALC_TURN_AFTER_ACTIONS GEN_LATEST // In Gen8, switching/using a move affects the current turn's order of actions, better known as dynamic speed. +#define B_RECALC_TURN_AFTER_ACTIONS GEN_LATEST // In Gen8+, switching/using a move affects the current turn's order of actions, better known as dynamic speed. #define B_FAINT_SWITCH_IN GEN_LATEST // In Gen4+, sending out a new Pokémon after the previous one fainted happens at the end of the turn. Before, it would happen after each action. // Move data settings #define B_UPDATED_MOVE_DATA GEN_LATEST // Updates move data in gMovesInfo, including Power, Accuracy, PP, stat changes, targets and chances of secondary effects. #define B_UPDATED_MOVE_TYPES GEN_LATEST // Updates move types. #define B_UPDATED_MOVE_FLAGS GEN_LATEST // Updates move flags. -#define B_PHYSICAL_SPECIAL_SPLIT GEN_LATEST // In Gen3, the move's type determines if it will do physical or special damage. The split icon in the summary will reflect this. +#define B_PHYSICAL_SPECIAL_SPLIT GEN_LATEST // In Gens1-3, the move's type determines if it will do physical or special damage. The split icon in the summary will reflect this. #define B_RECOIL_IF_MISS_DMG GEN_LATEST // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing. #define B_KLUTZ_FLING_INTERACTION GEN_LATEST // In Gen5+, Pokémon with the Klutz ability can't use Fling. #define B_UPDATED_CONVERSION GEN_LATEST // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random. #define B_UPDATED_CONVERSION_2 GEN_LATEST // In Gen5+, Conversion 2 changes the user's type to a type that resists the last move used by the selected target. Before, it would consider the last move being successfully hit by. Additionally, Struggle is considered Normal type before Gen 5. #define B_PP_REDUCED_BY_SPITE GEN_LATEST // In Gen4+, Spite reduces the foe's last move's PP by 4, instead of 2 to 5. #define B_EXTRAPOLATED_MOVE_FLAGS TRUE // Adds move flags to moves that they don't officially have but would likely have if they were in the latest core series game. +#define B_HIDDEN_POWER_COUNTER GEN_LATEST // Prior to Gen4, Counter and Mirror Coat treat Hidden Power as Physical regardless of type. +#define B_MODERN_TRICK_CHOICE_LOCK GEN_LATEST // In Gen5+, if a Choice Item is swapped for a Choice Item, the Trick/Switcheroo user can pick another move, and then they'll be locked into it. +#define B_PROTECT_FAILURE_RATE GEN_LATEST // In Gen5+, protect moves fails 1/3 of the time instead of 1/2 // Ability data settings #define B_UPDATED_ABILITY_DATA GEN_LATEST // Affects flags @@ -85,7 +88,7 @@ // Move stat change settings #define B_FELL_STINGER_STAT_RAISE GEN_LATEST // In Gen7+, it raises Atk by 3 stages instead of 2 if it causes the target to faint. #define B_KINGS_SHIELD_LOWER_ATK GEN_LATEST // In Gen8+, it lowers Atk by 1 stage instead of 2 of opponents that hit it. -#define B_SPEED_BUFFING_RAPID_SPIN GEN_LATEST // In Gen8, Rapid Spin raises the user's Speed by 1 stage. +#define B_SPEED_BUFFING_RAPID_SPIN GEN_LATEST // In Gen8+, Rapid Spin raises the user's Speed by 1 stage. #define B_CHARGE_SPDEF_RAISE GEN_LATEST // In Gen5+, Charge raises the user's Special Defense by 1 stage. #define B_MINIMIZE_EVASION GEN_LATEST // In Gen5+, Minimize raises evasion by 2 stages instead of 1. #define B_GROWTH_STAT_RAISE GEN_LATEST // In Gen5+, Growth raises Attack in addition to Special Attack by 1 stage each. Under the effects of the sun, it raises them by 2 stages each instead. @@ -94,8 +97,8 @@ // Other move settings #define B_INCINERATE_GEMS GEN_LATEST // In Gen6+, Incinerate can destroy Gems. #define B_CAN_SPITE_FAIL GEN_LATEST // In Gen4+, Spite can no longer fail if the foe's last move only has 1 remaining PP. -#define B_CRASH_IF_TARGET_IMMUNE GEN_LATEST // In Gen4+, The user of Jump Kick or High Jump Kick will "keep going and crash" if it attacks a target that is immune to the move. -#define B_MEMENTO_FAIL GEN_LATEST // In Gen4+, Memento fails if there is no target or if the target is protected or behind substitute. But not if Atk/Sp. Atk are at -6. +#define B_CRASH_IF_TARGET_IMMUNE GEN_LATEST // In Gen4+, moves with crash damage will crash if the user attacks a target that is immune due to their typing. +#define B_MEMENTO_FAIL GEN_LATEST // In Gen4+, Memento no longer fails if the target already has -6 Attack and Special Attack. Additionally, in Gen5+, it fails if there is no target, or if the target is protected or behind a Substitute. #define B_GLARE_GHOST GEN_LATEST // In Gen4+, Glare can hit Ghost-type Pokémon normally. #define B_SKILL_SWAP GEN_LATEST // In Gen4+, Skill Swap triggers switch-in abilities after use. #define B_BRICK_BREAK GEN_LATEST // In Gen4+, you can destroy your own side's screens. In Gen 5+, screens are not removed if the target is immune. @@ -111,19 +114,19 @@ #define B_BURN_HIT_THAW GEN_LATEST // In Gen6+, damaging moves with a chance of burn will thaw the target, regardless if they're fire-type moves or not. #define B_HEALING_WISH_SWITCH GEN_LATEST // In Gen5+, the mon receiving Healing Wish is sent out at the end of the turn. // Additionally, in gen8+ the Healing Wish's effect will be stored until the user switches into a statused or hurt mon. -#define B_DEFOG_EFFECT_CLEARING GEN_LATEST // In Gen6+, Defog clears Spikes, Toxic Spikes, Stealth Rock and Sticky Web from both sides. In Gen8+, Defog also clears active Terrain. +#define B_DEFOG_EFFECT_CLEARING GEN_LATEST // In Gen5+, Defog does not lower Evasion of target behind Subsitute. In Gen6+, Defog clears Spikes, Toxic Spikes, Stealth Rock and Sticky Web from both sides. In Gen8+, Defog also clears active Terrain. #define B_STOCKPILE_RAISES_DEFS GEN_LATEST // In Gen4+, Stockpile also raises Defense and Sp. Defense stats. Once Spit Up / Swallow is used, these stat changes are lost. #define B_TRANSFORM_SHINY GEN_LATEST // In Gen4+, Transform will copy the shiny state of the opponent instead of maintaining its own shiny state. #define B_TRANSFORM_FORM_CHANGES GEN_LATEST // In Gen5+, Transformed Pokemon cannot change forms. #define B_WIDE_GUARD GEN_LATEST // In Gen5 only, Wide Guard has a chance to fail if used consecutively. #define B_QUICK_GUARD GEN_LATEST // In Gen5 only, Quick Guard has a chance to fail if used consecutively. #define B_IMPRISON GEN_LATEST // In Gen5+, Imprison doesn't fail if opposing pokemon don't have any moves the user knows. -#define B_ALLY_SWITCH_FAIL_CHANCE GEN_LATEST // In Gen9, using Ally Switch consecutively decreases the chance of success for each consecutive use. +#define B_ALLY_SWITCH_FAIL_CHANCE GEN_LATEST // In Gen9+, using Ally Switch consecutively decreases the chance of success for each consecutive use. #define B_SKETCH_BANS GEN_LATEST // In Gen9+, Sketch is unable to copy more moves than in previous generations. #define B_KNOCK_OFF_REMOVAL GEN_LATEST // In Gen5+, Knock Off removes the foe's item instead of rendering it unusable. #define B_HEAL_BELL_SOUNDPROOF GEN_LATEST // In Gen5, Heal Bell affects all mons with Soundproof. In Gen6-8 it affects inactive mons, but not battlers. In Gen9 it always affects the user. -#define B_CHARGE GEN_LATEST // In Gen8-, Charge status is lost regardless of the typing of the next move. -#define B_POWDER_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. +#define B_CHARGE GEN_LATEST // In Gen9+, Charge status is lost regardless of the typing of the next move. +#define B_POWDER_STATUS_HEAVY_RAIN GEN_LATEST // In Gen7+, Powder doesn't damage the user of a Fire type move in heavy rain. #define B_AFTER_YOU_TURN_ORDER GEN_LATEST // In Gen8+, After You doesn't fail if the turn order wouldn't change after use. #define B_QUASH_TURN_ORDER GEN_LATEST // In Gen8+, Quash-affected battlers move according to speed order. Before Gen8, Quash-affected battlers move in the order they were affected by Quash. #define B_DESTINY_BOND_FAIL GEN_LATEST // In Gen7+, Destiny Bond fails if used repeatedly. @@ -133,21 +136,30 @@ #define B_TIME_OF_DAY_HEALING_MOVES GEN_LATEST // In Gen2, Morning Sun, Moonlight, and Synthesis heal twice as much HP based off the time of day. Also changes how much they heal. Evening affects Moonlight. // If OW_TIMES_OF_DAY is set to Gen 3, then Morning Sun is boosted during the day. #define B_DREAM_EATER_LIQUID_OOZE GEN_LATEST // In Gen5+, Dream Eater is affected by Liquid Ooze. +#define B_DREAM_EATER_SUBSTITUTE GEN_LATEST // In Gen5+, Dream Eater can successfully hit and drain from a Substitute. +#define B_SNATCH GEN_LATEST // In Gen5+, Snatch no longer steals moves that were already stolen by another Pokémon's Snatch on the same turn. +#define B_FOCUS_PUNCH_FAILURE GEN_LATEST // To determine if Focus is lost, in Gen4-, check if the current move is Focus Punch. + // In Gens 5-6, check if the selected move is Focus Punch. + // In Gen7+, check if the current move and the selected move are Focus Punch. + // Also in Gen4-, the check for Focus Punch fail will occur after effects like pp consumption and flinching while it happens before in Gen5+ +#define B_COUNTER_MIRROR_COAT_ALLY GEN_LATEST // In Gen5+, an ally's attack does not count for uses of Counter/Mirror Coat/Metal Burst. In Gen4-, if the last attack taken was from an ally, Counter/Mirror Coat/Metal Burst would fail. +#define B_COUNTER_TRY_HIT_PARTNER GEN_LATEST // In Gen5+, if the user of the last attack is not on the field, it will be redirected to the partner. In Gen4-, Counter/Mirror Coat/Metal Burst would fail. +#define B_RAGE_BUILDS GEN_LATEST // In Gen4+, Rage's effect only sets in when it successfully hits. In Gen3, Rage's effect sets in regardless of whether it hits, misses or fails. +#define B_CHECK_USER_FAILURE GEN_LATEST // In Gen5+, The user no longer checks it's own failure, e.g. Soundproof will not block it's own Perish Song // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. #define B_STANCE_CHANGE_FAIL GEN_LATEST // In Gen7+, Stance Change fails if the Pokémon is unable to use a move because of confusion, paralysis, etc. In Gen6, it doesn't. #define B_SHADOW_TAG_ESCAPE GEN_LATEST // In Gen4+, if both sides have a Pokémon with Shadow Tag, all battlers can escape. Before, neither side could escape this situation. -#define B_MOODY_ACC_EVASION GEN_LATEST // In Gen8, Moody CANNOT raise Accuracy and Evasion anymore. +#define B_MOODY_ACC_EVASION GEN_LATEST // In Gen8+, Moody CANNOT raise Accuracy and Evasion anymore. #define B_FLASH_FIRE_FROZEN GEN_LATEST // In Gen5+, Flash Fire can trigger even when frozen, when it couldn't before. #define B_SYNCHRONIZE_TOXIC GEN_LATEST // In Gen5+, if a Pokémon with Synchronize is badly poisoned, the opponent will also become badly poisoned. Previously, the opponent would become regular poisoned. -#define B_UPDATED_INTIMIDATE GEN_LATEST // In Gen8, Intimidate doesn't work on opponents with the Inner Focus, Scrappy, Own Tempo or Oblivious abilities. It also activates Rattled. +#define B_UPDATED_INTIMIDATE GEN_LATEST // In Gen8+, Intimidate doesn't work on opponents with the Inner Focus, Scrappy, Own Tempo or Oblivious abilities. It also activates Rattled. #define B_OBLIVIOUS_TAUNT GEN_LATEST // In Gen6+, Pokémon with Oblivious can't be taunted. #define B_STURDY GEN_LATEST // In Gen5+, Sturdy causes the Pokémon to have 1 HP remaining if another Pokémon's attack or confusion damage would have brought it from full health to 0 HP. #define B_PLUS_MINUS_INTERACTION GEN_LATEST // In Gen5+, Plus and Minus can be activated with themselves and the opposite ability. Before, only the opposing ability could activate it. #define B_WEATHER_FORMS GEN_LATEST // In Gen5+, Castform and Cherrim revert to their base form upon losing their respective ability. Cherrim needs Flower Gift to swap forms. #define B_SYMBIOSIS_GEMS GEN_LATEST // In Gen7+, Symbiosis passes an item after a gem-boosted attack. Previously, items are passed before the gem-boosted attack hits, making the item effect apply. -#define B_ABSORBING_ABILITY_STRING GEN_LATEST // In Gen5+, the abilities that absorb moves of a certain type use a generic string for stat increases and decreases. #define B_REDIRECT_ABILITY_IMMUNITY GEN_LATEST // In Gen5+, Pokémon with Lightning Rod/Storm Drain become immune to Electric/Water-type moves and increase their Sp. Attack by 1 stage on top of the redirecting effect. #define B_REDIRECT_ABILITY_ALLIES GEN_LATEST // In Gen4+, Lightning Rod/Storm Drain redirect ally's moves as well. #define B_LEAF_GUARD_PREVENTS_REST GEN_LATEST // In Gen5+, Leaf Guard prevents the use of Rest in harsh sunlight. @@ -168,14 +180,34 @@ #define B_DEFIANT_STICKY_WEB GEN_LATEST // In Gen9+, Defiant activates on Sticky Web regardless of who set it up. In Gen8, Defiant does not activate on Sticky Web set up by an ally after Court Change swaps its side. #define B_POWDER_OVERCOAT GEN_LATEST // In Gen6+, Overcoat blocks powder and spore moves from affecting the user. +// Various volatile timers +#define B_CONFUSION_TURNS 5 +#define B_UPROAR_TURN_COUNT 5 +#define B_RAMPAGE_TURNS 3 +#define B_DISABLE_TIMER 4 +#define B_ENCORE_TIMER 4 +#define B_PERISH_SONG_TIMER 3 +#define B_TAUNT_TIMER 5 +#define B_SLOW_START_TIMER 5 +#define B_EMBARGO_TIMER 5 +#define B_MAGNET_RISE_TIMER 5 +#define B_TELEKINESIS_TIMER 3 +#define B_HEAL_BLOCK_TIMER 5 +#define B_LASER_FOCUS_TIMER 2 +#define B_THROAT_CHOP_TIMER 2 +#define B_WRAP_TURNS 7 // Max number of turns with Grip Claw +#define B_SYRUP_BOMB_TIMER 3 +#define B_TORMENT_TIMER 3 + // Item settings -#define B_CONFUSE_BERRIES_HEAL GEN_LATEST // Before Gen7, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP. +#define B_CONFUSE_BERRIES_HEAL GEN_LATEST // In Gens3-6, Figy and similar berries restore 1/8th of HP and trigger at half HP. In Gen7 they restore half HP, triggering at 25% HP. In Gen8 they heal 1/3rd of HP. #define B_X_ITEMS_BUFF GEN_LATEST // In Gen7+, the X Items raise a stat by 2 stages instead of 1. +#define B_X_ITEMS_CROSSUSE TRUE // In Gen3, you can only use X item on the current battler, but in Gen7 you can use an X item on any friendly battler in double battles (we are not sure in which gen the change occured) #define B_MENTAL_HERB GEN_LATEST // In Gen5+, the Mental Herb cures Taunt, Encore, Torment, Heal Block, and Disable in addition to Infatuation from before. -#define B_TRAINERS_KNOCK_OFF_ITEMS TRUE // If TRUE, trainers can steal/swap your items (non-berries are restored after battle). In vanilla games trainers cannot steal items. +#define B_TRAINERS_KNOCK_OFF_ITEMS TRUE // If TRUE, trainers can steal/swap your items (non-berries are restored after battle). In vanilla games, trainers cannot steal items outside of facilities. #define B_RETURN_STOLEN_NPC_ITEMS GEN_LATEST // In Gen5+, Thief and Covet no longer steal items from NPCs. -#define B_STEAL_WILD_ITEMS GEN_LATEST // In Gen9, Thief and Covet steal a wild pokemon's item and send it to the bag. Before Gen9, the stolen item would be held by the Thief/Covet user. -#define B_RESTORE_HELD_BATTLE_ITEMS GEN_LATEST // In Gen9, all non-berry items are restored after battle. +#define B_STEAL_WILD_ITEMS GEN_LATEST // In Gen9+, Thief and Covet steal a wild pokemon's item and send it to the bag. In Gens2-8, the stolen item would be held by the Thief/Covet user. +#define B_RESTORE_HELD_BATTLE_ITEMS GEN_LATEST // In Gen9+, all non-berry items are restored after battle. #define B_SOUL_DEW_BOOST GEN_LATEST // In Gens3-6, Soul Dew boosts Latis' Sp. Atk and Sp. Def. In Gen7+ it boosts the power of their Psychic and Dragon type moves instead. #define B_NET_BALL_MODIFIER GEN_LATEST // In Gen7+, Net Ball's catch multiplier is x5 instead of x3. #define B_DIVE_BALL_MODIFIER GEN_LATEST // In Gen4+, Dive Ball's effectiveness increases by x3.5 when Surfing or Fishing. @@ -219,9 +251,6 @@ // Var Settings // To use the following features, change the 0 for a var present in include/constants/vars.h, preferably an unused one. // Eg: You may rename VAR_UNUSED_0x404E to a descriptive name and use it below. -#define B_VAR_STARTING_STATUS 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active. - // This var should never remain non-zero long enough for the player to save. -#define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten. #define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. IMPORTANT: NOT usable with flags above (1 << 15) // This var should never remain non-zero long enough for the player to save. // For better wild AI handling, edit GetWildAiFlags() in src/battle_ai_main.c @@ -257,6 +286,7 @@ #define B_ABILITY_WEATHER GEN_LATEST // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability. #define B_SANDSTORM_SPDEF_BOOST GEN_LATEST // In Gen4+, Sandstorm weather multiplies the Sp. Defense of Rock-type Pokémon by x1.5. +#define B_SANDSTORM_SOLAR_BEAM GEN_LATEST // In Gen3+, Sandstorm decreases the power of Solar Beam, when it didn't before. #define B_OVERWORLD_FOG GEN_LATEST // In Gen8+, overworld Fog summons Misty Terrain in battle. In Gen4 only, overworld Fog summons the unique fog weather condition in battle. #define B_OVERWORLD_SNOW GEN_LATEST // In Gen9+, overworld Snow will summon snow instead of hail in battle. #define B_SNOW_WARNING GEN_LATEST // In Gen9+, Snow Warning will summon snow instead of hail. @@ -288,10 +318,14 @@ #define B_ANIMATE_MON_AFTER_KO TRUE // If set to TRUE, if a Pokémon on the opposite site faints, the non-fainted Pokemon will display a victory animation. #define B_ANIMATE_MON_AFTER_FAILED_POKEBALL TRUE // If set to TRUE, if a Pokémon on the opposite side breaks out of a thrown Poké Ball, the wild Pokémon will display its animation. #define B_SHOW_DYNAMAX_MESSAGE FALSE // If set to TRUE, an additional battle message is shown after completing Dynamaxing/Gigantamaxing. +#define B_HPBAR_COLOR_THRESHOLD GEN_LATEST // In Gen 5+, HP bar color thresholds were changed to be based on the actual HP values instead of the pixel length of the HP bar, leading to more accurate HP bar colors. // Catching settings #define B_SEMI_INVULNERABLE_CATCH GEN_LATEST // In Gen4+, you cannot throw a ball against a Pokemon that is in a semi-invulnerable state (dig/fly/etc) #define B_CATCHING_CHARM_BOOST 100 // % boost in Critical Capture odds if player has the Catching Charm. +#define B_INCAPACITATED_CATCH_BONUS GEN_LATEST // In Gen5+, the catch rate bonus for a mon with sleep or freeze is 2.5x. In Gen4 and below its only a 2x bonus. +#define B_LOW_LEVEL_CATCH_BONUS GEN_LATEST // In Gen8, a bonus is added to the catch rate if catching a mon lower than level 20. In Gen9, the bonus is only applied to mons lower than level 13. +#define B_MISSING_BADGE_CATCH_MALUS GEN_LATEST // In Gen9, a penalty is added to the catch rate if trying to catch a mon 5 levels above the current obedience level, based on the number of gym badges obtained. #define B_CRITICAL_CAPTURE TRUE // If set to TRUE, Critical Capture will be enabled. #define B_CRITICAL_CAPTURE_LOCAL_DEX TRUE // If set to FALSE, Critical Capture % is based off of the National Pokedex estimated by enabled generations. #define B_CRITICAL_CAPTURE_IF_OWNED GEN_LATEST // In Gen9, a capture appear critical if the pokemon you are trying to catch already has a dex entry (has already been caught) diff --git a/include/config/general.h b/include/config/general.h index e89f83950..4e7c1f4b4 100644 --- a/include/config/general.h +++ b/include/config/general.h @@ -68,6 +68,7 @@ #define GEN_7 6 #define GEN_8 7 #define GEN_9 8 +#define GEN_COUNT 9 // Changing GEN_LATEST's value to a different Generation will change every default setting that uses it at once. #define GEN_LATEST GEN_9 diff --git a/include/config/pokerus.h b/include/config/pokerus.h new file mode 100644 index 000000000..689b08285 --- /dev/null +++ b/include/config/pokerus.h @@ -0,0 +1,21 @@ +#ifndef GUARD_CONFIG_POKERUS_H +#define GUARD_CONFIG_POKERUS_H + +//For Pokérus, we refer to infection as a Pokémon catching Pokérus from an enemy Pokémon (trainer or wild) and we refer to spreading as Pokémon catching Pokérus from another infected Pokémon in the party +#define P_POKERUS_ENABLED TRUE // If FALSE, Pokérus will have no effect, won't be shown and won't be aquired in any way but save data won't be affected +#define P_POKERUS_STRAIN_DISTRIBUTION GEN_LATEST // Pokérus has 16 different strains and their probability distribution change depending on generation, GEN_3 will use the Ruby/Sapphire version and GEN_4 will use the version used in Emerald and Gen 4 +#define P_POKERUS_SPREAD_ADJACENCY GEN_LATEST // In Gen 2, Pokérus spread to one adjacent Pokémon but it spreads to both adjacent Pokémon in gen 3+ +#define P_POKERUS_SPREAD_DAYS_LEFT GEN_LATEST // In Gen 2, a freshly spreaded Pokémon will get its full infection duration based on strain. In gen 3+, the Pokérus duration will copy the duration from the Pokémon it was spreaded from +#define P_POKERUS_INFECT_AGAIN GEN_LATEST // If Gen 2 only, your party can get infected even when it is already infected with Pokérus (doesn't affect spreading) +#define P_POKERUS_VISIBLE_ON_EGG GEN_LATEST // Controls if eggs can show Pokérus symbol in summary screen (TRUE from gen 3 to 6, FALSE in gen 2,7 and 8) +#define P_POKERUS_INFECT_EGG FALSE // If TRUE, eggs can receive Pokérus from spread and direction infection (gen 2). If FALSE, eggs can receive Pokérus from spread but not direct infection (gen 3). Behavior is unknown in other gens. +#define P_POKERUS_FLAG_INFECTION 0 // If Pokérus can only get infected if this flag is set or undefined (0). This emulates a gen 2 mechanic where Pokémon can only get infected by Pokérus after visiting Goldernrod. This does not affect spreading + +// Weird Pokérus behaviors that could be considered bugs. They are TRUE in vanilla Emerald but set to FALSE by default in Expansion (behaviors in other gens is unknown) +#define P_POKERUS_HERD_IMMUNITY FALSE // If TRUE, Pokémon that have been previously infected by the Pokérus in your party reduce the chances of your party getting infected by the Pokérus (because they can be rolled at the target of the infection but are now "immune") +#define P_POKERUS_WEAK_VARIANT FALSE // If TRUE, the variant 0 of Pokérus can be erased by stronger variant when Pokérus is spreading + +#define P_POKERUS_INFECTION_ODDS 3 // Actual probability is POKERUS_INFECTION_ODDS/65536 +#define P_POKERUS_SPREAD_ODDS 21846 // Actual probability is POKERUS_SPREAD_ODDS/65536 (21846 should correspond to the vanilla Random() % 3) + +#endif // GUARD_CONFIG_POKERUS_H diff --git a/include/constants/battle.h b/include/constants/battle.h index da4037ee3..4c87a74b7 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -32,6 +32,7 @@ enum BattlerPosition B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, MAX_POSITION_COUNT, + B_POSITION_ABSENT = 0xFF, }; enum BattlerId @@ -43,6 +44,15 @@ enum BattlerId MAX_BATTLERS_COUNT, }; +enum __attribute__((packed)) BattleTrainer +{ + B_TRAINER_0, + B_TRAINER_1, + B_TRAINER_2, + B_TRAINER_3, + MAX_BATTLE_TRAINERS, +}; + // These macros can be used with either battler ID or positions to get the partner or the opposite mon #define BATTLE_OPPOSITE(id) ((id) ^ BIT_SIDE) #define BATTLE_PARTNER(id) ((id) ^ BIT_FLANK) @@ -75,12 +85,11 @@ enum BattleSide #define BATTLE_TYPE_MULTI (1 << 6) #define BATTLE_TYPE_SAFARI (1 << 7) #define BATTLE_TYPE_BATTLE_TOWER (1 << 8) -#define BATTLE_TYPE_OLD_MAN_TUTORIAL (1 << 9) // Used in pokeemerald as BATTLE_TYPE_WALLY_TUTORIAL. +#define BATTLE_TYPE_CATCH_TUTORIAL (1 << 9) // Used in pokefirered as BATTLE_TYPE_OLD_MAN_TUTORIAL. #define BATTLE_TYPE_ROAMER (1 << 10) #define BATTLE_TYPE_EREADER_TRAINER (1 << 11) #define BATTLE_TYPE_RAID (1 << 12) #define BATTLE_TYPE_LEGENDARY (1 << 13) -#define BATTLE_TYPE_GHOST_UNVEILED (1 << 13) #define BATTLE_TYPE_WILD_SCRIPTED (1 << 14) #define BATTLE_TYPE_TWO_OPPONENTS (1 << 15) // Used in pokefirered as BATTLE_TYPE_GHOST. #define BATTLE_TYPE_DOME (1 << 16) // Used in pokefirered as BATTLE_TYPE_POKEDUDE. @@ -94,7 +103,7 @@ enum BattleSide #define BATTLE_TYPE_RECORDED (1 << 24) #define BATTLE_TYPE_RECORDED_LINK (1 << 25) #define BATTLE_TYPE_TRAINER_HILL (1 << 26) -#define BATTLE_TYPE_TRAINER_TOWER (BATTLE_TYPE_TRAINER_HILL) +#define BATTLE_TYPE_TRAINER_TOWER BATTLE_TYPE_TRAINER_HILL #define BATTLE_TYPE_SECRET_BASE (1 << 27) #define BATTLE_TYPE_GHOST (1 << 28) #define BATTLE_TYPE_POKEDUDE (1 << 29) @@ -103,7 +112,7 @@ enum BattleSide #define BATTLE_TYPE_FRONTIER (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE | BATTLE_TYPE_PYRAMID) #define BATTLE_TYPE_FRONTIER_NO_PYRAMID (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOME | BATTLE_TYPE_PALACE | BATTLE_TYPE_ARENA | BATTLE_TYPE_FACTORY | BATTLE_TYPE_PIKE) #define BATTLE_TYPE_RECORDED_INVALID ((BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE \ - | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ + | BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \ | BATTLE_TYPE_LEGENDARY \ | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_SECRET_BASE)) @@ -167,19 +176,19 @@ enum VolatileFlags * These are removed after exiting the battle or switching * Enum, Type Type, max value, flags */ #define VOLATILE_DEFINITIONS(F) \ - F(VOLATILE_CONFUSION, confusionTurns, (u32, 6), V_BATON_PASSABLE) \ + F(VOLATILE_CONFUSION, confusionTurns, (u32, B_CONFUSION_TURNS + 1), V_BATON_PASSABLE) \ F(VOLATILE_FLINCHED, flinched, (u32, 1)) \ F(VOLATILE_UPROAR, uproarTurns, (u32, 5)) \ F(VOLATILE_TORMENT, torment, (u32, 1)) \ F(VOLATILE_BIDE, bideTurns, (u32, 3)) \ - F(VOLATILE_LOCK_CONFUSE, lockConfusionTurns, (u32, 3)) \ + F(VOLATILE_RAMPAGE_TURNS, rampageTurns, (u32, B_RAMPAGE_TURNS + 1)) \ F(VOLATILE_MULTIPLETURNS, multipleTurns, (u32, 1)) \ F(VOLATILE_WRAPPED, wrapped, (u32, 1)) \ - F(VOLATILE_WRAPPED_BY, wrappedBy, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_WRAPPED_BY, wrappedBy, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ F(VOLATILE_WRAPPED_MOVE, wrappedMove, (u32, MOVES_COUNT_ALL - 1)) \ F(VOLATILE_POWDER, powder, (u32, 1)) \ F(VOLATILE_UNUSED, padding, (u32, 1)) \ - F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_INFATUATION, infatuation, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ F(VOLATILE_DEFENSE_CURL, defenseCurl, (u32, 1)) \ F(VOLATILE_TRANSFORMED, transformed, (u32, 1)) \ F(VOLATILE_RAGE, rage, (u32, 1)) \ @@ -191,20 +200,21 @@ enum VolatileFlags F(VOLATILE_FORESIGHT, foresight, (u32, 1)) \ F(VOLATILE_DRAGON_CHEER, dragonCheer, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_FOCUS_ENERGY, focusEnergy, (u32, 1), V_BATON_PASSABLE) \ - F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (u32, SEMI_INVULNERABLE_COUNT - 1)) \ + F(VOLATILE_BONUS_CRIT_STAGES, bonusCritStages, (u32, 4)) \ + F(VOLATILE_SEMI_INVULNERABLE, semiInvulnerable, (enum SemiInvulnerableState, SEMI_INVULNERABLE_COUNT)) \ F(VOLATILE_ELECTRIFIED, electrified, (u32, 1)) \ F(VOLATILE_MUD_SPORT, mudSport, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_WATER_SPORT, waterSport, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_INFINITE_CONFUSION, infiniteConfusion, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_SALT_CURE, saltCure, (u32, 1)) \ F(VOLATILE_SYRUP_BOMB, syrupBomb, (u32, 1)) \ - F(VOLATILE_STICKY_SYRUPED_BY, stickySyrupedBy, (enum BattlerId, MAX_BITS(4))) \ + F(VOLATILE_STICKY_SYRUPED_BY, stickySyrupedBy, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ F(VOLATILE_GLAIVE_RUSH, glaiveRush, (u32, 1)) \ - F(VOLATILE_LEECH_SEED, leechSeed, (enum BattlerId, MAX_BITS(4)), V_BATON_PASSABLE) \ + F(VOLATILE_LEECH_SEED, leechSeed, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT)), V_BATON_PASSABLE) \ F(VOLATILE_LOCK_ON, lockOn, (u32, 2), V_BATON_PASSABLE) \ F(VOLATILE_PERISH_SONG, perishSong, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_MINIMIZE, minimize, (u32, 1)) \ - F(VOLATILE_CHARGE, charge, (u32, 1)) \ + F(VOLATILE_CHARGE_TIMER, chargeTimer, (u32, 3)) \ F(VOLATILE_ROOT, root, (u32, 1), V_BATON_PASSABLE) \ F(VOLATILE_YAWN, yawn, (u32, 2)) \ F(VOLATILE_IMPRISON, imprison, (u32, 1)) \ @@ -223,7 +233,64 @@ enum VolatileFlags F(VOLATILE_VESSEL_OF_RUIN, vesselOfRuin, (u32, 1)) \ F(VOLATILE_SWORD_OF_RUIN, swordOfRuin, (u32, 1)) \ F(VOLATILE_TABLETS_OF_RUIN, tabletsOfRuin, (u32, 1)) \ - F(VOLATILE_BEADS_OF_RUIN, beadsOfRuin, (u32, 1)) + F(VOLATILE_BEADS_OF_RUIN, beadsOfRuin, (u32, 1)) \ + F(VOLATILE_IS_TRANSFORMED_MON_SHINY, isTransformedMonShiny, (u32, 1)) \ + F(VOLATILE_TRANSFORMED_MON_PID, transformedMonPID, (u32, UINT32_MAX)) \ + F(VOLATILE_DISABLED_MOVE, disabledMove, (u32, MOVES_COUNT_ALL)) \ + F(VOLATILE_ENCORED_MOVE, encoredMove, (u32, MOVES_COUNT_ALL)) \ + F(VOLATILE_PROTECT_USES, consecutiveMoveUses, (u32, UINT8_MAX)) \ + F(VOLATILE_STOCKPILE_COUNTER, stockpileCounter, (u32, MAX_STAT_STAGE)) \ + F(VOLATILE_STOCKPILE_DEF, stockpileDef, (u32, MAX_STAT_STAGE)) \ + F(VOLATILE_STOCKPILE_SP_DEF, stockpileSpDef, (u32, MAX_STAT_STAGE)) \ + F(VOLATILE_STOCKPILE_BEFORE_DEF, stockpileBeforeDef, (u32, MAX_STAT_STAGE)) \ + F(VOLATILE_STOCKPILE_BEFORE_SP_DEF, stockpileBeforeSpDef, (u32, MAX_STAT_STAGE)) \ + F(VOLATILE_SUBSTITUTE_HP, substituteHP, (u32, UINT8_MAX)) \ + F(VOLATILE_ENCORED_MOVE_POS, encoredMovePos, (u32, MAX_BITS(MAX_MON_MOVES))) \ + F(VOLATILE_DISABLE_TIMER, disableTimer, (u32, B_DISABLE_TIMER)) \ + F(VOLATILE_ENCORE_TIMER, encoreTimer, (u32, B_ENCORE_TIMER)) \ + F(VOLATILE_PERISH_SONG_TIMER, perishSongTimer, (u32, B_PERISH_SONG_TIMER)) \ + F(VOLATILE_ROLLOUT_TIMER, rolloutTimer, (u32, UINT8_MAX)) \ + F(VOLATILE_FURY_CUTTER_COUNTER, furyCutterCounter, (u32, UINT8_MAX)) \ + F(VOLATILE_METRONOME_ITEM_COUNTER, metronomeItemCounter, (u32, UINT8_MAX)) \ + F(VOLATILE_BATTLER_PREVENTING_ESCAPE, battlerPreventingEscape, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ + F(VOLATILE_BATTLER_WITH_SURE_HIT, battlerWithSureHit, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ + F(VOLATILE_MIMICKED_MOVES, mimickedMoves, (u32, MAX_BITS(MAX_MON_MOVES))) \ + F(VOLATILE_RECHARGE_TIMER, rechargeTimer, (u32, 2)) \ + F(VOLATILE_AUTOTOMIZE_COUNT, autotomizeCount, (u32, UINT8_MAX)) \ + F(VOLATILE_SLOW_START_TIMER, slowStartTimer, (u32, B_SLOW_START_TIMER)) \ + F(VOLATILE_EMBARGO_TIMER, embargoTimer, (u32, B_EMBARGO_TIMER)) \ + F(VOLATILE_MAGNET_RISE_TIMER, magnetRiseTimer, (u32, B_MAGNET_RISE_TIMER)) \ + F(VOLATILE_TELEKINESIS_TIMER, telekinesisTimer, (u32, B_TELEKINESIS_TIMER)) \ + F(VOLATILE_HEAL_BLOCK_TIMER, healBlockTimer, (u32, B_HEAL_BLOCK_TIMER)) \ + F(VOLATILE_TAUNT_TIMER, tauntTimer, (u32, B_TAUNT_TIMER)) \ + F(VOLATILE_TORMENT_TIMER, tormentTimer, (u32, B_TORMENT_TIMER)) \ + F(VOLATILE_LASER_FOCUS_TIMER, laserFocusTimer, (u32, B_LASER_FOCUS_TIMER)) \ + F(VOLATILE_THROAT_CHOP_TIMER, throatChopTimer, (u32, B_THROAT_CHOP_TIMER)) \ + F(VOLATILE_WRAP_TURNS, wrapTurns, (u32, B_WRAP_TURNS)) \ + F(VOLATILE_SYRUP_BOMB_TIMER, syrupBombTimer, (u32, B_SYRUP_BOMB_TIMER)) \ + F(VOLATILE_USED_MOVES, usedMoves, (u32, MAX_BITS(MAX_MON_MOVES))) \ + F(VOLATILE_TRUANT_COUNTER, truantCounter, (u32, 1)) \ + F(VOLATILE_TRUANT_SWITCH_IN_HACK, truantSwitchInHack, (u32, 1)) \ + F(VOLATILE_TAR_SHOT, tarShot, (u32, 1)) \ + F(VOLATILE_OCTOLOCK, octolock, (u32, 1)) \ + F(VOLATILE_CUD_CHEW, cudChew, (u32, 1)) \ + F(VOLATILE_WEATHER_ABILITY_DONE, weatherAbilityDone, (u32, 1)) \ + F(VOLATILE_TERRAIN_ABILITY_DONE, terrainAbilityDone, (u32, 1)) \ + F(VOLATILE_SYRUP_BOMB_IS_SHINY, syrupBombIsShiny, (u32, 1)) \ + F(VOLATILE_USED_PROTEAN_LIBERO, usedProteanLibero, (u32, 1)) \ + F(VOLATILE_FLASH_FIRE_BOOSTED, flashFireBoosted, (u32, 1)) \ + F(VOLATILE_BOOSTER_ENERGY_ACTIVATED, boosterEnergyActivated, (u32, 1)) \ + F(VOLATILE_OVERWRITTEN_ABILITY, overwrittenAbility, (enum Ability, ABILITIES_COUNT)) \ + F(VOLATILE_ROOST_ACTIVE, roostActive, (u32, 1)) \ + F(VOLATILE_UNBURDEN_ACTIVE, unburdenActive, (u32, 1)) \ + F(VOLATILE_NEUTRALIZING_GAS, neutralizingGas, (u32, 1)) \ + F(VOLATILE_TRIGGER_ICE_FACE, triggerIceFace, (u32, 1)) \ + F(VOLATILE_UNNERVE_ACTIVATED, unnerveActivated, (u32, 1)) \ + F(VOLATILE_ENDURED, endured, (u32, 1)) \ + F(VOLATILE_TRY_EJECT_PACK, tryEjectPack, (u32, 1)) \ + F(VOLATILE_OCTOLOCKED_BY, octolockedBy, (enum BattlerId, MAX_BITS(MAX_BATTLERS_COUNT))) \ + F(VOLATILE_PARADOX_BOOSTED_STAT, paradoxBoostedStat, (enum Stat, NUM_STATS - 1)) \ + F(VOLATILE_UNABLE_TO_USE_MOVE, unableToUseMove, (u32, 1)) /* Use within a macro to get the maximum allowed value for a volatile. Requires _typeMaxValue as input. */ @@ -252,7 +319,7 @@ enum SemiInvulnerableState STATE_PHANTOM_FORCE, STATE_SKY_DROP, STATE_COMMANDER, - SEMI_INVULNERABLE_COUNT, + SEMI_INVULNERABLE_COUNT }; enum SemiInvulnerableExclusion @@ -273,13 +340,13 @@ enum SemiInvulnerableExclusion #define HITMARKER_UNUSED_16 (1 << 16) #define HITMARKER_DISABLE_ANIMATION (1 << 17) // disable animations during battle scripts, e.g. for Bug Bite #define HITMARKER_UNUSED_18 (1 << 18) -#define HITMARKER_UNABLE_TO_USE_MOVE (1 << 19) +#define HITMARKER_UNUSED_19 (1 << 19) #define HITMARKER_UNUSED_20 (1 << 20) #define HITMARKER_UNUSED_21 (1 << 21) #define HITMARKER_PLAYER_FAINTED (1 << 22) #define HITMARKER_UNUSED_23 (1 << 23) #define HITMARKER_UNUSED_24 (1 << 24) -#define HITMARKER_OBEYS (1 << 25) +#define HITMARKER_UNUSED_25 (1 << 25) #define HITMARKER_UNUSED_26 (1 << 26) #define HITMARKER_UNUSED_27 (1 << 27) #define HITMARKER_FAINTED(battler) (1u << (battler + 28)) // Also uses bits 29, 30 and 31 @@ -348,8 +415,8 @@ enum TypeSideHazard #define MOVE_RESULT_FOE_HUNG_ON (1 << 7) #define MOVE_RESULT_STURDIED (1 << 8) #define MOVE_RESULT_FOE_ENDURED_AFFECTION (1 << 9) -#define MOVE_RESULT_SYNCHRONOISE_AFFECTED (1 << 10) -#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED) +#define MOVE_RESULT_AVOIDED_ATTACK (MOVE_RESULT_MISSED | MOVE_RESULT_FAILED) +#define MOVE_RESULT_NO_EFFECT (MOVE_RESULT_MISSED | MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) enum BattleWeather { @@ -381,11 +448,11 @@ enum BattleWeather #define B_WEATHER_FOG (1 << BATTLE_WEATHER_FOG) #define B_WEATHER_STRONG_WINDS (1 << BATTLE_WEATHER_STRONG_WINDS) -#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_HAIL | B_WEATHER_STRONG_WINDS | B_WEATHER_SNOW | B_WEATHER_FOG) #define B_WEATHER_DAMAGING_ANY (B_WEATHER_HAIL | B_WEATHER_SANDSTORM) #define B_WEATHER_ICY_ANY (B_WEATHER_HAIL | B_WEATHER_SNOW) #define B_WEATHER_LOW_LIGHT (B_WEATHER_FOG | B_WEATHER_ICY_ANY | B_WEATHER_RAIN | B_WEATHER_SANDSTORM) #define B_WEATHER_PRIMAL_ANY (B_WEATHER_RAIN_PRIMAL | B_WEATHER_SUN_PRIMAL | B_WEATHER_STRONG_WINDS) +#define B_WEATHER_ANY (B_WEATHER_RAIN | B_WEATHER_SANDSTORM | B_WEATHER_SUN | B_WEATHER_ICY_ANY | B_WEATHER_STRONG_WINDS | B_WEATHER_FOG) // Explicit numbers until frostbite because those shouldn't be shifted enum __attribute__((packed)) MoveEffect @@ -423,6 +490,7 @@ enum __attribute__((packed)) MoveEffect MOVE_EFFECT_RAGE, MOVE_EFFECT_PREVENT_ESCAPE, MOVE_EFFECT_NIGHTMARE, + MOVE_EFFECT_GLAIVE_RUSH, MOVE_EFFECT_ALL_STATS_UP, MOVE_EFFECT_REMOVE_STATUS, MOVE_EFFECT_ATK_DEF_DOWN, @@ -523,6 +591,10 @@ enum __attribute__((packed)) MoveEffect MOVE_EFFECT_FIXED_POWER, // Max move effects end. They can be used for (custom) normal moves. + // Move effects that happen before the move hits. Set in SetPreAttackMoveEffect + MOVE_EFFECT_BREAK_SCREEN, + MOVE_EFFECT_STEAL_STATS, + NUM_MOVE_EFFECTS }; @@ -532,8 +604,6 @@ enum __attribute__((packed)) MoveEffect #define MOVE_EFFECT_FREEZE_OR_FROSTBITE MOVE_EFFECT_FREEZE #endif -#define MOVE_EFFECT_CONTINUE 0x8000 - // Battle environment defines for gBattleEnvironment. enum BattleEnvironments { @@ -547,7 +617,7 @@ enum BattleEnvironments BATTLE_ENVIRONMENT_CAVE, BATTLE_ENVIRONMENT_BUILDING, BATTLE_ENVIRONMENT_PLAIN, -// New battle environments are used for Secret Power but not fully implemented. + // New battle environments are used for Secret Power and Nature Power but not fully implemented. BATTLE_ENVIRONMENT_SOARING, BATTLE_ENVIRONMENT_SKY_PILLAR, BATTLE_ENVIRONMENT_BURIAL_GROUND, @@ -571,7 +641,7 @@ enum BattleEnvironments BATTLE_ENVIRONMENT_LANCE, BATTLE_ENVIRONMENT_CHAMPION, - BATTLE_ENVIRONMENT_COUNT + BATTLE_ENVIRONMENT_COUNT, }; #define B_WAIT_TIME_LONG (B_WAIT_TIME_MULTIPLIER * 4) @@ -637,19 +707,24 @@ enum BattleEnvironments // Indicator for the party summary bar to display an empty slot. #define HP_EMPTY_SLOT 0xFFFF -#define MOVE_TARGET_SELECTED 0 -#define MOVE_TARGET_DEPENDS (1 << 0) -#define MOVE_TARGET_OPPONENT (1 << 1) -#define MOVE_TARGET_RANDOM (1 << 2) -#define MOVE_TARGET_BOTH (1 << 3) -#define MOVE_TARGET_USER (1 << 4) -#define MOVE_TARGET_FOES_AND_ALLY (1 << 5) -#define MOVE_TARGET_OPPONENTS_FIELD (1 << 6) -#define MOVE_TARGET_ALLY (1 << 7) -#define MOVE_TARGET_ALL_BATTLERS ((1 << 8) | MOVE_TARGET_USER) // No functionality for status moves - -// For the second argument of GetBattleMoveTarget, when no target override is needed -#define NO_TARGET_OVERRIDE 0 +enum MoveTarget +{ + TARGET_NONE, + TARGET_SELECTED, + TARGET_SMART, // Like target select but can also smartly redirect to partner. Works only with strikeCount > 1 moves + TARGET_DEPENDS, + TARGET_OPPONENT, + TARGET_RANDOM, + TARGET_BOTH, + TARGET_USER, + TARGET_ALLY, + TARGET_USER_AND_ALLY, + TARGET_USER_OR_ALLY, // Acupressure + TARGET_FOES_AND_ALLY, + TARGET_FIELD, // Moves that target the field, e.g. Rain Dance + TARGET_OPPONENTS_FIELD, // Targets all other battlers and self, e.g. Teatime + TARGET_ALL_BATTLERS, +}; // Constants for Parental Bond #define PARENTAL_BOND_1ST_HIT 2 @@ -675,26 +750,62 @@ enum FaintedActions FAINTED_ACTIONS_MAX_CASE, }; -// Constants for B_VAR_STARTING_STATUS -// Timer value controlled by B_VAR_STARTING_STATUS_TIMER +// Enum, fieldName, Type, max value +#define STARTING_STATUS_DEFINITIONS(F) \ + F(STARTING_STATUS_ELECTRIC_TERRAIN, electricTerrain, (u32, 1)) /* Electric Terrain (Permanent) */ \ + F(STARTING_STATUS_ELECTRIC_TERRAIN_TEMPORARY, electricTerrainTemporary, (u32, 1)) /* Electric Terrain Temporary (5 turns) */ \ + F(STARTING_STATUS_MISTY_TERRAIN, mistyTerrain, (u32, 1)) /* Misty Terrain (Permanent) */ \ + F(STARTING_STATUS_MISTY_TERRAIN_TEMPORARY, mistyTerrainTemporary, (u32, 1)) /* Misty Terrain Temporary (5 turns) */ \ + F(STARTING_STATUS_GRASSY_TERRAIN, grassyTerrain, (u32, 1)) /* Grassy Terrain (Permanent) */ \ + F(STARTING_STATUS_GRASSY_TERRAIN_TEMPORARY, grassyTerrainTemporary, (u32, 1)) /* Grassy Terrain Temporary (5 turns) */ \ + F(STARTING_STATUS_PSYCHIC_TERRAIN, psychicTerrain, (u32, 1)) /* Psychic Terrain (Permanent) */ \ + F(STARTING_STATUS_PSYCHIC_TERRAIN_TEMPORARY, psychicTerrainTemporary, (u32, 1)) /* Psychic Terrain Temporary (5 turns) */ \ + F(STARTING_STATUS_TRICK_ROOM, trickRoom, (u32, 1)) /* Trick Room (Permanent) */ \ + F(STARTING_STATUS_TRICK_ROOM_TEMPORARY, trickRoomTemporary, (u32, 1)) /* Trick Room Temporary (5 turns) */ \ + F(STARTING_STATUS_MAGIC_ROOM, magicRoom, (u32, 1)) /* Magic Room (Permanent) */ \ + F(STARTING_STATUS_MAGIC_ROOM_TEMPORARY, magicRoomTemporary, (u32, 1)) /* Magic Room Temporary (5 turns) */ \ + F(STARTING_STATUS_WONDER_ROOM, wonderRoom, (u32, 1)) /* Wonder Room (Permanent) */ \ + F(STARTING_STATUS_WONDER_ROOM_TEMPORARY, wonderRoomTemporary, (u32, 1)) /* Wonder Room Temporary (5 turns) */ \ + F(STARTING_STATUS_TAILWIND_PLAYER, tailwindPlayer, (u32, 1)) /* Tailwind Player (Permanent) */ \ + F(STARTING_STATUS_TAILWIND_PLAYER_TEMPORARY, tailwindPlayerTemporary, (u32, 1)) /* Tailwind Player Temporary (4/3 turns) */ \ + F(STARTING_STATUS_TAILWIND_OPPONENT, tailwindOpponent, (u32, 1)) /* Tailwind Opponent (Permanent) */ \ + F(STARTING_STATUS_TAILWIND_OPPONENT_TEMPORARY, tailwindOpponentTemporary, (u32, 1)) /* Tailwind Opponent Temporary (4/3 turns) */ \ + F(STARTING_STATUS_RAINBOW_PLAYER, rainbowPlayer, (u32, 1)) /* Rainbow Player (Permanent) */ \ + F(STARTING_STATUS_RAINBOW_PLAYER_TEMPORARY, rainbowPlayerTemporary, (u32, 1)) /* Rainbow Player Temporary (4 turns) */ \ + F(STARTING_STATUS_RAINBOW_OPPONENT, rainbowOpponent, (u32, 1)) /* Rainbow Opponent (Permanent) */ \ + F(STARTING_STATUS_RAINBOW_OPPONENT_TEMPORARY, rainbowOpponentTemporary, (u32, 1)) /* Rainbow Opponent Temporary (4 turns) */ \ + F(STARTING_STATUS_SEA_OF_FIRE_PLAYER, seaOfFirePlayer, (u32, 1)) /* Sea Of Fire Player (Permanent) */ \ + F(STARTING_STATUS_SEA_OF_FIRE_PLAYER_TEMPORARY, seaOfFirePlayerTemporary, (u32, 1)) /* Sea Of Fire Player Temporary (4 turns) */ \ + F(STARTING_STATUS_SEA_OF_FIRE_OPPONENT, seaOfFireOpponent, (u32, 1)) /* Sea Of Fire Opponent (Permanent) */ \ + F(STARTING_STATUS_SEA_OF_FIRE_OPPONENT_TEMPORARY, seaOfFireOpponentTemporary, (u32, 1)) /* Sea Of Fire Opponent Temporary (4 turns) */ \ + F(STARTING_STATUS_SWAMP_PLAYER, swampPlayer, (u32, 1)) /* Swamp Player (Permanent) */ \ + F(STARTING_STATUS_SWAMP_PLAYER_TEMPORARY, swampPlayerTemporary, (u32, 1)) /* Swamp Player Temporary (4 turns) */ \ + F(STARTING_STATUS_SWAMP_OPPONENT, swampOpponent, (u32, 1)) /* Swamp Opponent (Permanent) */ \ + F(STARTING_STATUS_SWAMP_OPPONENT_TEMPORARY, swampOpponentTemporary, (u32, 1)) /* Swamp Opponent Temporary (4 turns) */ \ + /* Hazards */ \ + F(STARTING_STATUS_SPIKES_PLAYER_L1, spikesPlayerL1, (u32, 1)) /* Spikes Player Layer 1 */ \ + F(STARTING_STATUS_SPIKES_PLAYER_L2, spikesPlayerL2, (u32, 1)) /* Spikes Player Layer 2 */ \ + F(STARTING_STATUS_SPIKES_PLAYER_L3, spikesPlayerL3, (u32, 1)) /* Spikes Player Layer 3 */ \ + F(STARTING_STATUS_SPIKES_OPPONENT_L1, spikesOpponentL1, (u32, 1)) /* Spikes Opponent Layer 1 */ \ + F(STARTING_STATUS_SPIKES_OPPONENT_L2, spikesOpponentL2, (u32, 1)) /* Spikes Opponent Layer 2 */ \ + F(STARTING_STATUS_SPIKES_OPPONENT_L3, spikesOpponentL3, (u32, 1)) /* Spikes Opponent Layer 3 */ \ + F(STARTING_STATUS_TOXIC_SPIKES_PLAYER_L1, toxicSpikesPlayerL1, (u32, 1)) /* Toxic Spikes Player Layer 1 */ \ + F(STARTING_STATUS_TOXIC_SPIKES_PLAYER_L2, toxicSpikesPlayerL2, (u32, 1)) /* Toxic Spikes Player Layer 2 */ \ + F(STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L1, toxicSpikesOpponentL1, (u32, 1)) /* Toxic Spikes Opponent Layer 1 */ \ + F(STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L2, toxicSpikesOpponentL2, (u32, 1)) /* Toxic Spikes Opponent Layer 2 */ \ + F(STARTING_STATUS_STICKY_WEB_PLAYER, stickyWebPlayer, (u32, 1)) /* Sticky Web Player */ \ + F(STARTING_STATUS_STICKY_WEB_OPPONENT, stickyWebOpponent, (u32, 1)) /* Sticky Web Opponent */ \ + F(STARTING_STATUS_STEALTH_ROCK_PLAYER, stealthRockPlayer, (u32, 1)) /* Stealth Rock Player */ \ + F(STARTING_STATUS_STEALTH_ROCK_OPPONENT, stealthRockOpponent, (u32, 1)) /* Stealth Rock Opponent */ \ + F(STARTING_STATUS_SHARP_STEEL_PLAYER, sharpSteelPlayer, (u32, 1)) /* Sharp Steel Player */ \ + F(STARTING_STATUS_SHARP_STEEL_OPPONENT, sharpSteelOpponent, (u32, 1)) /* Sharp Steel Opponent */ \ + +#define UNPACK_STARTING_STATUS_ENUMS(_enum, ...) _enum, + +// Constants for SetStartingStatus enum StartingStatus { - STARTING_STATUS_NONE, - STARTING_STATUS_ELECTRIC_TERRAIN, - STARTING_STATUS_MISTY_TERRAIN, - STARTING_STATUS_GRASSY_TERRAIN, - STARTING_STATUS_PSYCHIC_TERRAIN, - STARTING_STATUS_TRICK_ROOM, - STARTING_STATUS_MAGIC_ROOM, - STARTING_STATUS_WONDER_ROOM, - STARTING_STATUS_TAILWIND_PLAYER, - STARTING_STATUS_TAILWIND_OPPONENT, - STARTING_STATUS_RAINBOW_PLAYER, - STARTING_STATUS_RAINBOW_OPPONENT, - STARTING_STATUS_SEA_OF_FIRE_PLAYER, - STARTING_STATUS_SEA_OF_FIRE_OPPONENT, - STARTING_STATUS_SWAMP_PLAYER, - STARTING_STATUS_SWAMP_OPPONENT, + STARTING_STATUS_DEFINITIONS(UNPACK_STARTING_STATUS_ENUMS) }; enum SlideMsgStates diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h index c6277bf9b..cc2d68cc8 100644 --- a/include/constants/battle_ai.h +++ b/include/constants/battle_ai.h @@ -38,10 +38,13 @@ #define AI_FLAG_ASSUME_STAB AI_FLAG(28) // AI knows player's STAB moves, but nothing else. Restricted version of AI_FLAG_OMNISCIENT. #define AI_FLAG_ASSUME_STATUS_MOVES AI_FLAG(29) // AI has a chance to know certain non-damaging moves, and also Fake Out and Super Fang. Restricted version of AI_FLAG_OMNISCIENT. #define AI_FLAG_ATTACKS_PARTNER AI_FLAG(30) // AI specific to double battles; AI can deliberately attack its 'partner.' +#define AI_FLAG_KNOW_OPPONENT_PARTY AI_FLAG(31) // AI knows all the species in the player's party, but not moves/items/abilities unless they've been seen. +#define AI_FLAG_RANDOMIZE_SWITCHIN AI_FLAG(32) // AI will randomly choose between eligible switchin candidates of a given category instead of picking the last one in the party. +#define AI_FLAG_RANDOMIZE_PARTY_INDICES AI_FLAG(33) // AI will randomize the order of the mons in its party, including the lead. Not an AI flag really, just a way to trigger TPP functionality // The following options are enough to have a basic/smart trainer. Any other addtion could make the trainer worse/better depending on the flag #define AI_FLAG_BASIC_TRAINER (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY) -#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION | AI_FLAG_SMART_TERA) +#define AI_FLAG_SMART_TRAINER (AI_FLAG_BASIC_TRAINER | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION | AI_FLAG_SMART_TERA | AI_FLAG_RANDOMIZE_SWITCHIN) #define AI_FLAG_PREDICTION (AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON | AI_FLAG_PREDICT_MOVE) #define AI_FLAG_ASSUMPTIONS (AI_FLAG_ASSUME_STAB | AI_FLAG_ASSUME_STATUS_MOVES | AI_FLAG_WEIGH_ABILITY_PREDICTION) diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index 4e38768ac..17d2487a5 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -591,10 +591,12 @@ #define B_ANIM_TERA_ACTIVATE 51 #define B_ANIM_SIMPLE_HEAL 52 #define B_ANIM_POWER_CONSTRUCT 53 +#define B_ANIM_SWAP_TO_SUBSTITUTE 54 +#define B_ANIM_SWAP_FROM_SUBSTITUTE 55 // pokefirered -#define B_ANIM_MON_SCARED 54 -#define B_ANIM_GHOST_GET_OUT 55 -#define B_ANIM_SILPH_SCOPED 56 +#define B_ANIM_MON_SCARED 56 +#define B_ANIM_GHOST_GET_OUT 57 +#define B_ANIM_SILPH_SCOPED 58 #define B_ANIM_ROCK_THROW (B_ANIM_SILPH_SCOPED + 1) #define B_ANIM_SAFARI_REACTION (B_ANIM_ROCK_THROW + 1) diff --git a/include/constants/battle_end_turn.h b/include/constants/battle_end_turn.h index 81c0409ec..5ff2d5cb3 100644 --- a/include/constants/battle_end_turn.h +++ b/include/constants/battle_end_turn.h @@ -52,6 +52,9 @@ enum EndTurnResolutionOrder ENDTURN_FORM_CHANGE_ABILITIES, ENDTURN_EJECT_PACK, ENDTURN_DYNAMAX, + ENDTURN_TRAINER_A_SLIDES, + ENDTURN_TRAINER_B_SLIDES, + ENDTURN_TRAINER_PARTNER_SLIDES, ENDTURN_COUNT, }; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index f2ba76a55..f7f345af2 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -7,8 +7,7 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_HIT, EFFECT_NON_VOLATILE_STATUS, EFFECT_ABSORB, - EFFECT_EXPLOSION, - EFFECT_MISTY_EXPLOSION, // Same as EFFECT_EXPLOSION but it's boosted on Misty Terrain + EFFECT_TERRAIN_BOOST, EFFECT_DREAM_EATER, // Same as EFFECT_ABSORB but it can only be used on sleeping targets EFFECT_MIRROR_MOVE, EFFECT_ATTACK_UP, @@ -29,7 +28,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_HAZE, EFFECT_BIDE, EFFECT_ROAR, - EFFECT_MULTI_HIT, EFFECT_CONVERSION, EFFECT_RESTORE_HP, EFFECT_LIGHT_SCREEN, @@ -62,7 +60,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_REFLECT, EFFECT_TWO_TURNS_ATTACK, EFFECT_SUBSTITUTE, - EFFECT_RAGE, EFFECT_MIMIC, EFFECT_METRONOME, EFFECT_LEECH_SEED, @@ -73,7 +70,7 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_DISABLE, EFFECT_LEVEL_DAMAGE, EFFECT_PSYWAVE, - EFFECT_COUNTER, + EFFECT_REFLECT_DAMAGE, EFFECT_ENCORE, EFFECT_PAIN_SPLIT, EFFECT_SNORE, @@ -92,11 +89,11 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_MINIMIZE, EFFECT_CURSE, EFFECT_HEALING_WISH, + EFFECT_LUNAR_DANCE, // Same as EFFECT_HEALING_WISH, but also heals PP. EFFECT_PROTECT, EFFECT_SPIKES, EFFECT_FORESIGHT, EFFECT_PERISH_SONG, - EFFECT_SANDSTORM, EFFECT_ENDURE, EFFECT_ROLLOUT, EFFECT_SWAGGER, @@ -114,12 +111,10 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_SYNTHESIS, EFFECT_MOONLIGHT, EFFECT_HIDDEN_POWER, - EFFECT_RAIN_DANCE, - EFFECT_SUNNY_DAY, + EFFECT_WEATHER, EFFECT_FELL_STINGER, EFFECT_BELLY_DRUM, EFFECT_PSYCH_UP, - EFFECT_MIRROR_COAT, EFFECT_EARTHQUAKE, EFFECT_FUTURE_SIGHT, EFFECT_SOLAR_BEAM, @@ -134,7 +129,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_SPIT_UP, EFFECT_SWALLOW, EFFECT_OVERWRITE_ABILITY, - EFFECT_HAIL, EFFECT_TORMENT, EFFECT_FLATTER, EFFECT_MEMENTO, @@ -154,7 +148,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_MAGIC_COAT, EFFECT_RECYCLE, EFFECT_REVENGE, - EFFECT_BRICK_BREAK, EFFECT_YAWN, EFFECT_KNOCK_OFF, EFFECT_STEAL_ITEM, @@ -215,7 +208,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_POWER_SPLIT, EFFECT_GUARD_SPLIT, EFFECT_STICKY_WEB, - EFFECT_METAL_BURST, EFFECT_LUCKY_CHANT, EFFECT_SUCKER_PUNCH, EFFECT_ENTRAINMENT, @@ -303,8 +295,6 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_CLANGOROUS_SOUL, EFFECT_BOLT_BEAK, EFFECT_SKY_DROP, - EFFECT_EXPANDING_FORCE, - EFFECT_RISING_VOLTAGE, EFFECT_BEAK_BLAST, EFFECT_COURT_CHANGE, EFFECT_MAX_HP_50_RECOIL, @@ -313,19 +303,15 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_DARK_VOID, EFFECT_VICTORY_DANCE, EFFECT_TEATIME, - EFFECT_ATTACK_UP_USER_ALLY, EFFECT_SHELL_TRAP, - EFFECT_PSYBLADE, EFFECT_HYDRO_STEAM, EFFECT_REVIVAL_BLESSING, - EFFECT_SNOWSCAPE, EFFECT_TAKE_HEART, EFFECT_COLLISION_COURSE, EFFECT_CORROSIVE_GAS, EFFECT_POPULATION_BOMB, - EFFECT_CHILLY_RECEPTION, + EFFECT_WEATHER_AND_SWITCH, EFFECT_MAX_MOVE, - EFFECT_GLAIVE_RUSH, EFFECT_RAGING_BULL, EFFECT_RAGE_FIST, EFFECT_DOODLE, @@ -340,11 +326,8 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_SPICY_EXTRACT, EFFECT_TERA_BLAST, EFFECT_TERA_STARSTORM, - EFFECT_DRAGON_DARTS, EFFECT_SHELL_SIDE_ARM, - EFFECT_ORDER_UP, EFFECT_RAPID_SPIN, - EFFECT_SPECTRAL_THIEF, EFFECT_RECOIL, EFFECT_SMACK_DOWN, EFFECT_LIFE_DEW, @@ -352,6 +335,7 @@ enum __attribute__((packed)) BattleMoveEffects EFFECT_STEEL_ROLLER, // Will fail if there is no terrain up but removes it regardless if attacker is removed from field or not EFFECT_STONE_AXE, // Not to be confused with MOVE_EFFECT_STEALTH_ROCK. They have two different activation timings. EFFECT_CEASELESS_EDGE, // Same applies to spikes + EFFECT_SPECIES_POWER_OVERRIDE, // Uses argument field to for the species, power and (number of hits, used only for multi hit moves) NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/include/constants/battle_move_resolution.h b/include/constants/battle_move_resolution.h new file mode 100644 index 000000000..6645ff1af --- /dev/null +++ b/include/constants/battle_move_resolution.h @@ -0,0 +1,67 @@ +#ifndef GUARD_CONSTANTS_BATTLE_MOVE_RESOLUTION_H +#define GUARD_CONSTANTS_BATTLE_MOVE_RESOLUTION_H + +enum MoveEndResult +{ + MOVEEND_STEP_CONTINUE, + MOVEEND_STEP_RUN_SCRIPT, + MOVEEND_STEP_BREAK, +}; + +// cases for Cmd_moveend - Order matters! +enum MoveEndState +{ + MOVEEND_SET_VALUES, + MOVEEND_PROTECT_LIKE_EFFECT, + MOVEEND_ABSORB, + MOVEEND_RAGE, + MOVEEND_SYNCHRONIZE_TARGET, + MOVEEND_ABILITIES, + MOVEEND_ABILITIES_ATTACKER, + MOVEEND_STATUS_IMMUNITY_ABILITIES, // TODO: Do berries come before???? + MOVEEND_SYNCHRONIZE_ATTACKER, + MOVEEND_ATTACKER_INVISIBLE, + MOVEEND_ATTACKER_VISIBLE, + MOVEEND_TARGET_VISIBLE, + MOVEEND_ITEM_EFFECTS_TARGET, + MOVEEND_ITEM_EFFECTS_ATTACKER_1, + MOVEEND_SYMBIOSIS, + MOVEEND_SUBSTITUTE, + MOVEEND_FAINT_BLOCK, + MOVEEND_SKY_DROP_CONFUSE, + MOVEEND_UPDATE_LAST_MOVES, + MOVEEND_MIRROR_MOVE, + MOVEEND_DEFROST, + MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a spread move + MOVEEND_HP_THRESHOLD_ITEMS_TARGET, // Activation only during a multi hit move / ability (Parental Bond) + MOVEEND_MULTIHIT_MOVE, + MOVEEND_MOVE_BLOCK, + MOVEEND_ITEM_EFFECTS_ATTACKER_2, + MOVEEND_ABILITY_EFFECT_FOES_FAINTED, // Moxie-like abilities / Battle Bond / Magician + MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip to Hit Escape + One + MOVEEND_SHELL_TRAP, + MOVEEND_COLOR_CHANGE, // Color Change / Berserk / Anger Shell + MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET, + MOVEEND_CARD_BUTTON, // Red Card / Eject Button + MOVEEND_LIFE_ORB_SHELL_BELL, + MOVEEND_FORM_CHANGE, + MOVEEND_EMERGENCY_EXIT, + MOVEEND_EJECT_PACK, + MOVEEND_HIT_ESCAPE, + MOVEEND_ITEMS_EFFECTS_ALL, + MOVEEND_WHITE_HERB, + MOVEEND_OPPORTUNIST, + MOVEEND_MIRROR_HERB, + MOVEEND_PICKPOCKET, + MOVEEND_THIRD_MOVE_BLOCK, + MOVEEND_CHANGED_ITEMS, + MOVEEND_CLEAR_BITS, + MOVEEND_DANCER, + MOVEEND_PURSUIT_NEXT_ACTION, + MOVEEND_COUNT, + + // This guarantees a correct jump if new moveends are added directly after MOVEEND_HIT_ESCAPE + MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE = (MOVEEND_HIT_ESCAPE + 1), +}; + +#endif // GUARD_CONSTANTS_BATTLE_MOVE_RESOLUTION_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 167649c4d..b8aab46b3 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -1,6 +1,266 @@ #ifndef GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H #define GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H +enum BattleScriptOpcode +{ + B_SCR_OP_ATTACKCANCELER, + B_SCR_OP_ACCURACYCHECK, + B_SCR_OP_PRINTATTACKSTRING, + B_SCR_OP_PRINTSELECTIONSTRINGFROMTABLE, + B_SCR_OP_CRITCALC, + B_SCR_OP_DAMAGECALC, + B_SCR_OP_TYPECALC, + B_SCR_OP_ADJUSTDAMAGE, + B_SCR_OP_MULTIHITRESULTMESSAGE, + B_SCR_OP_ATTACKANIMATION, + B_SCR_OP_WAITANIMATION, + B_SCR_OP_HEALTHBARUPDATE, + B_SCR_OP_DATAHPUPDATE, + B_SCR_OP_CRITMESSAGE, + B_SCR_OP_EFFECTIVENESSSOUND, + B_SCR_OP_RESULTMESSAGE, + B_SCR_OP_PRINTSTRING, + B_SCR_OP_PRINTSELECTIONSTRING, + B_SCR_OP_WAITMESSAGE, + B_SCR_OP_PRINTFROMTABLE, + B_SCR_OP_SETPREATTACKADDITIONALEFFECT, + B_SCR_OP_SETADDITIONALEFFECTS, + B_SCR_OP_SETEFFECTPRIMARY, + B_SCR_OP_SETEFFECTSECONDARY, + B_SCR_OP_CLEARVOLATILE, + B_SCR_OP_TRYFAINTMON, + B_SCR_OP_DOFAINTANIMATION, + B_SCR_OP_CLEAREFFECTSONFAINT, + B_SCR_OP_JUMPIFSTATUS, + B_SCR_OP_JUMPIFVOLATILE, + B_SCR_OP_JUMPIFABILITY, + B_SCR_OP_JUMPIFSIDEAFFECTING, + B_SCR_OP_JUMPIFSTAT, + B_SCR_OP_JUMPIFSTATIGNORECONTRARY, + B_SCR_OP_JUMPBASEDONTYPE, + B_SCR_OP_GETEXP, + B_SCR_OP_CHECKTEAMSLOST, + B_SCR_OP_MOVEVALUESCLEANUP, + B_SCR_OP_SETMULTIHIT, + B_SCR_OP_DECREMENTMULTIHIT, + B_SCR_OP_GOTO, + B_SCR_OP_JUMPIFBYTE, + B_SCR_OP_JUMPIFHALFWORD, + B_SCR_OP_JUMPIFWORD, + B_SCR_OP_JUMPIFARRAYEQUAL, + B_SCR_OP_JUMPIFARRAYNOTEQUAL, + B_SCR_OP_SETBYTE, + B_SCR_OP_ADDBYTE, + B_SCR_OP_SUBBYTE, + B_SCR_OP_COPYARRAY, + B_SCR_OP_COPYARRAYWITHINDEX, + B_SCR_OP_ORBYTE, + B_SCR_OP_ORHALFWORD, + B_SCR_OP_ORWORD, + B_SCR_OP_BICBYTE, + B_SCR_OP_BICHALFWORD, + B_SCR_OP_BICWORD, + B_SCR_OP_PAUSE, + B_SCR_OP_WAITSTATE, + B_SCR_OP_ISDMGBLOCKEDBYDISGUISE, + B_SCR_OP_RETURN, + B_SCR_OP_END, + B_SCR_OP_END2, + B_SCR_OP_END3, + B_SCR_OP_SETCHARGINGTURN, + B_SCR_OP_CALL, + B_SCR_OP_SETROOST, + B_SCR_OP_JUMPIFABILITYPRESENT, + B_SCR_OP_ENDSELECTIONSCRIPT, + B_SCR_OP_PLAYANIMATION, + B_SCR_OP_PLAYANIMATION_VAR, + B_SCR_OP_JUMPFIFSEMIINVULNERABLE, + B_SCR_OP_TRAINERSLIDEIN, + B_SCR_OP_MOVEEND, + B_SCR_OP_SETHEALBLOCK, + B_SCR_OP_RETURNATKTOBALL, + B_SCR_OP_GETSWITCHEDMONDATA, + B_SCR_OP_SWITCHINDATAUPDATE, + B_SCR_OP_SWITCHINANIM, + B_SCR_OP_JUMPIFCANTSWITCH, + B_SCR_OP_OPENPARTYSCREEN, + B_SCR_OP_SWITCHHANDLEORDER, + B_SCR_OP_SWITCHINEFFECTS, + B_SCR_OP_SWITCHINEVENTS, + B_SCR_OP_PLAYSE, + B_SCR_OP_FANFARE, + B_SCR_OP_PLAYFAINTCRY, + B_SCR_OP_ENDLINKBATTLE, + B_SCR_OP_RETURNTOBALL, + B_SCR_OP_HANDLELEARNNEWMOVE, + B_SCR_OP_YESNOBOXLEARNMOVE, + B_SCR_OP_YESNOBOXSTOPLEARNINGMOVE, + B_SCR_OP_HITANIMATION, + B_SCR_OP_GETMONEYREWARD, + B_SCR_OP_UPDATEBATTLERMOVES, + B_SCR_OP_SWAPATTACKERWITHTARGET, + B_SCR_OP_INCREMENTGAMESTAT, + B_SCR_OP_DRAWPARTYSTATUSSUMMARY, + B_SCR_OP_HIDEPARTYSTATUSSUMMARY, + B_SCR_OP_JUMPTOCALLEDMOVE, + B_SCR_OP_STATUSANIMATION, + B_SCR_OP_FUTURESIGHTTARGETFAILURE, + B_SCR_OP_GETPOSSIBLENEXTTARGET, + B_SCR_OP_YESNOBOX, + B_SCR_OP_CANCELALLACTIONS, + B_SCR_OP_SETGRAVITY, + B_SCR_OP_REMOVEITEM, + B_SCR_OP_ATKNAMEINBUFF1, + B_SCR_OP_DRAWLVLUPBOX, + B_SCR_OP_RESETSENTMONSVALUE, + B_SCR_OP_SETATKTOPLAYER0, + B_SCR_OP_MAKEVISIBLE, + B_SCR_OP_RECORDABILITY, + B_SCR_OP_BUFFERMOVETOLEARN, + B_SCR_OP_JUMPIFPLAYERRAN, + B_SCR_OP_HPTHRESHOLDS, + B_SCR_OP_HPTHRESHOLDS2, + B_SCR_OP_USEITEMONOPPONENT, + B_SCR_OP_UNUSED_0X78, + B_SCR_OP_SETPROTECTLIKE, + B_SCR_OP_TRYEXPLOSION, + B_SCR_OP_SETATKHPTOZERO, + B_SCR_OP_JUMPIFNEXTTARGETVALID, + B_SCR_OP_TRYHEALHALFHEALTH, + B_SCR_OP_UNUSED_0X7E, + B_SCR_OP_SETFIELDWEATHER, + B_SCR_OP_SETREFLECT, + B_SCR_OP_SETSEEDED, + B_SCR_OP_MANIPULATEDAMAGE, + B_SCR_OP_TRYSETREST, + B_SCR_OP_UNUSED_0X82, + B_SCR_OP_UNUSED_0X83, + B_SCR_OP_JUMPIFUPROARWAKES, + B_SCR_OP_STOCKPILE, + B_SCR_OP_STOCKPILETOBASEDAMAGE, + B_SCR_OP_STOCKPILETOHPHEAL, + B_SCR_OP_UNUSED_0X88, + B_SCR_OP_STATBUFFCHANGE, + B_SCR_OP_NORMALISEBUFFS, + B_SCR_OP_SETBIDE, + B_SCR_OP_TWOTURNMOVESCHARGESTRINGANDANIMATION, + B_SCR_OP_TRYNONVOLATILESTATUS, + B_SCR_OP_INITMULTIHITSTRING, + B_SCR_OP_FORCERANDOMSWITCH, + B_SCR_OP_TRYCONVERSIONTYPECHANGE, + B_SCR_OP_GIVEPAYDAYMONEY, + B_SCR_OP_SETLIGHTSCREEN, + B_SCR_OP_TRYKO, + B_SCR_OP_CHECKNONVOLATILETRIGGER, + B_SCR_OP_COPYBIDEDMG, + B_SCR_OP_ANIMATEWILDPOKEMONAFTERFAILEDPOKEBALL, + B_SCR_OP_TRYINFATUATING, + B_SCR_OP_UPDATESTATUSICON, + B_SCR_OP_SETMIST, + B_SCR_OP_SETFOCUSENERGY, + B_SCR_OP_TRANSFORMDATAEXECUTION, + B_SCR_OP_SETSUBSTITUTE, + B_SCR_OP_MIMICATTACKCOPY, + B_SCR_OP_SETCALLEDMOVE, + B_SCR_OP_UNUSED_0X9F, + B_SCR_OP_UNUSED_0XA0, + B_SCR_OP_UNUSED_0XA1, + B_SCR_OP_UNUSED_0XA2, + B_SCR_OP_DISABLELASTUSEDATTACK, + B_SCR_OP_TRYSETENCORE, + B_SCR_OP_PAINSPLITDMGCALC, + B_SCR_OP_SETTYPETORANDOMRESISTANCE, + B_SCR_OP_SETALWAYSHITFLAG, + B_SCR_OP_COPYMOVEPERMANENTLY, + B_SCR_OP_UNUSED_0XA9, + B_SCR_OP_UNUSED_AA, + B_SCR_OP_UNUSED_0XAB, + B_SCR_OP_SETTAILWIND, + B_SCR_OP_TRYSPITEPPREDUCE, + B_SCR_OP_HEALPARTYSTATUS, + B_SCR_OP_CURSETARGET, + B_SCR_OP_TRYSETSPIKES, + B_SCR_OP_SETVOLATILE, + B_SCR_OP_TRYSETPERISHSONG, + B_SCR_OP_UNUSED_0XB3, + B_SCR_OP_JUMPIFCONFUSEDANDSTATMAXED, + B_SCR_OP_UNUSED_0XB5, + B_SCR_OP_SETEMBARGO, + B_SCR_OP_PRESENTDAMAGECALCULATION, + B_SCR_OP_SETSAFEGUARD, + B_SCR_OP_MAGNITUDEDAMAGECALCULATION, + B_SCR_OP_JUMPIFNOPURSUITSWITCHDMG, + B_SCR_OP_TRYACTIVATEITEM, + B_SCR_OP_HALVEHP, + B_SCR_OP_COPYFOESTATS, + B_SCR_OP_RAPIDSPINFREE, + B_SCR_OP_UNUSED_0XBF, + B_SCR_OP_RECOVERBASEDONSUNLIGHT, + B_SCR_OP_SETSTICKYWEB, + B_SCR_OP_SELECTFIRSTVALIDTARGET, + B_SCR_OP_SETFUTUREATTACK, + B_SCR_OP_TRYDOBEATUP, + B_SCR_OP_SETSEMIINVULNERABLEBIT, + B_SCR_OP_UNUSED_0XC6, + B_SCR_OP_UNUSED_0XC7, + B_SCR_OP_UNUSED_C8, + B_SCR_OP_TRYMEMENTO, + B_SCR_OP_SETFORCEDTARGET, + B_SCR_OP_UNUSED_0XCB, + B_SCR_OP_UNUSED_0XCC, + B_SCR_OP_CURESTATUSWITHMOVE, + B_SCR_OP_SETTORMENT, + B_SCR_OP_UNUSED_0XCF, + B_SCR_OP_SETTAUNT, + B_SCR_OP_TRYSETHELPINGHAND, + B_SCR_OP_TRYSWAPITEMS, + B_SCR_OP_TRYCOPYABILITY, + B_SCR_OP_TRYWISH, + B_SCR_OP_SETTOXICSPIKES, + B_SCR_OP_SETGASTROACID, + B_SCR_OP_SETYAWN, + B_SCR_OP_UNUSED0XD8, + B_SCR_OP_SETROOM, + B_SCR_OP_TRYSWAPABILITIES, + B_SCR_OP_TRYIMPRISON, + B_SCR_OP_SETSTEALTHROCK, + B_SCR_OP_TRYSETVOLATILE, + B_SCR_OP_UNUSED_0XDE, + B_SCR_OP_TRYSETMAGICCOAT, + B_SCR_OP_TRYSETSNATCH, + B_SCR_OP_UNUSED2, + B_SCR_OP_SWITCHOUTABILITIES, + B_SCR_OP_JUMPIFHASNOHP, + B_SCR_OP_UNUSED_0XE4, + B_SCR_OP_PICKUP, + B_SCR_OP_UNUSED_0XE6, + B_SCR_OP_UNUSED_0XE7, + B_SCR_OP_SETTYPEBASEDHALVERS, + B_SCR_OP_JUMPIFSUBSTITUTEBLOCKS, + B_SCR_OP_TRYRECYCLEITEM, + B_SCR_OP_SETTYPETOENVIRONMENT, + B_SCR_OP_PURSUITDOUBLES, + B_SCR_OP_SNATCHSETBATTLERS, + B_SCR_OP_UNUSED_0XEE, + B_SCR_OP_HANDLEBALLTHROW, + B_SCR_OP_GIVECAUGHTMON, + B_SCR_OP_TRYSETCAUGHTMONDEXFLAGS, + B_SCR_OP_DISPLAYDEXINFO, + B_SCR_OP_TRYGIVECAUGHTMONNICK, + B_SCR_OP_SORTBATTLERS, + B_SCR_OP_REMOVEATTACKERSTATUS1, + B_SCR_OP_FINISHACTION, + B_SCR_OP_FINISHTURN, + B_SCR_OP_TRAINERSLIDEOUT, + B_SCR_OP_SETTELEKINESIS, + B_SCR_OP_SWAPSTATSTAGES, + B_SCR_OP_AVERAGESTATS, + B_SCR_OP_JUMPIFCAPTIVATEAFFECTED, + B_SCR_OP_SETNONVOLATILESTATUS, + B_SCR_OP_TRYOVERWRITEABILITY, + B_SCR_OP_CALLNATIVE, +}; + // The following correspond to the struct members of BattleScripting by adding their offset #define sUNUSED_0x00 (gBattleScripting + 0x00) // unused_0x00 #define sUNUSED_0x04 (gBattleScripting + 0x04) // unused_0x04 @@ -31,7 +291,7 @@ #define sSPECIAL_TRAINER_BATTLE_TYPE (gBattleScripting + 0x26) // specialTrainerBattleType #define sMON_CAUGHT (gBattleScripting + 0x27) // monCaught #define sSAVED_DMG (gBattleScripting + 0x28) // savedDmg -#define sSAVED_MOVE_EFFECT (gBattleScripting + 0x2C) // savedMoveEffect +#define sUNUSED_0x2C (gBattleScripting + 0x2C) // unused_0x2c #define sMOVE_EFFECT (gBattleScripting + 0x2E) // moveEffect #define sUNUSED_0x30 (gBattleScripting + 0x30) // unused_0x30 #define sILLUSION_NICK_HACK (gBattleScripting + 0x32) // illusionNickHack @@ -76,10 +336,6 @@ #define BS_ABILITY_BATTLER 15 #define BS_ATTACKER_PARTNER 16 -// Cmd_accuracycheck -#define NO_ACC_CALC_CHECK_LOCK_ON 0xFFFF -#define ACC_CURR_MOVE 0 - // compare operands #define CMP_EQUAL 0 #define CMP_NOT_EQUAL 1 @@ -88,18 +344,10 @@ #define CMP_COMMON_BITS 4 #define CMP_NO_COMMON_BITS 5 -// Veriouses have been deprecated but the enum and function will be supported for one more release cycle -enum CmdVarious -{ - VARIOUS_NONE, -}; - // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 1 -#define DMG_DOUBLED 2 -#define DMG_1_8_TARGET_HP 3 -#define DMG_FULL_ATTACKER_HP 4 -#define DMG_BIG_ROOT 5 +#define DMG_1_8_TARGET_HP 2 +#define DMG_BIG_ROOT 3 // Cmd_jumpifcantswitch #define SWITCH_IGNORE_ESCAPE_PREVENTION (1 << 7) @@ -127,73 +375,31 @@ enum CmdVarious enum SetMoveEffectFlags { - NO_FLAGS = 0, - EFFECT_PRIMARY = (1 << 0), - EFFECT_CERTAIN = (1 << 1), + NO_FLAGS = 0, + EFFECT_PRIMARY = (1 << 0), + EFFECT_CERTAIN = (1 << 1), }; -// cases for Cmd_moveend - Order matters! -enum MoveEndEffects +enum FaintBlockStates { - MOVEEND_SET_VALUES, - MOVEEND_PROTECT_LIKE_EFFECT, - MOVEEND_GRUDGE, - MOVEEND_DESTINY_BOND, - MOVEEND_ABSORB, - MOVEEND_RAGE, - MOVEEND_SYNCHRONIZE_TARGET, - MOVEEND_ABILITIES, - MOVEEND_ABILITIES_ATTACKER, - MOVEEND_STATUS_IMMUNITY_ABILITIES, // TODO: Do berries come before???? - MOVEEND_SYNCHRONIZE_ATTACKER, - MOVEEND_ATTACKER_INVISIBLE, - MOVEEND_ATTACKER_VISIBLE, - MOVEEND_TARGET_VISIBLE, - MOVEEND_ITEM_EFFECTS_TARGET, - MOVEEND_ITEM_EFFECTS_ATTACKER_1, - MOVEEND_SYMBIOSIS, - MOVEEND_SUBSTITUTE, - MOVEEND_SKY_DROP_CONFUSE, - MOVEEND_UPDATE_LAST_MOVES, - MOVEEND_MIRROR_MOVE, - MOVEEND_DEFROST, - MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a spread move - MOVEEND_HP_THRESHHOLD_ITEMS_TARGET, // Activation only during a multi hit move / ability (Parental Bond) - MOVEEND_MULTIHIT_MOVE, - MOVEEND_MOVE_BLOCK, - MOVEEND_ITEM_EFFECTS_ATTACKER_2, - MOVEEND_ABILITY_BLOCK, - MOVEEND_SHEER_FORCE, // If move is Sheer Force affected, skip to Hit Escape + One - MOVEEND_COLOR_CHANGE, // Color Change / Berserk / Anger Shell - MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET, - MOVEEND_RED_CARD, - MOVEEND_EJECT_BUTTON, - MOVEEND_LIFE_ORB_SHELL_BELL, - MOVEEND_FORM_CHANGE, - MOVEEND_EMERGENCY_EXIT, - MOVEEND_EJECT_PACK, - MOVEEND_HIT_ESCAPE, - MOVEEND_ITEMS_EFFECTS_ALL, - MOVEEND_WHITE_HERB, - MOVEEND_OPPORTUNIST, - MOVEEND_MIRROR_HERB, - MOVEEND_PICKPOCKET, - MOVEEND_THIRD_MOVE_BLOCK, - MOVEEND_CHANGED_ITEMS, - MOVEEND_SAME_MOVE_TURNS, - MOVEEND_CLEAR_BITS, - MOVEEND_DANCER, - MOVEEND_PURSUIT_NEXT_ACTION, - MOVEEND_COUNT, - - // This guarantees a correct jump if new moveends are added directly after MOVEEND_HIT_ESCAPE - MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE = (MOVEEND_HIT_ESCAPE + 1), + FAINT_BLOCK_FINAL_GAMBIT, + FAINT_BLOCK_CHECK_TARGET_FAINTED, // Exits if target is not fainted + FAINT_BLOCK_END_NEUTRALIZING_GAS, + // Destiny Bond and Grudge are tested first, but Faint Target's script plays first + FAINT_BLOCK_TRY_DESTINY_BOND, + FAINT_BLOCK_TRY_GRUDGE, + FAINT_BLOCK_FAINT_TARGET, + FAINT_BLOCK_DO_DESTINY_BOND, + FAINT_BLOCK_DO_GRUDGE, + FAINT_BLOCK_COUNT, }; -// switch cases -#define B_SWITCH_NORMAL 0 -#define B_SWITCH_HIT 1 // dragon tail, circle throw -#define B_SWITCH_RED_CARD 2 +enum SwitchInCases +{ + B_SWITCH_NORMAL, + B_SWITCH_HIT, // dragon tail, circle throw + B_SWITCH_RED_CARD, +}; enum StatusTrigger { diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 2d84b8bf6..5234c2783 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -28,6 +28,7 @@ enum StringID STRINGID_STATSWONTINCREASE2, STRINGID_AVOIDEDDAMAGE, STRINGID_ITDOESNTAFFECT, + STRINGID_SCR_ITDOESNTAFFECT, STRINGID_BATTLERFAINTED, STRINGID_PLAYERGOTMONEY, STRINGID_PLAYERWHITEOUT, @@ -209,6 +210,7 @@ enum StringID STRINGID_DEFENDERSSTATROSE, STRINGID_ATTACKERSSTATFELL, STRINGID_DEFENDERSSTATFELL, + STRINGID_SCRIPTINGSTATROSE, STRINGID_CRITICALHIT, STRINGID_ONEHITKO, STRINGID_123POOF, @@ -336,7 +338,6 @@ enum StringID STRINGID_PKMNSXPREVENTSFLINCHING, STRINGID_PKMNALREADYHASBURN, STRINGID_STATSWONTDECREASE2, - STRINGID_PKMNSXBLOCKSY2, STRINGID_PKMNSXWOREOFF, STRINGID_THEWALLSHATTERED, STRINGID_PKMNSXCUREDITSYPROBLEM, @@ -718,7 +719,7 @@ enum StringID STRINGID_SILPHSCOPEUNVEILED, STRINGID_GHOSTWASMAROWAK, STRINGID_TRAINER1MON1COMEBACK, - + // pokefirered specific STRINGID_OLDMANUSEDITEM, STRINGID_GOTCHAPKMNCAUGHTOLDMAN, @@ -792,6 +793,19 @@ enum MoveWeatherChangeStringID B_MSG_STARTED_FOG, }; +// gAbilityWeatherChangeStringId +enum AbilityWeatherChangeStringID +{ + B_MSG_STARTED_DRIZZLE, + B_MSG_STARTED_SAND_STREAM, + B_MSG_STARTED_DROUGHT, + B_MSG_STARTED_HAIL_WARNING, + B_MSG_STARTED_SNOW_WARNING, + B_MSG_STARTED_DESOLATE_LAND, + B_MSG_STARTED_PRIMORDIAL_SEA, + B_MSG_STARTED_STRONG_WINDS, +}; + // gWeatherEndsStringIds enum WeatherEndStringID { @@ -1129,6 +1143,11 @@ enum StartingStatusStringID B_MSG_SET_RAINBOW, B_MSG_SET_SEA_OF_FIRE, B_MSG_SET_SWAMP, + B_MSG_SET_SPIKES, + B_MSG_SET_POISON_SPIKES, + B_MSG_SET_STICKY_WEB, + B_MSG_SET_STEALTH_ROCK, + B_MSG_SET_SHARP_STEEL, B_MSG_STARTING_STATUS_COUNT, }; diff --git a/include/constants/battle_switch_in.h b/include/constants/battle_switch_in.h new file mode 100644 index 000000000..3a3084472 --- /dev/null +++ b/include/constants/battle_switch_in.h @@ -0,0 +1,37 @@ +#ifndef GUARD_CONSTANTS_BATTLE_SWITCH_IN_H +#define GUARD_CONSTANTS_BATTLE_SWITCH_IN_H + +enum SwitchInEvents +{ + SWITCH_IN_EVENTS_ORDER_BY_SPEED, + SWITCH_IN_EVENTS_TERA_SHIFT, + SWITCH_IN_EVENTS_NEUTRALIZING_GAS, + SWITCH_IN_EVENTS_UNNERVE, + SWITCH_IN_EVENTS_FIRST_BLOCK, + SWITCH_IN_EVENTS_SECOND_BLOCK, + SWITCH_IN_EVENTS_WHITE_HERB, + SWITCH_IN_EVENTS_OPPORTUNIST, + SWITCH_IN_EVENTS_MIRROR_HERB, + SWITCH_IN_EVENTS_CLEAR_SET_VALUES, + SWITCH_IN_EVENTS_EJECT_PACK, + SWITCH_IN_EVENTS_COUNT, +}; + +enum SwitchInFirstEventBlock +{ + FIRST_EVENT_BLOCK_HEALING_WISH, + FIRST_EVENT_BLOCK_HAZARDS, + FIRST_EVENT_BLOCK_GENERAL_ABILITIES, + FIRST_EVENT_BLOCK_IMMUNITY_ABILITIES, + FIRST_EVENT_BLOCK_ITEMS, + FIRST_EVENT_BLOCK_COUNT, +}; + +enum SwitchInSecondEventBlock +{ + SECOND_EVENT_ABILITIES, + SECOND_EVENT_BOOSTER_ENERGY, + SECOND_EVENT_BLOCK_COUNT, +}; + +#endif // GUARD_CONSTANTS_BATTLE_SWITCH_IN_H diff --git a/include/constants/contest.h b/include/constants/contest.h index c9e11cd99..70531f540 100644 --- a/include/constants/contest.h +++ b/include/constants/contest.h @@ -103,29 +103,29 @@ #define CONTEST_EFFECT_REPETITION_NOT_BORING 3 #define CONTEST_EFFECT_AVOID_STARTLE_ONCE 4 #define CONTEST_EFFECT_AVOID_STARTLE 5 -#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6 -#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7 -#define CONTEST_EFFECT_STARTLE_FRONT_MON 8 -#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9 +#define CONTEST_EFFECT_AVOID_STARTLE_SLIGHTLY 6 // Unused +#define CONTEST_EFFECT_USER_LESS_EASILY_STARTLED 7 // Unused +#define CONTEST_EFFECT_STARTLE_FRONT_MON 8 // Unused +#define CONTEST_EFFECT_SLIGHTLY_STARTLE_PREV_MONS 9 // Unused #define CONTEST_EFFECT_STARTLE_PREV_MON 10 #define CONTEST_EFFECT_STARTLE_PREV_MONS 11 #define CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON 12 #define CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS 13 -#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14 -#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15 +#define CONTEST_EFFECT_STARTLE_PREV_MON_2 14 // Unused +#define CONTEST_EFFECT_STARTLE_PREV_MONS_2 15 // Unused #define CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION 16 #define CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION 17 #define CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN 18 #define CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL 19 -#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20 -#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21 -#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22 -#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23 -#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24 -#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25 +#define CONTEST_EFFECT_STARTLE_MONS_COOL_APPEAL 20 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_BEAUTY_APPEAL 21 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_CUTE_APPEAL 22 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_SMART_APPEAL 23 // Unused +#define CONTEST_EFFECT_STARTLE_MONS_TOUGH_APPEAL 24 // Unused +#define CONTEST_EFFECT_MAKE_FOLLOWING_MON_NERVOUS 25 // Unused #define CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS 26 #define CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS 27 -#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28 +#define CONTEST_EFFECT_BADLY_STARTLES_MONS_IN_GOOD_CONDITION 28 // Unused #define CONTEST_EFFECT_BETTER_IF_FIRST 29 #define CONTEST_EFFECT_BETTER_IF_LAST 30 #define CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES 31 @@ -133,18 +133,21 @@ #define CONTEST_EFFECT_BETTER_WHEN_LATER 33 #define CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING 34 #define CONTEST_EFFECT_BETTER_IF_SAME_TYPE 35 -#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36 +#define CONTEST_EFFECT_BETTER_IF_DIFF_TYPE 36 // Unused #define CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL 37 #define CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS 38 #define CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION 39 #define CONTEST_EFFECT_NEXT_APPEAL_EARLIER 40 #define CONTEST_EFFECT_NEXT_APPEAL_LATER 41 -#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42 +#define CONTEST_EFFECT_MAKE_SCRAMBLING_TURN_ORDER_EASIER 42 // Unused #define CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER 43 #define CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST 44 #define CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS 45 #define CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED 46 #define CONTEST_EFFECT_DONT_EXCITE_AUDIENCE 47 +//#define CONTEST_EFFECT_QUICKLY_GROW_BORED 48 // New in Gen 6 +//#define CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST 49 // New in Gen 6 +//#define CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST 50 // New in Gen 6 // Each of the above effects is grouped into one of these effect type categories // Only a few of these get checked by the AI, the rest go unused @@ -155,94 +158,129 @@ #define CONTEST_EFFECT_TYPE_WORSEN 4 #define CONTEST_EFFECT_TYPE_SPECIAL_APPEAL 5 #define CONTEST_EFFECT_TYPE_TURN_ORDER 6 +#define CONTEST_EFFECT_TYPE_UNKNOWN 8 -#define COMBO_STARTER_POUND 1 -#define COMBO_STARTER_FIRE_PUNCH 2 -#define COMBO_STARTER_ICE_PUNCH 3 -#define COMBO_STARTER_THUNDER_PUNCH 4 -#define COMBO_STARTER_SCRATCH 5 -#define COMBO_STARTER_VICE_GRIP 6 -#define COMBO_STARTER_SWORDS_DANCE 7 -#define COMBO_STARTER_SAND_ATTACK 8 -#define COMBO_STARTER_HORN_ATTACK 9 -#define COMBO_STARTER_LEER 10 -#define COMBO_STARTER_SING 11 -#define COMBO_STARTER_SURF 12 -#define COMBO_STARTER_PECK 13 -#define COMBO_STARTER_LEECH_SEED 14 -#define COMBO_STARTER_GROWTH 15 -#define COMBO_STARTER_STRING_SHOT 16 -#define COMBO_STARTER_DRAGON_RAGE 17 -#define COMBO_STARTER_ROCK_THROW 18 -#define COMBO_STARTER_EARTHQUAKE 19 -#define COMBO_STARTER_TOXIC 20 -#define COMBO_STARTER_CONFUSION 21 -#define COMBO_STARTER_PSYCHIC 22 -#define COMBO_STARTER_HYPNOSIS 23 -#define COMBO_STARTER_RAGE 24 -#define COMBO_STARTER_DOUBLE_TEAM 25 -#define COMBO_STARTER_HARDEN 26 -#define COMBO_STARTER_DEFENSE_CURL 27 -#define COMBO_STARTER_FOCUS_ENERGY 28 -#define COMBO_STARTER_SMOG 29 -#define COMBO_STARTER_SLUDGE 30 -#define COMBO_STARTER_BONE_CLUB 31 -#define COMBO_STARTER_KINESIS 32 -#define COMBO_STARTER_SOFT_BOILED 33 -#define COMBO_STARTER_BONEMERANG 34 -#define COMBO_STARTER_REST 35 -#define COMBO_STARTER_MIND_READER 36 -#define COMBO_STARTER_CURSE 37 -#define COMBO_STARTER_POWDER_SNOW 38 -#define COMBO_STARTER_SCARY_FACE 39 -#define COMBO_STARTER_BELLY_DRUM 40 -#define COMBO_STARTER_SLUDGE_BOMB 41 -#define COMBO_STARTER_MUD_SLAP 42 -#define COMBO_STARTER_BONE_RUSH 43 -#define COMBO_STARTER_LOCK_ON 44 -#define COMBO_STARTER_SANDSTORM 45 -#define COMBO_STARTER_ENDURE 46 -#define COMBO_STARTER_CHARM 47 -#define COMBO_STARTER_MEAN_LOOK 48 -#define COMBO_STARTER_HEAL_BELL 49 -#define COMBO_STARTER_DRAGON_BREATH 50 -#define COMBO_STARTER_SWEET_SCENT 51 -#define COMBO_STARTER_RAIN_DANCE 52 -#define COMBO_STARTER_SUNNY_DAY 53 -#define COMBO_STARTER_FAKE_OUT 54 -#define COMBO_STARTER_STOCKPILE 55 -#define COMBO_STARTER_HAIL 56 -#define COMBO_STARTER_CHARGE 57 -#define COMBO_STARTER_TAUNT 58 -#define COMBO_STARTER_REVENGE 59 -#define COMBO_STARTER_YAWN 60 -#define COMBO_STARTER_DIVE 61 -#define COMBO_STARTER_MUD_SPORT 62 -#define COMBO_STARTER_METAL_SOUND 63 -#define COMBO_STARTER_WATER_SPORT 64 -#define COMBO_STARTER_CALM_MIND 65 -#define COMBO_STARTER_DRAGON_DANCE 66 -#define COMBO_STARTER_PAYBACK 67 -#define COMBO_STARTER_LUCKY_CHANT 68 -#define COMBO_STARTER_WORRY_SEED 69 -#define COMBO_STARTER_DRAGON_RUSH 70 -#define COMBO_STARTER_BRAVE_BIRD 71 -#define COMBO_STARTER_THUNDER_FANG 72 -#define COMBO_STARTER_ICE_FANG 73 -#define COMBO_STARTER_FIRE_FANG 74 -#define COMBO_STARTER_ATTACK_ORDER 75 -#define COMBO_STARTER_DEFEND_ORDER 76 -#define COMBO_STARTER_HEAL_ORDER 77 -#define COMBO_STARTER_SCALD 78 -#define COMBO_STARTER_DRAGON_TAIL 79 -#define COMBO_STARTER_HYPERSPACE_HOLE 80 -#define COMBO_STARTER_THOUSAND_ARROWS 81 -#define COMBO_STARTER_THOUSAND_WAVES 82 -#define COMBO_STARTER_HYPERSPACE_FURY 83 -#define COMBO_STARTER_SHADOW_BONE 84 -#define COMBO_STARTER_ELECTRIC_TERRAIN 85 -#define COMBO_STARTER_MISTY_TERRAIN 86 -#define COMBO_STARTER_GRASSY_TERRAIN 87 -#define COMBO_STARTER_PSYCHIC_TERRAIN 88 +enum { + COMBO_STARTER_POUND, + COMBO_STARTER_FIRE_PUNCH, + COMBO_STARTER_ICE_PUNCH, + COMBO_STARTER_THUNDER_PUNCH, + COMBO_STARTER_SCRATCH, + COMBO_STARTER_VICE_GRIP, + COMBO_STARTER_SWORDS_DANCE, + COMBO_STARTER_SAND_ATTACK, + COMBO_STARTER_HORN_ATTACK, + COMBO_STARTER_LEER, + COMBO_STARTER_SING, + COMBO_STARTER_SURF, + COMBO_STARTER_PECK, + COMBO_STARTER_LEECH_SEED, + COMBO_STARTER_GROWTH, + COMBO_STARTER_STRING_SHOT, + COMBO_STARTER_DRAGON_RAGE, + COMBO_STARTER_ROCK_THROW, + COMBO_STARTER_EARTHQUAKE, + COMBO_STARTER_TOXIC, + COMBO_STARTER_CONFUSION, + COMBO_STARTER_PSYCHIC, + COMBO_STARTER_HYPNOSIS, + COMBO_STARTER_RAGE, + COMBO_STARTER_DOUBLE_TEAM, + COMBO_STARTER_HARDEN, + COMBO_STARTER_DEFENSE_CURL, + COMBO_STARTER_FOCUS_ENERGY, + COMBO_STARTER_SMOG, + COMBO_STARTER_SLUDGE, + COMBO_STARTER_BONE_CLUB, + COMBO_STARTER_KINESIS, + COMBO_STARTER_SOFT_BOILED, + COMBO_STARTER_BONEMERANG, + COMBO_STARTER_REST, + COMBO_STARTER_MIND_READER, + COMBO_STARTER_CURSE, + COMBO_STARTER_POWDER_SNOW, + COMBO_STARTER_SCARY_FACE, + COMBO_STARTER_BELLY_DRUM, + COMBO_STARTER_SLUDGE_BOMB, + COMBO_STARTER_MUD_SLAP, + COMBO_STARTER_BONE_RUSH, + COMBO_STARTER_LOCK_ON, + COMBO_STARTER_SANDSTORM, + COMBO_STARTER_ENDURE, + COMBO_STARTER_CHARM, + COMBO_STARTER_MEAN_LOOK, + COMBO_STARTER_HEAL_BELL, + COMBO_STARTER_DRAGON_BREATH, + COMBO_STARTER_SWEET_SCENT, + COMBO_STARTER_RAIN_DANCE, + COMBO_STARTER_SUNNY_DAY, + COMBO_STARTER_FAKE_OUT, + COMBO_STARTER_STOCKPILE, + COMBO_STARTER_HAIL, + COMBO_STARTER_CHARGE, + COMBO_STARTER_TAUNT, + COMBO_STARTER_REVENGE, + COMBO_STARTER_YAWN, + COMBO_STARTER_DIVE, + COMBO_STARTER_MUD_SPORT, + COMBO_STARTER_METAL_SOUND, + COMBO_STARTER_WATER_SPORT, + COMBO_STARTER_CALM_MIND, + COMBO_STARTER_DRAGON_DANCE, + COMBO_STARTER_PAYBACK, + COMBO_STARTER_LUCKY_CHANT, + COMBO_STARTER_WORRY_SEED, + COMBO_STARTER_DRAGON_RUSH, + COMBO_STARTER_BRAVE_BIRD, + COMBO_STARTER_THUNDER_FANG, + COMBO_STARTER_ICE_FANG, + COMBO_STARTER_FIRE_FANG, + COMBO_STARTER_ATTACK_ORDER, + COMBO_STARTER_DEFEND_ORDER, + COMBO_STARTER_HEAL_ORDER, + COMBO_STARTER_SCALD, + COMBO_STARTER_DRAGON_TAIL, + COMBO_STARTER_HYPERSPACE_HOLE, + COMBO_STARTER_THOUSAND_ARROWS, + COMBO_STARTER_THOUSAND_WAVES, + COMBO_STARTER_HYPERSPACE_FURY, + COMBO_STARTER_SHADOW_BONE, + COMBO_STARTER_ELECTRIC_TERRAIN, + COMBO_STARTER_MISTY_TERRAIN, + COMBO_STARTER_GRASSY_TERRAIN, + COMBO_STARTER_PSYCHIC_TERRAIN, + COMBO_STARTER_FORCE_PALM, + COMBO_STARTER_THUNDER_WAVE, + COMBO_STARTER_AGILITY, + COMBO_STARTER_STEALTH_ROCK, + COMBO_STARTER_INFERNO, + COMBO_STARTER_WILL_O_WISP, + COMBO_STARTER_LOVELY_KISS, + COMBO_STARTER_SPORE, + COMBO_STARTER_CELEBRATE, + COMBO_STARTER_COVET, + COMBO_STARTER_HAPPY_HOUR, + COMBO_STARTER_WISH, + COMBO_STARTER_AMNESIA, + COMBO_STARTER_HONE_CLAWS, + COMBO_STARTER_ENTRAINMENT, + COMBO_STARTER_PLAY_NICE, + COMBO_STARTER_BLOCK, + COMBO_STARTER_ENCORE, + COMBO_STARTER_DARK_VOID, + COMBO_STARTER_GRASS_WHISTLE, + COMBO_STARTER_SLEEP_POWDER, + COMBO_STARTER_POISON_GAS, + COMBO_STARTER_POISON_POWDER, + COMBO_STARTER_NASTY_PLOT, + COMBO_STARTER_PARABOLIC_CHARGE, + COMBO_STARTER_SHIFT_GEAR, + COMBO_STARTER_SPIKES, + COMBO_STARTER_TOXIC_SPIKES, + COMBO_STARTER_GLARE, + COMBO_STARTER_ROCK_POLISH, + COMBO_STARTER_ROTOTILLER, + COMBO_STARTER_TORMENT, +}; #endif // GUARD_CONSTANTS_CONTEST_H diff --git a/include/constants/cries.h b/include/constants/cries.h index e30973946..0752ac613 100644 --- a/include/constants/cries.h +++ b/include/constants/cries.h @@ -8,26 +8,26 @@ enum PokemonCry CRY_BULBASAUR, CRY_IVYSAUR, CRY_VENUSAUR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_VENUSAUR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BULBASAUR #if P_FAMILY_CHARMANDER CRY_CHARMANDER, CRY_CHARMELEON, CRY_CHARIZARD, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_CHARIZARD_MEGA_X, CRY_CHARIZARD_MEGA_Y, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CHARMANDER #if P_FAMILY_SQUIRTLE CRY_SQUIRTLE, CRY_WARTORTLE, CRY_BLASTOISE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_BLASTOISE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SQUIRTLE #if P_FAMILY_CATERPIE CRY_CATERPIE, @@ -38,17 +38,17 @@ enum PokemonCry CRY_WEEDLE, CRY_KAKUNA, CRY_BEEDRILL, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_BEEDRILL_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_WEEDLE #if P_FAMILY_PIDGEY CRY_PIDGEY, CRY_PIDGEOTTO, CRY_PIDGEOT, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_PIDGEOT_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_PIDGEY #if P_FAMILY_RATTATA CRY_RATTATA, @@ -68,6 +68,10 @@ enum PokemonCry #endif //P_GEN_2_CROSS_EVOS CRY_PIKACHU, CRY_RAICHU, +#if P_MODIFIED_MEGA_CRIES + CRY_RAICHU_MEGA_X, + CRY_RAICHU_MEGA_Y, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_PIKACHU #if P_FAMILY_SANDSHREW CRY_SANDSHREW, @@ -87,6 +91,9 @@ enum PokemonCry #endif //P_GEN_2_CROSS_EVOS CRY_CLEFAIRY, CRY_CLEFABLE, +#if P_MODIFIED_MEGA_CRIES + CRY_CLEFABLE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CLEFAIRY #if P_FAMILY_VULPIX CRY_VULPIX, @@ -160,9 +167,9 @@ enum PokemonCry CRY_ABRA, CRY_KADABRA, CRY_ALAKAZAM, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_ALAKAZAM_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ABRA #if P_FAMILY_MACHOP CRY_MACHOP, @@ -173,6 +180,9 @@ enum PokemonCry CRY_BELLSPROUT, CRY_WEEPINBELL, CRY_VICTREEBEL, +#if P_MODIFIED_MEGA_CRIES + CRY_VICTREEBEL_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BELLSPROUT #if P_FAMILY_TENTACOOL CRY_TENTACOOL, @@ -193,9 +203,9 @@ enum PokemonCry #if P_GEN_2_CROSS_EVOS CRY_SLOWKING, #endif //P_GEN_2_CROSS_EVOS -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SLOWBRO_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #if P_GALARIAN_FORMS CRY_SLOWPOKE_GALAR, #endif //P_GALARIAN_FORMS @@ -233,17 +243,17 @@ enum PokemonCry CRY_GASTLY, CRY_HAUNTER, CRY_GENGAR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GENGAR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_GASTLY #if P_FAMILY_ONIX CRY_ONIX, #if P_GEN_2_CROSS_EVOS CRY_STEELIX, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_STEELIX_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_ONIX #if P_FAMILY_DROWZEE @@ -310,9 +320,9 @@ enum PokemonCry #endif //P_FAMILY_TANGELA #if P_FAMILY_KANGASKHAN CRY_KANGASKHAN, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_KANGASKHAN_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_KANGASKHAN #if P_FAMILY_HORSEA CRY_HORSEA, @@ -328,6 +338,9 @@ enum PokemonCry #if P_FAMILY_STARYU CRY_STARYU, CRY_STARMIE, +#if P_MODIFIED_MEGA_CRIES + CRY_STARMIE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_STARYU #if P_FAMILY_MR_MIME #if P_GEN_4_CROSS_EVOS @@ -342,9 +355,9 @@ enum PokemonCry CRY_SCYTHER, #if P_GEN_2_CROSS_EVOS CRY_SCIZOR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SCIZOR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_GEN_2_CROSS_EVOS #if P_GEN_8_CROSS_EVOS CRY_KLEAVOR, @@ -376,9 +389,9 @@ enum PokemonCry #endif //P_FAMILY_MAGMAR #if P_FAMILY_PINSIR CRY_PINSIR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_PINSIR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_PINSIR #if P_FAMILY_TAUROS CRY_TAUROS, @@ -386,9 +399,9 @@ enum PokemonCry #if P_FAMILY_MAGIKARP CRY_MAGIKARP, CRY_GYARADOS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GYARADOS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MAGIKARP #if P_FAMILY_LAPRAS CRY_LAPRAS, @@ -413,8 +426,8 @@ enum PokemonCry CRY_SYLVEON, #endif //P_GEN_6_CROSS_EVOS #endif //P_FAMILY_EEVEE -#if P_FAMILY_PORYGON CRY_PORYGON, +#if P_FAMILY_PORYGON #if P_GEN_2_CROSS_EVOS CRY_PORYGON2, #if P_GEN_4_CROSS_EVOS @@ -432,9 +445,9 @@ enum PokemonCry #endif //P_FAMILY_KABUTO #if P_FAMILY_AERODACTYL CRY_AERODACTYL, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_AERODACTYL_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_AERODACTYL #if P_FAMILY_SNORLAX #if P_GEN_4_CROSS_EVOS @@ -455,13 +468,16 @@ enum PokemonCry CRY_DRATINI, CRY_DRAGONAIR, CRY_DRAGONITE, +#if P_MODIFIED_MEGA_CRIES + CRY_DRAGONITE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_DRATINI #if P_FAMILY_MEWTWO CRY_MEWTWO, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_MEWTWO_MEGA_X, CRY_MEWTWO_MEGA_Y, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MEWTWO #if P_FAMILY_MEW CRY_MEW, @@ -470,6 +486,9 @@ enum PokemonCry CRY_CHIKORITA, CRY_BAYLEEF, CRY_MEGANIUM, +#if P_MODIFIED_MEGA_CRIES + CRY_MEGANIUM_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CHIKORITA #if P_FAMILY_CYNDAQUIL CRY_CYNDAQUIL, @@ -480,6 +499,9 @@ enum PokemonCry CRY_TOTODILE, CRY_CROCONAW, CRY_FERALIGATR, +#if P_MODIFIED_MEGA_CRIES + CRY_FERALIGATR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TOTODILE #if P_FAMILY_SENTRET CRY_SENTRET, @@ -516,9 +538,9 @@ enum PokemonCry CRY_MAREEP, CRY_FLAAFFY, CRY_AMPHAROS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_AMPHAROS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MAREEP #if P_FAMILY_MARILL #if P_GEN_3_CROSS_EVOS @@ -611,9 +633,9 @@ enum PokemonCry #endif //P_FAMILY_SHUCKLE #if P_FAMILY_HERACROSS CRY_HERACROSS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_HERACROSS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_HERACROSS #if P_FAMILY_SNEASEL CRY_SNEASEL, @@ -629,6 +651,7 @@ enum PokemonCry CRY_URSARING, #if P_GEN_8_CROSS_EVOS CRY_URSALUNA, + CRY_URSALUNA_BLOODMOON, #endif //P_GEN_8_CROSS_EVOS #endif //P_FAMILY_TEDDIURSA #if P_FAMILY_SLUGMA @@ -663,13 +686,16 @@ enum PokemonCry #endif //P_FAMILY_MANTINE #if P_FAMILY_SKARMORY CRY_SKARMORY, +#if P_MODIFIED_MEGA_CRIES + CRY_SKARMORY_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SKARMORY #if P_FAMILY_HOUNDOUR CRY_HOUNDOUR, CRY_HOUNDOOM, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_HOUNDOOM_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_HOUNDOUR #if P_FAMILY_PHANPY CRY_PHANPY, @@ -700,9 +726,9 @@ enum PokemonCry CRY_LARVITAR, CRY_PUPITAR, CRY_TYRANITAR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_TYRANITAR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_LARVITAR #if P_FAMILY_LUGIA CRY_LUGIA, @@ -717,25 +743,25 @@ enum PokemonCry CRY_TREECKO, CRY_GROVYLE, CRY_SCEPTILE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SCEPTILE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TREECKO #if P_FAMILY_TORCHIC CRY_TORCHIC, CRY_COMBUSKEN, CRY_BLAZIKEN, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_BLAZIKEN_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TORCHIC #if P_FAMILY_MUDKIP CRY_MUDKIP, CRY_MARSHTOMP, CRY_SWAMPERT, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SWAMPERT_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MUDKIP #if P_FAMILY_POOCHYENA CRY_POOCHYENA, @@ -777,14 +803,14 @@ enum PokemonCry CRY_RALTS, CRY_KIRLIA, CRY_GARDEVOIR, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GARDEVOIR_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #if P_GEN_4_CROSS_EVOS CRY_GALLADE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GALLADE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RALTS #if P_FAMILY_SURSKIT @@ -826,37 +852,37 @@ enum PokemonCry #endif //P_FAMILY_SKITTY #if P_FAMILY_SABLEYE CRY_SABLEYE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SABLEYE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SABLEYE #if P_FAMILY_MAWILE CRY_MAWILE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_MAWILE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MAWILE #if P_FAMILY_ARON CRY_ARON, CRY_LAIRON, CRY_AGGRON, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_AGGRON_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ARON #if P_FAMILY_MEDITITE CRY_MEDITITE, CRY_MEDICHAM, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_MEDICHAM_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MEDITITE #if P_FAMILY_ELECTRIKE CRY_ELECTRIKE, CRY_MANECTRIC, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_MANECTRIC_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ELECTRIKE #if P_FAMILY_PLUSLE CRY_PLUSLE, @@ -884,9 +910,9 @@ enum PokemonCry #if P_FAMILY_CARVANHA CRY_CARVANHA, CRY_SHARPEDO, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SHARPEDO_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CARVANHA #if P_FAMILY_WAILMER CRY_WAILMER, @@ -895,9 +921,9 @@ enum PokemonCry #if P_FAMILY_NUMEL CRY_NUMEL, CRY_CAMERUPT, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_CAMERUPT_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_NUMEL #if P_FAMILY_TORKOAL CRY_TORKOAL, @@ -921,9 +947,9 @@ enum PokemonCry #if P_FAMILY_SWABLU CRY_SWABLU, CRY_ALTARIA, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_ALTARIA_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SWABLU #if P_FAMILY_ZANGOOSE CRY_ZANGOOSE, @@ -970,9 +996,9 @@ enum PokemonCry #if P_FAMILY_SHUPPET CRY_SHUPPET, CRY_BANETTE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_BANETTE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SHUPPET #if P_FAMILY_DUSKULL CRY_DUSKULL, @@ -989,21 +1015,28 @@ enum PokemonCry CRY_CHINGLING, #endif //P_GEN_4_CROSS_EVOS CRY_CHIMECHO, +#if P_MODIFIED_MEGA_CRIES + CRY_CHIMECHO_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CHIMECHO #if P_FAMILY_ABSOL CRY_ABSOL, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_ABSOL_MEGA, -#endif //P_MEGA_EVOLUTIONS + CRY_ABSOL_MEGA_Z, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ABSOL #if P_FAMILY_SNORUNT CRY_SNORUNT, CRY_GLALIE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GLALIE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #if P_GEN_4_CROSS_EVOS CRY_FROSLASS, +#if P_MODIFIED_MEGA_CRIES + CRY_FROSLASS_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_SNORUNT #if P_FAMILY_SPHEAL @@ -1026,17 +1059,17 @@ enum PokemonCry CRY_BAGON, CRY_SHELGON, CRY_SALAMENCE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_SALAMENCE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BAGON #if P_FAMILY_BELDUM CRY_BELDUM, CRY_METANG, CRY_METAGROSS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_METAGROSS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BELDUM #if P_FAMILY_REGIROCK CRY_REGIROCK, @@ -1049,15 +1082,15 @@ enum PokemonCry #endif //P_FAMILY_REGISTEEL #if P_FAMILY_LATIAS CRY_LATIAS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_LATIAS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_LATIAS #if P_FAMILY_LATIOS CRY_LATIOS, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_LATIOS_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_LATIOS #if P_FAMILY_KYOGRE CRY_KYOGRE, @@ -1073,9 +1106,9 @@ enum PokemonCry #endif //P_FAMILY_GROUDON #if P_FAMILY_RAYQUAZA CRY_RAYQUAZA, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_RAYQUAZA_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_RAYQUAZA #if P_FAMILY_JIRACHI CRY_JIRACHI, @@ -1102,6 +1135,9 @@ enum PokemonCry CRY_STARLY, CRY_STARAVIA, CRY_STARAPTOR, +#if P_MODIFIED_MEGA_CRIES + CRY_STARAPTOR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_STARLY #if P_FAMILY_BIDOOF CRY_BIDOOF, @@ -1155,9 +1191,9 @@ enum PokemonCry #if P_FAMILY_BUNEARY CRY_BUNEARY, CRY_LOPUNNY, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_LOPUNNY_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BUNEARY #if P_FAMILY_GLAMEOW CRY_GLAMEOW, @@ -1181,16 +1217,17 @@ enum PokemonCry CRY_GIBLE, CRY_GABITE, CRY_GARCHOMP, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_GARCHOMP_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_GIBLE #if P_FAMILY_RIOLU CRY_RIOLU, CRY_LUCARIO, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_LUCARIO_MEGA, -#endif //P_MEGA_EVOLUTIONS + CRY_LUCARIO_MEGA_Z, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_RIOLU #if P_FAMILY_HIPPOPOTAS CRY_HIPPOPOTAS, @@ -1214,9 +1251,9 @@ enum PokemonCry #if P_FAMILY_SNOVER CRY_SNOVER, CRY_ABOMASNOW, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_ABOMASNOW_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SNOVER #if P_FAMILY_ROTOM CRY_ROTOM, @@ -1238,6 +1275,9 @@ enum PokemonCry #endif //P_FAMILY_PALKIA #if P_FAMILY_HEATRAN CRY_HEATRAN, +#if P_MODIFIED_MEGA_CRIES + CRY_HEATRAN_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_HEATRAN #if P_FAMILY_REGIGIGAS CRY_REGIGIGAS, @@ -1254,6 +1294,9 @@ enum PokemonCry #endif //P_FAMILY_MANAPHY #if P_FAMILY_DARKRAI CRY_DARKRAI, +#if P_MODIFIED_MEGA_CRIES + CRY_DARKRAI_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_DARKRAI #if P_FAMILY_SHAYMIN CRY_SHAYMIN_LAND, @@ -1274,6 +1317,9 @@ enum PokemonCry CRY_TEPIG, CRY_PIGNITE, CRY_EMBOAR, +#if P_MODIFIED_MEGA_CRIES + CRY_EMBOAR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TEPIG #if P_FAMILY_OSHAWOTT CRY_OSHAWOTT, @@ -1330,12 +1376,15 @@ enum PokemonCry #if P_FAMILY_DRILBUR CRY_DRILBUR, CRY_EXCADRILL, +#if P_MODIFIED_MEGA_CRIES + CRY_EXCADRILL_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_DRILBUR #if P_FAMILY_AUDINO CRY_AUDINO, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_AUDINO_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_AUDINO #if P_FAMILY_TIMBURR CRY_TIMBURR, @@ -1362,6 +1411,9 @@ enum PokemonCry CRY_VENIPEDE, CRY_WHIRLIPEDE, CRY_SCOLIPEDE, +#if P_MODIFIED_MEGA_CRIES + CRY_SCOLIPEDE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_VENIPEDE #if P_FAMILY_COTTONEE CRY_COTTONEE, @@ -1396,6 +1448,9 @@ enum PokemonCry #if P_FAMILY_SCRAGGY CRY_SCRAGGY, CRY_SCRAFTY, +#if P_MODIFIED_MEGA_CRIES + CRY_SCRAFTY_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SCRAGGY #if P_FAMILY_SIGILYPH CRY_SIGILYPH, @@ -1485,6 +1540,9 @@ enum PokemonCry CRY_TYNAMO, CRY_EELEKTRIK, CRY_EELEKTROSS, +#if P_MODIFIED_MEGA_CRIES + CRY_EELEKTROSS_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TYNAMO #if P_FAMILY_ELGYEM CRY_ELGYEM, @@ -1494,6 +1552,9 @@ enum PokemonCry CRY_LITWICK, CRY_LAMPENT, CRY_CHANDELURE, +#if P_MODIFIED_MEGA_CRIES + CRY_CHANDELURE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_LITWICK #if P_FAMILY_AXEW CRY_AXEW, @@ -1524,6 +1585,9 @@ enum PokemonCry #if P_FAMILY_GOLETT CRY_GOLETT, CRY_GOLURK, +#if P_MODIFIED_MEGA_CRIES + CRY_GOLURK_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_GOLETT #if P_FAMILY_PAWNIARD CRY_PAWNIARD, @@ -1605,16 +1669,25 @@ enum PokemonCry CRY_CHESPIN, CRY_QUILLADIN, CRY_CHESNAUGHT, +#if P_MODIFIED_MEGA_CRIES + CRY_CHESNAUGHT_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CHESPIN #if P_FAMILY_FENNEKIN CRY_FENNEKIN, CRY_BRAIXEN, CRY_DELPHOX, +#if P_MODIFIED_MEGA_CRIES + CRY_DELPHOX_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_FENNEKIN #if P_FAMILY_FROAKIE CRY_FROAKIE, CRY_FROGADIER, CRY_GRENINJA, +#if P_MODIFIED_MEGA_CRIES + CRY_GRENINJA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_FROAKIE #if P_FAMILY_BUNNELBY CRY_BUNNELBY, @@ -1633,11 +1706,17 @@ enum PokemonCry #if P_FAMILY_LITLEO CRY_LITLEO, CRY_PYROAR, +#if P_MODIFIED_MEGA_CRIES + CRY_PYROAR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_LITLEO #if P_FAMILY_FLABEBE CRY_FLABEBE, CRY_FLOETTE, CRY_FLOETTE_ETERNAL, +#if P_MODIFIED_MEGA_CRIES + CRY_FLOETTE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES CRY_FLORGES, #endif //P_FAMILY_FLABEBE #if P_FAMILY_SKIDDO @@ -1654,6 +1733,9 @@ enum PokemonCry #if P_FAMILY_ESPURR CRY_ESPURR, CRY_MEOWSTIC, +#if P_MODIFIED_MEGA_CRIES + CRY_MEOWSTIC_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ESPURR #if P_FAMILY_HONEDGE CRY_HONEDGE, @@ -1671,14 +1753,23 @@ enum PokemonCry #if P_FAMILY_INKAY CRY_INKAY, CRY_MALAMAR, +#if P_MODIFIED_MEGA_CRIES + CRY_MALAMAR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_INKAY #if P_FAMILY_BINACLE CRY_BINACLE, CRY_BARBARACLE, +#if P_MODIFIED_MEGA_CRIES + CRY_BARBARACLE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_BINACLE #if P_FAMILY_SKRELP CRY_SKRELP, CRY_DRAGALGE, +#if P_MODIFIED_MEGA_CRIES + CRY_DRAGALGE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_SKRELP #if P_FAMILY_CLAUNCHER CRY_CLAUNCHER, @@ -1698,6 +1789,9 @@ enum PokemonCry #endif //P_FAMILY_AMAURA #if P_FAMILY_HAWLUCHA CRY_HAWLUCHA, +#if P_MODIFIED_MEGA_CRIES + CRY_HAWLUCHA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_HAWLUCHA #if P_FAMILY_DEDENNE CRY_DEDENNE, @@ -1741,12 +1835,15 @@ enum PokemonCry CRY_ZYGARDE_50, CRY_ZYGARDE_10, CRY_ZYGARDE_COMPLETE, +#if P_MODIFIED_MEGA_CRIES + CRY_ZYGARDE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE CRY_DIANCIE, -#if P_MEGA_EVOLUTIONS +#if P_MODIFIED_MEGA_CRIES CRY_DIANCIE_MEGA, -#endif //P_MEGA_EVOLUTIONS +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_DIANCIE #if P_FAMILY_HOOPA CRY_HOOPA_CONFINED, @@ -1787,6 +1884,9 @@ enum PokemonCry #if P_FAMILY_CRABRAWLER CRY_CRABRAWLER, CRY_CRABOMINABLE, +#if P_MODIFIED_MEGA_CRIES + CRY_CRABOMINABLE_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CRABRAWLER #if P_FAMILY_ORICORIO CRY_ORICORIO_BAILE, @@ -1853,6 +1953,9 @@ enum PokemonCry #if P_FAMILY_WIMPOD CRY_WIMPOD, CRY_GOLISOPOD, +#if P_MODIFIED_MEGA_CRIES + CRY_GOLISOPOD_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_WIMPOD #if P_FAMILY_SANDYGAST CRY_SANDYGAST, @@ -1885,6 +1988,9 @@ enum PokemonCry #endif //P_FAMILY_BRUXISH #if P_FAMILY_DRAMPA CRY_DRAMPA, +#if P_MODIFIED_MEGA_CRIES + CRY_DRAMPA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_DRAMPA #if P_FAMILY_DHELMISE CRY_DHELMISE, @@ -1945,6 +2051,9 @@ enum PokemonCry #endif //P_FAMILY_NECROZMA #if P_FAMILY_MAGEARNA CRY_MAGEARNA, +#if P_MODIFIED_MEGA_CRIES + CRY_MAGEARNA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_MAGEARNA #if P_FAMILY_MARSHADOW CRY_MARSHADOW, @@ -1961,6 +2070,9 @@ enum PokemonCry #endif //P_FAMILY_BLACEPHALON #if P_FAMILY_ZERAORA CRY_ZERAORA, +#if P_MODIFIED_MEGA_CRIES + CRY_ZERAORA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_ZERAORA #if P_FAMILY_MELTAN CRY_MELTAN, @@ -2035,6 +2147,7 @@ enum PokemonCry #endif //P_FAMILY_SILICOBRA #if P_FAMILY_CRAMORANT CRY_CRAMORANT, + CRY_CRAMORANT_GULPING, #endif //P_FAMILY_CRAMORANT #if P_FAMILY_ARROKUDA CRY_ARROKUDA, @@ -2073,6 +2186,9 @@ enum PokemonCry #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS CRY_FALINKS, +#if P_MODIFIED_MEGA_CRIES + CRY_FALINKS_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_FALINKS #if P_FAMILY_PINCURCHIN CRY_PINCURCHIN, @@ -2256,6 +2372,9 @@ enum PokemonCry #if P_FAMILY_CAPSAKID CRY_CAPSAKID, CRY_SCOVILLAIN, +#if P_MODIFIED_MEGA_CRIES + CRY_SCOVILLAIN_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_CAPSAKID #if P_FAMILY_RELLOR CRY_RELLOR, @@ -2295,6 +2414,9 @@ enum PokemonCry #if P_FAMILY_GLIMMET CRY_GLIMMET, CRY_GLIMMORA, +#if P_MODIFIED_MEGA_CRIES + CRY_GLIMMORA_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_GLIMMET #if P_FAMILY_GREAVARD CRY_GREAVARD, @@ -2317,6 +2439,9 @@ enum PokemonCry CRY_TATSUGIRI_CURLY, CRY_TATSUGIRI_DROOPY, CRY_TATSUGIRI_STRETCHY, +#if P_MODIFIED_MEGA_CRIES + CRY_TATSUGIRI_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_TATSUGIRI #if P_FAMILY_GREAT_TUSK CRY_GREAT_TUSK, @@ -2358,6 +2483,9 @@ enum PokemonCry CRY_FRIGIBAX, CRY_ARCTIBAX, CRY_BAXCALIBUR, +#if P_MODIFIED_MEGA_CRIES + CRY_BAXCALIBUR_MEGA, +#endif //P_MODIFIED_MEGA_CRIES #endif //P_FAMILY_FRIGIBAX #if P_FAMILY_GIMMIGHOUL CRY_GIMMIGHOUL, diff --git a/include/constants/egg_ids.h b/include/constants/egg_ids.h new file mode 100644 index 000000000..bab187101 --- /dev/null +++ b/include/constants/egg_ids.h @@ -0,0 +1,12 @@ +#ifndef GUARD_EGG_IDS_H +#define GUARD_EGG_IDS_H + +// IDs for species with custom eggs +enum EggIds +{ + EGG_ID_NONE, + EGG_ID_MANAPHY, + EGG_ID_COUNT +}; + +#endif // GUARD_EGG_IDS_H diff --git a/include/constants/flags.h b/include/constants/flags.h index 13792f03e..92f66f14c 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1551,7 +1551,7 @@ #define TESTING_FLAGS_START 0x5000 #define TESTING_FLAG_SLEEP_CLAUSE (TESTING_FLAGS_START + 0x0) #define TESTING_FLAG_INVERSE_BATTLE (TESTING_FLAGS_START + 0x1) -#define TESTING_FLAG_UNUSED_2 (TESTING_FLAGS_START + 0x2) +#define TESTING_FLAG_TRAINER_SLIDES (TESTING_FLAGS_START + 0x2) #define TESTING_FLAG_UNUSED_3 (TESTING_FLAGS_START + 0x3) #define TESTING_FLAG_UNUSED_4 (TESTING_FLAGS_START + 0x4) #define TESTING_FLAG_UNUSED_5 (TESTING_FLAGS_START + 0x5) diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 88584e997..c764712ba 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -1,53 +1,235 @@ #ifndef GUARD_CONSTANTS_GENERATIONAL_CHANGES_H #define GUARD_CONSTANTS_GENERATIONAL_CHANGES_H -enum GenConfigTag +/* Config definitions */ +#define BATTLE_CONFIG_DEFINITIONS(F) \ + /* Calculation settings */ \ + F(CRIT_CHANCE, critChance, (u32, GEN_COUNT - 1)) \ + F(CRIT_MULTIPLIER, critMultiplier, (u32, GEN_COUNT - 1)) \ + F(PARALYSIS_SPEED, paralysisSpeed, (u32, GEN_COUNT - 1)) \ + F(CONFUSION_SELF_DMG_CHANCE, confusionSelfDmgChance, (u32, GEN_COUNT - 1)) \ + F(MULTI_HIT_CHANCE, multiHitChance, (u32, GEN_COUNT - 1)) \ + F(WHITEOUT_MONEY, whiteoutMoney, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LIGHT_BALL_ATTACK_BOOST, lightBallAttackBoost, (u32, GEN_COUNT - 1)) \ + /* Experience settings */ \ + F(EXP_CATCH, expCatch, (u32, GEN_COUNT - 1)) \ + F(TRAINER_EXP_MULTIPLIER, trainerExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPLIT_EXP, splitExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SCALED_EXP, scaledExp, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UNEVOLVED_EXP_MULTIPLIER, unevolvedExpMultiplier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LEVEL_UP_NOTIFICATION, levelUpNotification, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Stat settings */ \ + F(BADGE_BOOST, badgeBoost, (u32, GEN_COUNT - 1)) \ + F(FRIENDSHIP_BOOST, friendshipBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MAX_LEVEL_EV_GAINS, maxLevelEvGains, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RECALCULATE_STATS, recalculateStats, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Damage settings */ \ + F(BURN_DAMAGE, burnDamage, (u32, GEN_COUNT - 1)) \ + F(BURN_FACADE_DMG, burnFacadeDmg, (u32, GEN_COUNT - 1)) \ + F(BINDING_DAMAGE, bindingDamage, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PSYWAVE_DMG, psywaveDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PAYBACK_SWITCH_BOOST, paybackSwitchBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HIDDEN_POWER_DMG, hiddenPowerDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ROUGH_SKIN_DMG, roughSkinDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KNOCK_OFF_DMG, knockOffDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_DMG_REDUCTION, sportDmgReduction, (u32, GEN_COUNT - 1)) \ + F(EXPLOSION_DEFENSE, explosionDefense, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PARENTAL_BOND_DMG, parentalBondDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MULTIPLE_TARGETS_DMG, multipleTargetsDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Type settings */ \ + F(GHOSTS_ESCAPE, ghostsEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PARALYZE_ELECTRIC, paralyzeElectric, (u32, GEN_COUNT - 1)) \ + F(POWDER_GRASS, powderGrass, (u32, GEN_COUNT - 1)) \ + F(POWDER_OVERCOAT, powderOvercoat, (u32, GEN_COUNT - 1)) \ + F(UPDATED_TYPE_MATCHUPS, updatedTypeMatchups, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PRANKSTER_DARK_TYPES, pranksterDarkTypes, (u32, GEN_COUNT - 1)) \ + F(SHEER_COLD_IMMUNITY, sheerColdImmunity, (u32, GEN_COUNT - 1)) \ + F(ROOST_PURE_FLYING, roostPureFlying, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(STATUS_TYPE_IMMUNITY, statusTypeImmunity, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HIDDEN_POWER_COUNTER, hiddenPowerCounter, (u32, GEN_COUNT - 1)) \ + /* Turn settings */ \ + F(BINDING_TURNS, bindingTurns, (u32, GEN_COUNT - 1)) \ + F(UPROAR_TURNS, uproarTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPROAR_IGNORE_SOUNDPROOF, uproarIgnoreSoundproof, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DISABLE_TURNS, disableTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TAILWIND_TURNS, tailwindTurns, (u32, GEN_COUNT - 1)) \ + F(SLEEP_TURNS, sleepTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TAUNT_TURNS, tauntTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_TURNS, sportTurns, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MEGA_EVO_TURN_ORDER, megaEvoTurnOrder, (u32, GEN_COUNT - 1)) \ + F(RECALC_TURN_AFTER_ACTIONS, recalcTurnAfterActions, (u32, GEN_COUNT - 1)) \ + F(FAINT_SWITCH_IN, faintSwitchIn, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move data settings */ \ + F(UPDATED_MOVE_DATA, updatedMoveData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_MOVE_TYPES, updatedMoveTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_MOVE_FLAGS, updatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(PHYSICAL_SPECIAL_SPLIT, physicalSpecialSplit, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RECOIL_IF_MISS_DMG, recoilIfMissDmg, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KLUTZ_FLING_INTERACTION, klutzFlingInteraction, (u32, GEN_COUNT - 1)) \ + F(UPDATED_CONVERSION, updatedConversion, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(UPDATED_CONVERSION_2, updatedConversion2, (u32, GEN_COUNT - 1)) \ + F(PP_REDUCED_BY_SPITE, ppReducedBySpite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(EXTRAPOLATED_MOVE_FLAGS, extrapolatedMoveFlags, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MODERN_TRICK_CHOICE_LOCK, modernTrickChoiceLock, (u32, GEN_COUNT - 1)) \ + /* Ability data settings */ \ + F(UPDATED_ABILITY_DATA, updatedAbilityData, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move accuracy settings */ \ + F(TOXIC_NEVER_MISS, toxicNeverMiss, (u32, GEN_COUNT - 1)) \ + F(MINIMIZE_DMG_ACC, minimizeDmgAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BLIZZARD_HAIL, blizzardHail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SHEER_COLD_ACC, sheerColdAcc, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Move stat change settings */ \ + F(FELL_STINGER_STAT_RAISE, fellStingerStatRaise, (u32, GEN_COUNT - 1)) \ + F(KINGS_SHIELD_LOWER_ATK, kingsShieldLowerAtk, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPEED_BUFFING_RAPID_SPIN, speedBuffingRapidSpin, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CHARGE_SPDEF_RAISE, chargeSpDefRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MINIMIZE_EVASION, minimizeEvasion, (u32, GEN_COUNT - 1)) \ + F(GROWTH_STAT_RAISE, growthStatRaise, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(FOCUS_ENERGY_CRIT_RATIO, focusEnergyCritRatio, (u32, GEN_COUNT - 1)) \ + /* Other move settings */ \ + F(INCINERATE_GEMS, incinerateGems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CAN_SPITE_FAIL, canSpiteFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CRASH_IF_TARGET_IMMUNE, crashIfTargetImmune, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MEMENTO_FAIL, mementoFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(GLARE_GHOST, glareGhost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SKILL_SWAP, skillSwap, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BRICK_BREAK, brickBreak, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WISH_HP_SOURCE, wishHpSource, (u32, GEN_COUNT - 1)) \ + F(RAMPAGE_CANCELLING, rampageCancelling, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAL_BLOCKING, healBlocking, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ROOTED_GROUNDING, rootedGrounding, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(METRONOME_MOVES, metronomeMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TELEPORT_BEHAVIOR, teleportBehavior, (u32, GEN_COUNT - 1)) \ + F(BEAT_UP, beatUp, (u32, GEN_COUNT - 1)) \ + F(DARK_VOID_FAIL, darkVoidFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BURN_HIT_THAW, burnHitThaw, (u32, GEN_COUNT - 1)) \ + F(HEALING_WISH_SWITCH, healingWishSwitch, (u32, GEN_COUNT - 1)) \ + F(DEFOG_EFFECT_CLEARING, defogEffectClearing, (u32, GEN_COUNT - 1)) \ + F(STOCKPILE_RAISES_DEFS, stockpileRaisesDefs, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRANSFORM_SHINY, transformShiny, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRANSFORM_FORM_CHANGES, transformFormChanges, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WIDE_GUARD, wideGuard, (u32, GEN_COUNT - 1)) \ + F(QUICK_GUARD, quickGuard, (u32, GEN_COUNT - 1)) \ + F(IMPRISON, imprison, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ALLY_SWITCH_FAIL_CHANCE, allySwitchFailChance, (u32, GEN_COUNT - 1)) \ + F(SKETCH_BANS, sketchBans, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(KNOCK_OFF_REMOVAL, knockOffRemoval, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAL_BELL_SOUNDPROOF, healBellSoundproof, (u32, GEN_COUNT - 1)) \ + F(CHARGE, charge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(POWDER_STATUS_HEAVY_RAIN, powderStatusHeavyRain, (u32, GEN_COUNT - 1)) \ + F(AFTER_YOU_TURN_ORDER, afterYouTurnOrder, (u32, GEN_COUNT - 1)) \ + F(QUASH_TURN_ORDER, quashTurnOrder, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DESTINY_BOND_FAIL, destinyBondFail, (u32, GEN_COUNT - 1)) \ + F(PURSUIT_TARGET, pursuitTarget, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SKIP_RECHARGE, skipRecharge, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(ENCORE_TARGET, encoreTarget, (u32, GEN_COUNT - 1)) \ + F(TIME_OF_DAY_HEALING_MOVES, timeOfDayHealingMoves, (u32, GEN_COUNT - 1)) \ + F(DREAM_EATER_LIQUID_OOZE, dreamEaterLiquidOoze, (u32, GEN_COUNT - 1)) \ + F(FOCUS_PUNCH_FAILURE, focusPunchFailure, (u32, GEN_COUNT - 1)) \ + F(RAGE_BUILDS, rageBuilds, (u32, GEN_COUNT - 1)) \ + F(CHECK_USER_FAILURE, checkUserFailure, (u32, GEN_COUNT - 1)) \ + /* Ability settings */ \ + F(GALE_WINGS, galeWings, (u32, GEN_COUNT - 1)) \ + F(STANCE_CHANGE_FAIL, stanceChangeFail, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SHADOW_TAG_ESCAPE, shadowTagEscape, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MOODY_ACC_EVASION, moodyAccEvasion, (u32, GEN_COUNT - 1)) \ + F(FLASH_FIRE_FROZEN, flashFireFrozen, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SYNCHRONIZE_TOXIC, synchronizeToxic, (u32, GEN_COUNT - 1)) \ + F(UPDATED_INTIMIDATE, updatedIntimidate, (u32, GEN_COUNT - 1)) \ + F(OBLIVIOUS_TAUNT, obliviousTaunt, (u32, GEN_COUNT - 1)) \ + F(STURDY, sturdy, (u32, GEN_COUNT - 1)) \ + F(PLUS_MINUS_INTERACTION, plusMinusInteraction, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(WEATHER_FORMS, weatherForms, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SYMBIOSIS_GEMS, symbiosisGems, (u32, GEN_COUNT - 1)) \ + F(REDIRECT_ABILITY_IMMUNITY, redirectAbilityImmunity, (u32, GEN_COUNT - 1)) \ + F(REDIRECT_ABILITY_ALLIES, redirectAbilityAllies, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LEAF_GUARD_PREVENTS_REST, leafGuardPreventsRest, (u32, GEN_COUNT - 1)) \ + F(TRANSISTOR_BOOST, transistorBoost, (u32, GEN_COUNT - 1)) \ + F(ILLUMINATE_EFFECT, illuminateEffect, (u32, GEN_COUNT - 1)) \ + F(WEAK_ARMOR_SPEED, weakArmorSpeed, (u32, GEN_COUNT - 1)) \ + F(PROTEAN_LIBERO, proteanLibero, (u32, GEN_COUNT - 1)) \ + F(INTREPID_SWORD, intrepidSword, (u32, GEN_COUNT - 1)) \ + F(DAUNTLESS_SHIELD, dauntlessShield, (u32, GEN_COUNT - 1)) \ + F(DISGUISE_HP_LOSS, disguiseHpLoss, (u32, GEN_COUNT - 1)) \ + F(ABILITY_TRIGGER_CHANCE, abilityTriggerChance, (u32, GEN_COUNT - 1)) \ + F(PICKUP_WILD, pickupWild, (u32, GEN_COUNT - 1)) \ + F(MAGIC_GUARD, magicGuard, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(BATTLE_BOND, battleBond, (u32, GEN_COUNT - 1)) \ + F(ATE_MULTIPLIER, ateMultiplier, (u32, GEN_COUNT - 1)) \ + F(DEFIANT_STICKY_WEB, defiantStickyWeb, (u32, GEN_COUNT - 1)) \ + /* Item settings */ \ + F(CONFUSE_BERRIES_HEAL, confuseBerriesHeal, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(X_ITEMS_BUFF, xItemsBuff, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(MENTAL_HERB, mentalHerb, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TRAINERS_KNOCK_OFF_ITEMS, trainersKnockOffItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(RETURN_STOLEN_NPC_ITEMS, returnStolenNpcItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(STEAL_WILD_ITEMS, stealWildItems, (u32, GEN_COUNT - 1)) \ + F(RESTORE_HELD_BATTLE_ITEMS, restoreHeldBattleItems, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SOUL_DEW_BOOST, soulDewBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NET_BALL_MODIFIER, netBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DIVE_BALL_MODIFIER, diveBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NEST_BALL_MODIFIER, nestBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(REPEAT_BALL_MODIFIER, repeatBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(TIMER_BALL_MODIFIER, timerBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DUSK_BALL_MODIFIER, duskBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(QUICK_BALL_MODIFIER, quickBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(LURE_BALL_MODIFIER, lureBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(HEAVY_BALL_MODIFIER, heavyBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(DREAM_BALL_MODIFIER, dreamBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SPORT_BALL_MODIFIER, sportBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SAFARI_BALL_MODIFIER, safariBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(FRIEND_BALL_MODIFIER, friendBallModifier, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SERENE_GRACE_BOOST, sereneGraceBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(IRON_BALL, ironBall, (u32, GEN_COUNT - 1)) \ + /* Weather settings */ \ + F(ABILITY_WEATHER, abilityWeather, (u32, GEN_COUNT - 1)) \ + F(SANDSTORM_SPDEF_BOOST, sandstormSpDefBoost, (u32, GEN_COUNT - 1)) \ + F(OVERWORLD_FOG, overworldFog, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(OVERWORLD_SNOW, overworldSnow, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SNOW_WARNING, snowWarning, (u32, GEN_COUNT - 1)) \ + F(PREFERRED_ICE_WEATHER, preferredIceWeather, (u32, B_ICE_WEATHER_SNOW)) /* TODO: use in tests */ \ + /* Terrain settings */ \ + F(TERRAIN_TYPE_BOOST, terrainTypeBoost, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SECRET_POWER_EFFECT, secretPowerEffect, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SECRET_POWER_ANIMATION, secretPowerAnimation, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(NATURE_POWER_MOVES, naturePowerMoves, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(CAMOUFLAGE_TYPES, camouflageTypes, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + /* Catching settings */ \ + F(SEMI_INVULNERABLE_CATCH, semiInvulnerableCatch, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(INCAPACITATED_CATCH_BONUS, incapacitatedCatchBonus, (u32, GEN_COUNT - 1)) \ + F(LOW_LEVEL_CATCH_BONUS, lowLevlCatchBonus, (u32, GEN_COUNT - 1)) \ + F(MISSING_BADGE_CATCH_MALUS, missingBadgeCatchMalue, (u32, GEN_COUNT - 1)) \ + F(CRITICAL_CAPTURE_IF_OWNED, criticalCaptureIfOwned, (u32, GEN_COUNT - 1)) \ + /* Other settings */ \ + F(WILD_NATURAL_ENEMIES, wildNaturalEnemies, (u32, TRUE)) /* TODO: use in tests */ \ + F(AFFECTION_MECHANICS, affectionMechanics, (u32, TRUE)) /* TODO: use in tests */ \ + F(OBEDIENCE_MECHANICS, obedienceMechanics, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(USE_FROSTBITE, useFrostbite, (u32, GEN_COUNT - 1)) /* TODO: use in tests */ \ + F(SANDSTORM_SOLAR_BEAM, standstormSolarBeam, (u32, GEN_COUNT - 1)) \ + F(COUNTER_MIRROR_COAT_ALLY, counterMirrorCoatAlly, (u32, GEN_COUNT - 1)) \ + F(COUNTER_TRY_HIT_PARTNER, counterTryHitPartner, (u32, GEN_COUNT - 1)) \ + + +#define POKEMON_CONFIG_DEFINITIONS(F) \ + F(POKERUS_ENABLED, pokerusEnabled, (u32, TRUE)) \ + F(POKERUS_SPREAD_ADJACENCY, pokerusSpreadAdjacency, (u32, GEN_COUNT - 1)) \ + F(POKERUS_SPREAD_DAYS_LEFT, pokerusSpreadDaysLeft, (u32, GEN_COUNT - 1)) \ + F(POKERUS_INFECT_AGAIN, pokerusInfectAgain, (u32, GEN_COUNT - 1)) \ + F(POKERUS_INFECT_EGG, pokerusInfectEgg, (u32, TRUE)) \ + F(POKERUS_HERD_IMMUNITY, pokerusHerdImmunity, (u32, TRUE)) \ + F(POKERUS_WEAK_VARIANT, pokerusWeakVariant, (u32, TRUE)) \ + + +#define GET_CONFIG_MAXIMUM(_typeMaxValue, ...) INVOKE_WITH_B(GET_CONFIG_MAXIMUM_, _typeMaxValue) +#define GET_CONFIG_MAXIMUM_(_type, ...) FIRST(__VA_OPT__(FIRST(__VA_ARGS__),) MAX_BITS((sizeof(_type) * 8))) + +#define UNPACK_CONFIG_ENUMS(_name, ...) CONFIG_##_name, + +enum ConfigTag { - GEN_CONFIG_CRIT_CHANCE, - GEN_CONFIG_CRIT_MULTIPLIER, - GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, - GEN_CONFIG_PARALYSIS_SPEED, - GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, - GEN_CONFIG_MULTI_HIT_CHANCE, - GEN_CONFIG_GALE_WINGS, - GEN_CONFIG_HEAL_BELL_SOUNDPROOF, - GEN_CONFIG_TELEPORT_BEHAVIOR, - GEN_CONFIG_ABILITY_WEATHER, - GEN_CONFIG_MOODY_STATS, - GEN_CONFIG_BATTLE_BOND, - GEN_CONFIG_ATE_MULTIPLIER, - GEN_CONFIG_FELL_STINGER_STAT_RAISE, - GEN_CONFIG_DEFIANT_STICKY_WEB, - GEN_CONFIG_ENCORE_TARGET, - GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, - GEN_PICKUP_WILD, - GEN_PROTEAN_LIBERO, - GEN_INTREPID_SWORD, - GEN_DAUNTLESS_SHIELD, - GEN_ILLUMINATE_EFFECT, - GEN_STEAL_WILD_ITEMS, - GEN_SNOW_WARNING, - GEN_ALLY_SWITCH_FAIL_CHANCE, - GEN_DREAM_EATER_LIQUID_OOZE, - GEN_CONFIG_TRANSISTOR_BOOST, - GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, - GEN_CONFIG_UPDATED_INTIMIDATE, - GEN_CONFIG_DISGUISE_HP_LOSS, - GEN_CONFIG_AFTER_YOU_TURN_ORDER, - GEN_CONFIG_HEALING_WISH_SWITCH, - GEN_CONFIG_MEGA_EVO_TURN_ORDER, - GEN_CONFIG_SHEER_COLD_IMMUNITY, - GEN_CONFIG_WEAK_ARMOR_SPEED, - GEN_CONFIG_PRANKSTER_DARK_TYPES, - GEN_CONFIG_DESTINY_BOND_FAIL, - GEN_CONFIG_POWDER_RAIN, - GEN_CONFIG_POWDER_GRASS, - GEN_CONFIG_POWDER_OVERCOAT, - GEN_CONFIG_OBLIVIOUS_TAUNT, - GEN_CONFIG_TOXIC_NEVER_MISS, - GEN_CONFIG_PARALYZE_ELECTRIC, - GEN_CONFIG_BADGE_BOOST, - GEN_CONFIG_COUNT + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_ENUMS) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_ENUMS) + CONFIG_COUNT }; #endif // GUARD_CONSTANTS_GENERATIONAL_CHANGES_H diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 32dacc36d..bec914c68 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -45,10 +45,8 @@ enum __attribute__((packed)) HoldEffect HOLD_EFFECT_LUCKY_EGG, HOLD_EFFECT_SCOPE_LENS, HOLD_EFFECT_LEFTOVERS, - HOLD_EFFECT_DRAGON_SCALE, HOLD_EFFECT_LIGHT_BALL, HOLD_EFFECT_TYPE_POWER, - HOLD_EFFECT_UPGRADE, HOLD_EFFECT_SHELL_BELL, HOLD_EFFECT_LUCKY_PUNCH, HOLD_EFFECT_METAL_POWDER, @@ -157,6 +155,7 @@ enum ItemActivationState ACTIVATION_ON_PICK_UP, ACTIVATION_ON_HARVEST, ACTIVATION_ON_HP_THRESHOLD, + ACTIVATION_ON_STATUS_CHANGE, }; #endif // GUARD_HOLD_EFFECTS_H diff --git a/include/constants/item_effects.h b/include/constants/item_effects.h index dbe322bea..037f28c4b 100644 --- a/include/constants/item_effects.h +++ b/include/constants/item_effects.h @@ -93,6 +93,9 @@ #define ITEM_EFFECT_HEAL_PP 21 #define ITEM_EFFECT_NONE 22 +#define ITEM_FRIENDSHIP_MAPSEC_BONUS 1 // The amount of bonus friendship gained when an item is used on a Pokémon whose met location matches the current map section. +#define ITEM_FRIENDSHIP_LUXURY_BONUS 1 // The amount of bonus friendship gained when a Pokémon is in the Luxury Ball. + // Since X item stat increases are now handled by battle scripts, the friendship increase effect is now handled by the battle controller in HandleAction_UseItem. #define X_ITEM_FRIENDSHIP_INCREASE 1 // The amount of friendship gained by using an X item on a Pokémon in battle. #define X_ITEM_MAX_FRIENDSHIP 200 // Friendship threshold at which Pokémon stop receiving a friendship increase from using X items on them in battle. diff --git a/include/constants/items.h b/include/constants/items.h index 87b349323..275c11ce0 100644 --- a/include/constants/items.h +++ b/include/constants/items.h @@ -1,640 +1,1064 @@ #ifndef GUARD_CONSTANTS_ITEMS_H #define GUARD_CONSTANTS_ITEMS_H -#define ITEM_NONE 0 +#include "metaprogram.h" +#include "constants/tms_hms.h" -// Poké Balls -#define ITEM_POKE_BALL 1 -#define ITEM_GREAT_BALL 2 -#define ITEM_ULTRA_BALL 3 -#define ITEM_MASTER_BALL 4 -#define ITEM_PREMIER_BALL 5 -#define ITEM_HEAL_BALL 6 -#define ITEM_NET_BALL 7 -#define ITEM_NEST_BALL 8 -#define ITEM_DIVE_BALL 9 -#define ITEM_DUSK_BALL 10 -#define ITEM_TIMER_BALL 11 -#define ITEM_QUICK_BALL 12 -#define ITEM_REPEAT_BALL 13 -#define ITEM_LUXURY_BALL 14 -#define ITEM_LEVEL_BALL 15 -#define ITEM_LURE_BALL 16 -#define ITEM_MOON_BALL 17 -#define ITEM_FRIEND_BALL 18 -#define ITEM_LOVE_BALL 19 -#define ITEM_FAST_BALL 20 -#define ITEM_HEAVY_BALL 21 -#define ITEM_DREAM_BALL 22 -#define ITEM_SAFARI_BALL 23 -#define ITEM_SPORT_BALL 24 -#define ITEM_PARK_BALL 25 -#define ITEM_BEAST_BALL 26 -#define ITEM_CHERISH_BALL 27 +enum __attribute__((packed)) Item +{ + ITEM_NONE = 0, -// Medicine -#define ITEM_POTION 28 -#define ITEM_SUPER_POTION 29 -#define ITEM_HYPER_POTION 30 -#define ITEM_MAX_POTION 31 -#define ITEM_FULL_RESTORE 32 -#define ITEM_REVIVE 33 -#define ITEM_MAX_REVIVE 34 -#define ITEM_FRESH_WATER 35 -#define ITEM_SODA_POP 36 -#define ITEM_LEMONADE 37 -#define ITEM_MOOMOO_MILK 38 -#define ITEM_ENERGY_POWDER 39 -#define ITEM_ENERGYPOWDER ITEM_ENERGY_POWDER // Pre-Gen VI name -#define ITEM_ENERGY_ROOT 40 -#define ITEM_HEAL_POWDER 41 -#define ITEM_REVIVAL_HERB 42 -#define ITEM_ANTIDOTE 43 -#define ITEM_PARALYZE_HEAL 44 -#define ITEM_PARLYZ_HEAL ITEM_PARALYZE_HEAL // Pre-Gen VI name -#define ITEM_BURN_HEAL 45 -#define ITEM_ICE_HEAL 46 -#define ITEM_AWAKENING 47 -#define ITEM_FULL_HEAL 48 -#define ITEM_ETHER 49 -#define ITEM_MAX_ETHER 50 -#define ITEM_ELIXIR 51 -#define ITEM_ELIXER ITEM_ELIXIR // Pre-Gen III name -#define ITEM_MAX_ELIXIR 52 -#define ITEM_MAX_ELIXER ITEM_MAX_ELIXIR // Pre-Gen III name -#define ITEM_BERRY_JUICE 53 -#define ITEM_SACRED_ASH 54 -#define ITEM_SWEET_HEART 55 -#define ITEM_MAX_HONEY 56 + // Poké Balls + ITEM_POKE_BALL = 1, + ITEM_GREAT_BALL = 2, + ITEM_ULTRA_BALL = 3, + ITEM_MASTER_BALL = 4, + ITEM_PREMIER_BALL = 5, + ITEM_HEAL_BALL = 6, + ITEM_NET_BALL = 7, + ITEM_NEST_BALL = 8, + ITEM_DIVE_BALL = 9, + ITEM_DUSK_BALL = 10, + ITEM_TIMER_BALL = 11, + ITEM_QUICK_BALL = 12, + ITEM_REPEAT_BALL = 13, + ITEM_LUXURY_BALL = 14, + ITEM_LEVEL_BALL = 15, + ITEM_LURE_BALL = 16, + ITEM_MOON_BALL = 17, + ITEM_FRIEND_BALL = 18, + ITEM_LOVE_BALL = 19, + ITEM_FAST_BALL = 20, + ITEM_HEAVY_BALL = 21, + ITEM_DREAM_BALL = 22, + ITEM_SAFARI_BALL = 23, + ITEM_SPORT_BALL = 24, + ITEM_PARK_BALL = 25, + ITEM_BEAST_BALL = 26, + ITEM_CHERISH_BALL = 27, -// Regional Specialties -#define ITEM_PEWTER_CRUNCHIES 57 -#define ITEM_RAGE_CANDY_BAR 58 -#define ITEM_RAGECANDYBAR ITEM_RAGE_CANDY_BAR // Pre-Gen VI name -#define ITEM_LAVA_COOKIE 59 -#define ITEM_OLD_GATEAU 60 -#define ITEM_CASTELIACONE 61 -#define ITEM_LUMIOSE_GALETTE 62 -#define ITEM_SHALOUR_SABLE 63 -#define ITEM_BIG_MALASADA 64 + // Medicine + ITEM_POTION = 28, + ITEM_SUPER_POTION = 29, + ITEM_HYPER_POTION = 30, + ITEM_MAX_POTION = 31, + ITEM_FULL_RESTORE = 32, + ITEM_REVIVE = 33, + ITEM_MAX_REVIVE = 34, + ITEM_FRESH_WATER = 35, + ITEM_SODA_POP = 36, + ITEM_LEMONADE = 37, + ITEM_MOOMOO_MILK = 38, + ITEM_ENERGY_POWDER = 39, + ITEM_ENERGYPOWDER = ITEM_ENERGY_POWDER, // Pre-Gen VI name + ITEM_ENERGY_ROOT = 40, + ITEM_HEAL_POWDER = 41, + ITEM_REVIVAL_HERB = 42, + ITEM_ANTIDOTE = 43, + ITEM_PARALYZE_HEAL = 44, + ITEM_PARLYZ_HEAL = ITEM_PARALYZE_HEAL, // Pre-Gen VI name + ITEM_BURN_HEAL = 45, + ITEM_ICE_HEAL = 46, + ITEM_AWAKENING = 47, + ITEM_FULL_HEAL = 48, + ITEM_ETHER = 49, + ITEM_MAX_ETHER = 50, + ITEM_ELIXIR = 51, + ITEM_ELIXER = ITEM_ELIXIR, // Pre-Gen III name + ITEM_MAX_ELIXIR = 52, + ITEM_MAX_ELIXER = ITEM_MAX_ELIXIR, // Pre-Gen III name + ITEM_BERRY_JUICE = 53, + ITEM_SACRED_ASH = 54, + ITEM_SWEET_HEART = 55, + ITEM_MAX_HONEY = 56, -// Vitamins -#define ITEM_HP_UP 65 -#define ITEM_PROTEIN 66 -#define ITEM_IRON 67 -#define ITEM_CALCIUM 68 -#define ITEM_ZINC 69 -#define ITEM_CARBOS 70 -#define ITEM_PP_UP 71 -#define ITEM_PP_MAX 72 + // Regional Specialties + ITEM_PEWTER_CRUNCHIES = 57, + ITEM_RAGE_CANDY_BAR = 58, + ITEM_RAGECANDYBAR = ITEM_RAGE_CANDY_BAR, // Pre-Gen VI name + ITEM_LAVA_COOKIE = 59, + ITEM_OLD_GATEAU = 60, + ITEM_CASTELIACONE = 61, + ITEM_LUMIOSE_GALETTE = 62, + ITEM_SHALOUR_SABLE = 63, + ITEM_BIG_MALASADA = 64, -// EV Feathers -#define ITEM_HEALTH_FEATHER 73 -#define ITEM_HEALTH_WING ITEM_HEALTH_FEATHER // Pre-Gen VIII name -#define ITEM_MUSCLE_FEATHER 74 -#define ITEM_MUSCLE_WING ITEM_MUSCLE_FEATHER // Pre-Gen VIII name -#define ITEM_RESIST_FEATHER 75 -#define ITEM_RESIST_WING ITEM_RESIST_FEATHER // Pre-Gen VIII name -#define ITEM_GENIUS_FEATHER 76 -#define ITEM_GENIUS_WING ITEM_GENIUS_FEATHER // Pre-Gen VIII name -#define ITEM_CLEVER_FEATHER 77 -#define ITEM_CLEVER_WING ITEM_CLEVER_FEATHER // Pre-Gen VIII name -#define ITEM_SWIFT_FEATHER 78 -#define ITEM_SWIFT_WING ITEM_SWIFT_FEATHER // Pre-Gen VIII name + // Vitamins + ITEM_HP_UP = 65, + ITEM_PROTEIN = 66, + ITEM_IRON = 67, + ITEM_CALCIUM = 68, + ITEM_ZINC = 69, + ITEM_CARBOS = 70, + ITEM_PP_UP = 71, + ITEM_PP_MAX = 72, -// Ability Modifiers -#define ITEM_ABILITY_CAPSULE 79 -#define ITEM_ABILITY_PATCH 80 + // EV Feathers + ITEM_HEALTH_FEATHER = 73, + ITEM_HEALTH_WING = ITEM_HEALTH_FEATHER, // Pre-Gen VIII name + ITEM_MUSCLE_FEATHER = 74, + ITEM_MUSCLE_WING = ITEM_MUSCLE_FEATHER, // Pre-Gen VIII name + ITEM_RESIST_FEATHER = 75, + ITEM_RESIST_WING = ITEM_RESIST_FEATHER, // Pre-Gen VIII name + ITEM_GENIUS_FEATHER = 76, + ITEM_GENIUS_WING = ITEM_GENIUS_FEATHER, // Pre-Gen VIII name + ITEM_CLEVER_FEATHER = 77, + ITEM_CLEVER_WING = ITEM_CLEVER_FEATHER, // Pre-Gen VIII name + ITEM_SWIFT_FEATHER = 78, + ITEM_SWIFT_WING = ITEM_SWIFT_FEATHER, // Pre-Gen VIII name -// Mints -#define ITEM_LONELY_MINT 81 -#define ITEM_ADAMANT_MINT 82 -#define ITEM_NAUGHTY_MINT 83 -#define ITEM_BRAVE_MINT 84 -#define ITEM_BOLD_MINT 85 -#define ITEM_IMPISH_MINT 86 -#define ITEM_LAX_MINT 87 -#define ITEM_RELAXED_MINT 88 -#define ITEM_MODEST_MINT 89 -#define ITEM_MILD_MINT 90 -#define ITEM_RASH_MINT 91 -#define ITEM_QUIET_MINT 92 -#define ITEM_CALM_MINT 93 -#define ITEM_GENTLE_MINT 94 -#define ITEM_CAREFUL_MINT 95 -#define ITEM_SASSY_MINT 96 -#define ITEM_TIMID_MINT 97 -#define ITEM_HASTY_MINT 98 -#define ITEM_JOLLY_MINT 99 -#define ITEM_NAIVE_MINT 100 -#define ITEM_SERIOUS_MINT 101 + // Ability Modifiers + ITEM_ABILITY_CAPSULE = 79, + ITEM_ABILITY_PATCH = 80, -// Candy -#define ITEM_RARE_CANDY 102 -#define ITEM_EXP_CANDY_XS 103 -#define ITEM_EXP_CANDY_S 104 -#define ITEM_EXP_CANDY_M 105 -#define ITEM_EXP_CANDY_L 106 -#define ITEM_EXP_CANDY_XL 107 -#define ITEM_DYNAMAX_CANDY 108 + // Mints + ITEM_LONELY_MINT = 81, + ITEM_ADAMANT_MINT = 82, + ITEM_NAUGHTY_MINT = 83, + ITEM_BRAVE_MINT = 84, + ITEM_BOLD_MINT = 85, + ITEM_IMPISH_MINT = 86, + ITEM_LAX_MINT = 87, + ITEM_RELAXED_MINT = 88, + ITEM_MODEST_MINT = 89, + ITEM_MILD_MINT = 90, + ITEM_RASH_MINT = 91, + ITEM_QUIET_MINT = 92, + ITEM_CALM_MINT = 93, + ITEM_GENTLE_MINT = 94, + ITEM_CAREFUL_MINT = 95, + ITEM_SASSY_MINT = 96, + ITEM_TIMID_MINT = 97, + ITEM_HASTY_MINT = 98, + ITEM_JOLLY_MINT = 99, + ITEM_NAIVE_MINT = 100, + ITEM_SERIOUS_MINT = 101, -// Medicinal Flutes -#define ITEM_BLUE_FLUTE 109 -#define ITEM_YELLOW_FLUTE 110 -#define ITEM_RED_FLUTE 111 + // Candy + ITEM_RARE_CANDY = 102, + ITEM_EXP_CANDY_XS = 103, + ITEM_EXP_CANDY_S = 104, + ITEM_EXP_CANDY_M = 105, + ITEM_EXP_CANDY_L = 106, + ITEM_EXP_CANDY_XL = 107, + ITEM_DYNAMAX_CANDY = 108, -// Encounter-modifying Flutes -#define ITEM_BLACK_FLUTE 112 -#define ITEM_WHITE_FLUTE 113 + // Medicinal Flutes + ITEM_BLUE_FLUTE = 109, + ITEM_YELLOW_FLUTE = 110, + ITEM_RED_FLUTE = 111, -// Encounter Modifiers -#define ITEM_REPEL 114 -#define ITEM_SUPER_REPEL 115 -#define ITEM_MAX_REPEL 116 -#define ITEM_LURE 117 -#define ITEM_SUPER_LURE 118 -#define ITEM_MAX_LURE 119 + // Encounter-modifying Flutes + ITEM_BLACK_FLUTE = 112, + ITEM_WHITE_FLUTE = 113, -#define ITEM_ESCAPE_ROPE 120 + // Encounter Modifiers + ITEM_REPEL = 114, + ITEM_SUPER_REPEL = 115, + ITEM_MAX_REPEL = 116, + ITEM_LURE = 117, + ITEM_SUPER_LURE = 118, + ITEM_MAX_LURE = 119, -// X Items -#define ITEM_X_ATTACK 121 -#define ITEM_X_DEFENSE 122 -#define ITEM_X_DEFEND ITEM_X_DEFENSE // Pre-Gen VI name -#define ITEM_X_SP_ATK 123 -#define ITEM_X_SPECIAL ITEM_X_SP_ATK // Pre-Gen VI name -#define ITEM_X_SP_DEF 124 -#define ITEM_X_SPEED 125 -#define ITEM_X_ACCURACY 126 + ITEM_ESCAPE_ROPE = 120, -#define ITEM_DIRE_HIT 127 -#define ITEM_GUARD_SPEC 128 + // X Items + ITEM_X_ATTACK = 121, + ITEM_X_DEFENSE = 122, + ITEM_X_DEFEND = ITEM_X_DEFENSE, // Pre-Gen VI name + ITEM_X_SP_ATK = 123, + ITEM_X_SPECIAL = ITEM_X_SP_ATK, // Pre-Gen VI name + ITEM_X_SP_DEF = 124, + ITEM_X_SPEED = 125, + ITEM_X_ACCURACY = 126, -// Escape Items -#define ITEM_POKE_DOLL 129 -#define ITEM_FLUFFY_TAIL 130 -#define ITEM_POKE_TOY 131 + ITEM_DIRE_HIT = 127, + ITEM_GUARD_SPEC = 128, -#define ITEM_MAX_MUSHROOMS 132 + // Escape Items + ITEM_POKE_DOLL = 129, + ITEM_FLUFFY_TAIL = 130, + ITEM_POKE_TOY = 131, -// Treasures -#define ITEM_BOTTLE_CAP 133 -#define ITEM_GOLD_BOTTLE_CAP 134 -#define ITEM_NUGGET 135 -#define ITEM_BIG_NUGGET 136 -#define ITEM_TINY_MUSHROOM 137 -#define ITEM_TINYMUSHROOM ITEM_TINY_MUSHROOM // Pre-Gen VI name -#define ITEM_BIG_MUSHROOM 138 -#define ITEM_BALM_MUSHROOM 139 -#define ITEM_BALMMUSHROOM ITEM_BALM_MUSHROOM // Pre-Gen VI name -#define ITEM_PEARL 140 -#define ITEM_BIG_PEARL 141 -#define ITEM_PEARL_STRING 142 -#define ITEM_STARDUST 143 -#define ITEM_STAR_PIECE 144 -#define ITEM_COMET_SHARD 145 -#define ITEM_SHOAL_SALT 146 -#define ITEM_SHOAL_SHELL 147 -#define ITEM_RED_SHARD 148 -#define ITEM_BLUE_SHARD 149 -#define ITEM_YELLOW_SHARD 150 -#define ITEM_GREEN_SHARD 151 -#define ITEM_HEART_SCALE 152 -#define ITEM_HONEY 153 -#define ITEM_RARE_BONE 154 -#define ITEM_ODD_KEYSTONE 155 -#define ITEM_PRETTY_FEATHER 156 -#define ITEM_PRETTY_WING ITEM_PRETTY_FEATHER // Pre-Gen VIII name -#define ITEM_RELIC_COPPER 157 -#define ITEM_RELIC_SILVER 158 -#define ITEM_RELIC_GOLD 159 -#define ITEM_RELIC_VASE 160 -#define ITEM_RELIC_BAND 161 -#define ITEM_RELIC_STATUE 162 -#define ITEM_RELIC_CROWN 163 -#define ITEM_STRANGE_SOUVENIR 164 + ITEM_MAX_MUSHROOMS = 132, -// Fossils -#define ITEM_HELIX_FOSSIL 165 -#define ITEM_DOME_FOSSIL 166 -#define ITEM_OLD_AMBER 167 -#define ITEM_ROOT_FOSSIL 168 -#define ITEM_CLAW_FOSSIL 169 -#define ITEM_ARMOR_FOSSIL 170 -#define ITEM_SKULL_FOSSIL 171 -#define ITEM_COVER_FOSSIL 172 -#define ITEM_PLUME_FOSSIL 173 -#define ITEM_JAW_FOSSIL 174 -#define ITEM_SAIL_FOSSIL 175 -#define ITEM_FOSSILIZED_BIRD 176 -#define ITEM_FOSSILIZED_FISH 177 -#define ITEM_FOSSILIZED_DRAKE 178 -#define ITEM_FOSSILIZED_DINO 179 + // Treasures + ITEM_BOTTLE_CAP = 133, + ITEM_GOLD_BOTTLE_CAP = 134, + ITEM_NUGGET = 135, + ITEM_BIG_NUGGET = 136, + ITEM_TINY_MUSHROOM = 137, + ITEM_TINYMUSHROOM = ITEM_TINY_MUSHROOM, // Pre-Gen VI name + ITEM_BIG_MUSHROOM = 138, + ITEM_BALM_MUSHROOM = 139, + ITEM_BALMMUSHROOM = ITEM_BALM_MUSHROOM, // Pre-Gen VI name + ITEM_PEARL = 140, + ITEM_BIG_PEARL = 141, + ITEM_PEARL_STRING = 142, + ITEM_STARDUST = 143, + ITEM_STAR_PIECE = 144, + ITEM_COMET_SHARD = 145, + ITEM_SHOAL_SALT = 146, + ITEM_SHOAL_SHELL = 147, + ITEM_RED_SHARD = 148, + ITEM_BLUE_SHARD = 149, + ITEM_YELLOW_SHARD = 150, + ITEM_GREEN_SHARD = 151, + ITEM_HEART_SCALE = 152, + ITEM_HONEY = 153, + ITEM_RARE_BONE = 154, + ITEM_ODD_KEYSTONE = 155, + ITEM_PRETTY_FEATHER = 156, + ITEM_PRETTY_WING = ITEM_PRETTY_FEATHER, // Pre-Gen VIII name + ITEM_RELIC_COPPER = 157, + ITEM_RELIC_SILVER = 158, + ITEM_RELIC_GOLD = 159, + ITEM_RELIC_VASE = 160, + ITEM_RELIC_BAND = 161, + ITEM_RELIC_STATUE = 162, + ITEM_RELIC_CROWN = 163, + ITEM_STRANGE_SOUVENIR = 164, -// Mulch -#define ITEM_GROWTH_MULCH 180 -#define ITEM_DAMP_MULCH 181 -#define ITEM_STABLE_MULCH 182 -#define ITEM_GOOEY_MULCH 183 -#define ITEM_RICH_MULCH 184 -#define ITEM_SURPRISE_MULCH 185 -#define ITEM_BOOST_MULCH 186 -#define ITEM_AMAZE_MULCH 187 + // Fossils + ITEM_HELIX_FOSSIL = 165, + ITEM_DOME_FOSSIL = 166, + ITEM_OLD_AMBER = 167, + ITEM_ROOT_FOSSIL = 168, + ITEM_CLAW_FOSSIL = 169, + ITEM_ARMOR_FOSSIL = 170, + ITEM_SKULL_FOSSIL = 171, + ITEM_COVER_FOSSIL = 172, + ITEM_PLUME_FOSSIL = 173, + ITEM_JAW_FOSSIL = 174, + ITEM_SAIL_FOSSIL = 175, + ITEM_FOSSILIZED_BIRD = 176, + ITEM_FOSSILIZED_FISH = 177, + ITEM_FOSSILIZED_DRAKE = 178, + ITEM_FOSSILIZED_DINO = 179, -// Apricorns -#define ITEM_RED_APRICORN 188 -#define ITEM_BLUE_APRICORN 189 -#define ITEM_BLU_APRICORN ITEM_BLUE_APRICORN // Pre-Gen VI name -#define ITEM_YELLOW_APRICORN 190 -#define ITEM_YLW_APRICORN ITEM_YELLOW_APRICORN // Pre-Gen VI name -#define ITEM_GREEN_APRICORN 191 -#define ITEM_GRN_APRICORN ITEM_GREEN_APRICORN // Pre-Gen VI name -#define ITEM_PINK_APRICORN 192 -#define ITEM_PNK_APRICORN ITEM_PINK_APRICORN // Pre-Gen VI name -#define ITEM_WHITE_APRICORN 193 -#define ITEM_WHT_APRICORN ITEM_WHITE_APRICORN // Pre-Gen VI name -#define ITEM_BLACK_APRICORN 194 -#define ITEM_BLK_APRICORN ITEM_BLACK_APRICORN // Pre-Gen VI name + // Mulch + ITEM_GROWTH_MULCH = 180, + ITEM_DAMP_MULCH = 181, + ITEM_STABLE_MULCH = 182, + ITEM_GOOEY_MULCH = 183, + ITEM_RICH_MULCH = 184, + ITEM_SURPRISE_MULCH = 185, + ITEM_BOOST_MULCH = 186, + ITEM_AMAZE_MULCH = 187, -#define ITEM_WISHING_PIECE 195 -#define ITEM_GALARICA_TWIG 196 -#define ITEM_ARMORITE_ORE 197 -#define ITEM_DYNITE_ORE 198 + // Apricorns + ITEM_RED_APRICORN = 188, + ITEM_BLUE_APRICORN = 189, + ITEM_BLU_APRICORN = ITEM_BLUE_APRICORN, // Pre-Gen VI name + ITEM_YELLOW_APRICORN = 190, + ITEM_YLW_APRICORN = ITEM_YELLOW_APRICORN, // Pre-Gen VI name + ITEM_GREEN_APRICORN = 191, + ITEM_GRN_APRICORN = ITEM_GREEN_APRICORN, // Pre-Gen VI name + ITEM_PINK_APRICORN = 192, + ITEM_PNK_APRICORN = ITEM_PINK_APRICORN, // Pre-Gen VI name + ITEM_WHITE_APRICORN = 193, + ITEM_WHT_APRICORN = ITEM_WHITE_APRICORN, // Pre-Gen VI name + ITEM_BLACK_APRICORN = 194, + ITEM_BLK_APRICORN = ITEM_BLACK_APRICORN, // Pre-Gen VI name -// Mail -#define ITEM_ORANGE_MAIL 199 -#define ITEM_HARBOR_MAIL 200 -#define ITEM_GLITTER_MAIL 201 -#define ITEM_MECH_MAIL 202 -#define ITEM_WOOD_MAIL 203 -#define ITEM_WAVE_MAIL 204 -#define ITEM_BEAD_MAIL 205 -#define ITEM_SHADOW_MAIL 206 -#define ITEM_TROPIC_MAIL 207 -#define ITEM_DREAM_MAIL 208 -#define ITEM_FAB_MAIL 209 -#define ITEM_RETRO_MAIL 210 + ITEM_WISHING_PIECE = 195, + ITEM_GALARICA_TWIG = 196, + ITEM_ARMORITE_ORE = 197, + ITEM_DYNITE_ORE = 198, -#define FIRST_MAIL_INDEX ITEM_ORANGE_MAIL + // Mail + FIRST_MAIL_INDEX = 199, + ITEM_ORANGE_MAIL = FIRST_MAIL_INDEX, + ITEM_HARBOR_MAIL = 200, + ITEM_GLITTER_MAIL = 201, + ITEM_MECH_MAIL = 202, + ITEM_WOOD_MAIL = 203, + ITEM_WAVE_MAIL = 204, + ITEM_BEAD_MAIL = 205, + ITEM_SHADOW_MAIL = 206, + ITEM_TROPIC_MAIL = 207, + ITEM_DREAM_MAIL = 208, + ITEM_FAB_MAIL = 209, + ITEM_RETRO_MAIL = 210, -// Evolution Items -#define ITEM_FIRE_STONE 211 -#define ITEM_WATER_STONE 212 -#define ITEM_THUNDER_STONE 213 -#define ITEM_THUNDERSTONE ITEM_THUNDER_STONE // Pre-Gen VI name -#define ITEM_LEAF_STONE 214 -#define ITEM_ICE_STONE 215 -#define ITEM_SUN_STONE 216 -#define ITEM_MOON_STONE 217 -#define ITEM_SHINY_STONE 218 -#define ITEM_DUSK_STONE 219 -#define ITEM_DAWN_STONE 220 -#define ITEM_SWEET_APPLE 221 -#define ITEM_TART_APPLE 222 -#define ITEM_CRACKED_POT 223 -#define ITEM_CHIPPED_POT 224 -#define ITEM_GALARICA_CUFF 225 -#define ITEM_GALARICA_WREATH 226 -#define ITEM_DRAGON_SCALE 227 -#define ITEM_UPGRADE 228 -#define ITEM_UP_GRADE ITEM_UPGRADE // Pre-Gen VIII name -#define ITEM_PROTECTOR 229 -#define ITEM_ELECTIRIZER 230 -#define ITEM_MAGMARIZER 231 -#define ITEM_DUBIOUS_DISC 232 -#define ITEM_REAPER_CLOTH 233 -#define ITEM_PRISM_SCALE 234 -#define ITEM_WHIPPED_DREAM 235 -#define ITEM_SACHET 236 -#define ITEM_OVAL_STONE 237 -#define ITEM_STRAWBERRY_SWEET 238 -#define ITEM_LOVE_SWEET 239 -#define ITEM_BERRY_SWEET 240 -#define ITEM_CLOVER_SWEET 241 -#define ITEM_FLOWER_SWEET 242 -#define ITEM_STAR_SWEET 243 -#define ITEM_RIBBON_SWEET 244 + // Evolution Items + ITEM_FIRE_STONE = 211, + ITEM_WATER_STONE = 212, + ITEM_THUNDER_STONE = 213, + ITEM_THUNDERSTONE = ITEM_THUNDER_STONE, // Pre-Gen VI name + ITEM_LEAF_STONE = 214, + ITEM_ICE_STONE = 215, + ITEM_SUN_STONE = 216, + ITEM_MOON_STONE = 217, + ITEM_SHINY_STONE = 218, + ITEM_DUSK_STONE = 219, + ITEM_DAWN_STONE = 220, + ITEM_SWEET_APPLE = 221, + ITEM_TART_APPLE = 222, + ITEM_CRACKED_POT = 223, + ITEM_CHIPPED_POT = 224, + ITEM_GALARICA_CUFF = 225, + ITEM_GALARICA_WREATH = 226, + ITEM_DRAGON_SCALE = 227, + ITEM_UPGRADE = 228, + ITEM_UP_GRADE = ITEM_UPGRADE, // Pre-Gen VIII name + ITEM_PROTECTOR = 229, + ITEM_ELECTIRIZER = 230, + ITEM_MAGMARIZER = 231, + ITEM_DUBIOUS_DISC = 232, + ITEM_REAPER_CLOTH = 233, + ITEM_PRISM_SCALE = 234, + ITEM_WHIPPED_DREAM = 235, + ITEM_SACHET = 236, + ITEM_OVAL_STONE = 237, + ITEM_STRAWBERRY_SWEET = 238, + ITEM_LOVE_SWEET = 239, + ITEM_BERRY_SWEET = 240, + ITEM_CLOVER_SWEET = 241, + ITEM_FLOWER_SWEET = 242, + ITEM_STAR_SWEET = 243, + ITEM_RIBBON_SWEET = 244, -#define ITEM_EVERSTONE 245 + ITEM_EVERSTONE = 245, -// Nectars -#define ITEM_RED_NECTAR 246 -#define ITEM_YELLOW_NECTAR 247 -#define ITEM_PINK_NECTAR 248 -#define ITEM_PURPLE_NECTAR 249 + // Nectars + ITEM_RED_NECTAR = 246, + ITEM_YELLOW_NECTAR = 247, + ITEM_PINK_NECTAR = 248, + ITEM_PURPLE_NECTAR = 249, -// Plates -#define ITEM_FLAME_PLATE 250 -#define ITEM_SPLASH_PLATE 251 -#define ITEM_ZAP_PLATE 252 -#define ITEM_MEADOW_PLATE 253 -#define ITEM_ICICLE_PLATE 254 -#define ITEM_FIST_PLATE 255 -#define ITEM_TOXIC_PLATE 256 -#define ITEM_EARTH_PLATE 257 -#define ITEM_SKY_PLATE 258 -#define ITEM_MIND_PLATE 259 -#define ITEM_INSECT_PLATE 260 -#define ITEM_STONE_PLATE 261 -#define ITEM_SPOOKY_PLATE 262 -#define ITEM_DRACO_PLATE 263 -#define ITEM_DREAD_PLATE 264 -#define ITEM_IRON_PLATE 265 -#define ITEM_PIXIE_PLATE 266 + // Plates + ITEM_FLAME_PLATE = 250, + ITEM_SPLASH_PLATE = 251, + ITEM_ZAP_PLATE = 252, + ITEM_MEADOW_PLATE = 253, + ITEM_ICICLE_PLATE = 254, + ITEM_FIST_PLATE = 255, + ITEM_TOXIC_PLATE = 256, + ITEM_EARTH_PLATE = 257, + ITEM_SKY_PLATE = 258, + ITEM_MIND_PLATE = 259, + ITEM_INSECT_PLATE = 260, + ITEM_STONE_PLATE = 261, + ITEM_SPOOKY_PLATE = 262, + ITEM_DRACO_PLATE = 263, + ITEM_DREAD_PLATE = 264, + ITEM_IRON_PLATE = 265, + ITEM_PIXIE_PLATE = 266, -// Drives -#define ITEM_DOUSE_DRIVE 267 -#define ITEM_SHOCK_DRIVE 268 -#define ITEM_BURN_DRIVE 269 -#define ITEM_CHILL_DRIVE 270 + // Drives + ITEM_DOUSE_DRIVE = 267, + ITEM_SHOCK_DRIVE = 268, + ITEM_BURN_DRIVE = 269, + ITEM_CHILL_DRIVE = 270, -// Memories -#define ITEM_FIRE_MEMORY 271 -#define ITEM_WATER_MEMORY 272 -#define ITEM_ELECTRIC_MEMORY 273 -#define ITEM_GRASS_MEMORY 274 -#define ITEM_ICE_MEMORY 275 -#define ITEM_FIGHTING_MEMORY 276 -#define ITEM_POISON_MEMORY 277 -#define ITEM_GROUND_MEMORY 278 -#define ITEM_FLYING_MEMORY 279 -#define ITEM_PSYCHIC_MEMORY 280 -#define ITEM_BUG_MEMORY 281 -#define ITEM_ROCK_MEMORY 282 -#define ITEM_GHOST_MEMORY 283 -#define ITEM_DRAGON_MEMORY 284 -#define ITEM_DARK_MEMORY 285 -#define ITEM_STEEL_MEMORY 286 -#define ITEM_FAIRY_MEMORY 287 + // Memories + ITEM_FIRE_MEMORY = 271, + ITEM_WATER_MEMORY = 272, + ITEM_ELECTRIC_MEMORY = 273, + ITEM_GRASS_MEMORY = 274, + ITEM_ICE_MEMORY = 275, + ITEM_FIGHTING_MEMORY = 276, + ITEM_POISON_MEMORY = 277, + ITEM_GROUND_MEMORY = 278, + ITEM_FLYING_MEMORY = 279, + ITEM_PSYCHIC_MEMORY = 280, + ITEM_BUG_MEMORY = 281, + ITEM_ROCK_MEMORY = 282, + ITEM_GHOST_MEMORY = 283, + ITEM_DRAGON_MEMORY = 284, + ITEM_DARK_MEMORY = 285, + ITEM_STEEL_MEMORY = 286, + ITEM_FAIRY_MEMORY = 287, -#define ITEM_RUSTED_SWORD 288 -#define ITEM_RUSTED_SHIELD 289 + ITEM_RUSTED_SWORD = 288, + ITEM_RUSTED_SHIELD = 289, -// Colored Orbs -#define ITEM_RED_ORB 290 -#define ITEM_BLUE_ORB 291 + // Colored Orbs + ITEM_RED_ORB = 290, + ITEM_BLUE_ORB = 291, -// Mega Stones -#define ITEM_VENUSAURITE 292 -#define ITEM_CHARIZARDITE_X 293 -#define ITEM_CHARIZARDITE_Y 294 -#define ITEM_BLASTOISINITE 295 -#define ITEM_BEEDRILLITE 296 -#define ITEM_PIDGEOTITE 297 -#define ITEM_ALAKAZITE 298 -#define ITEM_SLOWBRONITE 299 -#define ITEM_GENGARITE 300 -#define ITEM_KANGASKHANITE 301 -#define ITEM_PINSIRITE 302 -#define ITEM_GYARADOSITE 303 -#define ITEM_AERODACTYLITE 304 -#define ITEM_MEWTWONITE_X 305 -#define ITEM_MEWTWONITE_Y 306 -#define ITEM_AMPHAROSITE 307 -#define ITEM_STEELIXITE 308 -#define ITEM_SCIZORITE 309 -#define ITEM_HERACRONITE 310 -#define ITEM_HOUNDOOMINITE 311 -#define ITEM_TYRANITARITE 312 -#define ITEM_SCEPTILITE 313 -#define ITEM_BLAZIKENITE 314 -#define ITEM_SWAMPERTITE 315 -#define ITEM_GARDEVOIRITE 316 -#define ITEM_SABLENITE 317 -#define ITEM_MAWILITE 318 -#define ITEM_AGGRONITE 319 -#define ITEM_MEDICHAMITE 320 -#define ITEM_MANECTITE 321 -#define ITEM_SHARPEDONITE 322 -#define ITEM_CAMERUPTITE 323 -#define ITEM_ALTARIANITE 324 -#define ITEM_BANETTITE 325 -#define ITEM_ABSOLITE 326 -#define ITEM_GLALITITE 327 -#define ITEM_SALAMENCITE 328 -#define ITEM_METAGROSSITE 329 -#define ITEM_LATIASITE 330 -#define ITEM_LATIOSITE 331 -#define ITEM_LOPUNNITE 332 -#define ITEM_GARCHOMPITE 333 -#define ITEM_LUCARIONITE 334 -#define ITEM_ABOMASITE 335 -#define ITEM_GALLADITE 336 -#define ITEM_AUDINITE 337 -#define ITEM_DIANCITE 338 + // Mega Stones + ITEM_VENUSAURITE = 292, + ITEM_CHARIZARDITE_X = 293, + ITEM_CHARIZARDITE_Y = 294, + ITEM_BLASTOISINITE = 295, + ITEM_BEEDRILLITE = 296, + ITEM_PIDGEOTITE = 297, + ITEM_ALAKAZITE = 298, + ITEM_SLOWBRONITE = 299, + ITEM_GENGARITE = 300, + ITEM_KANGASKHANITE = 301, + ITEM_PINSIRITE = 302, + ITEM_GYARADOSITE = 303, + ITEM_AERODACTYLITE = 304, + ITEM_MEWTWONITE_X = 305, + ITEM_MEWTWONITE_Y = 306, + ITEM_AMPHAROSITE = 307, + ITEM_STEELIXITE = 308, + ITEM_SCIZORITE = 309, + ITEM_HERACRONITE = 310, + ITEM_HOUNDOOMINITE = 311, + ITEM_TYRANITARITE = 312, + ITEM_SCEPTILITE = 313, + ITEM_BLAZIKENITE = 314, + ITEM_SWAMPERTITE = 315, + ITEM_GARDEVOIRITE = 316, + ITEM_SABLENITE = 317, + ITEM_MAWILITE = 318, + ITEM_AGGRONITE = 319, + ITEM_MEDICHAMITE = 320, + ITEM_MANECTITE = 321, + ITEM_SHARPEDONITE = 322, + ITEM_CAMERUPTITE = 323, + ITEM_ALTARIANITE = 324, + ITEM_BANETTITE = 325, + ITEM_ABSOLITE = 326, + ITEM_GLALITITE = 327, + ITEM_SALAMENCITE = 328, + ITEM_METAGROSSITE = 329, + ITEM_LATIASITE = 330, + ITEM_LATIOSITE = 331, + ITEM_LOPUNNITE = 332, + ITEM_GARCHOMPITE = 333, + ITEM_LUCARIONITE = 334, + ITEM_ABOMASITE = 335, + ITEM_GALLADITE = 336, + ITEM_AUDINITE = 337, + ITEM_DIANCITE = 338, -// Gems -#define ITEM_NORMAL_GEM 339 -#define ITEM_FIRE_GEM 340 -#define ITEM_WATER_GEM 341 -#define ITEM_ELECTRIC_GEM 342 -#define ITEM_GRASS_GEM 343 -#define ITEM_ICE_GEM 344 -#define ITEM_FIGHTING_GEM 345 -#define ITEM_POISON_GEM 346 -#define ITEM_GROUND_GEM 347 -#define ITEM_FLYING_GEM 348 -#define ITEM_PSYCHIC_GEM 349 -#define ITEM_BUG_GEM 350 -#define ITEM_ROCK_GEM 351 -#define ITEM_GHOST_GEM 352 -#define ITEM_DRAGON_GEM 353 -#define ITEM_DARK_GEM 354 -#define ITEM_STEEL_GEM 355 -#define ITEM_FAIRY_GEM 356 + // Gems + ITEM_NORMAL_GEM = 339, + ITEM_FIRE_GEM = 340, + ITEM_WATER_GEM = 341, + ITEM_ELECTRIC_GEM = 342, + ITEM_GRASS_GEM = 343, + ITEM_ICE_GEM = 344, + ITEM_FIGHTING_GEM = 345, + ITEM_POISON_GEM = 346, + ITEM_GROUND_GEM = 347, + ITEM_FLYING_GEM = 348, + ITEM_PSYCHIC_GEM = 349, + ITEM_BUG_GEM = 350, + ITEM_ROCK_GEM = 351, + ITEM_GHOST_GEM = 352, + ITEM_DRAGON_GEM = 353, + ITEM_DARK_GEM = 354, + ITEM_STEEL_GEM = 355, + ITEM_FAIRY_GEM = 356, -// Z-Crystals -#define ITEM_NORMALIUM_Z 357 -#define ITEM_FIRIUM_Z 358 -#define ITEM_WATERIUM_Z 359 -#define ITEM_ELECTRIUM_Z 360 -#define ITEM_GRASSIUM_Z 361 -#define ITEM_ICIUM_Z 362 -#define ITEM_FIGHTINIUM_Z 363 -#define ITEM_POISONIUM_Z 364 -#define ITEM_GROUNDIUM_Z 365 -#define ITEM_FLYINIUM_Z 366 -#define ITEM_PSYCHIUM_Z 367 -#define ITEM_BUGINIUM_Z 368 -#define ITEM_ROCKIUM_Z 369 -#define ITEM_GHOSTIUM_Z 370 -#define ITEM_DRAGONIUM_Z 371 -#define ITEM_DARKINIUM_Z 372 -#define ITEM_STEELIUM_Z 373 -#define ITEM_FAIRIUM_Z 374 -#define ITEM_PIKANIUM_Z 375 -#define ITEM_EEVIUM_Z 376 -#define ITEM_SNORLIUM_Z 377 -#define ITEM_MEWNIUM_Z 378 -#define ITEM_DECIDIUM_Z 379 -#define ITEM_INCINIUM_Z 380 -#define ITEM_PRIMARIUM_Z 381 -#define ITEM_LYCANIUM_Z 382 -#define ITEM_MIMIKIUM_Z 383 -#define ITEM_KOMMONIUM_Z 384 -#define ITEM_TAPUNIUM_Z 385 -#define ITEM_SOLGANIUM_Z 386 -#define ITEM_LUNALIUM_Z 387 -#define ITEM_MARSHADIUM_Z 388 -#define ITEM_ALORAICHIUM_Z 389 -#define ITEM_PIKASHUNIUM_Z 390 -#define ITEM_ULTRANECROZIUM_Z 391 + // Z-Crystals + ITEM_NORMALIUM_Z = 357, + ITEM_FIRIUM_Z = 358, + ITEM_WATERIUM_Z = 359, + ITEM_ELECTRIUM_Z = 360, + ITEM_GRASSIUM_Z = 361, + ITEM_ICIUM_Z = 362, + ITEM_FIGHTINIUM_Z = 363, + ITEM_POISONIUM_Z = 364, + ITEM_GROUNDIUM_Z = 365, + ITEM_FLYINIUM_Z = 366, + ITEM_PSYCHIUM_Z = 367, + ITEM_BUGINIUM_Z = 368, + ITEM_ROCKIUM_Z = 369, + ITEM_GHOSTIUM_Z = 370, + ITEM_DRAGONIUM_Z = 371, + ITEM_DARKINIUM_Z = 372, + ITEM_STEELIUM_Z = 373, + ITEM_FAIRIUM_Z = 374, + ITEM_PIKANIUM_Z = 375, + ITEM_EEVIUM_Z = 376, + ITEM_SNORLIUM_Z = 377, + ITEM_MEWNIUM_Z = 378, + ITEM_DECIDIUM_Z = 379, + ITEM_INCINIUM_Z = 380, + ITEM_PRIMARIUM_Z = 381, + ITEM_LYCANIUM_Z = 382, + ITEM_MIMIKIUM_Z = 383, + ITEM_KOMMONIUM_Z = 384, + ITEM_TAPUNIUM_Z = 385, + ITEM_SOLGANIUM_Z = 386, + ITEM_LUNALIUM_Z = 387, + ITEM_MARSHADIUM_Z = 388, + ITEM_ALORAICHIUM_Z = 389, + ITEM_PIKASHUNIUM_Z = 390, + ITEM_ULTRANECROZIUM_Z = 391, -// Species-specific Held Items -#define ITEM_LIGHT_BALL 392 -#define ITEM_LEEK 393 -#define ITEM_STICK ITEM_LEEK // Pre-Gen VIII name -#define ITEM_THICK_CLUB 394 -#define ITEM_LUCKY_PUNCH 395 -#define ITEM_METAL_POWDER 396 -#define ITEM_QUICK_POWDER 397 -#define ITEM_DEEP_SEA_SCALE 398 -#define ITEM_DEEPSEASCALE ITEM_DEEP_SEA_SCALE // Pre-Gen VI name -#define ITEM_DEEP_SEA_TOOTH 399 -#define ITEM_DEEPSEATOOTH ITEM_DEEP_SEA_TOOTH // Pre-Gen VI name -#define ITEM_SOUL_DEW 400 -#define ITEM_ADAMANT_ORB 401 -#define ITEM_LUSTROUS_ORB 402 -#define ITEM_GRISEOUS_ORB 403 + // Species-specific Held Items + ITEM_LIGHT_BALL = 392, + ITEM_LEEK = 393, + ITEM_STICK = ITEM_LEEK, // Pre-Gen VIII name + ITEM_THICK_CLUB = 394, + ITEM_LUCKY_PUNCH = 395, + ITEM_METAL_POWDER = 396, + ITEM_QUICK_POWDER = 397, + ITEM_DEEP_SEA_SCALE = 398, + ITEM_DEEPSEASCALE = ITEM_DEEP_SEA_SCALE, // Pre-Gen VI name + ITEM_DEEP_SEA_TOOTH = 399, + ITEM_DEEPSEATOOTH = ITEM_DEEP_SEA_TOOTH, // Pre-Gen VI name + ITEM_SOUL_DEW = 400, + ITEM_ADAMANT_ORB = 401, + ITEM_LUSTROUS_ORB = 402, + ITEM_GRISEOUS_ORB = 403, -// Incenses -#define ITEM_SEA_INCENSE 404 -#define ITEM_LAX_INCENSE 405 -#define ITEM_ODD_INCENSE 406 -#define ITEM_ROCK_INCENSE 407 -#define ITEM_FULL_INCENSE 408 -#define ITEM_WAVE_INCENSE 409 -#define ITEM_ROSE_INCENSE 410 -#define ITEM_LUCK_INCENSE 411 -#define ITEM_PURE_INCENSE 412 + // Incenses + ITEM_SEA_INCENSE = 404, + ITEM_LAX_INCENSE = 405, + ITEM_ODD_INCENSE = 406, + ITEM_ROCK_INCENSE = 407, + ITEM_FULL_INCENSE = 408, + ITEM_WAVE_INCENSE = 409, + ITEM_ROSE_INCENSE = 410, + ITEM_LUCK_INCENSE = 411, + ITEM_PURE_INCENSE = 412, -// Contest Scarves -#define ITEM_RED_SCARF 413 -#define ITEM_BLUE_SCARF 414 -#define ITEM_PINK_SCARF 415 -#define ITEM_GREEN_SCARF 416 -#define ITEM_YELLOW_SCARF 417 + // Contest Scarves + ITEM_RED_SCARF = 413, + ITEM_BLUE_SCARF = 414, + ITEM_PINK_SCARF = 415, + ITEM_GREEN_SCARF = 416, + ITEM_YELLOW_SCARF = 417, -// EV Gain Modifiers -#define ITEM_MACHO_BRACE 418 -#define ITEM_POWER_WEIGHT 419 -#define ITEM_POWER_BRACER 420 -#define ITEM_POWER_BELT 421 -#define ITEM_POWER_LENS 422 -#define ITEM_POWER_BAND 423 -#define ITEM_POWER_ANKLET 424 + // EV Gain Modifiers + ITEM_MACHO_BRACE = 418, + ITEM_POWER_WEIGHT = 419, + ITEM_POWER_BRACER = 420, + ITEM_POWER_BELT = 421, + ITEM_POWER_LENS = 422, + ITEM_POWER_BAND = 423, + ITEM_POWER_ANKLET = 424, -// Type-boosting Held Items -#define ITEM_SILK_SCARF 425 -#define ITEM_CHARCOAL 426 -#define ITEM_MYSTIC_WATER 427 -#define ITEM_MAGNET 428 -#define ITEM_MIRACLE_SEED 429 -#define ITEM_NEVER_MELT_ICE 430 -#define ITEM_NEVERMELTICE ITEM_NEVER_MELT_ICE // Pre-Gen VI name -#define ITEM_BLACK_BELT 431 -#define ITEM_BLACKBELT ITEM_BLACK_BELT // Gen II name -#define ITEM_POISON_BARB 432 -#define ITEM_SOFT_SAND 433 -#define ITEM_SHARP_BEAK 434 -#define ITEM_TWISTED_SPOON 435 -#define ITEM_TWISTEDSPOON ITEM_TWISTED_SPOON // Pre-Gen VI name -#define ITEM_SILVER_POWDER 436 -#define ITEM_SILVERPOWDER ITEM_SILVER_POWDER // Pre-Gen VI name -#define ITEM_HARD_STONE 437 -#define ITEM_SPELL_TAG 438 -#define ITEM_DRAGON_FANG 439 -#define ITEM_BLACK_GLASSES 440 -#define ITEM_BLACKGLASSES ITEM_BLACK_GLASSES // Pre-Gen VI name -#define ITEM_METAL_COAT 441 + // Type-boosting Held Items + ITEM_SILK_SCARF = 425, + ITEM_CHARCOAL = 426, + ITEM_MYSTIC_WATER = 427, + ITEM_MAGNET = 428, + ITEM_MIRACLE_SEED = 429, + ITEM_NEVER_MELT_ICE = 430, + ITEM_NEVERMELTICE = ITEM_NEVER_MELT_ICE, // Pre-Gen VI name + ITEM_BLACK_BELT = 431, + ITEM_BLACKBELT = ITEM_BLACK_BELT, // Gen II name + ITEM_POISON_BARB = 432, + ITEM_SOFT_SAND = 433, + ITEM_SHARP_BEAK = 434, + ITEM_TWISTED_SPOON = 435, + ITEM_TWISTEDSPOON = ITEM_TWISTED_SPOON, // Pre-Gen VI name + ITEM_SILVER_POWDER = 436, + ITEM_SILVERPOWDER = ITEM_SILVER_POWDER, // Pre-Gen VI name + ITEM_HARD_STONE = 437, + ITEM_SPELL_TAG = 438, + ITEM_DRAGON_FANG = 439, + ITEM_BLACK_GLASSES = 440, + ITEM_BLACKGLASSES = ITEM_BLACK_GLASSES, // Pre-Gen VI name + ITEM_METAL_COAT = 441, -// Choice Items -#define ITEM_CHOICE_BAND 442 -#define ITEM_CHOICE_SPECS 443 -#define ITEM_CHOICE_SCARF 444 + // Choice Items + ITEM_CHOICE_BAND = 442, + ITEM_CHOICE_SPECS = 443, + ITEM_CHOICE_SCARF = 444, -// Status Orbs -#define ITEM_FLAME_ORB 445 -#define ITEM_TOXIC_ORB 446 + // Status Orbs + ITEM_FLAME_ORB = 445, + ITEM_TOXIC_ORB = 446, -// Weather Rocks -#define ITEM_DAMP_ROCK 447 -#define ITEM_HEAT_ROCK 448 -#define ITEM_SMOOTH_ROCK 449 -#define ITEM_ICY_ROCK 450 + // Weather Rocks + ITEM_DAMP_ROCK = 447, + ITEM_HEAT_ROCK = 448, + ITEM_SMOOTH_ROCK = 449, + ITEM_ICY_ROCK = 450, -// Terrain Seeds -#define ITEM_ELECTRIC_SEED 451 -#define ITEM_PSYCHIC_SEED 452 -#define ITEM_MISTY_SEED 453 -#define ITEM_GRASSY_SEED 454 + // Terrain Seeds + ITEM_ELECTRIC_SEED = 451, + ITEM_PSYCHIC_SEED = 452, + ITEM_MISTY_SEED = 453, + ITEM_GRASSY_SEED = 454, -// Type-activated Stat Modifiers -#define ITEM_ABSORB_BULB 455 -#define ITEM_CELL_BATTERY 456 -#define ITEM_LUMINOUS_MOSS 457 -#define ITEM_SNOWBALL 458 + // Type-activated Stat Modifiers + ITEM_ABSORB_BULB = 455, + ITEM_CELL_BATTERY = 456, + ITEM_LUMINOUS_MOSS = 457, + ITEM_SNOWBALL = 458, -// Misc. Held Items -#define ITEM_BRIGHT_POWDER 459 -#define ITEM_BRIGHTPOWDER ITEM_BRIGHT_POWDER // Pre-Gen VI name -#define ITEM_WHITE_HERB 460 -#define ITEM_EXP_SHARE 461 -#define ITEM_EXP_ALL ITEM_EXP_SHARE // Gen I name -#define ITEM_QUICK_CLAW 462 -#define ITEM_SOOTHE_BELL 463 -#define ITEM_MENTAL_HERB 464 -#define ITEM_KINGS_ROCK 465 -#define ITEM_AMULET_COIN 466 -#define ITEM_CLEANSE_TAG 467 -#define ITEM_SMOKE_BALL 468 -#define ITEM_FOCUS_BAND 469 -#define ITEM_LUCKY_EGG 470 -#define ITEM_SCOPE_LENS 471 -#define ITEM_LEFTOVERS 472 -#define ITEM_SHELL_BELL 473 -#define ITEM_WIDE_LENS 474 -#define ITEM_MUSCLE_BAND 475 -#define ITEM_WISE_GLASSES 476 -#define ITEM_EXPERT_BELT 477 -#define ITEM_LIGHT_CLAY 478 -#define ITEM_LIFE_ORB 479 -#define ITEM_POWER_HERB 480 -#define ITEM_FOCUS_SASH 481 -#define ITEM_ZOOM_LENS 482 -#define ITEM_METRONOME 483 -#define ITEM_IRON_BALL 484 -#define ITEM_LAGGING_TAIL 485 -#define ITEM_DESTINY_KNOT 486 -#define ITEM_BLACK_SLUDGE 487 -#define ITEM_GRIP_CLAW 488 -#define ITEM_STICKY_BARB 489 -#define ITEM_SHED_SHELL 490 -#define ITEM_BIG_ROOT 491 -#define ITEM_RAZOR_CLAW 492 -#define ITEM_RAZOR_FANG 493 -#define ITEM_EVIOLITE 494 -#define ITEM_FLOAT_STONE 495 -#define ITEM_ROCKY_HELMET 496 -#define ITEM_AIR_BALLOON 497 -#define ITEM_RED_CARD 498 -#define ITEM_RING_TARGET 499 -#define ITEM_BINDING_BAND 500 -#define ITEM_EJECT_BUTTON 501 -#define ITEM_WEAKNESS_POLICY 502 -#define ITEM_ASSAULT_VEST 503 -#define ITEM_SAFETY_GOGGLES 504 -#define ITEM_ADRENALINE_ORB 505 -#define ITEM_TERRAIN_EXTENDER 506 -#define ITEM_PROTECTIVE_PADS 507 -#define ITEM_THROAT_SPRAY 508 -#define ITEM_EJECT_PACK 509 -#define ITEM_HEAVY_DUTY_BOOTS 510 -#define ITEM_BLUNDER_POLICY 511 -#define ITEM_ROOM_SERVICE 512 -#define ITEM_UTILITY_UMBRELLA 513 + // Misc. Held Items + ITEM_BRIGHT_POWDER = 459, + ITEM_BRIGHTPOWDER = ITEM_BRIGHT_POWDER, // Pre-Gen VI name + ITEM_WHITE_HERB = 460, + ITEM_EXP_SHARE = 461, + ITEM_EXP_ALL = ITEM_EXP_SHARE, // Gen I name + ITEM_QUICK_CLAW = 462, + ITEM_SOOTHE_BELL = 463, + ITEM_MENTAL_HERB = 464, + ITEM_KINGS_ROCK = 465, + ITEM_AMULET_COIN = 466, + ITEM_CLEANSE_TAG = 467, + ITEM_SMOKE_BALL = 468, + ITEM_FOCUS_BAND = 469, + ITEM_LUCKY_EGG = 470, + ITEM_SCOPE_LENS = 471, + ITEM_LEFTOVERS = 472, + ITEM_SHELL_BELL = 473, + ITEM_WIDE_LENS = 474, + ITEM_MUSCLE_BAND = 475, + ITEM_WISE_GLASSES = 476, + ITEM_EXPERT_BELT = 477, + ITEM_LIGHT_CLAY = 478, + ITEM_LIFE_ORB = 479, + ITEM_POWER_HERB = 480, + ITEM_FOCUS_SASH = 481, + ITEM_ZOOM_LENS = 482, + ITEM_METRONOME = 483, + ITEM_IRON_BALL = 484, + ITEM_LAGGING_TAIL = 485, + ITEM_DESTINY_KNOT = 486, + ITEM_BLACK_SLUDGE = 487, + ITEM_GRIP_CLAW = 488, + ITEM_STICKY_BARB = 489, + ITEM_SHED_SHELL = 490, + ITEM_BIG_ROOT = 491, + ITEM_RAZOR_CLAW = 492, + ITEM_RAZOR_FANG = 493, + ITEM_EVIOLITE = 494, + ITEM_FLOAT_STONE = 495, + ITEM_ROCKY_HELMET = 496, + ITEM_AIR_BALLOON = 497, + ITEM_RED_CARD = 498, + ITEM_RING_TARGET = 499, + ITEM_BINDING_BAND = 500, + ITEM_EJECT_BUTTON = 501, + ITEM_WEAKNESS_POLICY = 502, + ITEM_ASSAULT_VEST = 503, + ITEM_SAFETY_GOGGLES = 504, + ITEM_ADRENALINE_ORB = 505, + ITEM_TERRAIN_EXTENDER = 506, + ITEM_PROTECTIVE_PADS = 507, + ITEM_THROAT_SPRAY = 508, + ITEM_EJECT_PACK = 509, + ITEM_HEAVY_DUTY_BOOTS = 510, + ITEM_BLUNDER_POLICY = 511, + ITEM_ROOM_SERVICE = 512, + ITEM_UTILITY_UMBRELLA = 513, + + // Berries + FIRST_BERRY_INDEX = 514, + ITEM_CHERI_BERRY = FIRST_BERRY_INDEX, + ITEM_CHESTO_BERRY = 515, + ITEM_PECHA_BERRY = 516, + ITEM_RAWST_BERRY = 517, + ITEM_ASPEAR_BERRY = 518, + ITEM_LEPPA_BERRY = 519, + ITEM_ORAN_BERRY = 520, + ITEM_PERSIM_BERRY = 521, + ITEM_LUM_BERRY = 522, + ITEM_SITRUS_BERRY = 523, + ITEM_FIGY_BERRY = 524, + ITEM_WIKI_BERRY = 525, + ITEM_MAGO_BERRY = 526, + ITEM_AGUAV_BERRY = 527, + ITEM_IAPAPA_BERRY = 528, + ITEM_RAZZ_BERRY = 529, + ITEM_BLUK_BERRY = 530, + ITEM_NANAB_BERRY = 531, + ITEM_WEPEAR_BERRY = 532, + ITEM_PINAP_BERRY = 533, + ITEM_POMEG_BERRY = 534, + ITEM_KELPSY_BERRY = 535, + ITEM_QUALOT_BERRY = 536, + ITEM_HONDEW_BERRY = 537, + ITEM_GREPA_BERRY = 538, + ITEM_TAMATO_BERRY = 539, + ITEM_CORNN_BERRY = 540, + ITEM_MAGOST_BERRY = 541, + ITEM_RABUTA_BERRY = 542, + ITEM_NOMEL_BERRY = 543, + ITEM_SPELON_BERRY = 544, + ITEM_PAMTRE_BERRY = 545, + ITEM_WATMEL_BERRY = 546, + ITEM_DURIN_BERRY = 547, + ITEM_BELUE_BERRY = 548, + ITEM_CHILAN_BERRY = 549, + ITEM_OCCA_BERRY = 550, + ITEM_PASSHO_BERRY = 551, + ITEM_WACAN_BERRY = 552, + ITEM_RINDO_BERRY = 553, + ITEM_YACHE_BERRY = 554, + ITEM_CHOPLE_BERRY = 555, + ITEM_KEBIA_BERRY = 556, + ITEM_SHUCA_BERRY = 557, + ITEM_COBA_BERRY = 558, + ITEM_PAYAPA_BERRY = 559, + ITEM_TANGA_BERRY = 560, + ITEM_CHARTI_BERRY = 561, + ITEM_KASIB_BERRY = 562, + ITEM_HABAN_BERRY = 563, + ITEM_COLBUR_BERRY = 564, + ITEM_BABIRI_BERRY = 565, + ITEM_ROSELI_BERRY = 566, + ITEM_LIECHI_BERRY = 567, + ITEM_GANLON_BERRY = 568, + ITEM_SALAC_BERRY = 569, + ITEM_PETAYA_BERRY = 570, + ITEM_APICOT_BERRY = 571, + ITEM_LANSAT_BERRY = 572, + ITEM_STARF_BERRY = 573, + ITEM_ENIGMA_BERRY = 574, + ITEM_MICLE_BERRY = 575, + ITEM_CUSTAP_BERRY = 576, + ITEM_JABOCA_BERRY = 577, + ITEM_ROWAP_BERRY = 578, + ITEM_KEE_BERRY = 579, + ITEM_MARANGA_BERRY = 580, + ITEM_ENIGMA_BERRY_E_READER = 581, + LAST_BERRY_INDEX = ITEM_ENIGMA_BERRY_E_READER, + + // TMs/HMs + ITEM_TM01 = 582, + ITEM_TM02 = 583, + ITEM_TM03 = 584, + ITEM_TM04 = 585, + ITEM_TM05 = 586, + ITEM_TM06 = 587, + ITEM_TM07 = 588, + ITEM_TM08 = 589, + ITEM_TM09 = 590, + ITEM_TM10 = 591, + ITEM_TM11 = 592, + ITEM_TM12 = 593, + ITEM_TM13 = 594, + ITEM_TM14 = 595, + ITEM_TM15 = 596, + ITEM_TM16 = 597, + ITEM_TM17 = 598, + ITEM_TM18 = 599, + ITEM_TM19 = 600, + ITEM_TM20 = 601, + ITEM_TM21 = 602, + ITEM_TM22 = 603, + ITEM_TM23 = 604, + ITEM_TM24 = 605, + ITEM_TM25 = 606, + ITEM_TM26 = 607, + ITEM_TM27 = 608, + ITEM_TM28 = 609, + ITEM_TM29 = 610, + ITEM_TM30 = 611, + ITEM_TM31 = 612, + ITEM_TM32 = 613, + ITEM_TM33 = 614, + ITEM_TM34 = 615, + ITEM_TM35 = 616, + ITEM_TM36 = 617, + ITEM_TM37 = 618, + ITEM_TM38 = 619, + ITEM_TM39 = 620, + ITEM_TM40 = 621, + ITEM_TM41 = 622, + ITEM_TM42 = 623, + ITEM_TM43 = 624, + ITEM_TM44 = 625, + ITEM_TM45 = 626, + ITEM_TM46 = 627, + ITEM_TM47 = 628, + ITEM_TM48 = 629, + ITEM_TM49 = 630, + ITEM_TM50 = 631, + ITEM_TM51 = 632, + ITEM_TM52 = 633, + ITEM_TM53 = 634, + ITEM_TM54 = 635, + ITEM_TM55 = 636, + ITEM_TM56 = 637, + ITEM_TM57 = 638, + ITEM_TM58 = 639, + ITEM_TM59 = 640, + ITEM_TM60 = 641, + ITEM_TM61 = 642, + ITEM_TM62 = 643, + ITEM_TM63 = 644, + ITEM_TM64 = 645, + ITEM_TM65 = 646, + ITEM_TM66 = 647, + ITEM_TM67 = 648, + ITEM_TM68 = 649, + ITEM_TM69 = 650, + ITEM_TM70 = 651, + ITEM_TM71 = 652, + ITEM_TM72 = 653, + ITEM_TM73 = 654, + ITEM_TM74 = 655, + ITEM_TM75 = 656, + ITEM_TM76 = 657, + ITEM_TM77 = 658, + ITEM_TM78 = 659, + ITEM_TM79 = 660, + ITEM_TM80 = 661, + ITEM_TM81 = 662, + ITEM_TM82 = 663, + ITEM_TM83 = 664, + ITEM_TM84 = 665, + ITEM_TM85 = 666, + ITEM_TM86 = 667, + ITEM_TM87 = 668, + ITEM_TM88 = 669, + ITEM_TM89 = 670, + ITEM_TM90 = 671, + ITEM_TM91 = 672, + ITEM_TM92 = 673, + ITEM_TM93 = 674, + ITEM_TM94 = 675, + ITEM_TM95 = 676, + ITEM_TM96 = 677, + ITEM_TM97 = 678, + ITEM_TM98 = 679, + ITEM_TM99 = 680, + ITEM_TM100 = 681, + + ITEM_HM01 = 682, + ITEM_HM02 = 683, + ITEM_HM03 = 684, + ITEM_HM04 = 685, + ITEM_HM05 = 686, + ITEM_HM06 = 687, + ITEM_HM07 = 688, + ITEM_HM08 = 689, + + + /* Expands to: + * ITEM_TM_FOCUS_PUNCH = ITEM_TM01, + * ... + * ITEM_HM_CUT = ITM_HM01, + * ... */ + #define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n), + #define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n), + #define TO_TMHM_NUMS(a, ...) (__VA_ARGS__) + RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA)))) + RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA)))) + #undef ENUM_TM + #undef ENUM_HM + #undef TO_TMHM_NUMS + + // Charms + ITEM_OVAL_CHARM = 690, + ITEM_SHINY_CHARM = 691, + ITEM_CATCHING_CHARM = 692, + ITEM_EXP_CHARM = 693, + + // Form-changing Key Items + ITEM_ROTOM_CATALOG = 694, + ITEM_GRACIDEA = 695, + ITEM_REVEAL_GLASS = 696, + ITEM_DNA_SPLICERS = 697, + ITEM_ZYGARDE_CUBE = 698, + ITEM_PRISON_BOTTLE = 699, + ITEM_N_SOLARIZER = 700, + ITEM_N_LUNARIZER = 701, + ITEM_REINS_OF_UNITY = 702, + + // Battle Mechanic Key Items + ITEM_MEGA_RING = 703, + ITEM_Z_POWER_RING = 704, + ITEM_DYNAMAX_BAND = 705, + + // Misc. Key Items + ITEM_BICYCLE = 706, + ITEM_MACH_BIKE = 707, + ITEM_ACRO_BIKE = 708, + ITEM_OLD_ROD = 709, + ITEM_GOOD_ROD = 710, + ITEM_SUPER_ROD = 711, + ITEM_DOWSING_MACHINE = 712, + ITEM_ITEMFINDER = ITEM_DOWSING_MACHINE, // Pre-Gen IV name + ITEM_DOWSING_MCHN = ITEM_DOWSING_MACHINE, // Gen IV-V name + ITEM_TOWN_MAP = 713, + ITEM_VS_SEEKER = 714, + ITEM_TM_CASE = 715, + ITEM_BERRY_POUCH = 716, + ITEM_POKEMON_BOX_LINK = 717, + ITEM_POKEMON_BOX = ITEM_POKEMON_BOX_LINK, // Pre-Gen VIII name + ITEM_COIN_CASE = 718, + ITEM_POWDER_JAR = 719, + ITEM_WAILMER_PAIL = 720, + ITEM_POKE_RADAR = 721, + ITEM_POKEBLOCK_CASE = 722, + ITEM_SOOT_SACK = 723, + ITEM_POKE_FLUTE = 724, + ITEM_FAME_CHECKER = 725, + ITEM_TEACHY_TV = 726, + + // Story Key Items + ITEM_SS_TICKET = 727, + ITEM_EON_TICKET = 728, + ITEM_MYSTIC_TICKET = 729, + ITEM_AURORA_TICKET = 730, + ITEM_OLD_SEA_MAP = 731, + ITEM_LETTER = 732, + ITEM_DEVON_PARTS = 733, + ITEM_DEVON_GOODS = ITEM_DEVON_PARTS, // Pre-Gen VI name + ITEM_GO_GOGGLES = 734, + ITEM_DEVON_SCOPE = 735, + ITEM_BASEMENT_KEY = 736, + ITEM_SCANNER = 737, + ITEM_STORAGE_KEY = 738, + ITEM_KEY_TO_ROOM_1 = 739, + ITEM_RM_1_KEY = ITEM_KEY_TO_ROOM_1, // Pre-Gen VI name + ITEM_KEY_TO_ROOM_2 = 740, + ITEM_RM_2_KEY = ITEM_KEY_TO_ROOM_2, // Pre-Gen VI name + ITEM_KEY_TO_ROOM_4 = 741, + ITEM_RM_4_KEY = ITEM_KEY_TO_ROOM_4, // Pre-Gen VI name + ITEM_KEY_TO_ROOM_6 = 742, + ITEM_RM_6_KEY = ITEM_KEY_TO_ROOM_6, // Pre-Gen VI name + ITEM_METEORITE = 743, + ITEM_MAGMA_EMBLEM = 744, + ITEM_CONTEST_PASS = 745, + ITEM_PARCEL = 746, + ITEM_OAKS_PARCEL = ITEM_PARCEL, // Pre-Gen IV name + ITEM_SECRET_KEY = 747, + ITEM_BIKE_VOUCHER = 748, + ITEM_GOLD_TEETH = 749, + ITEM_CARD_KEY = 750, + ITEM_LIFT_KEY = 751, + ITEM_SILPH_SCOPE = 752, + ITEM_TRI_PASS = 753, + ITEM_RAINBOW_PASS = 754, + ITEM_TEA = 755, + ITEM_RUBY = 756, + ITEM_SAPPHIRE = 757, + + // GEN IX ITEMS + ITEM_ABILITY_SHIELD = 758, + ITEM_CLEAR_AMULET = 759, + ITEM_PUNCHING_GLOVE = 760, + ITEM_COVERT_CLOAK = 761, + ITEM_LOADED_DICE = 762, + ITEM_AUSPICIOUS_ARMOR = 763, + ITEM_BOOSTER_ENERGY = 764, + ITEM_BIG_BAMBOO_SHOOT = 765, + ITEM_GIMMIGHOUL_COIN = 766, + ITEM_LEADERS_CREST = 767, + ITEM_MALICIOUS_ARMOR = 768, + ITEM_MIRROR_HERB = 769, + ITEM_SCROLL_OF_DARKNESS = 770, + ITEM_SCROLL_OF_WATERS = 771, + ITEM_TERA_ORB = 772, + ITEM_TINY_BAMBOO_SHOOT = 773, + + ITEM_BUG_TERA_SHARD = 774, + ITEM_DARK_TERA_SHARD = 775, + ITEM_DRAGON_TERA_SHARD = 776, + ITEM_ELECTRIC_TERA_SHARD = 777, + ITEM_FAIRY_TERA_SHARD = 778, + ITEM_FIGHTING_TERA_SHARD = 779, + ITEM_FIRE_TERA_SHARD = 780, + ITEM_FLYING_TERA_SHARD = 781, + ITEM_GHOST_TERA_SHARD = 782, + ITEM_GRASS_TERA_SHARD = 783, + ITEM_GROUND_TERA_SHARD = 784, + ITEM_ICE_TERA_SHARD = 785, + ITEM_NORMAL_TERA_SHARD = 786, + ITEM_POISON_TERA_SHARD = 787, + ITEM_PSYCHIC_TERA_SHARD = 788, + ITEM_ROCK_TERA_SHARD = 789, + ITEM_STEEL_TERA_SHARD = 790, + ITEM_WATER_TERA_SHARD = 791, + + ITEM_ADAMANT_CRYSTAL = 792, + ITEM_GRISEOUS_CORE = 793, + ITEM_LUSTROUS_GLOBE = 794, + + ITEM_BLACK_AUGURITE = 795, + ITEM_LINKING_CORD = 796, + ITEM_PEAT_BLOCK = 797, + ITEM_BERSERK_GENE = 798, + + ITEM_FAIRY_FEATHER = 799, + ITEM_SYRUPY_APPLE = 800, + ITEM_UNREMARKABLE_TEACUP = 801, + ITEM_MASTERPIECE_TEACUP = 802, + ITEM_CORNERSTONE_MASK = 803, + ITEM_WELLSPRING_MASK = 804, + ITEM_HEARTHFLAME_MASK = 805, + ITEM_HEALTH_MOCHI = 806, + ITEM_MUSCLE_MOCHI = 807, + ITEM_RESIST_MOCHI = 808, + ITEM_GENIUS_MOCHI = 809, + ITEM_CLEVER_MOCHI = 810, + ITEM_SWIFT_MOCHI = 811, + ITEM_FRESH_START_MOCHI = 812, + ITEM_GLIMMERING_CHARM = 813, + ITEM_METAL_ALLOY = 814, + ITEM_STELLAR_TERA_SHARD = 815, + + ITEM_JUBILIFE_MUFFIN = 816, + ITEM_REMEDY = 817, + ITEM_FINE_REMEDY = 818, + ITEM_SUPERB_REMEDY = 819, + ITEM_AUX_EVASION = 820, + ITEM_AUX_GUARD = 821, + ITEM_AUX_POWER = 822, + ITEM_AUX_POWERGUARD = 823, + ITEM_CHOICE_DUMPLING = 824, + ITEM_SWAP_SNACK = 825, + ITEM_TWICE_SPICED_RADISH = 826, + ITEM_POKESHI_DOLL = 827, + + ITEM_STRANGE_BALL = 828, + + // Legends Z-A Mega Stones + ITEM_CLEFABLITE = 829, + ITEM_VICTREEBELITE = 830, + ITEM_STARMINITE = 831, + ITEM_DRAGONINITE = 832, + ITEM_MEGANIUMITE = 833, + ITEM_FERALIGITE = 834, + ITEM_SKARMORITE = 835, + ITEM_FROSLASSITE = 836, + ITEM_EMBOARITE = 837, + ITEM_EXCADRITE = 838, + ITEM_SCOLIPITE = 839, + ITEM_SCRAFTINITE = 840, + ITEM_EELEKTROSSITE = 841, + ITEM_CHANDELURITE = 842, + ITEM_CHESNAUGHTITE = 843, + ITEM_DELPHOXITE = 844, + ITEM_GRENINJITE = 845, + ITEM_PYROARITE = 846, + ITEM_FLOETTITE = 847, + ITEM_MALAMARITE = 848, + ITEM_BARBARACITE = 849, + ITEM_DRAGALGITE = 850, + ITEM_HAWLUCHANITE = 851, + ITEM_ZYGARDITE = 852, + ITEM_DRAMPANITE = 853, + ITEM_FALINKSITE = 854, + + // Legends Z-A: Mega Dimension DLC Mega Stones + ITEM_HEATRANITE = 855, + ITEM_DARKRANITE = 856, + ITEM_ZERAORITE = 857, + ITEM_RAICHUNITE_X = 858, + ITEM_RAICHUNITE_Y = 859, + ITEM_CHIMECHITE = 860, + ITEM_ABSOLITE_Z = 861, + ITEM_STARAPTITE = 862, + ITEM_GARCHOMPITE_Z = 863, + ITEM_LUCARIONITE_Z = 864, + ITEM_GOLURKITE = 865, + ITEM_MEOWSTICITE = 866, + ITEM_CRABOMINITE = 867, + ITEM_GOLISOPITE = 868, + ITEM_MAGEARNITE = 869, + ITEM_SCOVILLAINITE = 870, + ITEM_BAXCALIBRITE = 871, + ITEM_TATSUGIRINITE = 872, + ITEM_GLIMMORANITE = 873, + + ITEMS_COUNT, + ITEM_FIELD_ARROW = ITEMS_COUNT, +}; + +// A special item id associated with "Cancel"/"Exit" etc. in a list of items or decorations +// Its icon is defined at ITEMS_COUNT as the "return to field" arrow +#define ITEM_LIST_END 0xFFFF -// Berries #if B_CONFUSE_BERRIES_HEAL >= GEN_8 #define CONFUSE_BERRY_HEAL_FRACTION 3 #elif B_CONFUSE_BERRIES_HEAL == GEN_7 @@ -645,408 +1069,6 @@ #define CONFUSE_BERRY_HP_FRACTION ((B_CONFUSE_BERRIES_HEAL >= GEN_7) ? 4 : 2) -#define ITEM_CHERI_BERRY 514 -#define ITEM_CHESTO_BERRY 515 -#define ITEM_PECHA_BERRY 516 -#define ITEM_RAWST_BERRY 517 -#define ITEM_ASPEAR_BERRY 518 -#define ITEM_LEPPA_BERRY 519 -#define ITEM_ORAN_BERRY 520 -#define ITEM_PERSIM_BERRY 521 -#define ITEM_LUM_BERRY 522 -#define ITEM_SITRUS_BERRY 523 -#define ITEM_FIGY_BERRY 524 -#define ITEM_WIKI_BERRY 525 -#define ITEM_MAGO_BERRY 526 -#define ITEM_AGUAV_BERRY 527 -#define ITEM_IAPAPA_BERRY 528 -#define ITEM_RAZZ_BERRY 529 -#define ITEM_BLUK_BERRY 530 -#define ITEM_NANAB_BERRY 531 -#define ITEM_WEPEAR_BERRY 532 -#define ITEM_PINAP_BERRY 533 -#define ITEM_POMEG_BERRY 534 -#define ITEM_KELPSY_BERRY 535 -#define ITEM_QUALOT_BERRY 536 -#define ITEM_HONDEW_BERRY 537 -#define ITEM_GREPA_BERRY 538 -#define ITEM_TAMATO_BERRY 539 -#define ITEM_CORNN_BERRY 540 -#define ITEM_MAGOST_BERRY 541 -#define ITEM_RABUTA_BERRY 542 -#define ITEM_NOMEL_BERRY 543 -#define ITEM_SPELON_BERRY 544 -#define ITEM_PAMTRE_BERRY 545 -#define ITEM_WATMEL_BERRY 546 -#define ITEM_DURIN_BERRY 547 -#define ITEM_BELUE_BERRY 548 -#define ITEM_CHILAN_BERRY 549 -#define ITEM_OCCA_BERRY 550 -#define ITEM_PASSHO_BERRY 551 -#define ITEM_WACAN_BERRY 552 -#define ITEM_RINDO_BERRY 553 -#define ITEM_YACHE_BERRY 554 -#define ITEM_CHOPLE_BERRY 555 -#define ITEM_KEBIA_BERRY 556 -#define ITEM_SHUCA_BERRY 557 -#define ITEM_COBA_BERRY 558 -#define ITEM_PAYAPA_BERRY 559 -#define ITEM_TANGA_BERRY 560 -#define ITEM_CHARTI_BERRY 561 -#define ITEM_KASIB_BERRY 562 -#define ITEM_HABAN_BERRY 563 -#define ITEM_COLBUR_BERRY 564 -#define ITEM_BABIRI_BERRY 565 -#define ITEM_ROSELI_BERRY 566 -#define ITEM_LIECHI_BERRY 567 -#define ITEM_GANLON_BERRY 568 -#define ITEM_SALAC_BERRY 569 -#define ITEM_PETAYA_BERRY 570 -#define ITEM_APICOT_BERRY 571 -#define ITEM_LANSAT_BERRY 572 -#define ITEM_STARF_BERRY 573 -#define ITEM_ENIGMA_BERRY 574 -#define ITEM_MICLE_BERRY 575 -#define ITEM_CUSTAP_BERRY 576 -#define ITEM_JABOCA_BERRY 577 -#define ITEM_ROWAP_BERRY 578 -#define ITEM_KEE_BERRY 579 -#define ITEM_MARANGA_BERRY 580 -#define ITEM_ENIGMA_BERRY_E_READER 581 - -#define FIRST_BERRY_INDEX ITEM_CHERI_BERRY -#define LAST_BERRY_INDEX ITEM_ENIGMA_BERRY_E_READER - -// TMs/HMs -#define ITEM_TM01 582 -#define ITEM_TM02 583 -#define ITEM_TM03 584 -#define ITEM_TM04 585 -#define ITEM_TM05 586 -#define ITEM_TM06 587 -#define ITEM_TM07 588 -#define ITEM_TM08 589 -#define ITEM_TM09 590 -#define ITEM_TM10 591 -#define ITEM_TM11 592 -#define ITEM_TM12 593 -#define ITEM_TM13 594 -#define ITEM_TM14 595 -#define ITEM_TM15 596 -#define ITEM_TM16 597 -#define ITEM_TM17 598 -#define ITEM_TM18 599 -#define ITEM_TM19 600 -#define ITEM_TM20 601 -#define ITEM_TM21 602 -#define ITEM_TM22 603 -#define ITEM_TM23 604 -#define ITEM_TM24 605 -#define ITEM_TM25 606 -#define ITEM_TM26 607 -#define ITEM_TM27 608 -#define ITEM_TM28 609 -#define ITEM_TM29 610 -#define ITEM_TM30 611 -#define ITEM_TM31 612 -#define ITEM_TM32 613 -#define ITEM_TM33 614 -#define ITEM_TM34 615 -#define ITEM_TM35 616 -#define ITEM_TM36 617 -#define ITEM_TM37 618 -#define ITEM_TM38 619 -#define ITEM_TM39 620 -#define ITEM_TM40 621 -#define ITEM_TM41 622 -#define ITEM_TM42 623 -#define ITEM_TM43 624 -#define ITEM_TM44 625 -#define ITEM_TM45 626 -#define ITEM_TM46 627 -#define ITEM_TM47 628 -#define ITEM_TM48 629 -#define ITEM_TM49 630 -#define ITEM_TM50 631 -#define ITEM_TM51 632 -#define ITEM_TM52 633 -#define ITEM_TM53 634 -#define ITEM_TM54 635 -#define ITEM_TM55 636 -#define ITEM_TM56 637 -#define ITEM_TM57 638 -#define ITEM_TM58 639 -#define ITEM_TM59 640 -#define ITEM_TM60 641 -#define ITEM_TM61 642 -#define ITEM_TM62 643 -#define ITEM_TM63 644 -#define ITEM_TM64 645 -#define ITEM_TM65 646 -#define ITEM_TM66 647 -#define ITEM_TM67 648 -#define ITEM_TM68 649 -#define ITEM_TM69 650 -#define ITEM_TM70 651 -#define ITEM_TM71 652 -#define ITEM_TM72 653 -#define ITEM_TM73 654 -#define ITEM_TM74 655 -#define ITEM_TM75 656 -#define ITEM_TM76 657 -#define ITEM_TM77 658 -#define ITEM_TM78 659 -#define ITEM_TM79 660 -#define ITEM_TM80 661 -#define ITEM_TM81 662 -#define ITEM_TM82 663 -#define ITEM_TM83 664 -#define ITEM_TM84 665 -#define ITEM_TM85 666 -#define ITEM_TM86 667 -#define ITEM_TM87 668 -#define ITEM_TM88 669 -#define ITEM_TM89 670 -#define ITEM_TM90 671 -#define ITEM_TM91 672 -#define ITEM_TM92 673 -#define ITEM_TM93 674 -#define ITEM_TM94 675 -#define ITEM_TM95 676 -#define ITEM_TM96 677 -#define ITEM_TM97 678 -#define ITEM_TM98 679 -#define ITEM_TM99 680 -#define ITEM_TM100 681 - -#define ITEM_HM01 682 -#define ITEM_HM02 683 -#define ITEM_HM03 684 -#define ITEM_HM04 685 -#define ITEM_HM05 686 -#define ITEM_HM06 687 -#define ITEM_HM07 688 -#define ITEM_HM08 689 - -// Charms -#define ITEM_OVAL_CHARM 690 -#define ITEM_SHINY_CHARM 691 -#define ITEM_CATCHING_CHARM 692 -#define ITEM_EXP_CHARM 693 - -// Form-changing Key Items -#define ITEM_ROTOM_CATALOG 694 -#define ITEM_GRACIDEA 695 -#define ITEM_REVEAL_GLASS 696 -#define ITEM_DNA_SPLICERS 697 -#define ITEM_ZYGARDE_CUBE 698 -#define ITEM_PRISON_BOTTLE 699 -#define ITEM_N_SOLARIZER 700 -#define ITEM_N_LUNARIZER 701 -#define ITEM_REINS_OF_UNITY 702 - -// Battle Mechanic Key Items -#define ITEM_MEGA_RING 703 -#define ITEM_Z_POWER_RING 704 -#define ITEM_DYNAMAX_BAND 705 - -// Misc. Key Items -#define ITEM_BICYCLE 706 -#define ITEM_MACH_BIKE 707 -#define ITEM_ACRO_BIKE 708 -#define ITEM_OLD_ROD 709 -#define ITEM_GOOD_ROD 710 -#define ITEM_SUPER_ROD 711 -#define ITEM_DOWSING_MACHINE 712 -#define ITEM_ITEMFINDER ITEM_DOWSING_MACHINE // Pre-Gen IV name -#define ITEM_DOWSING_MCHN ITEM_DOWSING_MACHINE // Gen IV-V name -#define ITEM_TOWN_MAP 713 -#define ITEM_VS_SEEKER 714 -#define ITEM_TM_CASE 715 -#define ITEM_BERRY_POUCH 716 -#define ITEM_POKEMON_BOX_LINK 717 -#define ITEM_POKEMON_BOX ITEM_POKEMON_BOX_LINK // Pre-Gen VIII name -#define ITEM_COIN_CASE 718 -#define ITEM_POWDER_JAR 719 -#define ITEM_WAILMER_PAIL 720 -#define ITEM_POKE_RADAR 721 -#define ITEM_POKEBLOCK_CASE 722 -#define ITEM_SOOT_SACK 723 -#define ITEM_POKE_FLUTE 724 -#define ITEM_FAME_CHECKER 725 -#define ITEM_TEACHY_TV 726 - -// Story Key Items -#define ITEM_SS_TICKET 727 -#define ITEM_EON_TICKET 728 -#define ITEM_MYSTIC_TICKET 729 -#define ITEM_AURORA_TICKET 730 -#define ITEM_OLD_SEA_MAP 731 -#define ITEM_LETTER 732 -#define ITEM_DEVON_PARTS 733 -#define ITEM_DEVON_GOODS ITEM_DEVON_PARTS // Pre-Gen VI name -#define ITEM_GO_GOGGLES 734 -#define ITEM_DEVON_SCOPE 735 -#define ITEM_BASEMENT_KEY 736 -#define ITEM_SCANNER 737 -#define ITEM_STORAGE_KEY 738 -#define ITEM_KEY_TO_ROOM_1 739 -#define ITEM_RM_1_KEY ITEM_KEY_TO_ROOM_1 // Pre-Gen VI name -#define ITEM_KEY_TO_ROOM_2 740 -#define ITEM_RM_2_KEY ITEM_KEY_TO_ROOM_2 // Pre-Gen VI name -#define ITEM_KEY_TO_ROOM_4 741 -#define ITEM_RM_4_KEY ITEM_KEY_TO_ROOM_4 // Pre-Gen VI name -#define ITEM_KEY_TO_ROOM_6 742 -#define ITEM_RM_6_KEY ITEM_KEY_TO_ROOM_6 // Pre-Gen VI name -#define ITEM_METEORITE 743 -#define ITEM_MAGMA_EMBLEM 744 -#define ITEM_CONTEST_PASS 745 -#define ITEM_PARCEL 746 -#define ITEM_OAKS_PARCEL ITEM_PARCEL // Pre-Gen IV name -#define ITEM_SECRET_KEY 747 -#define ITEM_BIKE_VOUCHER 748 -#define ITEM_GOLD_TEETH 749 -#define ITEM_CARD_KEY 750 -#define ITEM_LIFT_KEY 751 -#define ITEM_SILPH_SCOPE 752 -#define ITEM_TRI_PASS 753 -#define ITEM_RAINBOW_PASS 754 -#define ITEM_TEA 755 -#define ITEM_RUBY 756 -#define ITEM_SAPPHIRE 757 - -// GEN IX ITEMS -#define ITEM_ABILITY_SHIELD 758 -#define ITEM_CLEAR_AMULET 759 -#define ITEM_PUNCHING_GLOVE 760 -#define ITEM_COVERT_CLOAK 761 -#define ITEM_LOADED_DICE 762 -#define ITEM_AUSPICIOUS_ARMOR 763 -#define ITEM_BOOSTER_ENERGY 764 -#define ITEM_BIG_BAMBOO_SHOOT 765 -#define ITEM_GIMMIGHOUL_COIN 766 -#define ITEM_LEADERS_CREST 767 -#define ITEM_MALICIOUS_ARMOR 768 -#define ITEM_MIRROR_HERB 769 -#define ITEM_SCROLL_OF_DARKNESS 770 -#define ITEM_SCROLL_OF_WATERS 771 -#define ITEM_TERA_ORB 772 -#define ITEM_TINY_BAMBOO_SHOOT 773 - -#define ITEM_BUG_TERA_SHARD 774 -#define ITEM_DARK_TERA_SHARD 775 -#define ITEM_DRAGON_TERA_SHARD 776 -#define ITEM_ELECTRIC_TERA_SHARD 777 -#define ITEM_FAIRY_TERA_SHARD 778 -#define ITEM_FIGHTING_TERA_SHARD 779 -#define ITEM_FIRE_TERA_SHARD 780 -#define ITEM_FLYING_TERA_SHARD 781 -#define ITEM_GHOST_TERA_SHARD 782 -#define ITEM_GRASS_TERA_SHARD 783 -#define ITEM_GROUND_TERA_SHARD 784 -#define ITEM_ICE_TERA_SHARD 785 -#define ITEM_NORMAL_TERA_SHARD 786 -#define ITEM_POISON_TERA_SHARD 787 -#define ITEM_PSYCHIC_TERA_SHARD 788 -#define ITEM_ROCK_TERA_SHARD 789 -#define ITEM_STEEL_TERA_SHARD 790 -#define ITEM_WATER_TERA_SHARD 791 - -#define ITEM_ADAMANT_CRYSTAL 792 -#define ITEM_GRISEOUS_CORE 793 -#define ITEM_LUSTROUS_GLOBE 794 - -#define ITEM_BLACK_AUGURITE 795 -#define ITEM_LINKING_CORD 796 -#define ITEM_PEAT_BLOCK 797 -#define ITEM_BERSERK_GENE 798 - -#define ITEM_FAIRY_FEATHER 799 -#define ITEM_SYRUPY_APPLE 800 -#define ITEM_UNREMARKABLE_TEACUP 801 -#define ITEM_MASTERPIECE_TEACUP 802 -#define ITEM_CORNERSTONE_MASK 803 -#define ITEM_WELLSPRING_MASK 804 -#define ITEM_HEARTHFLAME_MASK 805 -#define ITEM_HEALTH_MOCHI 806 -#define ITEM_MUSCLE_MOCHI 807 -#define ITEM_RESIST_MOCHI 808 -#define ITEM_GENIUS_MOCHI 809 -#define ITEM_CLEVER_MOCHI 810 -#define ITEM_SWIFT_MOCHI 811 -#define ITEM_FRESH_START_MOCHI 812 -#define ITEM_GLIMMERING_CHARM 813 -#define ITEM_METAL_ALLOY 814 -#define ITEM_STELLAR_TERA_SHARD 815 - -#define ITEM_JUBILIFE_MUFFIN 816 -#define ITEM_REMEDY 817 -#define ITEM_FINE_REMEDY 818 -#define ITEM_SUPERB_REMEDY 819 -#define ITEM_AUX_EVASION 820 -#define ITEM_AUX_GUARD 821 -#define ITEM_AUX_POWER 822 -#define ITEM_AUX_POWERGUARD 823 -#define ITEM_CHOICE_DUMPLING 824 -#define ITEM_SWAP_SNACK 825 -#define ITEM_TWICE_SPICED_RADISH 826 -#define ITEM_POKESHI_DOLL 827 - -#define ITEM_STRANGE_BALL 828 - -#define ITEM_CLEFABLITE 829 -#define ITEM_VICTREEBELITE 830 -#define ITEM_STARMINITE 831 -#define ITEM_DRAGONINITE 832 -#define ITEM_MEGANIUMITE 833 -#define ITEM_FERALIGITE 834 -#define ITEM_SKARMORITE 835 -#define ITEM_FROSLASSITE 836 -#define ITEM_EMBOARITE 837 -#define ITEM_EXCADRITE 838 -#define ITEM_SCOLIPITE 839 -#define ITEM_SCRAFTINITE 840 -#define ITEM_EELEKTROSSITE 841 -#define ITEM_CHANDELURITE 842 -#define ITEM_CHESNAUGHTITE 843 -#define ITEM_DELPHOXITE 844 -#define ITEM_GRENINJITE 845 -#define ITEM_PYROARITE 846 -#define ITEM_FLOETTITE 847 -#define ITEM_MALAMARITE 848 -#define ITEM_BARBARACITE 849 -#define ITEM_DRAGALGITE 850 -#define ITEM_HAWLUCHANITE 851 -#define ITEM_ZYGARDITE 852 -#define ITEM_DRAMPANITE 853 -#define ITEM_FALINKSITE 854 -#define ITEM_HEATRANITE 855 -#define ITEM_DARKRANITE 856 -#define ITEM_ZERAORITE 857 -#define ITEM_RAICHUNITE_X 858 -#define ITEM_RAICHUNITE_Y 859 -#define ITEM_CHIMECHITE 860 -#define ITEM_ABSOLITE_Z 861 -#define ITEM_STARAPTITE 862 -#define ITEM_GARCHOMPITE_Z 863 -#define ITEM_LUCARIONITE_Z 864 -#define ITEM_GOLURKITE 865 -#define ITEM_MEOWSTICITE 866 -#define ITEM_CRABOMINITE 867 -#define ITEM_GOLISOPITE 868 -#define ITEM_MAGEARNITE 869 -#define ITEM_SCOVILLAINITE 870 -#define ITEM_BAXCALIBRITE 871 -#define ITEM_TATSUGIRINITE 872 -#define ITEM_GLIMMORANITE 873 - -#define ITEMS_COUNT 874 -#define ITEM_FIELD_ARROW ITEMS_COUNT - -// A special item id associated with "Cancel"/"Exit" etc. in a list of items or decorations -// Its icon is defined at ITEMS_COUNT as the "return to field" arrow -#define ITEM_LIST_END 0xFFFF - // Range of berries given out by various NPCS #define FIRST_BERRY_MASTER_BERRY ITEM_POMEG_BERRY #define LAST_BERRY_MASTER_BERRY ITEM_NOMEL_BERRY @@ -1085,6 +1107,7 @@ // Secondary IDs for bikes #define MACH_BIKE 0 #define ACRO_BIKE 1 +#define STANDARD_BIKE 2 // Item parameters for EXP Candies #define EXP_100 1 @@ -1100,6 +1123,7 @@ #define ITEM_USE_UNUSED 3 #define ITEM_USE_BAG_MENU 4 // No exit callback, stays in bag menu #define ITEM_USE_PARTY_MENU_MOVES 5 +#define ITEM_USE_BATTLER 6 // Auto-select in Singles but lets you choose from party menu in Doubles // Item battle script IDs (need to be non-zero) #define EFFECT_ITEM_RESTORE_HP 1 diff --git a/include/constants/moves.h b/include/constants/moves.h index dc8bc59a3..f1d695ffc 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -1,1025 +1,1017 @@ #ifndef GUARD_CONSTANTS_MOVES_H #define GUARD_CONSTANTS_MOVES_H -#define MOVE_NONE 0 -#define MOVE_POUND 1 -#define MOVE_KARATE_CHOP 2 -#define MOVE_DOUBLE_SLAP 3 -#define MOVE_DOUBLESLAP MOVE_DOUBLE_SLAP // Pre-Gen VI name -#define MOVE_COMET_PUNCH 4 -#define MOVE_MEGA_PUNCH 5 -#define MOVE_PAY_DAY 6 -#define MOVE_FIRE_PUNCH 7 -#define MOVE_ICE_PUNCH 8 -#define MOVE_THUNDER_PUNCH 9 -#define MOVE_THUNDERPUNCH MOVE_THUNDER_PUNCH // Pre-Gen VI name -#define MOVE_SCRATCH 10 -#define MOVE_VISE_GRIP 11 -#define MOVE_VICEGRIP MOVE_VISE_GRIP // Pre-Gen VI name -#define MOVE_VICE_GRIP MOVE_VISE_GRIP // Pre-Gen VIII name -#define MOVE_GUILLOTINE 12 -#define MOVE_RAZOR_WIND 13 -#define MOVE_SWORDS_DANCE 14 -#define MOVE_CUT 15 -#define MOVE_GUST 16 -#define MOVE_WING_ATTACK 17 -#define MOVE_WHIRLWIND 18 -#define MOVE_FLY 19 -#define MOVE_BIND 20 -#define MOVE_SLAM 21 -#define MOVE_VINE_WHIP 22 -#define MOVE_STOMP 23 -#define MOVE_DOUBLE_KICK 24 -#define MOVE_MEGA_KICK 25 -#define MOVE_JUMP_KICK 26 -#define MOVE_ROLLING_KICK 27 -#define MOVE_SAND_ATTACK 28 -#define MOVE_HEADBUTT 29 -#define MOVE_HORN_ATTACK 30 -#define MOVE_FURY_ATTACK 31 -#define MOVE_HORN_DRILL 32 -#define MOVE_TACKLE 33 -#define MOVE_BODY_SLAM 34 -#define MOVE_WRAP 35 -#define MOVE_TAKE_DOWN 36 -#define MOVE_THRASH 37 -#define MOVE_DOUBLE_EDGE 38 -#define MOVE_TAIL_WHIP 39 -#define MOVE_POISON_STING 40 -#define MOVE_TWINEEDLE 41 -#define MOVE_PIN_MISSILE 42 -#define MOVE_LEER 43 -#define MOVE_BITE 44 -#define MOVE_GROWL 45 -#define MOVE_ROAR 46 -#define MOVE_SING 47 -#define MOVE_SUPERSONIC 48 -#define MOVE_SONIC_BOOM 49 -#define MOVE_SONICBOOM MOVE_SONIC_BOOM // Pre-Gen VI name -#define MOVE_DISABLE 50 -#define MOVE_ACID 51 -#define MOVE_EMBER 52 -#define MOVE_FLAMETHROWER 53 -#define MOVE_MIST 54 -#define MOVE_WATER_GUN 55 -#define MOVE_HYDRO_PUMP 56 -#define MOVE_SURF 57 -#define MOVE_ICE_BEAM 58 -#define MOVE_BLIZZARD 59 -#define MOVE_PSYBEAM 60 -#define MOVE_BUBBLE_BEAM 61 -#define MOVE_BUBBLEBEAM MOVE_BUBBLE_BEAM // Pre-Gen VI name -#define MOVE_AURORA_BEAM 62 -#define MOVE_HYPER_BEAM 63 -#define MOVE_PECK 64 -#define MOVE_DRILL_PECK 65 -#define MOVE_SUBMISSION 66 -#define MOVE_LOW_KICK 67 -#define MOVE_COUNTER 68 -#define MOVE_SEISMIC_TOSS 69 -#define MOVE_STRENGTH 70 -#define MOVE_ABSORB 71 -#define MOVE_MEGA_DRAIN 72 -#define MOVE_LEECH_SEED 73 -#define MOVE_GROWTH 74 -#define MOVE_RAZOR_LEAF 75 -#define MOVE_SOLAR_BEAM 76 -#define MOVE_SOLARBEAM MOVE_SOLAR_BEAM // Pre-Gen VI name -#define MOVE_POISON_POWDER 77 -#define MOVE_POISONPOWDER MOVE_POISON_POWDER // Pre-Gen VI name -#define MOVE_STUN_SPORE 78 -#define MOVE_SLEEP_POWDER 79 -#define MOVE_PETAL_DANCE 80 -#define MOVE_STRING_SHOT 81 -#define MOVE_DRAGON_RAGE 82 -#define MOVE_FIRE_SPIN 83 -#define MOVE_THUNDER_SHOCK 84 -#define MOVE_THUNDERSHOCK MOVE_THUNDER_SHOCK // Pre-Gen VI name -#define MOVE_THUNDERBOLT 85 -#define MOVE_THUNDER_WAVE 86 -#define MOVE_THUNDER 87 -#define MOVE_ROCK_THROW 88 -#define MOVE_EARTHQUAKE 89 -#define MOVE_FISSURE 90 -#define MOVE_DIG 91 -#define MOVE_TOXIC 92 -#define MOVE_CONFUSION 93 -#define MOVE_PSYCHIC 94 -#define MOVE_HYPNOSIS 95 -#define MOVE_MEDITATE 96 -#define MOVE_AGILITY 97 -#define MOVE_QUICK_ATTACK 98 -#define MOVE_RAGE 99 -#define MOVE_TELEPORT 100 -#define MOVE_NIGHT_SHADE 101 -#define MOVE_MIMIC 102 -#define MOVE_SCREECH 103 -#define MOVE_DOUBLE_TEAM 104 -#define MOVE_RECOVER 105 -#define MOVE_HARDEN 106 -#define MOVE_MINIMIZE 107 -#define MOVE_SMOKESCREEN 108 -#define MOVE_CONFUSE_RAY 109 -#define MOVE_WITHDRAW 110 -#define MOVE_DEFENSE_CURL 111 -#define MOVE_BARRIER 112 -#define MOVE_LIGHT_SCREEN 113 -#define MOVE_HAZE 114 -#define MOVE_REFLECT 115 -#define MOVE_FOCUS_ENERGY 116 -#define MOVE_BIDE 117 -#define MOVE_METRONOME 118 -#define MOVE_MIRROR_MOVE 119 -#define MOVE_SELF_DESTRUCT 120 -#define MOVE_SELFDESTRUCT MOVE_SELF_DESTRUCT // Pre-Gen VI name -#define MOVE_EGG_BOMB 121 -#define MOVE_LICK 122 -#define MOVE_SMOG 123 -#define MOVE_SLUDGE 124 -#define MOVE_BONE_CLUB 125 -#define MOVE_FIRE_BLAST 126 -#define MOVE_WATERFALL 127 -#define MOVE_CLAMP 128 -#define MOVE_SWIFT 129 -#define MOVE_SKULL_BASH 130 -#define MOVE_SPIKE_CANNON 131 -#define MOVE_CONSTRICT 132 -#define MOVE_AMNESIA 133 -#define MOVE_KINESIS 134 -#define MOVE_SOFT_BOILED 135 -#define MOVE_SOFTBOILED MOVE_SOFT_BOILED // Pre-Gen VI name -#define MOVE_HIGH_JUMP_KICK 136 -#define MOVE_HI_JUMP_KICK MOVE_HIGH_JUMP_KICK // Pre-Gen VI name -#define MOVE_GLARE 137 -#define MOVE_DREAM_EATER 138 -#define MOVE_POISON_GAS 139 -#define MOVE_BARRAGE 140 -#define MOVE_LEECH_LIFE 141 -#define MOVE_LOVELY_KISS 142 -#define MOVE_SKY_ATTACK 143 -#define MOVE_TRANSFORM 144 -#define MOVE_BUBBLE 145 -#define MOVE_DIZZY_PUNCH 146 -#define MOVE_SPORE 147 -#define MOVE_FLASH 148 -#define MOVE_PSYWAVE 149 -#define MOVE_SPLASH 150 -#define MOVE_ACID_ARMOR 151 -#define MOVE_CRABHAMMER 152 -#define MOVE_EXPLOSION 153 -#define MOVE_FURY_SWIPES 154 -#define MOVE_BONEMERANG 155 -#define MOVE_REST 156 -#define MOVE_ROCK_SLIDE 157 -#define MOVE_HYPER_FANG 158 -#define MOVE_SHARPEN 159 -#define MOVE_CONVERSION 160 -#define MOVE_TRI_ATTACK 161 -#define MOVE_SUPER_FANG 162 -#define MOVE_SLASH 163 -#define MOVE_SUBSTITUTE 164 -#define MOVE_STRUGGLE 165 +enum __attribute__((packed)) Move +{ + MOVE_NONE = 0, + MOVE_POUND = 1, + MOVE_KARATE_CHOP = 2, + MOVE_DOUBLE_SLAP = 3, + MOVE_DOUBLESLAP = MOVE_DOUBLE_SLAP, // Pre-Gen VI name + MOVE_COMET_PUNCH = 4, + MOVE_MEGA_PUNCH = 5, + MOVE_PAY_DAY = 6, + MOVE_FIRE_PUNCH = 7, + MOVE_ICE_PUNCH = 8, + MOVE_THUNDER_PUNCH = 9, + MOVE_THUNDERPUNCH = MOVE_THUNDER_PUNCH, // Pre-Gen VI name + MOVE_SCRATCH = 10, + MOVE_VISE_GRIP = 11, + MOVE_VICEGRIP = MOVE_VISE_GRIP, // Pre-Gen VI name + MOVE_VICE_GRIP = MOVE_VISE_GRIP, // Pre-Gen VIII name + MOVE_GUILLOTINE = 12, + MOVE_RAZOR_WIND = 13, + MOVE_SWORDS_DANCE = 14, + MOVE_CUT = 15, + MOVE_GUST = 16, + MOVE_WING_ATTACK = 17, + MOVE_WHIRLWIND = 18, + MOVE_FLY = 19, + MOVE_BIND = 20, + MOVE_SLAM = 21, + MOVE_VINE_WHIP = 22, + MOVE_STOMP = 23, + MOVE_DOUBLE_KICK = 24, + MOVE_MEGA_KICK = 25, + MOVE_JUMP_KICK = 26, + MOVE_ROLLING_KICK = 27, + MOVE_SAND_ATTACK = 28, + MOVE_HEADBUTT = 29, + MOVE_HORN_ATTACK = 30, + MOVE_FURY_ATTACK = 31, + MOVE_HORN_DRILL = 32, + MOVE_TACKLE = 33, + MOVE_BODY_SLAM = 34, + MOVE_WRAP = 35, + MOVE_TAKE_DOWN = 36, + MOVE_THRASH = 37, + MOVE_DOUBLE_EDGE = 38, + MOVE_TAIL_WHIP = 39, + MOVE_POISON_STING = 40, + MOVE_TWINEEDLE = 41, + MOVE_PIN_MISSILE = 42, + MOVE_LEER = 43, + MOVE_BITE = 44, + MOVE_GROWL = 45, + MOVE_ROAR = 46, + MOVE_SING = 47, + MOVE_SUPERSONIC = 48, + MOVE_SONIC_BOOM = 49, + MOVE_SONICBOOM = MOVE_SONIC_BOOM, // Pre-Gen VI name + MOVE_DISABLE = 50, + MOVE_ACID = 51, + MOVE_EMBER = 52, + MOVE_FLAMETHROWER = 53, + MOVE_MIST = 54, + MOVE_WATER_GUN = 55, + MOVE_HYDRO_PUMP = 56, + MOVE_SURF = 57, + MOVE_ICE_BEAM = 58, + MOVE_BLIZZARD = 59, + MOVE_PSYBEAM = 60, + MOVE_BUBBLE_BEAM = 61, + MOVE_BUBBLEBEAM = MOVE_BUBBLE_BEAM, // Pre-Gen VI name + MOVE_AURORA_BEAM = 62, + MOVE_HYPER_BEAM = 63, + MOVE_PECK = 64, + MOVE_DRILL_PECK = 65, + MOVE_SUBMISSION = 66, + MOVE_LOW_KICK = 67, + MOVE_COUNTER = 68, + MOVE_SEISMIC_TOSS = 69, + MOVE_STRENGTH = 70, + MOVE_ABSORB = 71, + MOVE_MEGA_DRAIN = 72, + MOVE_LEECH_SEED = 73, + MOVE_GROWTH = 74, + MOVE_RAZOR_LEAF = 75, + MOVE_SOLAR_BEAM = 76, + MOVE_SOLARBEAM = MOVE_SOLAR_BEAM, // Pre-Gen VI name + MOVE_POISON_POWDER = 77, + MOVE_POISONPOWDER = MOVE_POISON_POWDER, // Pre-Gen VI name + MOVE_STUN_SPORE = 78, + MOVE_SLEEP_POWDER = 79, + MOVE_PETAL_DANCE = 80, + MOVE_STRING_SHOT = 81, + MOVE_DRAGON_RAGE = 82, + MOVE_FIRE_SPIN = 83, + MOVE_THUNDER_SHOCK = 84, + MOVE_THUNDERSHOCK = MOVE_THUNDER_SHOCK, // Pre-Gen VI name + MOVE_THUNDERBOLT = 85, + MOVE_THUNDER_WAVE = 86, + MOVE_THUNDER = 87, + MOVE_ROCK_THROW = 88, + MOVE_EARTHQUAKE = 89, + MOVE_FISSURE = 90, + MOVE_DIG = 91, + MOVE_TOXIC = 92, + MOVE_CONFUSION = 93, + MOVE_PSYCHIC = 94, + MOVE_HYPNOSIS = 95, + MOVE_MEDITATE = 96, + MOVE_AGILITY = 97, + MOVE_QUICK_ATTACK = 98, + MOVE_RAGE = 99, + MOVE_TELEPORT = 100, + MOVE_NIGHT_SHADE = 101, + MOVE_MIMIC = 102, + MOVE_SCREECH = 103, + MOVE_DOUBLE_TEAM = 104, + MOVE_RECOVER = 105, + MOVE_HARDEN = 106, + MOVE_MINIMIZE = 107, + MOVE_SMOKESCREEN = 108, + MOVE_CONFUSE_RAY = 109, + MOVE_WITHDRAW = 110, + MOVE_DEFENSE_CURL = 111, + MOVE_BARRIER = 112, + MOVE_LIGHT_SCREEN = 113, + MOVE_HAZE = 114, + MOVE_REFLECT = 115, + MOVE_FOCUS_ENERGY = 116, + MOVE_BIDE = 117, + MOVE_METRONOME = 118, + MOVE_MIRROR_MOVE = 119, + MOVE_SELF_DESTRUCT = 120, + MOVE_SELFDESTRUCT = MOVE_SELF_DESTRUCT, // Pre-Gen VI name + MOVE_EGG_BOMB = 121, + MOVE_LICK = 122, + MOVE_SMOG = 123, + MOVE_SLUDGE = 124, + MOVE_BONE_CLUB = 125, + MOVE_FIRE_BLAST = 126, + MOVE_WATERFALL = 127, + MOVE_CLAMP = 128, + MOVE_SWIFT = 129, + MOVE_SKULL_BASH = 130, + MOVE_SPIKE_CANNON = 131, + MOVE_CONSTRICT = 132, + MOVE_AMNESIA = 133, + MOVE_KINESIS = 134, + MOVE_SOFT_BOILED = 135, + MOVE_SOFTBOILED = MOVE_SOFT_BOILED, // Pre-Gen VI name + MOVE_HIGH_JUMP_KICK = 136, + MOVE_HI_JUMP_KICK = MOVE_HIGH_JUMP_KICK, // Pre-Gen VI name + MOVE_GLARE = 137, + MOVE_DREAM_EATER = 138, + MOVE_POISON_GAS = 139, + MOVE_BARRAGE = 140, + MOVE_LEECH_LIFE = 141, + MOVE_LOVELY_KISS = 142, + MOVE_SKY_ATTACK = 143, + MOVE_TRANSFORM = 144, + MOVE_BUBBLE = 145, + MOVE_DIZZY_PUNCH = 146, + MOVE_SPORE = 147, + MOVE_FLASH = 148, + MOVE_PSYWAVE = 149, + MOVE_SPLASH = 150, + MOVE_ACID_ARMOR = 151, + MOVE_CRABHAMMER = 152, + MOVE_EXPLOSION = 153, + MOVE_FURY_SWIPES = 154, + MOVE_BONEMERANG = 155, + MOVE_REST = 156, + MOVE_ROCK_SLIDE = 157, + MOVE_HYPER_FANG = 158, + MOVE_SHARPEN = 159, + MOVE_CONVERSION = 160, + MOVE_TRI_ATTACK = 161, + MOVE_SUPER_FANG = 162, + MOVE_SLASH = 163, + MOVE_SUBSTITUTE = 164, + MOVE_STRUGGLE = 165, + MOVES_COUNT_GEN1, -#define MOVES_COUNT_GEN1 166 + // Gen 2 + MOVE_SKETCH = MOVES_COUNT_GEN1, + MOVE_TRIPLE_KICK = 167, + MOVE_THIEF = 168, + MOVE_SPIDER_WEB = 169, + MOVE_MIND_READER = 170, + MOVE_NIGHTMARE = 171, + MOVE_FLAME_WHEEL = 172, + MOVE_SNORE = 173, + MOVE_CURSE = 174, + MOVE_FLAIL = 175, + MOVE_CONVERSION_2 = 176, + MOVE_AEROBLAST = 177, + MOVE_COTTON_SPORE = 178, + MOVE_REVERSAL = 179, + MOVE_SPITE = 180, + MOVE_POWDER_SNOW = 181, + MOVE_PROTECT = 182, + MOVE_MACH_PUNCH = 183, + MOVE_SCARY_FACE = 184, + MOVE_FEINT_ATTACK = 185, + MOVE_FAINT_ATTACK = MOVE_FEINT_ATTACK, // Pre-Gen VI name + MOVE_SWEET_KISS = 186, + MOVE_BELLY_DRUM = 187, + MOVE_SLUDGE_BOMB = 188, + MOVE_MUD_SLAP = 189, + MOVE_OCTAZOOKA = 190, + MOVE_SPIKES = 191, + MOVE_ZAP_CANNON = 192, + MOVE_FORESIGHT = 193, + MOVE_DESTINY_BOND = 194, + MOVE_PERISH_SONG = 195, + MOVE_ICY_WIND = 196, + MOVE_DETECT = 197, + MOVE_BONE_RUSH = 198, + MOVE_LOCK_ON = 199, + MOVE_OUTRAGE = 200, + MOVE_SANDSTORM = 201, + MOVE_GIGA_DRAIN = 202, + MOVE_ENDURE = 203, + MOVE_CHARM = 204, + MOVE_ROLLOUT = 205, + MOVE_FALSE_SWIPE = 206, + MOVE_SWAGGER = 207, + MOVE_MILK_DRINK = 208, + MOVE_SPARK = 209, + MOVE_FURY_CUTTER = 210, + MOVE_STEEL_WING = 211, + MOVE_MEAN_LOOK = 212, + MOVE_ATTRACT = 213, + MOVE_SLEEP_TALK = 214, + MOVE_HEAL_BELL = 215, + MOVE_RETURN = 216, + MOVE_PRESENT = 217, + MOVE_FRUSTRATION = 218, + MOVE_SAFEGUARD = 219, + MOVE_PAIN_SPLIT = 220, + MOVE_SACRED_FIRE = 221, + MOVE_MAGNITUDE = 222, + MOVE_DYNAMIC_PUNCH = 223, + MOVE_DYNAMICPUNCH = MOVE_DYNAMIC_PUNCH, // Pre-Gen VI name + MOVE_MEGAHORN = 224, + MOVE_DRAGON_BREATH = 225, + MOVE_DRAGONBREATH = MOVE_DRAGON_BREATH, // Pre-Gen VI name + MOVE_BATON_PASS = 226, + MOVE_ENCORE = 227, + MOVE_PURSUIT = 228, + MOVE_RAPID_SPIN = 229, + MOVE_SWEET_SCENT = 230, + MOVE_IRON_TAIL = 231, + MOVE_METAL_CLAW = 232, + MOVE_VITAL_THROW = 233, + MOVE_MORNING_SUN = 234, + MOVE_SYNTHESIS = 235, + MOVE_MOONLIGHT = 236, + MOVE_HIDDEN_POWER = 237, + MOVE_CROSS_CHOP = 238, + MOVE_TWISTER = 239, + MOVE_RAIN_DANCE = 240, + MOVE_SUNNY_DAY = 241, + MOVE_CRUNCH = 242, + MOVE_MIRROR_COAT = 243, + MOVE_PSYCH_UP = 244, + MOVE_EXTREME_SPEED = 245, + MOVE_EXTREMESPEED = MOVE_EXTREME_SPEED, // Pre-Gen VI name + MOVE_ANCIENT_POWER = 246, + MOVE_ANCIENTPOWER = MOVE_ANCIENT_POWER, // Pre-Gen VI name + MOVE_SHADOW_BALL = 247, + MOVE_FUTURE_SIGHT = 248, + MOVE_ROCK_SMASH = 249, + MOVE_WHIRLPOOL = 250, + MOVE_BEAT_UP = 251, + MOVES_COUNT_GEN2, -#define MOVE_SKETCH 166 -#define MOVE_TRIPLE_KICK 167 -#define MOVE_THIEF 168 -#define MOVE_SPIDER_WEB 169 -#define MOVE_MIND_READER 170 -#define MOVE_NIGHTMARE 171 -#define MOVE_FLAME_WHEEL 172 -#define MOVE_SNORE 173 -#define MOVE_CURSE 174 -#define MOVE_FLAIL 175 -#define MOVE_CONVERSION_2 176 -#define MOVE_AEROBLAST 177 -#define MOVE_COTTON_SPORE 178 -#define MOVE_REVERSAL 179 -#define MOVE_SPITE 180 -#define MOVE_POWDER_SNOW 181 -#define MOVE_PROTECT 182 -#define MOVE_MACH_PUNCH 183 -#define MOVE_SCARY_FACE 184 -#define MOVE_FEINT_ATTACK 185 -#define MOVE_FAINT_ATTACK MOVE_FEINT_ATTACK // Pre-Gen VI name -#define MOVE_SWEET_KISS 186 -#define MOVE_BELLY_DRUM 187 -#define MOVE_SLUDGE_BOMB 188 -#define MOVE_MUD_SLAP 189 -#define MOVE_OCTAZOOKA 190 -#define MOVE_SPIKES 191 -#define MOVE_ZAP_CANNON 192 -#define MOVE_FORESIGHT 193 -#define MOVE_DESTINY_BOND 194 -#define MOVE_PERISH_SONG 195 -#define MOVE_ICY_WIND 196 -#define MOVE_DETECT 197 -#define MOVE_BONE_RUSH 198 -#define MOVE_LOCK_ON 199 -#define MOVE_OUTRAGE 200 -#define MOVE_SANDSTORM 201 -#define MOVE_GIGA_DRAIN 202 -#define MOVE_ENDURE 203 -#define MOVE_CHARM 204 -#define MOVE_ROLLOUT 205 -#define MOVE_FALSE_SWIPE 206 -#define MOVE_SWAGGER 207 -#define MOVE_MILK_DRINK 208 -#define MOVE_SPARK 209 -#define MOVE_FURY_CUTTER 210 -#define MOVE_STEEL_WING 211 -#define MOVE_MEAN_LOOK 212 -#define MOVE_ATTRACT 213 -#define MOVE_SLEEP_TALK 214 -#define MOVE_HEAL_BELL 215 -#define MOVE_RETURN 216 -#define MOVE_PRESENT 217 -#define MOVE_FRUSTRATION 218 -#define MOVE_SAFEGUARD 219 -#define MOVE_PAIN_SPLIT 220 -#define MOVE_SACRED_FIRE 221 -#define MOVE_MAGNITUDE 222 -#define MOVE_DYNAMIC_PUNCH 223 -#define MOVE_DYNAMICPUNCH MOVE_DYNAMIC_PUNCH // Pre-Gen VI name -#define MOVE_MEGAHORN 224 -#define MOVE_DRAGON_BREATH 225 -#define MOVE_DRAGONBREATH MOVE_DRAGON_BREATH // Pre-Gen VI name -#define MOVE_BATON_PASS 226 -#define MOVE_ENCORE 227 -#define MOVE_PURSUIT 228 -#define MOVE_RAPID_SPIN 229 -#define MOVE_SWEET_SCENT 230 -#define MOVE_IRON_TAIL 231 -#define MOVE_METAL_CLAW 232 -#define MOVE_VITAL_THROW 233 -#define MOVE_MORNING_SUN 234 -#define MOVE_SYNTHESIS 235 -#define MOVE_MOONLIGHT 236 -#define MOVE_HIDDEN_POWER 237 -#define MOVE_CROSS_CHOP 238 -#define MOVE_TWISTER 239 -#define MOVE_RAIN_DANCE 240 -#define MOVE_SUNNY_DAY 241 -#define MOVE_CRUNCH 242 -#define MOVE_MIRROR_COAT 243 -#define MOVE_PSYCH_UP 244 -#define MOVE_EXTREME_SPEED 245 -#define MOVE_EXTREMESPEED MOVE_EXTREME_SPEED // Pre-Gen VI name -#define MOVE_ANCIENT_POWER 246 -#define MOVE_ANCIENTPOWER MOVE_ANCIENT_POWER // Pre-Gen VI name -#define MOVE_SHADOW_BALL 247 -#define MOVE_FUTURE_SIGHT 248 -#define MOVE_ROCK_SMASH 249 -#define MOVE_WHIRLPOOL 250 -#define MOVE_BEAT_UP 251 + // Gen 3 + MOVE_FAKE_OUT = MOVES_COUNT_GEN2, + MOVE_UPROAR = 253, + MOVE_STOCKPILE = 254, + MOVE_SPIT_UP = 255, + MOVE_SWALLOW = 256, + MOVE_HEAT_WAVE = 257, + MOVE_HAIL = 258, + MOVE_TORMENT = 259, + MOVE_FLATTER = 260, + MOVE_WILL_O_WISP = 261, + MOVE_MEMENTO = 262, + MOVE_FACADE = 263, + MOVE_FOCUS_PUNCH = 264, + MOVE_SMELLING_SALTS = 265, + MOVE_SMELLINGSALT = MOVE_SMELLING_SALTS, // Pre-Gen VI name + MOVE_FOLLOW_ME = 266, + MOVE_NATURE_POWER = 267, + MOVE_CHARGE = 268, + MOVE_TAUNT = 269, + MOVE_HELPING_HAND = 270, + MOVE_TRICK = 271, + MOVE_ROLE_PLAY = 272, + MOVE_WISH = 273, + MOVE_ASSIST = 274, + MOVE_INGRAIN = 275, + MOVE_SUPERPOWER = 276, + MOVE_MAGIC_COAT = 277, + MOVE_RECYCLE = 278, + MOVE_REVENGE = 279, + MOVE_BRICK_BREAK = 280, + MOVE_YAWN = 281, + MOVE_KNOCK_OFF = 282, + MOVE_ENDEAVOR = 283, + MOVE_ERUPTION = 284, + MOVE_SKILL_SWAP = 285, + MOVE_IMPRISON = 286, + MOVE_REFRESH = 287, + MOVE_GRUDGE = 288, + MOVE_SNATCH = 289, + MOVE_SECRET_POWER = 290, + MOVE_DIVE = 291, + MOVE_ARM_THRUST = 292, + MOVE_CAMOUFLAGE = 293, + MOVE_TAIL_GLOW = 294, + MOVE_LUSTER_PURGE = 295, + MOVE_MIST_BALL = 296, + MOVE_FEATHER_DANCE = 297, + MOVE_FEATHERDANCE = MOVE_FEATHER_DANCE, // Pre-Gen VI name + MOVE_TEETER_DANCE = 298, + MOVE_BLAZE_KICK = 299, + MOVE_MUD_SPORT = 300, + MOVE_ICE_BALL = 301, + MOVE_NEEDLE_ARM = 302, + MOVE_SLACK_OFF = 303, + MOVE_HYPER_VOICE = 304, + MOVE_POISON_FANG = 305, + MOVE_CRUSH_CLAW = 306, + MOVE_BLAST_BURN = 307, + MOVE_HYDRO_CANNON = 308, + MOVE_METEOR_MASH = 309, + MOVE_ASTONISH = 310, + MOVE_WEATHER_BALL = 311, + MOVE_AROMATHERAPY = 312, + MOVE_FAKE_TEARS = 313, + MOVE_AIR_CUTTER = 314, + MOVE_OVERHEAT = 315, + MOVE_ODOR_SLEUTH = 316, + MOVE_ROCK_TOMB = 317, + MOVE_SILVER_WIND = 318, + MOVE_METAL_SOUND = 319, + MOVE_GRASS_WHISTLE = 320, + MOVE_GRASSWHISTLE = MOVE_GRASS_WHISTLE, // Pre-Gen VI name + MOVE_TICKLE = 321, + MOVE_COSMIC_POWER = 322, + MOVE_WATER_SPOUT = 323, + MOVE_SIGNAL_BEAM = 324, + MOVE_SHADOW_PUNCH = 325, + MOVE_EXTRASENSORY = 326, + MOVE_SKY_UPPERCUT = 327, + MOVE_SAND_TOMB = 328, + MOVE_SHEER_COLD = 329, + MOVE_MUDDY_WATER = 330, + MOVE_BULLET_SEED = 331, + MOVE_AERIAL_ACE = 332, + MOVE_ICICLE_SPEAR = 333, + MOVE_IRON_DEFENSE = 334, + MOVE_BLOCK = 335, + MOVE_HOWL = 336, + MOVE_DRAGON_CLAW = 337, + MOVE_FRENZY_PLANT = 338, + MOVE_BULK_UP = 339, + MOVE_BOUNCE = 340, + MOVE_MUD_SHOT = 341, + MOVE_POISON_TAIL = 342, + MOVE_COVET = 343, + MOVE_VOLT_TACKLE = 344, + MOVE_MAGICAL_LEAF = 345, + MOVE_WATER_SPORT = 346, + MOVE_CALM_MIND = 347, + MOVE_LEAF_BLADE = 348, + MOVE_DRAGON_DANCE = 349, + MOVE_ROCK_BLAST = 350, + MOVE_SHOCK_WAVE = 351, + MOVE_WATER_PULSE = 352, + MOVE_DOOM_DESIRE = 353, + MOVE_PSYCHO_BOOST = 354, + MOVES_COUNT_GEN3, -#define MOVES_COUNT_GEN2 252 + // Gen 4 + MOVE_ROOST = MOVES_COUNT_GEN3, + MOVE_GRAVITY = 356, + MOVE_MIRACLE_EYE = 357, + MOVE_WAKE_UP_SLAP = 358, + MOVE_HAMMER_ARM = 359, + MOVE_GYRO_BALL = 360, + MOVE_HEALING_WISH = 361, + MOVE_BRINE = 362, + MOVE_NATURAL_GIFT = 363, + MOVE_FEINT = 364, + MOVE_PLUCK = 365, + MOVE_TAILWIND = 366, + MOVE_ACUPRESSURE = 367, + MOVE_METAL_BURST = 368, + MOVE_U_TURN = 369, + MOVE_CLOSE_COMBAT = 370, + MOVE_PAYBACK = 371, + MOVE_ASSURANCE = 372, + MOVE_EMBARGO = 373, + MOVE_FLING = 374, + MOVE_PSYCHO_SHIFT = 375, + MOVE_TRUMP_CARD = 376, + MOVE_HEAL_BLOCK = 377, + MOVE_WRING_OUT = 378, + MOVE_POWER_TRICK = 379, + MOVE_GASTRO_ACID = 380, + MOVE_LUCKY_CHANT = 381, + MOVE_ME_FIRST = 382, + MOVE_COPYCAT = 383, + MOVE_POWER_SWAP = 384, + MOVE_GUARD_SWAP = 385, + MOVE_PUNISHMENT = 386, + MOVE_LAST_RESORT = 387, + MOVE_WORRY_SEED = 388, + MOVE_SUCKER_PUNCH = 389, + MOVE_TOXIC_SPIKES = 390, + MOVE_HEART_SWAP = 391, + MOVE_AQUA_RING = 392, + MOVE_MAGNET_RISE = 393, + MOVE_FLARE_BLITZ = 394, + MOVE_FORCE_PALM = 395, + MOVE_AURA_SPHERE = 396, + MOVE_ROCK_POLISH = 397, + MOVE_POISON_JAB = 398, + MOVE_DARK_PULSE = 399, + MOVE_NIGHT_SLASH = 400, + MOVE_AQUA_TAIL = 401, + MOVE_SEED_BOMB = 402, + MOVE_AIR_SLASH = 403, + MOVE_X_SCISSOR = 404, + MOVE_BUG_BUZZ = 405, + MOVE_DRAGON_PULSE = 406, + MOVE_DRAGON_RUSH = 407, + MOVE_POWER_GEM = 408, + MOVE_DRAIN_PUNCH = 409, + MOVE_VACUUM_WAVE = 410, + MOVE_FOCUS_BLAST = 411, + MOVE_ENERGY_BALL = 412, + MOVE_BRAVE_BIRD = 413, + MOVE_EARTH_POWER = 414, + MOVE_SWITCHEROO = 415, + MOVE_GIGA_IMPACT = 416, + MOVE_NASTY_PLOT = 417, + MOVE_BULLET_PUNCH = 418, + MOVE_AVALANCHE = 419, + MOVE_ICE_SHARD = 420, + MOVE_SHADOW_CLAW = 421, + MOVE_THUNDER_FANG = 422, + MOVE_ICE_FANG = 423, + MOVE_FIRE_FANG = 424, + MOVE_SHADOW_SNEAK = 425, + MOVE_MUD_BOMB = 426, + MOVE_PSYCHO_CUT = 427, + MOVE_ZEN_HEADBUTT = 428, + MOVE_MIRROR_SHOT = 429, + MOVE_FLASH_CANNON = 430, + MOVE_ROCK_CLIMB = 431, + MOVE_DEFOG = 432, + MOVE_TRICK_ROOM = 433, + MOVE_DRACO_METEOR = 434, + MOVE_DISCHARGE = 435, + MOVE_LAVA_PLUME = 436, + MOVE_LEAF_STORM = 437, + MOVE_POWER_WHIP = 438, + MOVE_ROCK_WRECKER = 439, + MOVE_CROSS_POISON = 440, + MOVE_GUNK_SHOT = 441, + MOVE_IRON_HEAD = 442, + MOVE_MAGNET_BOMB = 443, + MOVE_STONE_EDGE = 444, + MOVE_CAPTIVATE = 445, + MOVE_STEALTH_ROCK = 446, + MOVE_GRASS_KNOT = 447, + MOVE_CHATTER = 448, + MOVE_JUDGMENT = 449, + MOVE_BUG_BITE = 450, + MOVE_CHARGE_BEAM = 451, + MOVE_WOOD_HAMMER = 452, + MOVE_AQUA_JET = 453, + MOVE_ATTACK_ORDER = 454, + MOVE_DEFEND_ORDER = 455, + MOVE_HEAL_ORDER = 456, + MOVE_HEAD_SMASH = 457, + MOVE_DOUBLE_HIT = 458, + MOVE_ROAR_OF_TIME = 459, + MOVE_SPACIAL_REND = 460, + MOVE_LUNAR_DANCE = 461, + MOVE_CRUSH_GRIP = 462, + MOVE_MAGMA_STORM = 463, + MOVE_DARK_VOID = 464, + MOVE_SEED_FLARE = 465, + MOVE_OMINOUS_WIND = 466, + MOVE_SHADOW_FORCE = 467, + MOVES_COUNT_GEN4, -#define MOVE_FAKE_OUT 252 -#define MOVE_UPROAR 253 -#define MOVE_STOCKPILE 254 -#define MOVE_SPIT_UP 255 -#define MOVE_SWALLOW 256 -#define MOVE_HEAT_WAVE 257 -#define MOVE_HAIL 258 -#define MOVE_TORMENT 259 -#define MOVE_FLATTER 260 -#define MOVE_WILL_O_WISP 261 -#define MOVE_MEMENTO 262 -#define MOVE_FACADE 263 -#define MOVE_FOCUS_PUNCH 264 -#define MOVE_SMELLING_SALTS 265 -#define MOVE_SMELLINGSALT MOVE_SMELLING_SALTS // Pre-Gen VI name -#define MOVE_FOLLOW_ME 266 -#define MOVE_NATURE_POWER 267 -#define MOVE_CHARGE 268 -#define MOVE_TAUNT 269 -#define MOVE_HELPING_HAND 270 -#define MOVE_TRICK 271 -#define MOVE_ROLE_PLAY 272 -#define MOVE_WISH 273 -#define MOVE_ASSIST 274 -#define MOVE_INGRAIN 275 -#define MOVE_SUPERPOWER 276 -#define MOVE_MAGIC_COAT 277 -#define MOVE_RECYCLE 278 -#define MOVE_REVENGE 279 -#define MOVE_BRICK_BREAK 280 -#define MOVE_YAWN 281 -#define MOVE_KNOCK_OFF 282 -#define MOVE_ENDEAVOR 283 -#define MOVE_ERUPTION 284 -#define MOVE_SKILL_SWAP 285 -#define MOVE_IMPRISON 286 -#define MOVE_REFRESH 287 -#define MOVE_GRUDGE 288 -#define MOVE_SNATCH 289 -#define MOVE_SECRET_POWER 290 -#define MOVE_DIVE 291 -#define MOVE_ARM_THRUST 292 -#define MOVE_CAMOUFLAGE 293 -#define MOVE_TAIL_GLOW 294 -#define MOVE_LUSTER_PURGE 295 -#define MOVE_MIST_BALL 296 -#define MOVE_FEATHER_DANCE 297 -#define MOVE_FEATHERDANCE MOVE_FEATHER_DANCE // Pre-Gen VI name -#define MOVE_TEETER_DANCE 298 -#define MOVE_BLAZE_KICK 299 -#define MOVE_MUD_SPORT 300 -#define MOVE_ICE_BALL 301 -#define MOVE_NEEDLE_ARM 302 -#define MOVE_SLACK_OFF 303 -#define MOVE_HYPER_VOICE 304 -#define MOVE_POISON_FANG 305 -#define MOVE_CRUSH_CLAW 306 -#define MOVE_BLAST_BURN 307 -#define MOVE_HYDRO_CANNON 308 -#define MOVE_METEOR_MASH 309 -#define MOVE_ASTONISH 310 -#define MOVE_WEATHER_BALL 311 -#define MOVE_AROMATHERAPY 312 -#define MOVE_FAKE_TEARS 313 -#define MOVE_AIR_CUTTER 314 -#define MOVE_OVERHEAT 315 -#define MOVE_ODOR_SLEUTH 316 -#define MOVE_ROCK_TOMB 317 -#define MOVE_SILVER_WIND 318 -#define MOVE_METAL_SOUND 319 -#define MOVE_GRASS_WHISTLE 320 -#define MOVE_GRASSWHISTLE MOVE_GRASS_WHISTLE // Pre-Gen VI name -#define MOVE_TICKLE 321 -#define MOVE_COSMIC_POWER 322 -#define MOVE_WATER_SPOUT 323 -#define MOVE_SIGNAL_BEAM 324 -#define MOVE_SHADOW_PUNCH 325 -#define MOVE_EXTRASENSORY 326 -#define MOVE_SKY_UPPERCUT 327 -#define MOVE_SAND_TOMB 328 -#define MOVE_SHEER_COLD 329 -#define MOVE_MUDDY_WATER 330 -#define MOVE_BULLET_SEED 331 -#define MOVE_AERIAL_ACE 332 -#define MOVE_ICICLE_SPEAR 333 -#define MOVE_IRON_DEFENSE 334 -#define MOVE_BLOCK 335 -#define MOVE_HOWL 336 -#define MOVE_DRAGON_CLAW 337 -#define MOVE_FRENZY_PLANT 338 -#define MOVE_BULK_UP 339 -#define MOVE_BOUNCE 340 -#define MOVE_MUD_SHOT 341 -#define MOVE_POISON_TAIL 342 -#define MOVE_COVET 343 -#define MOVE_VOLT_TACKLE 344 -#define MOVE_MAGICAL_LEAF 345 -#define MOVE_WATER_SPORT 346 -#define MOVE_CALM_MIND 347 -#define MOVE_LEAF_BLADE 348 -#define MOVE_DRAGON_DANCE 349 -#define MOVE_ROCK_BLAST 350 -#define MOVE_SHOCK_WAVE 351 -#define MOVE_WATER_PULSE 352 -#define MOVE_DOOM_DESIRE 353 -#define MOVE_PSYCHO_BOOST 354 + // Gen 5 + MOVE_HONE_CLAWS = MOVES_COUNT_GEN4, + MOVE_WIDE_GUARD = 469, + MOVE_GUARD_SPLIT = 470, + MOVE_POWER_SPLIT = 471, + MOVE_WONDER_ROOM = 472, + MOVE_PSYSHOCK = 473, + MOVE_VENOSHOCK = 474, + MOVE_AUTOTOMIZE = 475, + MOVE_RAGE_POWDER = 476, + MOVE_TELEKINESIS = 477, + MOVE_MAGIC_ROOM = 478, + MOVE_SMACK_DOWN = 479, + MOVE_STORM_THROW = 480, + MOVE_FLAME_BURST = 481, + MOVE_SLUDGE_WAVE = 482, + MOVE_QUIVER_DANCE = 483, + MOVE_HEAVY_SLAM = 484, + MOVE_SYNCHRONOISE = 485, + MOVE_ELECTRO_BALL = 486, + MOVE_SOAK = 487, + MOVE_FLAME_CHARGE = 488, + MOVE_COIL = 489, + MOVE_LOW_SWEEP = 490, + MOVE_ACID_SPRAY = 491, + MOVE_FOUL_PLAY = 492, + MOVE_SIMPLE_BEAM = 493, + MOVE_ENTRAINMENT = 494, + MOVE_AFTER_YOU = 495, + MOVE_ROUND = 496, + MOVE_ECHOED_VOICE = 497, + MOVE_CHIP_AWAY = 498, + MOVE_CLEAR_SMOG = 499, + MOVE_STORED_POWER = 500, + MOVE_QUICK_GUARD = 501, + MOVE_ALLY_SWITCH = 502, + MOVE_SCALD = 503, + MOVE_SHELL_SMASH = 504, + MOVE_HEAL_PULSE = 505, + MOVE_HEX = 506, + MOVE_SKY_DROP = 507, + MOVE_SHIFT_GEAR = 508, + MOVE_CIRCLE_THROW = 509, + MOVE_INCINERATE = 510, + MOVE_QUASH = 511, + MOVE_ACROBATICS = 512, + MOVE_REFLECT_TYPE = 513, + MOVE_RETALIATE = 514, + MOVE_FINAL_GAMBIT = 515, + MOVE_BESTOW = 516, + MOVE_INFERNO = 517, + MOVE_WATER_PLEDGE = 518, + MOVE_FIRE_PLEDGE = 519, + MOVE_GRASS_PLEDGE = 520, + MOVE_VOLT_SWITCH = 521, + MOVE_STRUGGLE_BUG = 522, + MOVE_BULLDOZE = 523, + MOVE_FROST_BREATH = 524, + MOVE_DRAGON_TAIL = 525, + MOVE_WORK_UP = 526, + MOVE_ELECTROWEB = 527, + MOVE_WILD_CHARGE = 528, + MOVE_DRILL_RUN = 529, + MOVE_DUAL_CHOP = 530, + MOVE_HEART_STAMP = 531, + MOVE_HORN_LEECH = 532, + MOVE_SACRED_SWORD = 533, + MOVE_RAZOR_SHELL = 534, + MOVE_HEAT_CRASH = 535, + MOVE_LEAF_TORNADO = 536, + MOVE_STEAMROLLER = 537, + MOVE_COTTON_GUARD = 538, + MOVE_NIGHT_DAZE = 539, + MOVE_PSYSTRIKE = 540, + MOVE_TAIL_SLAP = 541, + MOVE_HURRICANE = 542, + MOVE_HEAD_CHARGE = 543, + MOVE_GEAR_GRIND = 544, + MOVE_SEARING_SHOT = 545, + MOVE_TECHNO_BLAST = 546, + MOVE_RELIC_SONG = 547, + MOVE_SECRET_SWORD = 548, + MOVE_GLACIATE = 549, + MOVE_BOLT_STRIKE = 550, + MOVE_BLUE_FLARE = 551, + MOVE_FIERY_DANCE = 552, + MOVE_FREEZE_SHOCK = 553, + MOVE_ICE_BURN = 554, + MOVE_SNARL = 555, + MOVE_ICICLE_CRASH = 556, + MOVE_V_CREATE = 557, + MOVE_FUSION_FLARE = 558, + MOVE_FUSION_BOLT = 559, + MOVES_COUNT_GEN5, -#define MOVES_COUNT_GEN3 355 + // Gen 6 + MOVE_FLYING_PRESS = MOVES_COUNT_GEN5, + MOVE_MAT_BLOCK = 561, + MOVE_BELCH = 562, + MOVE_ROTOTILLER = 563, + MOVE_STICKY_WEB = 564, + MOVE_FELL_STINGER = 565, + MOVE_PHANTOM_FORCE = 566, + MOVE_TRICK_OR_TREAT = 567, + MOVE_NOBLE_ROAR = 568, + MOVE_ION_DELUGE = 569, + MOVE_PARABOLIC_CHARGE = 570, + MOVE_FORESTS_CURSE = 571, + MOVE_PETAL_BLIZZARD = 572, + MOVE_FREEZE_DRY = 573, + MOVE_DISARMING_VOICE = 574, + MOVE_PARTING_SHOT = 575, + MOVE_TOPSY_TURVY = 576, + MOVE_DRAINING_KISS = 577, + MOVE_CRAFTY_SHIELD = 578, + MOVE_FLOWER_SHIELD = 579, + MOVE_GRASSY_TERRAIN = 580, + MOVE_MISTY_TERRAIN = 581, + MOVE_ELECTRIFY = 582, + MOVE_PLAY_ROUGH = 583, + MOVE_FAIRY_WIND = 584, + MOVE_MOONBLAST = 585, + MOVE_BOOMBURST = 586, + MOVE_FAIRY_LOCK = 587, + MOVE_KINGS_SHIELD = 588, + MOVE_PLAY_NICE = 589, + MOVE_CONFIDE = 590, + MOVE_DIAMOND_STORM = 591, + MOVE_STEAM_ERUPTION = 592, + MOVE_HYPERSPACE_HOLE = 593, + MOVE_WATER_SHURIKEN = 594, + MOVE_MYSTICAL_FIRE = 595, + MOVE_SPIKY_SHIELD = 596, + MOVE_AROMATIC_MIST = 597, + MOVE_EERIE_IMPULSE = 598, + MOVE_VENOM_DRENCH = 599, + MOVE_POWDER = 600, + MOVE_GEOMANCY = 601, + MOVE_MAGNETIC_FLUX = 602, + MOVE_HAPPY_HOUR = 603, + MOVE_ELECTRIC_TERRAIN = 604, + MOVE_DAZZLING_GLEAM = 605, + MOVE_CELEBRATE = 606, + MOVE_HOLD_HANDS = 607, + MOVE_BABY_DOLL_EYES = 608, + MOVE_NUZZLE = 609, + MOVE_HOLD_BACK = 610, + MOVE_INFESTATION = 611, + MOVE_POWER_UP_PUNCH = 612, + MOVE_OBLIVION_WING = 613, + MOVE_THOUSAND_ARROWS = 614, + MOVE_THOUSAND_WAVES = 615, + MOVE_LANDS_WRATH = 616, + MOVE_LIGHT_OF_RUIN = 617, + // ORAS Moves + MOVE_ORIGIN_PULSE = 618, + MOVE_PRECIPICE_BLADES = 619, + MOVE_DRAGON_ASCENT = 620, + MOVE_HYPERSPACE_FURY = 621, + MOVES_COUNT_GEN6, -// Gen 4 moves. -#define MOVE_ROOST 355 -#define MOVE_GRAVITY 356 -#define MOVE_MIRACLE_EYE 357 -#define MOVE_WAKE_UP_SLAP 358 -#define MOVE_HAMMER_ARM 359 -#define MOVE_GYRO_BALL 360 -#define MOVE_HEALING_WISH 361 -#define MOVE_BRINE 362 -#define MOVE_NATURAL_GIFT 363 -#define MOVE_FEINT 364 -#define MOVE_PLUCK 365 -#define MOVE_TAILWIND 366 -#define MOVE_ACUPRESSURE 367 -#define MOVE_METAL_BURST 368 -#define MOVE_U_TURN 369 -#define MOVE_CLOSE_COMBAT 370 -#define MOVE_PAYBACK 371 -#define MOVE_ASSURANCE 372 -#define MOVE_EMBARGO 373 -#define MOVE_FLING 374 -#define MOVE_PSYCHO_SHIFT 375 -#define MOVE_TRUMP_CARD 376 -#define MOVE_HEAL_BLOCK 377 -#define MOVE_WRING_OUT 378 -#define MOVE_POWER_TRICK 379 -#define MOVE_GASTRO_ACID 380 -#define MOVE_LUCKY_CHANT 381 -#define MOVE_ME_FIRST 382 -#define MOVE_COPYCAT 383 -#define MOVE_POWER_SWAP 384 -#define MOVE_GUARD_SWAP 385 -#define MOVE_PUNISHMENT 386 -#define MOVE_LAST_RESORT 387 -#define MOVE_WORRY_SEED 388 -#define MOVE_SUCKER_PUNCH 389 -#define MOVE_TOXIC_SPIKES 390 -#define MOVE_HEART_SWAP 391 -#define MOVE_AQUA_RING 392 -#define MOVE_MAGNET_RISE 393 -#define MOVE_FLARE_BLITZ 394 -#define MOVE_FORCE_PALM 395 -#define MOVE_AURA_SPHERE 396 -#define MOVE_ROCK_POLISH 397 -#define MOVE_POISON_JAB 398 -#define MOVE_DARK_PULSE 399 -#define MOVE_NIGHT_SLASH 400 -#define MOVE_AQUA_TAIL 401 -#define MOVE_SEED_BOMB 402 -#define MOVE_AIR_SLASH 403 -#define MOVE_X_SCISSOR 404 -#define MOVE_BUG_BUZZ 405 -#define MOVE_DRAGON_PULSE 406 -#define MOVE_DRAGON_RUSH 407 -#define MOVE_POWER_GEM 408 -#define MOVE_DRAIN_PUNCH 409 -#define MOVE_VACUUM_WAVE 410 -#define MOVE_FOCUS_BLAST 411 -#define MOVE_ENERGY_BALL 412 -#define MOVE_BRAVE_BIRD 413 -#define MOVE_EARTH_POWER 414 -#define MOVE_SWITCHEROO 415 -#define MOVE_GIGA_IMPACT 416 -#define MOVE_NASTY_PLOT 417 -#define MOVE_BULLET_PUNCH 418 -#define MOVE_AVALANCHE 419 -#define MOVE_ICE_SHARD 420 -#define MOVE_SHADOW_CLAW 421 -#define MOVE_THUNDER_FANG 422 -#define MOVE_ICE_FANG 423 -#define MOVE_FIRE_FANG 424 -#define MOVE_SHADOW_SNEAK 425 -#define MOVE_MUD_BOMB 426 -#define MOVE_PSYCHO_CUT 427 -#define MOVE_ZEN_HEADBUTT 428 -#define MOVE_MIRROR_SHOT 429 -#define MOVE_FLASH_CANNON 430 -#define MOVE_ROCK_CLIMB 431 -#define MOVE_DEFOG 432 -#define MOVE_TRICK_ROOM 433 -#define MOVE_DRACO_METEOR 434 -#define MOVE_DISCHARGE 435 -#define MOVE_LAVA_PLUME 436 -#define MOVE_LEAF_STORM 437 -#define MOVE_POWER_WHIP 438 -#define MOVE_ROCK_WRECKER 439 -#define MOVE_CROSS_POISON 440 -#define MOVE_GUNK_SHOT 441 -#define MOVE_IRON_HEAD 442 -#define MOVE_MAGNET_BOMB 443 -#define MOVE_STONE_EDGE 444 -#define MOVE_CAPTIVATE 445 -#define MOVE_STEALTH_ROCK 446 -#define MOVE_GRASS_KNOT 447 -#define MOVE_CHATTER 448 -#define MOVE_JUDGMENT 449 -#define MOVE_BUG_BITE 450 -#define MOVE_CHARGE_BEAM 451 -#define MOVE_WOOD_HAMMER 452 -#define MOVE_AQUA_JET 453 -#define MOVE_ATTACK_ORDER 454 -#define MOVE_DEFEND_ORDER 455 -#define MOVE_HEAL_ORDER 456 -#define MOVE_HEAD_SMASH 457 -#define MOVE_DOUBLE_HIT 458 -#define MOVE_ROAR_OF_TIME 459 -#define MOVE_SPACIAL_REND 460 -#define MOVE_LUNAR_DANCE 461 -#define MOVE_CRUSH_GRIP 462 -#define MOVE_MAGMA_STORM 463 -#define MOVE_DARK_VOID 464 -#define MOVE_SEED_FLARE 465 -#define MOVE_OMINOUS_WIND 466 -#define MOVE_SHADOW_FORCE 467 + // Gen 7 + MOVE_SHORE_UP = MOVES_COUNT_GEN6, + MOVE_FIRST_IMPRESSION = 623, + MOVE_BANEFUL_BUNKER = 624, + MOVE_SPIRIT_SHACKLE = 625, + MOVE_DARKEST_LARIAT = 626, + MOVE_SPARKLING_ARIA = 627, + MOVE_ICE_HAMMER = 628, + MOVE_FLORAL_HEALING = 629, + MOVE_HIGH_HORSEPOWER = 630, + MOVE_STRENGTH_SAP = 631, + MOVE_SOLAR_BLADE = 632, + MOVE_LEAFAGE = 633, + MOVE_SPOTLIGHT = 634, + MOVE_TOXIC_THREAD = 635, + MOVE_LASER_FOCUS = 636, + MOVE_GEAR_UP = 637, + MOVE_THROAT_CHOP = 638, + MOVE_POLLEN_PUFF = 639, + MOVE_ANCHOR_SHOT = 640, + MOVE_PSYCHIC_TERRAIN = 641, + MOVE_LUNGE = 642, + MOVE_FIRE_LASH = 643, + MOVE_POWER_TRIP = 644, + MOVE_BURN_UP = 645, + MOVE_SPEED_SWAP = 646, + MOVE_SMART_STRIKE = 647, + MOVE_PURIFY = 648, + MOVE_REVELATION_DANCE = 649, + MOVE_CORE_ENFORCER = 650, + MOVE_TROP_KICK = 651, + MOVE_INSTRUCT = 652, + MOVE_BEAK_BLAST = 653, + MOVE_CLANGING_SCALES = 654, + MOVE_DRAGON_HAMMER = 655, + MOVE_BRUTAL_SWING = 656, + MOVE_AURORA_VEIL = 657, + MOVE_SHELL_TRAP = 658, + MOVE_FLEUR_CANNON = 659, + MOVE_PSYCHIC_FANGS = 660, + MOVE_STOMPING_TANTRUM = 661, + MOVE_SHADOW_BONE = 662, + MOVE_ACCELEROCK = 663, + MOVE_LIQUIDATION = 664, + MOVE_PRISMATIC_LASER = 665, + MOVE_SPECTRAL_THIEF = 666, + MOVE_SUNSTEEL_STRIKE = 667, + MOVE_MOONGEIST_BEAM = 668, + MOVE_TEARFUL_LOOK = 669, + MOVE_ZING_ZAP = 670, + MOVE_NATURES_MADNESS = 671, + MOVE_MULTI_ATTACK = 672, + // USUM Moves + MOVE_MIND_BLOWN = 673, + MOVE_PLASMA_FISTS = 674, + MOVE_PHOTON_GEYSER = 675, + // LGPE Moves + MOVE_ZIPPY_ZAP = 676, + MOVE_SPLISHY_SPLASH = 677, + MOVE_FLOATY_FALL = 678, + MOVE_PIKA_PAPOW = 679, + MOVE_BOUNCY_BUBBLE = 680, + MOVE_BUZZY_BUZZ = 681, + MOVE_SIZZLY_SLIDE = 682, + MOVE_GLITZY_GLOW = 683, + MOVE_BADDY_BAD = 684, + MOVE_SAPPY_SEED = 685, + MOVE_FREEZY_FROST = 686, + MOVE_SPARKLY_SWIRL = 687, + MOVE_VEEVEE_VOLLEY = 688, + MOVE_DOUBLE_IRON_BASH = 689, + MOVES_COUNT_GEN7, -#define MOVES_COUNT_GEN4 468 + // Gen 8 + MOVE_DYNAMAX_CANNON = MOVES_COUNT_GEN7, + MOVE_SNIPE_SHOT = 691, + MOVE_JAW_LOCK = 692, + MOVE_STUFF_CHEEKS = 693, + MOVE_NO_RETREAT = 694, + MOVE_TAR_SHOT = 695, + MOVE_MAGIC_POWDER = 696, + MOVE_DRAGON_DARTS = 697, + MOVE_TEATIME = 698, + MOVE_OCTOLOCK = 699, + MOVE_BOLT_BEAK = 700, + MOVE_FISHIOUS_REND = 701, + MOVE_COURT_CHANGE = 702, + MOVE_CLANGOROUS_SOUL = 703, + MOVE_BODY_PRESS = 704, + MOVE_DECORATE = 705, + MOVE_DRUM_BEATING = 706, + MOVE_SNAP_TRAP = 707, + MOVE_PYRO_BALL = 708, + MOVE_BEHEMOTH_BLADE = 709, + MOVE_BEHEMOTH_BASH = 710, + MOVE_AURA_WHEEL = 711, + MOVE_BREAKING_SWIPE = 712, + MOVE_BRANCH_POKE = 713, + MOVE_OVERDRIVE = 714, + MOVE_APPLE_ACID = 715, + MOVE_GRAV_APPLE = 716, + MOVE_SPIRIT_BREAK = 717, + MOVE_STRANGE_STEAM = 718, + MOVE_LIFE_DEW = 719, + MOVE_OBSTRUCT = 720, + MOVE_FALSE_SURRENDER = 721, + MOVE_METEOR_ASSAULT = 722, + MOVE_ETERNABEAM = 723, + MOVE_STEEL_BEAM = 724, + // Isle of Armor Moves + MOVE_EXPANDING_FORCE = 725, + MOVE_STEEL_ROLLER = 726, + MOVE_SCALE_SHOT = 727, + MOVE_METEOR_BEAM = 728, + MOVE_SHELL_SIDE_ARM = 729, + MOVE_MISTY_EXPLOSION = 730, + MOVE_GRASSY_GLIDE = 731, + MOVE_RISING_VOLTAGE = 732, + MOVE_TERRAIN_PULSE = 733, + MOVE_SKITTER_SMACK = 734, + MOVE_BURNING_JEALOUSY = 735, + MOVE_LASH_OUT = 736, + MOVE_POLTERGEIST = 737, + MOVE_CORROSIVE_GAS = 738, + MOVE_COACHING = 739, + MOVE_FLIP_TURN = 740, + MOVE_TRIPLE_AXEL = 741, + MOVE_DUAL_WINGBEAT = 742, + MOVE_SCORCHING_SANDS = 743, + MOVE_JUNGLE_HEALING = 744, + MOVE_WICKED_BLOW = 745, + MOVE_SURGING_STRIKES = 746, + // Crown Tundra Moves + MOVE_THUNDER_CAGE = 747, + MOVE_DRAGON_ENERGY = 748, + MOVE_FREEZING_GLARE = 749, + MOVE_FIERY_WRATH = 750, + MOVE_THUNDEROUS_KICK = 751, + MOVE_GLACIAL_LANCE = 752, + MOVE_ASTRAL_BARRAGE = 753, + MOVE_EERIE_SPELL = 754, + // Legends: Arceus Moves + MOVE_DIRE_CLAW = 755, + MOVE_PSYSHIELD_BASH = 756, + MOVE_POWER_SHIFT = 757, + MOVE_STONE_AXE = 758, + MOVE_SPRINGTIDE_STORM = 759, + MOVE_MYSTICAL_POWER = 760, + MOVE_RAGING_FURY = 761, + MOVE_WAVE_CRASH = 762, + MOVE_CHLOROBLAST = 763, + MOVE_MOUNTAIN_GALE = 764, + MOVE_VICTORY_DANCE = 765, + MOVE_HEADLONG_RUSH = 766, + MOVE_BARB_BARRAGE = 767, + MOVE_ESPER_WING = 768, + MOVE_BITTER_MALICE = 769, + MOVE_SHELTER = 770, + MOVE_TRIPLE_ARROWS = 771, + MOVE_INFERNAL_PARADE = 772, + MOVE_CEASELESS_EDGE = 773, + MOVE_BLEAKWIND_STORM = 774, + MOVE_WILDBOLT_STORM = 775, + MOVE_SANDSEAR_STORM = 776, + MOVE_LUNAR_BLESSING = 777, + MOVE_TAKE_HEART = 778, + MOVES_COUNT_GEN8, -// Gen 5 moves. -#define MOVE_HONE_CLAWS 468 -#define MOVE_WIDE_GUARD 469 -#define MOVE_GUARD_SPLIT 470 -#define MOVE_POWER_SPLIT 471 -#define MOVE_WONDER_ROOM 472 -#define MOVE_PSYSHOCK 473 -#define MOVE_VENOSHOCK 474 -#define MOVE_AUTOTOMIZE 475 -#define MOVE_RAGE_POWDER 476 -#define MOVE_TELEKINESIS 477 -#define MOVE_MAGIC_ROOM 478 -#define MOVE_SMACK_DOWN 479 -#define MOVE_STORM_THROW 480 -#define MOVE_FLAME_BURST 481 -#define MOVE_SLUDGE_WAVE 482 -#define MOVE_QUIVER_DANCE 483 -#define MOVE_HEAVY_SLAM 484 -#define MOVE_SYNCHRONOISE 485 -#define MOVE_ELECTRO_BALL 486 -#define MOVE_SOAK 487 -#define MOVE_FLAME_CHARGE 488 -#define MOVE_COIL 489 -#define MOVE_LOW_SWEEP 490 -#define MOVE_ACID_SPRAY 491 -#define MOVE_FOUL_PLAY 492 -#define MOVE_SIMPLE_BEAM 493 -#define MOVE_ENTRAINMENT 494 -#define MOVE_AFTER_YOU 495 -#define MOVE_ROUND 496 -#define MOVE_ECHOED_VOICE 497 -#define MOVE_CHIP_AWAY 498 -#define MOVE_CLEAR_SMOG 499 -#define MOVE_STORED_POWER 500 -#define MOVE_QUICK_GUARD 501 -#define MOVE_ALLY_SWITCH 502 -#define MOVE_SCALD 503 -#define MOVE_SHELL_SMASH 504 -#define MOVE_HEAL_PULSE 505 -#define MOVE_HEX 506 -#define MOVE_SKY_DROP 507 -#define MOVE_SHIFT_GEAR 508 -#define MOVE_CIRCLE_THROW 509 -#define MOVE_INCINERATE 510 -#define MOVE_QUASH 511 -#define MOVE_ACROBATICS 512 -#define MOVE_REFLECT_TYPE 513 -#define MOVE_RETALIATE 514 -#define MOVE_FINAL_GAMBIT 515 -#define MOVE_BESTOW 516 -#define MOVE_INFERNO 517 -#define MOVE_WATER_PLEDGE 518 -#define MOVE_FIRE_PLEDGE 519 -#define MOVE_GRASS_PLEDGE 520 -#define MOVE_VOLT_SWITCH 521 -#define MOVE_STRUGGLE_BUG 522 -#define MOVE_BULLDOZE 523 -#define MOVE_FROST_BREATH 524 -#define MOVE_DRAGON_TAIL 525 -#define MOVE_WORK_UP 526 -#define MOVE_ELECTROWEB 527 -#define MOVE_WILD_CHARGE 528 -#define MOVE_DRILL_RUN 529 -#define MOVE_DUAL_CHOP 530 -#define MOVE_HEART_STAMP 531 -#define MOVE_HORN_LEECH 532 -#define MOVE_SACRED_SWORD 533 -#define MOVE_RAZOR_SHELL 534 -#define MOVE_HEAT_CRASH 535 -#define MOVE_LEAF_TORNADO 536 -#define MOVE_STEAMROLLER 537 -#define MOVE_COTTON_GUARD 538 -#define MOVE_NIGHT_DAZE 539 -#define MOVE_PSYSTRIKE 540 -#define MOVE_TAIL_SLAP 541 -#define MOVE_HURRICANE 542 -#define MOVE_HEAD_CHARGE 543 -#define MOVE_GEAR_GRIND 544 -#define MOVE_SEARING_SHOT 545 -#define MOVE_TECHNO_BLAST 546 -#define MOVE_RELIC_SONG 547 -#define MOVE_SECRET_SWORD 548 -#define MOVE_GLACIATE 549 -#define MOVE_BOLT_STRIKE 550 -#define MOVE_BLUE_FLARE 551 -#define MOVE_FIERY_DANCE 552 -#define MOVE_FREEZE_SHOCK 553 -#define MOVE_ICE_BURN 554 -#define MOVE_SNARL 555 -#define MOVE_ICICLE_CRASH 556 -#define MOVE_V_CREATE 557 -#define MOVE_FUSION_FLARE 558 -#define MOVE_FUSION_BOLT 559 + // Gen 9 + MOVE_TERA_BLAST = MOVES_COUNT_GEN8, + MOVE_SILK_TRAP = 780, + MOVE_AXE_KICK = 781, + MOVE_LAST_RESPECTS = 782, + MOVE_LUMINA_CRASH = 783, + MOVE_ORDER_UP = 784, + MOVE_JET_PUNCH = 785, + MOVE_SPICY_EXTRACT = 786, + MOVE_SPIN_OUT = 787, + MOVE_POPULATION_BOMB = 788, + MOVE_ICE_SPINNER = 789, + MOVE_GLAIVE_RUSH = 790, + MOVE_REVIVAL_BLESSING = 791, + MOVE_SALT_CURE = 792, + MOVE_TRIPLE_DIVE = 793, + MOVE_MORTAL_SPIN = 794, + MOVE_DOODLE = 795, + MOVE_FILLET_AWAY = 796, + MOVE_KOWTOW_CLEAVE = 797, + MOVE_FLOWER_TRICK = 798, + MOVE_TORCH_SONG = 799, + MOVE_AQUA_STEP = 800, + MOVE_RAGING_BULL = 801, + MOVE_MAKE_IT_RAIN = 802, + MOVE_RUINATION = 803, + MOVE_COLLISION_COURSE = 804, + MOVE_ELECTRO_DRIFT = 805, + MOVE_SHED_TAIL = 806, + MOVE_CHILLY_RECEPTION = 807, + MOVE_TIDY_UP = 808, + MOVE_SNOWSCAPE = 809, + MOVE_POUNCE = 810, + MOVE_TRAILBLAZE = 811, + MOVE_CHILLING_WATER = 812, + MOVE_HYPER_DRILL = 813, + MOVE_TWIN_BEAM = 814, + MOVE_RAGE_FIST = 815, + MOVE_ARMOR_CANNON = 816, + MOVE_BITTER_BLADE = 817, + MOVE_DOUBLE_SHOCK = 818, + MOVE_GIGATON_HAMMER = 819, + MOVE_COMEUPPANCE = 820, + MOVE_AQUA_CUTTER = 821, + MOVE_BLAZING_TORQUE = 822, + MOVE_WICKED_TORQUE = 823, + MOVE_NOXIOUS_TORQUE = 824, + MOVE_COMBAT_TORQUE = 825, + MOVE_MAGICAL_TORQUE = 826, + MOVE_PSYBLADE = 827, + MOVE_HYDRO_STEAM = 828, + // The Teal Mask Moves + MOVE_BLOOD_MOON = 829, + MOVE_MATCHA_GOTCHA = 830, + MOVE_SYRUP_BOMB = 831, + MOVE_IVY_CUDGEL = 832, + // The Indigo Disk Moves + MOVE_ELECTRO_SHOT = 833, + MOVE_TERA_STARSTORM = 834, + MOVE_FICKLE_BEAM = 835, + MOVE_BURNING_BULWARK = 836, + MOVE_THUNDERCLAP = 837, + MOVE_MIGHTY_CLEAVE = 838, + MOVE_TACHYON_CUTTER = 839, + MOVE_HARD_PRESS = 840, + MOVE_DRAGON_CHEER = 841, + MOVE_ALLURING_VOICE = 842, + MOVE_TEMPER_FLARE = 843, + MOVE_SUPERCELL_SLAM = 844, + MOVE_PSYCHIC_NOISE = 845, + MOVE_UPPER_HAND = 846, + MOVE_MALIGNANT_CHAIN = 847, + MOVES_COUNT_GEN9, -#define MOVES_COUNT_GEN5 560 + // Add any custom moves here, not further down! -// Gen 6 moves. -#define MOVE_FLYING_PRESS 560 -#define MOVE_MAT_BLOCK 561 -#define MOVE_BELCH 562 -#define MOVE_ROTOTILLER 563 -#define MOVE_STICKY_WEB 564 -#define MOVE_FELL_STINGER 565 -#define MOVE_PHANTOM_FORCE 566 -#define MOVE_TRICK_OR_TREAT 567 -#define MOVE_NOBLE_ROAR 568 -#define MOVE_ION_DELUGE 569 -#define MOVE_PARABOLIC_CHARGE 570 -#define MOVE_FORESTS_CURSE 571 -#define MOVE_PETAL_BLIZZARD 572 -#define MOVE_FREEZE_DRY 573 -#define MOVE_DISARMING_VOICE 574 -#define MOVE_PARTING_SHOT 575 -#define MOVE_TOPSY_TURVY 576 -#define MOVE_DRAINING_KISS 577 -#define MOVE_CRAFTY_SHIELD 578 -#define MOVE_FLOWER_SHIELD 579 -#define MOVE_GRASSY_TERRAIN 580 -#define MOVE_MISTY_TERRAIN 581 -#define MOVE_ELECTRIFY 582 -#define MOVE_PLAY_ROUGH 583 -#define MOVE_FAIRY_WIND 584 -#define MOVE_MOONBLAST 585 -#define MOVE_BOOMBURST 586 -#define MOVE_FAIRY_LOCK 587 -#define MOVE_KINGS_SHIELD 588 -#define MOVE_PLAY_NICE 589 -#define MOVE_CONFIDE 590 -#define MOVE_DIAMOND_STORM 591 -#define MOVE_STEAM_ERUPTION 592 -#define MOVE_HYPERSPACE_HOLE 593 -#define MOVE_WATER_SHURIKEN 594 -#define MOVE_MYSTICAL_FIRE 595 -#define MOVE_SPIKY_SHIELD 596 -#define MOVE_AROMATIC_MIST 597 -#define MOVE_EERIE_IMPULSE 598 -#define MOVE_VENOM_DRENCH 599 -#define MOVE_POWDER 600 -#define MOVE_GEOMANCY 601 -#define MOVE_MAGNETIC_FLUX 602 -#define MOVE_HAPPY_HOUR 603 -#define MOVE_ELECTRIC_TERRAIN 604 -#define MOVE_DAZZLING_GLEAM 605 -#define MOVE_CELEBRATE 606 -#define MOVE_HOLD_HANDS 607 -#define MOVE_BABY_DOLL_EYES 608 -#define MOVE_NUZZLE 609 -#define MOVE_HOLD_BACK 610 -#define MOVE_INFESTATION 611 -#define MOVE_POWER_UP_PUNCH 612 -#define MOVE_OBLIVION_WING 613 -#define MOVE_THOUSAND_ARROWS 614 -#define MOVE_THOUSAND_WAVES 615 -#define MOVE_LANDS_WRATH 616 -#define MOVE_LIGHT_OF_RUIN 617 -// ORAS Moves -#define MOVE_ORIGIN_PULSE 618 -#define MOVE_PRECIPICE_BLADES 619 -#define MOVE_DRAGON_ASCENT 620 -#define MOVE_HYPERSPACE_FURY 621 + MOVES_COUNT = MOVES_COUNT_GEN9, -#define MOVES_COUNT_GEN6 622 + // Z Moves + FIRST_Z_MOVE = MOVES_COUNT, + MOVE_BREAKNECK_BLITZ = FIRST_Z_MOVE, + MOVE_ALL_OUT_PUMMELING, + MOVE_SUPERSONIC_SKYSTRIKE, + MOVE_ACID_DOWNPOUR, + MOVE_TECTONIC_RAGE, + MOVE_CONTINENTAL_CRUSH, + MOVE_SAVAGE_SPIN_OUT, + MOVE_NEVER_ENDING_NIGHTMARE, + MOVE_CORKSCREW_CRASH, + MOVE_INFERNO_OVERDRIVE, + MOVE_HYDRO_VORTEX, + MOVE_BLOOM_DOOM, + MOVE_GIGAVOLT_HAVOC, + MOVE_SHATTERED_PSYCHE, + MOVE_SUBZERO_SLAMMER, + MOVE_DEVASTATING_DRAKE, + MOVE_BLACK_HOLE_ECLIPSE, + MOVE_TWINKLE_TACKLE, + // Signature Z Moves + MOVE_CATASTROPIKA, + MOVE_10000000_VOLT_THUNDERBOLT, + MOVE_10_000_000_VOLT_THUNDERBOLT = MOVE_10000000_VOLT_THUNDERBOLT, + MOVE_STOKED_SPARKSURFER, + MOVE_EXTREME_EVOBOOST, + MOVE_PULVERIZING_PANCAKE, + MOVE_GENESIS_SUPERNOVA, + MOVE_SINISTER_ARROW_RAID, + MOVE_MALICIOUS_MOONSAULT, + MOVE_OCEANIC_OPERETTA, + MOVE_SPLINTERED_STORMSHARDS, + MOVE_LETS_SNUGGLE_FOREVER, + MOVE_CLANGOROUS_SOULBLAZE, + MOVE_GUARDIAN_OF_ALOLA, + MOVE_SEARING_SUNRAZE_SMASH, + MOVE_MENACING_MOONRAZE_MAELSTROM, + MOVE_LIGHT_THAT_BURNS_THE_SKY, + MOVE_SOUL_STEALING_7_STAR_STRIKE, + LAST_Z_MOVE = MOVE_SOUL_STEALING_7_STAR_STRIKE, + MOVES_COUNT_Z, -// Gen 7 moves. -#define MOVE_SHORE_UP 622 -#define MOVE_FIRST_IMPRESSION 623 -#define MOVE_BANEFUL_BUNKER 624 -#define MOVE_SPIRIT_SHACKLE 625 -#define MOVE_DARKEST_LARIAT 626 -#define MOVE_SPARKLING_ARIA 627 -#define MOVE_ICE_HAMMER 628 -#define MOVE_FLORAL_HEALING 629 -#define MOVE_HIGH_HORSEPOWER 630 -#define MOVE_STRENGTH_SAP 631 -#define MOVE_SOLAR_BLADE 632 -#define MOVE_LEAFAGE 633 -#define MOVE_SPOTLIGHT 634 -#define MOVE_TOXIC_THREAD 635 -#define MOVE_LASER_FOCUS 636 -#define MOVE_GEAR_UP 637 -#define MOVE_THROAT_CHOP 638 -#define MOVE_POLLEN_PUFF 639 -#define MOVE_ANCHOR_SHOT 640 -#define MOVE_PSYCHIC_TERRAIN 641 -#define MOVE_LUNGE 642 -#define MOVE_FIRE_LASH 643 -#define MOVE_POWER_TRIP 644 -#define MOVE_BURN_UP 645 -#define MOVE_SPEED_SWAP 646 -#define MOVE_SMART_STRIKE 647 -#define MOVE_PURIFY 648 -#define MOVE_REVELATION_DANCE 649 -#define MOVE_CORE_ENFORCER 650 -#define MOVE_TROP_KICK 651 -#define MOVE_INSTRUCT 652 -#define MOVE_BEAK_BLAST 653 -#define MOVE_CLANGING_SCALES 654 -#define MOVE_DRAGON_HAMMER 655 -#define MOVE_BRUTAL_SWING 656 -#define MOVE_AURORA_VEIL 657 -#define MOVE_SHELL_TRAP 658 -#define MOVE_FLEUR_CANNON 659 -#define MOVE_PSYCHIC_FANGS 660 -#define MOVE_STOMPING_TANTRUM 661 -#define MOVE_SHADOW_BONE 662 -#define MOVE_ACCELEROCK 663 -#define MOVE_LIQUIDATION 664 -#define MOVE_PRISMATIC_LASER 665 -#define MOVE_SPECTRAL_THIEF 666 -#define MOVE_SUNSTEEL_STRIKE 667 -#define MOVE_MOONGEIST_BEAM 668 -#define MOVE_TEARFUL_LOOK 669 -#define MOVE_ZING_ZAP 670 -#define MOVE_NATURES_MADNESS 671 -#define MOVE_MULTI_ATTACK 672 -// USUM Moves -#define MOVE_MIND_BLOWN 673 -#define MOVE_PLASMA_FISTS 674 -#define MOVE_PHOTON_GEYSER 675 -// LGPE Moves -#define MOVE_ZIPPY_ZAP 676 -#define MOVE_SPLISHY_SPLASH 677 -#define MOVE_FLOATY_FALL 678 -#define MOVE_PIKA_PAPOW 679 -#define MOVE_BOUNCY_BUBBLE 680 -#define MOVE_BUZZY_BUZZ 681 -#define MOVE_SIZZLY_SLIDE 682 -#define MOVE_GLITZY_GLOW 683 -#define MOVE_BADDY_BAD 684 -#define MOVE_SAPPY_SEED 685 -#define MOVE_FREEZY_FROST 686 -#define MOVE_SPARKLY_SWIRL 687 -#define MOVE_VEEVEE_VOLLEY 688 -#define MOVE_DOUBLE_IRON_BASH 689 + // Max Moves + FIRST_MAX_MOVE = MOVES_COUNT_Z, + MOVE_MAX_GUARD = FIRST_MAX_MOVE, + MOVE_MAX_STRIKE, + MOVE_MAX_KNUCKLE, + MOVE_MAX_AIRSTREAM, + MOVE_MAX_OOZE, + MOVE_MAX_QUAKE, + MOVE_MAX_ROCKFALL, + MOVE_MAX_FLUTTERBY, + MOVE_MAX_PHANTASM, + MOVE_MAX_STEELSPIKE, + MOVE_MAX_FLARE, + MOVE_MAX_GEYSER, + MOVE_MAX_OVERGROWTH, + MOVE_MAX_LIGHTNING, + MOVE_MAX_MINDSTORM, + MOVE_MAX_HAILSTORM, + MOVE_MAX_WYRMWIND, + MOVE_MAX_DARKNESS, + MOVE_MAX_STARFALL, + // Gigantamax Moves + MOVE_G_MAX_VINE_LASH, + MOVE_G_MAX_WILDFIRE, + MOVE_G_MAX_CANNONADE, + MOVE_G_MAX_BEFUDDLE, + MOVE_G_MAX_VOLT_CRASH, + MOVE_G_MAX_GOLD_RUSH, + MOVE_G_MAX_CHI_STRIKE, + MOVE_G_MAX_TERROR, + MOVE_G_MAX_FOAM_BURST, + MOVE_G_MAX_RESONANCE, + MOVE_G_MAX_CUDDLE, + MOVE_G_MAX_REPLENISH, + MOVE_G_MAX_MALODOR, + MOVE_G_MAX_MELTDOWN, + MOVE_G_MAX_DRUM_SOLO, + MOVE_G_MAX_FIREBALL, + MOVE_G_MAX_HYDROSNIPE, + MOVE_G_MAX_WIND_RAGE, + MOVE_G_MAX_GRAVITAS, + MOVE_G_MAX_STONESURGE, + MOVE_G_MAX_VOLCALITH, + MOVE_G_MAX_TARTNESS, + MOVE_G_MAX_SWEETNESS, + MOVE_G_MAX_SANDBLAST, + MOVE_G_MAX_STUN_SHOCK, + MOVE_G_MAX_CENTIFERNO, + MOVE_G_MAX_SMITE, + MOVE_G_MAX_SNOOZE, + MOVE_G_MAX_FINALE, + MOVE_G_MAX_STEELSURGE, + MOVE_G_MAX_DEPLETION, + MOVE_G_MAX_ONE_BLOW, + MOVE_G_MAX_RAPID_FLOW, + LAST_MAX_MOVE = MOVE_G_MAX_RAPID_FLOW, + MOVES_COUNT_DYNAMAX, + MOVES_COUNT_ALL = MOVES_COUNT_DYNAMAX, +}; -#define MOVES_COUNT_GEN7 690 - -// Gen 8 moves. -#define MOVE_DYNAMAX_CANNON 690 -#define MOVE_SNIPE_SHOT 691 -#define MOVE_JAW_LOCK 692 -#define MOVE_STUFF_CHEEKS 693 -#define MOVE_NO_RETREAT 694 -#define MOVE_TAR_SHOT 695 -#define MOVE_MAGIC_POWDER 696 -#define MOVE_DRAGON_DARTS 697 -#define MOVE_TEATIME 698 -#define MOVE_OCTOLOCK 699 -#define MOVE_BOLT_BEAK 700 -#define MOVE_FISHIOUS_REND 701 -#define MOVE_COURT_CHANGE 702 -#define MOVE_CLANGOROUS_SOUL 703 -#define MOVE_BODY_PRESS 704 -#define MOVE_DECORATE 705 -#define MOVE_DRUM_BEATING 706 -#define MOVE_SNAP_TRAP 707 -#define MOVE_PYRO_BALL 708 -#define MOVE_BEHEMOTH_BLADE 709 -#define MOVE_BEHEMOTH_BASH 710 -#define MOVE_AURA_WHEEL 711 -#define MOVE_BREAKING_SWIPE 712 -#define MOVE_BRANCH_POKE 713 -#define MOVE_OVERDRIVE 714 -#define MOVE_APPLE_ACID 715 -#define MOVE_GRAV_APPLE 716 -#define MOVE_SPIRIT_BREAK 717 -#define MOVE_STRANGE_STEAM 718 -#define MOVE_LIFE_DEW 719 -#define MOVE_OBSTRUCT 720 -#define MOVE_FALSE_SURRENDER 721 -#define MOVE_METEOR_ASSAULT 722 -#define MOVE_ETERNABEAM 723 -#define MOVE_STEEL_BEAM 724 -// Isle of Armor Moves -#define MOVE_EXPANDING_FORCE 725 -#define MOVE_STEEL_ROLLER 726 -#define MOVE_SCALE_SHOT 727 -#define MOVE_METEOR_BEAM 728 -#define MOVE_SHELL_SIDE_ARM 729 -#define MOVE_MISTY_EXPLOSION 730 -#define MOVE_GRASSY_GLIDE 731 -#define MOVE_RISING_VOLTAGE 732 -#define MOVE_TERRAIN_PULSE 733 -#define MOVE_SKITTER_SMACK 734 -#define MOVE_BURNING_JEALOUSY 735 -#define MOVE_LASH_OUT 736 -#define MOVE_POLTERGEIST 737 -#define MOVE_CORROSIVE_GAS 738 -#define MOVE_COACHING 739 -#define MOVE_FLIP_TURN 740 -#define MOVE_TRIPLE_AXEL 741 -#define MOVE_DUAL_WINGBEAT 742 -#define MOVE_SCORCHING_SANDS 743 -#define MOVE_JUNGLE_HEALING 744 -#define MOVE_WICKED_BLOW 745 -#define MOVE_SURGING_STRIKES 746 -// Crown Tundra Moves -#define MOVE_THUNDER_CAGE 747 -#define MOVE_DRAGON_ENERGY 748 -#define MOVE_FREEZING_GLARE 749 -#define MOVE_FIERY_WRATH 750 -#define MOVE_THUNDEROUS_KICK 751 -#define MOVE_GLACIAL_LANCE 752 -#define MOVE_ASTRAL_BARRAGE 753 -#define MOVE_EERIE_SPELL 754 -// Legends: Arceus Moves -#define MOVE_DIRE_CLAW 755 -#define MOVE_PSYSHIELD_BASH 756 -#define MOVE_POWER_SHIFT 757 -#define MOVE_STONE_AXE 758 -#define MOVE_SPRINGTIDE_STORM 759 -#define MOVE_MYSTICAL_POWER 760 -#define MOVE_RAGING_FURY 761 -#define MOVE_WAVE_CRASH 762 -#define MOVE_CHLOROBLAST 763 -#define MOVE_MOUNTAIN_GALE 764 -#define MOVE_VICTORY_DANCE 765 -#define MOVE_HEADLONG_RUSH 766 -#define MOVE_BARB_BARRAGE 767 -#define MOVE_ESPER_WING 768 -#define MOVE_BITTER_MALICE 769 -#define MOVE_SHELTER 770 -#define MOVE_TRIPLE_ARROWS 771 -#define MOVE_INFERNAL_PARADE 772 -#define MOVE_CEASELESS_EDGE 773 -#define MOVE_BLEAKWIND_STORM 774 -#define MOVE_WILDBOLT_STORM 775 -#define MOVE_SANDSEAR_STORM 776 -#define MOVE_LUNAR_BLESSING 777 -#define MOVE_TAKE_HEART 778 - -#define MOVES_COUNT_GEN8 779 - -// Gen 9 moves. -#define MOVE_TERA_BLAST 779 -#define MOVE_SILK_TRAP 780 -#define MOVE_AXE_KICK 781 -#define MOVE_LAST_RESPECTS 782 -#define MOVE_LUMINA_CRASH 783 -#define MOVE_ORDER_UP 784 -#define MOVE_JET_PUNCH 785 -#define MOVE_SPICY_EXTRACT 786 -#define MOVE_SPIN_OUT 787 -#define MOVE_POPULATION_BOMB 788 -#define MOVE_ICE_SPINNER 789 -#define MOVE_GLAIVE_RUSH 790 -#define MOVE_REVIVAL_BLESSING 791 -#define MOVE_SALT_CURE 792 -#define MOVE_TRIPLE_DIVE 793 -#define MOVE_MORTAL_SPIN 794 -#define MOVE_DOODLE 795 -#define MOVE_FILLET_AWAY 796 -#define MOVE_KOWTOW_CLEAVE 797 -#define MOVE_FLOWER_TRICK 798 -#define MOVE_TORCH_SONG 799 -#define MOVE_AQUA_STEP 800 -#define MOVE_RAGING_BULL 801 -#define MOVE_MAKE_IT_RAIN 802 -#define MOVE_RUINATION 803 -#define MOVE_COLLISION_COURSE 804 -#define MOVE_ELECTRO_DRIFT 805 -#define MOVE_SHED_TAIL 806 -#define MOVE_CHILLY_RECEPTION 807 -#define MOVE_TIDY_UP 808 -#define MOVE_SNOWSCAPE 809 -#define MOVE_POUNCE 810 -#define MOVE_TRAILBLAZE 811 -#define MOVE_CHILLING_WATER 812 -#define MOVE_HYPER_DRILL 813 -#define MOVE_TWIN_BEAM 814 -#define MOVE_RAGE_FIST 815 -#define MOVE_ARMOR_CANNON 816 -#define MOVE_BITTER_BLADE 817 -#define MOVE_DOUBLE_SHOCK 818 -#define MOVE_GIGATON_HAMMER 819 -#define MOVE_COMEUPPANCE 820 -#define MOVE_AQUA_CUTTER 821 -#define MOVE_BLAZING_TORQUE 822 -#define MOVE_WICKED_TORQUE 823 -#define MOVE_NOXIOUS_TORQUE 824 -#define MOVE_COMBAT_TORQUE 825 -#define MOVE_MAGICAL_TORQUE 826 -#define MOVE_PSYBLADE 827 -#define MOVE_HYDRO_STEAM 828 -// The Teal Mask Moves -#define MOVE_BLOOD_MOON 829 -#define MOVE_MATCHA_GOTCHA 830 -#define MOVE_SYRUP_BOMB 831 -#define MOVE_IVY_CUDGEL 832 -// The Indigo Disk Moves -#define MOVE_ELECTRO_SHOT 833 -#define MOVE_TERA_STARSTORM 834 -#define MOVE_FICKLE_BEAM 835 -#define MOVE_BURNING_BULWARK 836 -#define MOVE_THUNDERCLAP 837 -#define MOVE_MIGHTY_CLEAVE 838 -#define MOVE_TACHYON_CUTTER 839 -#define MOVE_HARD_PRESS 840 -#define MOVE_DRAGON_CHEER 841 -#define MOVE_ALLURING_VOICE 842 -#define MOVE_TEMPER_FLARE 843 -#define MOVE_SUPERCELL_SLAM 844 -#define MOVE_PSYCHIC_NOISE 845 -#define MOVE_UPPER_HAND 846 -#define MOVE_MALIGNANT_CHAIN 847 - -#define MOVES_COUNT_GEN9 848 - -#define MOVES_COUNT MOVES_COUNT_GEN9 - -// Z Moves -#define MOVE_BREAKNECK_BLITZ (MOVES_COUNT + 0) -#define MOVE_ALL_OUT_PUMMELING (MOVES_COUNT + 1) -#define MOVE_SUPERSONIC_SKYSTRIKE (MOVES_COUNT + 2) -#define MOVE_ACID_DOWNPOUR (MOVES_COUNT + 3) -#define MOVE_TECTONIC_RAGE (MOVES_COUNT + 4) -#define MOVE_CONTINENTAL_CRUSH (MOVES_COUNT + 5) -#define MOVE_SAVAGE_SPIN_OUT (MOVES_COUNT + 6) -#define MOVE_NEVER_ENDING_NIGHTMARE (MOVES_COUNT + 7) -#define MOVE_CORKSCREW_CRASH (MOVES_COUNT + 8) -#define MOVE_INFERNO_OVERDRIVE (MOVES_COUNT + 9) -#define MOVE_HYDRO_VORTEX (MOVES_COUNT + 10) -#define MOVE_BLOOM_DOOM (MOVES_COUNT + 11) -#define MOVE_GIGAVOLT_HAVOC (MOVES_COUNT + 12) -#define MOVE_SHATTERED_PSYCHE (MOVES_COUNT + 13) -#define MOVE_SUBZERO_SLAMMER (MOVES_COUNT + 14) -#define MOVE_DEVASTATING_DRAKE (MOVES_COUNT + 15) -#define MOVE_BLACK_HOLE_ECLIPSE (MOVES_COUNT + 16) -#define MOVE_TWINKLE_TACKLE (MOVES_COUNT + 17) - -// Signature Z Moves -#define MOVE_CATASTROPIKA (MOVES_COUNT + 18) -#define MOVE_10000000_VOLT_THUNDERBOLT (MOVES_COUNT + 19) -#define MOVE_10_000_000_VOLT_THUNDERBOLT MOVE_10000000_VOLT_THUNDERBOLT -#define MOVE_STOKED_SPARKSURFER (MOVES_COUNT + 20) -#define MOVE_EXTREME_EVOBOOST (MOVES_COUNT + 21) -#define MOVE_PULVERIZING_PANCAKE (MOVES_COUNT + 22) -#define MOVE_GENESIS_SUPERNOVA (MOVES_COUNT + 23) -#define MOVE_SINISTER_ARROW_RAID (MOVES_COUNT + 24) -#define MOVE_MALICIOUS_MOONSAULT (MOVES_COUNT + 25) -#define MOVE_OCEANIC_OPERETTA (MOVES_COUNT + 26) -#define MOVE_SPLINTERED_STORMSHARDS (MOVES_COUNT + 27) -#define MOVE_LETS_SNUGGLE_FOREVER (MOVES_COUNT + 28) -#define MOVE_CLANGOROUS_SOULBLAZE (MOVES_COUNT + 29) -#define MOVE_GUARDIAN_OF_ALOLA (MOVES_COUNT + 30) -#define MOVE_SEARING_SUNRAZE_SMASH (MOVES_COUNT + 31) -#define MOVE_MENACING_MOONRAZE_MAELSTROM (MOVES_COUNT + 32) -#define MOVE_LIGHT_THAT_BURNS_THE_SKY (MOVES_COUNT + 33) -#define MOVE_SOUL_STEALING_7_STAR_STRIKE (MOVES_COUNT + 34) - -#define FIRST_Z_MOVE MOVE_BREAKNECK_BLITZ -#define LAST_Z_MOVE MOVE_SOUL_STEALING_7_STAR_STRIKE - -#define MOVES_COUNT_Z (LAST_Z_MOVE + 1) - -//Max Moves -#define MOVE_MAX_GUARD (FIRST_MAX_MOVE + 0) -#define MOVE_MAX_STRIKE (FIRST_MAX_MOVE + 1) -#define MOVE_MAX_KNUCKLE (FIRST_MAX_MOVE + 2) -#define MOVE_MAX_AIRSTREAM (FIRST_MAX_MOVE + 3) -#define MOVE_MAX_OOZE (FIRST_MAX_MOVE + 4) -#define MOVE_MAX_QUAKE (FIRST_MAX_MOVE + 5) -#define MOVE_MAX_ROCKFALL (FIRST_MAX_MOVE + 6) -#define MOVE_MAX_FLUTTERBY (FIRST_MAX_MOVE + 7) -#define MOVE_MAX_PHANTASM (FIRST_MAX_MOVE + 8) -#define MOVE_MAX_STEELSPIKE (FIRST_MAX_MOVE + 9) -#define MOVE_MAX_FLARE (FIRST_MAX_MOVE + 10) -#define MOVE_MAX_GEYSER (FIRST_MAX_MOVE + 11) -#define MOVE_MAX_OVERGROWTH (FIRST_MAX_MOVE + 12) -#define MOVE_MAX_LIGHTNING (FIRST_MAX_MOVE + 13) -#define MOVE_MAX_MINDSTORM (FIRST_MAX_MOVE + 14) -#define MOVE_MAX_HAILSTORM (FIRST_MAX_MOVE + 15) -#define MOVE_MAX_WYRMWIND (FIRST_MAX_MOVE + 16) -#define MOVE_MAX_DARKNESS (FIRST_MAX_MOVE + 17) -#define MOVE_MAX_STARFALL (FIRST_MAX_MOVE + 18) -// Gigantamax Moves -#define MOVE_G_MAX_VINE_LASH (FIRST_MAX_MOVE + 19) -#define MOVE_G_MAX_WILDFIRE (FIRST_MAX_MOVE + 20) -#define MOVE_G_MAX_CANNONADE (FIRST_MAX_MOVE + 21) -#define MOVE_G_MAX_BEFUDDLE (FIRST_MAX_MOVE + 22) -#define MOVE_G_MAX_VOLT_CRASH (FIRST_MAX_MOVE + 23) -#define MOVE_G_MAX_GOLD_RUSH (FIRST_MAX_MOVE + 24) -#define MOVE_G_MAX_CHI_STRIKE (FIRST_MAX_MOVE + 25) -#define MOVE_G_MAX_TERROR (FIRST_MAX_MOVE + 26) -#define MOVE_G_MAX_FOAM_BURST (FIRST_MAX_MOVE + 27) -#define MOVE_G_MAX_RESONANCE (FIRST_MAX_MOVE + 28) -#define MOVE_G_MAX_CUDDLE (FIRST_MAX_MOVE + 29) -#define MOVE_G_MAX_REPLENISH (FIRST_MAX_MOVE + 30) -#define MOVE_G_MAX_MALODOR (FIRST_MAX_MOVE + 31) -#define MOVE_G_MAX_MELTDOWN (FIRST_MAX_MOVE + 32) -#define MOVE_G_MAX_DRUM_SOLO (FIRST_MAX_MOVE + 33) -#define MOVE_G_MAX_FIREBALL (FIRST_MAX_MOVE + 34) -#define MOVE_G_MAX_HYDROSNIPE (FIRST_MAX_MOVE + 35) -#define MOVE_G_MAX_WIND_RAGE (FIRST_MAX_MOVE + 36) -#define MOVE_G_MAX_GRAVITAS (FIRST_MAX_MOVE + 37) -#define MOVE_G_MAX_STONESURGE (FIRST_MAX_MOVE + 38) -#define MOVE_G_MAX_VOLCALITH (FIRST_MAX_MOVE + 39) -#define MOVE_G_MAX_TARTNESS (FIRST_MAX_MOVE + 40) -#define MOVE_G_MAX_SWEETNESS (FIRST_MAX_MOVE + 41) -#define MOVE_G_MAX_SANDBLAST (FIRST_MAX_MOVE + 42) -#define MOVE_G_MAX_STUN_SHOCK (FIRST_MAX_MOVE + 43) -#define MOVE_G_MAX_CENTIFERNO (FIRST_MAX_MOVE + 44) -#define MOVE_G_MAX_SMITE (FIRST_MAX_MOVE + 45) -#define MOVE_G_MAX_SNOOZE (FIRST_MAX_MOVE + 46) -#define MOVE_G_MAX_FINALE (FIRST_MAX_MOVE + 47) -#define MOVE_G_MAX_STEELSURGE (FIRST_MAX_MOVE + 48) -#define MOVE_G_MAX_DEPLETION (FIRST_MAX_MOVE + 49) -#define MOVE_G_MAX_ONE_BLOW (FIRST_MAX_MOVE + 50) -#define MOVE_G_MAX_RAPID_FLOW (FIRST_MAX_MOVE + 51) - -#define FIRST_MAX_MOVE MOVES_COUNT_Z -#define LAST_MAX_MOVE MOVE_G_MAX_RAPID_FLOW - -#define MOVES_COUNT_DYNAMAX (LAST_MAX_MOVE + 1) - -#define MOVES_COUNT_ALL MOVES_COUNT_DYNAMAX - -// Used for checks for moves affected by Disable, Mimic, etc. -#define MOVE_UNAVAILABLE 0xFFFF +#define MOVE_DEFAULT 0x3FFF // Used when creating a mon to be replaced by a level-up move (needs to be less than that 0x4000 because of VarGet) +#define MOVE_UNAVAILABLE 0xFFFF // Used for checks for moves affected by Disable, Mimic, etc. #endif // GUARD_CONSTANTS_MOVES_H diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 26fb2081b..335659886 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -76,6 +76,9 @@ enum __attribute__((packed)) Type #define NATURE_QUIRKY 24 // Neutral #define NUM_NATURES 25 +#define NATURE_RANDOM NUM_NATURES +#define NATURE_MAY_SYNCHRONIZE NUM_NATURES + 1 + // Pokémon Stats enum __attribute__((packed)) Stat { @@ -154,9 +157,12 @@ enum __attribute__((packed)) Stat #define MAX_DYNAMAX_LEVEL 10 -#define OT_ID_PLAYER_ID 0 -#define OT_ID_PRESET 1 -#define OT_ID_RANDOM_NO_SHINY 2 +enum OtIdMethod +{ + OT_ID_PLAYER_ID, + OT_ID_PRESET, + OT_ID_RANDOM_NO_SHINY +}; #define MON_GIVEN_TO_PARTY 0 #define MON_GIVEN_TO_PC 1 @@ -179,6 +185,9 @@ enum __attribute__((packed)) Stat #define MON_FEMALE 0xFE #define MON_GENDERLESS 0xFF +#define MON_GENDER_RANDOM 0x01 +#define MON_GENDER_MAY_CUTE_CHARM 0x02 + // Constants for AdjustFriendship #define FRIENDSHIP_EVENT_GROW_LEVEL 0 #define FRIENDSHIP_EVENT_VITAMIN 1 // unused, handled by PokemonUseItemEffects diff --git a/include/constants/teaching_types.h b/include/constants/teaching_types.h new file mode 100644 index 000000000..63fd9daa9 --- /dev/null +++ b/include/constants/teaching_types.h @@ -0,0 +1,34 @@ +#ifndef GUARD_CONSTANTS_TEACHING_TYPES_H +#define GUARD_CONSTANTS_TEACHING_TYPES_H + +/* +Teaching Types are not used directly by the ROM but they are used by +make_teachables.py to generate teachable learnsets. To save ROM space, the info is +stored in 1 bit and the python script reads the name of the define. +This means we can have multiple "modes" that define to 1. +You can add additional teaching types but they would need to be described in the +python script. +*/ + + +/* DEFAULT_LEARNING +Vanilla uses: most pokemon +Allow a pokemon to learn all universal moves +*/ +#define DEFAULT_LEARNING 0 + +/* TM_ILLITERATE +Vanilla uses: pokemon with "gimmick" moveset (Ditto, Smeargle, Magikarp, ...) +Pokemon can't learn any universal moves (unless it was added to their teachable learnset) +*/ +#define TM_ILLITERATE 1 + +/* ALL_TEACHABLES +Vanilla uses: Mew +Allows a pokemon to learn almost every teachable move (whether from TM or tutors) +Some moves are excluded, they are listed in SignatureTeachables +*/ +#define ALL_TEACHABLES 1 + + +#endif // GUARD_CONSTANTS_TEACHING_TYPES_H diff --git a/include/constants/trainer_slide.h b/include/constants/trainer_slide.h index 26635b164..5444110d9 100644 --- a/include/constants/trainer_slide.h +++ b/include/constants/trainer_slide.h @@ -38,6 +38,7 @@ enum TrainerSlideTargets TRAINER_SLIDE_TARGET_NONE, TRAINER_SLIDE_TARGET_TRAINER_A, TRAINER_SLIDE_TARGET_TRAINER_B, + TRAINER_SLIDE_TARGET_TRAINER_PARTNER, }; #endif // GUARD_CONSTANTS_TRAINER_SLIDE_H diff --git a/include/constants/trainers.h b/include/constants/trainers.h index 445de60a2..d0929d9dc 100644 --- a/include/constants/trainers.h +++ b/include/constants/trainers.h @@ -18,154 +18,158 @@ #define TRAINER_ENCOUNTER_MUSIC_INTERVIEWER 12 #define TRAINER_ENCOUNTER_MUSIC_RICH 13 // Rich Boys and Gentlemen -#define TRAINER_PIC_AQUA_LEADER_ARCHIE 0 -#define TRAINER_PIC_AQUA_GRUNT_M 1 -#define TRAINER_PIC_AQUA_GRUNT_F 2 -#define TRAINER_PIC_RS_AROMA_LADY 3 -#define TRAINER_PIC_RS_RUIN_MANIAC 4 -#define TRAINER_PIC_INTERVIEWER 5 -#define TRAINER_PIC_RS_TUBER_F 6 -#define TRAINER_PIC_RS_TUBER_M 7 -#define TRAINER_PIC_RS_COOLTRAINER_M 8 -#define TRAINER_PIC_RS_COOLTRAINER_F 9 -#define TRAINER_PIC_HEX_MANIAC 10 -#define TRAINER_PIC_RS_LADY 11 -#define TRAINER_PIC_RS_BEAUTY 12 -#define TRAINER_PIC_RICH_BOY 13 -#define TRAINER_PIC_RS_POKEMANIAC 14 -#define TRAINER_PIC_RS_SWIMMER_M 15 -#define TRAINER_PIC_RS_BLACK_BELT 16 -#define TRAINER_PIC_GUITARIST 17 -#define TRAINER_PIC_KINDLER 18 -#define TRAINER_PIC_RS_CAMPER 19 -#define TRAINER_PIC_BUG_MANIAC 20 -#define TRAINER_PIC_RS_PSYCHIC_M 21 -#define TRAINER_PIC_RS_PSYCHIC_F 22 -#define TRAINER_PIC_RS_GENTLEMAN 23 -#define TRAINER_PIC_ELITE_FOUR_SIDNEY 24 -#define TRAINER_PIC_ELITE_FOUR_PHOEBE 25 -#define TRAINER_PIC_LEADER_ROXANNE 26 -#define TRAINER_PIC_LEADER_BRAWLY 27 -#define TRAINER_PIC_LEADER_TATE_AND_LIZA 28 -#define TRAINER_PIC_SCHOOL_KID_M 29 -#define TRAINER_PIC_SCHOOL_KID_F 30 -#define TRAINER_PIC_SR_AND_JR 31 -#define TRAINER_PIC_POKEFAN_M 32 -#define TRAINER_PIC_POKEFAN_F 33 -#define TRAINER_PIC_EXPERT_M 34 -#define TRAINER_PIC_EXPERT_F 35 -#define TRAINER_PIC_RS_YOUNGSTER 36 -#define TRAINER_PIC_CHAMPION_STEVEN 37 -#define TRAINER_PIC_RS_FISHERMAN 38 -#define TRAINER_PIC_CYCLING_TRIATHLETE_M 39 -#define TRAINER_PIC_CYCLING_TRIATHLETE_F 40 -#define TRAINER_PIC_RUNNING_TRIATHLETE_M 41 -#define TRAINER_PIC_RUNNING_TRIATHLETE_F 42 -#define TRAINER_PIC_SWIMMING_TRIATHLETE_M 43 -#define TRAINER_PIC_SWIMMING_TRIATHLETE_F 44 -#define TRAINER_PIC_DRAGON_TAMER 45 -#define TRAINER_PIC_RS_BIRD_KEEPER 46 -#define TRAINER_PIC_NINJA_BOY 47 -#define TRAINER_PIC_BATTLE_GIRL 48 -#define TRAINER_PIC_PARASOL_LADY 49 -#define TRAINER_PIC_RS_SWIMMER_F 50 -#define TRAINER_PIC_RS_PICNICKER 51 -#define TRAINER_PIC_RS_TWINS 52 -#define TRAINER_PIC_RS_SAILOR 53 -#define TRAINER_PIC_COLLECTOR 54 -#define TRAINER_PIC_WALLY 55 -#define TRAINER_PIC_RS_BRENDAN_1 56 -#define TRAINER_PIC_RS_MAY_1 57 -#define TRAINER_PIC_RS_POKEMON_BREEDER_M 58 -#define TRAINER_PIC_RS_POKEMON_BREEDER_F 59 -#define TRAINER_PIC_RS_POKEMON_RANGER_M 60 -#define TRAINER_PIC_RS_POKEMON_RANGER_F 61 -#define TRAINER_PIC_MAGMA_LEADER_MAXIE 62 -#define TRAINER_PIC_MAGMA_GRUNT_M 63 -#define TRAINER_PIC_MAGMA_GRUNT_F 64 -#define TRAINER_PIC_RS_LASS 65 -#define TRAINER_PIC_RS_BUG_CATCHER 66 -#define TRAINER_PIC_RS_HIKER 67 -#define TRAINER_PIC_RS_YOUNG_COUPLE 68 -#define TRAINER_PIC_OLD_COUPLE 69 -#define TRAINER_PIC_RS_SIS_AND_BRO 70 -#define TRAINER_PIC_AQUA_ADMIN_M 71 -#define TRAINER_PIC_AQUA_ADMIN_F 72 -#define TRAINER_PIC_MAGMA_ADMIN_M 73 -#define TRAINER_PIC_MAGMA_ADMIN_F 74 -#define TRAINER_PIC_LEADER_WATTSON 75 -#define TRAINER_PIC_LEADER_FLANNERY 76 -#define TRAINER_PIC_LEADER_NORMAN 77 -#define TRAINER_PIC_LEADER_WINONA 78 -#define TRAINER_PIC_LEADER_WALLACE 79 -#define TRAINER_PIC_ELITE_FOUR_GLACIA 80 -#define TRAINER_PIC_ELITE_FOUR_DRAKE 81 -#define TRAINER_PIC_YOUNGSTER 82 -#define TRAINER_PIC_BUG_CATCHER 83 -#define TRAINER_PIC_LASS 84 -#define TRAINER_PIC_SAILOR 85 -#define TRAINER_PIC_CAMPER 86 -#define TRAINER_PIC_PICNICKER 87 -#define TRAINER_PIC_POKEMANIAC 88 -#define TRAINER_PIC_SUPER_NERD 89 -#define TRAINER_PIC_HIKER 90 -#define TRAINER_PIC_BIKER 91 -#define TRAINER_PIC_BURGLAR 92 -#define TRAINER_PIC_ENGINEER 93 -#define TRAINER_PIC_FISHERMAN 94 -#define TRAINER_PIC_SWIMMER_M 95 -#define TRAINER_PIC_CUE_BALL 96 -#define TRAINER_PIC_GAMER 97 -#define TRAINER_PIC_BEAUTY 98 -#define TRAINER_PIC_SWIMMER_F 99 -#define TRAINER_PIC_PSYCHIC_M 100 -#define TRAINER_PIC_ROCKER 101 -#define TRAINER_PIC_JUGGLER 102 -#define TRAINER_PIC_TAMER 103 -#define TRAINER_PIC_BIRD_KEEPER 104 -#define TRAINER_PIC_BLACK_BELT 105 -#define TRAINER_PIC_RIVAL_EARLY 106 -#define TRAINER_PIC_SCIENTIST 107 -#define TRAINER_PIC_LEADER_GIOVANNI 108 -#define TRAINER_PIC_ROCKET_GRUNT_M 109 -#define TRAINER_PIC_COOLTRAINER_M 110 -#define TRAINER_PIC_COOLTRAINER_F 111 -#define TRAINER_PIC_ELITE_FOUR_LORELEI 112 -#define TRAINER_PIC_ELITE_FOUR_BRUNO 113 -#define TRAINER_PIC_ELITE_FOUR_AGATHA 114 -#define TRAINER_PIC_ELITE_FOUR_LANCE 115 -#define TRAINER_PIC_LEADER_BROCK 116 -#define TRAINER_PIC_LEADER_MISTY 117 -#define TRAINER_PIC_LEADER_LT_SURGE 118 -#define TRAINER_PIC_LEADER_ERIKA 119 -#define TRAINER_PIC_LEADER_KOGA 120 -#define TRAINER_PIC_LEADER_BLAINE 121 -#define TRAINER_PIC_LEADER_SABRINA 122 -#define TRAINER_PIC_GENTLEMAN 123 -#define TRAINER_PIC_RIVAL_LATE 124 -#define TRAINER_PIC_CHAMPION_RIVAL 125 -#define TRAINER_PIC_CHANNELER 126 -#define TRAINER_PIC_TWINS 127 -#define TRAINER_PIC_COOL_COUPLE 128 -#define TRAINER_PIC_YOUNG_COUPLE 129 -#define TRAINER_PIC_CRUSH_KIN 130 -#define TRAINER_PIC_SIS_AND_BRO 131 -#define TRAINER_PIC_PROFESSOR_OAK 132 -#define TRAINER_PIC_RS_BRENDAN_2 133 -#define TRAINER_PIC_RS_MAY_2 134 -#define TRAINER_PIC_RED 135 -#define TRAINER_PIC_LEAF 136 -#define TRAINER_PIC_ROCKET_GRUNT_F 137 -#define TRAINER_PIC_PSYCHIC_F 138 -#define TRAINER_PIC_CRUSH_GIRL 139 -#define TRAINER_PIC_TUBER_F 140 -#define TRAINER_PIC_POKEMON_BREEDER 141 -#define TRAINER_PIC_POKEMON_RANGER_M 142 -#define TRAINER_PIC_POKEMON_RANGER_F 143 -#define TRAINER_PIC_AROMA_LADY 144 -#define TRAINER_PIC_RUIN_MANIAC 145 -#define TRAINER_PIC_LADY 146 -#define TRAINER_PIC_PAINTER 147 + +enum __attribute__((packed)) TrainerPicID +{ + TRAINER_PIC_AQUA_LEADER_ARCHIE, + TRAINER_PIC_AQUA_GRUNT_M, + TRAINER_PIC_AQUA_GRUNT_F, + TRAINER_PIC_RS_AROMA_LADY, + TRAINER_PIC_RS_RUIN_MANIAC, + TRAINER_PIC_INTERVIEWER, + TRAINER_PIC_RS_TUBER_F, + TRAINER_PIC_RS_TUBER_M, + TRAINER_PIC_RS_COOLTRAINER_M, + TRAINER_PIC_RS_COOLTRAINER_F, + TRAINER_PIC_HEX_MANIAC, + TRAINER_PIC_RS_LADY, + TRAINER_PIC_RS_BEAUTY, + TRAINER_PIC_RICH_BOY, + TRAINER_PIC_RS_POKEMANIAC, + TRAINER_PIC_RS_SWIMMER_M, + TRAINER_PIC_RS_BLACK_BELT, + TRAINER_PIC_GUITARIST, + TRAINER_PIC_KINDLER, + TRAINER_PIC_RS_CAMPER, + TRAINER_PIC_BUG_MANIAC, + TRAINER_PIC_RS_PSYCHIC_M, + TRAINER_PIC_RS_PSYCHIC_F, + TRAINER_PIC_RS_GENTLEMAN, + TRAINER_PIC_ELITE_FOUR_SIDNEY, + TRAINER_PIC_ELITE_FOUR_PHOEBE, + TRAINER_PIC_LEADER_ROXANNE, + TRAINER_PIC_LEADER_BRAWLY, + TRAINER_PIC_LEADER_TATE_AND_LIZA, + TRAINER_PIC_SCHOOL_KID_M, + TRAINER_PIC_SCHOOL_KID_F, + TRAINER_PIC_SR_AND_JR, + TRAINER_PIC_POKEFAN_M, + TRAINER_PIC_POKEFAN_F, + TRAINER_PIC_EXPERT_M, + TRAINER_PIC_EXPERT_F, + TRAINER_PIC_RS_YOUNGSTER, + TRAINER_PIC_CHAMPION_STEVEN, + TRAINER_PIC_RS_FISHERMAN, + TRAINER_PIC_CYCLING_TRIATHLETE_M, + TRAINER_PIC_CYCLING_TRIATHLETE_F, + TRAINER_PIC_RUNNING_TRIATHLETE_M, + TRAINER_PIC_RUNNING_TRIATHLETE_F, + TRAINER_PIC_SWIMMING_TRIATHLETE_M, + TRAINER_PIC_SWIMMING_TRIATHLETE_F, + TRAINER_PIC_DRAGON_TAMER, + TRAINER_PIC_RS_BIRD_KEEPER, + TRAINER_PIC_NINJA_BOY, + TRAINER_PIC_BATTLE_GIRL, + TRAINER_PIC_PARASOL_LADY, + TRAINER_PIC_RS_SWIMMER_F, + TRAINER_PIC_RS_PICNICKER, + TRAINER_PIC_RS_TWINS, + TRAINER_PIC_RS_SAILOR, + TRAINER_PIC_COLLECTOR, + TRAINER_PIC_WALLY, + TRAINER_PIC_RS_BRENDAN_1, + TRAINER_PIC_RS_MAY_1, + TRAINER_PIC_RS_POKEMON_BREEDER_M, + TRAINER_PIC_RS_POKEMON_BREEDER_F, + TRAINER_PIC_RS_POKEMON_RANGER_M, + TRAINER_PIC_RS_POKEMON_RANGER_F, + TRAINER_PIC_MAGMA_LEADER_MAXIE, + TRAINER_PIC_MAGMA_GRUNT_M, + TRAINER_PIC_MAGMA_GRUNT_F, + TRAINER_PIC_RS_LASS, + TRAINER_PIC_RS_BUG_CATCHER, + TRAINER_PIC_RS_HIKER, + TRAINER_PIC_RS_YOUNG_COUPLE, + TRAINER_PIC_OLD_COUPLE, + TRAINER_PIC_RS_SIS_AND_BRO, + TRAINER_PIC_AQUA_ADMIN_M, + TRAINER_PIC_AQUA_ADMIN_F, + TRAINER_PIC_MAGMA_ADMIN_M, + TRAINER_PIC_MAGMA_ADMIN_F, + TRAINER_PIC_LEADER_WATTSON, + TRAINER_PIC_LEADER_FLANNERY, + TRAINER_PIC_LEADER_NORMAN, + TRAINER_PIC_LEADER_WINONA, + TRAINER_PIC_LEADER_WALLACE, + TRAINER_PIC_ELITE_FOUR_GLACIA, + TRAINER_PIC_ELITE_FOUR_DRAKE, + TRAINER_PIC_YOUNGSTER, + TRAINER_PIC_BUG_CATCHER, + TRAINER_PIC_LASS, + TRAINER_PIC_SAILOR, + TRAINER_PIC_CAMPER, + TRAINER_PIC_PICNICKER, + TRAINER_PIC_POKEMANIAC, + TRAINER_PIC_SUPER_NERD, + TRAINER_PIC_HIKER, + TRAINER_PIC_BIKER, + TRAINER_PIC_BURGLAR, + TRAINER_PIC_ENGINEER, + TRAINER_PIC_FISHERMAN, + TRAINER_PIC_SWIMMER_M, + TRAINER_PIC_CUE_BALL, + TRAINER_PIC_GAMER, + TRAINER_PIC_BEAUTY, + TRAINER_PIC_SWIMMER_F, + TRAINER_PIC_PSYCHIC_M, + TRAINER_PIC_ROCKER, + TRAINER_PIC_JUGGLER, + TRAINER_PIC_TAMER, + TRAINER_PIC_BIRD_KEEPER, + TRAINER_PIC_BLACK_BELT, + TRAINER_PIC_RIVAL_EARLY, + TRAINER_PIC_SCIENTIST, + TRAINER_PIC_LEADER_GIOVANNI, + TRAINER_PIC_ROCKET_GRUNT_M, + TRAINER_PIC_COOLTRAINER_M, + TRAINER_PIC_COOLTRAINER_F, + TRAINER_PIC_ELITE_FOUR_LORELEI, + TRAINER_PIC_ELITE_FOUR_BRUNO, + TRAINER_PIC_ELITE_FOUR_AGATHA, + TRAINER_PIC_ELITE_FOUR_LANCE, + TRAINER_PIC_LEADER_BROCK, + TRAINER_PIC_LEADER_MISTY, + TRAINER_PIC_LEADER_LT_SURGE, + TRAINER_PIC_LEADER_ERIKA, + TRAINER_PIC_LEADER_KOGA, + TRAINER_PIC_LEADER_BLAINE, + TRAINER_PIC_LEADER_SABRINA, + TRAINER_PIC_GENTLEMAN, + TRAINER_PIC_RIVAL_LATE, + TRAINER_PIC_CHAMPION_RIVAL, + TRAINER_PIC_CHANNELER, + TRAINER_PIC_TWINS, + TRAINER_PIC_COOL_COUPLE, + TRAINER_PIC_YOUNG_COUPLE, + TRAINER_PIC_CRUSH_KIN, + TRAINER_PIC_SIS_AND_BRO, + TRAINER_PIC_PROFESSOR_OAK, + TRAINER_PIC_RS_BRENDAN_2, + TRAINER_PIC_RS_MAY_2, + TRAINER_PIC_RED, + TRAINER_PIC_LEAF, + TRAINER_PIC_ROCKET_GRUNT_F, + TRAINER_PIC_PSYCHIC_F, + TRAINER_PIC_CRUSH_GIRL, + TRAINER_PIC_TUBER_F, + TRAINER_PIC_POKEMON_BREEDER, + TRAINER_PIC_POKEMON_RANGER_M, + TRAINER_PIC_POKEMON_RANGER_F, + TRAINER_PIC_AROMA_LADY, + TRAINER_PIC_RUIN_MANIAC, + TRAINER_PIC_LADY, + TRAINER_PIC_PAINTER, +}; // The player back pics are assumed to alternate according to the gender values (MALE/FEMALE) #define TRAINER_BACK_PIC_RED 0 @@ -445,7 +449,8 @@ enum TrainerClassID #define FACILITY_CLASS_ELITE_FOUR_LANCE 148 #define FACILITY_CLASS_CHAMPION_RIVAL_2 149 -#define F_TRAINER_FEMALE (1 << 7) +#define TRAINER_GENDER_MALE 0 +#define TRAINER_GENDER_FEMALE 1 // Trainer party defines #define TRAINER_MON_MALE 1 diff --git a/include/constants/vars.h b/include/constants/vars.h index 22192d0dd..4c0adb3f6 100644 --- a/include/constants/vars.h +++ b/include/constants/vars.h @@ -337,15 +337,15 @@ #define SPECIAL_VARS_END 0x8014 #if TESTING -#define TESTING_VARS_START 0x9000 -#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0) -#define TESTING_VAR_UNUSED_1 (TESTING_VARS_START + 0x1) -#define TESTING_VAR_UNUSED_2 (TESTING_VARS_START + 0x2) -#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3) -#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4) -#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5) -#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6) -#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7) +#define TESTING_VARS_START 0x9000 +#define TESTING_VAR_DIFFICULTY (TESTING_VARS_START + 0x0) +#define TESTING_VAR_TRAINER_SLIDES (TESTING_VARS_START + 0x1) +#define TESTING_VAR_UNUSED_2 (TESTING_VARS_START + 0x2) +#define TESTING_VAR_UNUSED_3 (TESTING_VARS_START + 0x3) +#define TESTING_VAR_UNUSED_4 (TESTING_VARS_START + 0x4) +#define TESTING_VAR_UNUSED_5 (TESTING_VARS_START + 0x5) +#define TESTING_VAR_UNUSED_6 (TESTING_VARS_START + 0x6) +#define TESTING_VAR_UNUSED_7 (TESTING_VARS_START + 0x7) #endif // TESTING // Text color ids for VAR_TEXT_COLOR / VAR_PREV_TEXT_COLOR diff --git a/include/contest_effect.h b/include/contest_effect.h index 87129bd79..885f0b70f 100644 --- a/include/contest_effect.h +++ b/include/contest_effect.h @@ -1,6 +1,6 @@ #ifndef GUARD_CONTEST_EFFECT_H #define GUARD_CONTEST_EFFECT_H -#define MAX_COMBO_MOVES 5 +#define MAX_COMBO_MOVES 17 struct ContestEffect { diff --git a/include/data.h b/include/data.h index 7cccf3eba..c37ae0947 100644 --- a/include/data.h +++ b/include/data.h @@ -62,17 +62,17 @@ struct TrainerMon const u8 *nickname; const u8 *ev; u32 iv; - u16 moves[4]; + enum Move moves[MAX_MON_MOVES]; u16 species; u16 heldItem; - u16 ability; + enum Ability ability; u8 lvl; u8 ball; u8 friendship; u8 nature:5; bool8 gender:2; bool8 isShiny:1; - u8 teraType:5; + enum Type teraType:5; bool8 gigantamaxFactor:1; u8 shouldUseDynamax:1; u8 padding1:1; @@ -83,31 +83,56 @@ struct TrainerMon #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) -enum TrainerBattleType +enum TrainerBattleType { TRAINER_BATTLE_TYPE_SINGLES, TRAINER_BATTLE_TYPE_DOUBLES, }; +#define UNPACK_STARTING_STATUSES_STRUCT(_enum, _fieldName, _typeMaxValue, ...) INVOKE_WITH_(UNPACK_STARTING_STATUSES_STRUCT_, _fieldName, UNPACK_B(_typeMaxValue)); +#define UNPACK_STARTING_STATUSES_STRUCT_(_fieldName, _type, ...) _type FIRST(__VA_OPT__(_fieldName:BIT_SIZE(FIRST(__VA_ARGS__)),) _fieldName) + +struct StartingStatuses +{ + STARTING_STATUS_DEFINITIONS(UNPACK_STARTING_STATUSES_STRUCT) + // Expands to: + // u32 electricTerrain:1; + // u32 mistyTerrain:1; + // u32 grassyTerrain:1; + // u32 psychicTerrain:1; + // u32 trickRoom:1; + // u32 magicRoom:1; + // u32 wonderRoom:1; + // u32 tailwindPlayer:1; + // u32 tailwindOpponent:1; + // u32 rainbowPlayer:1; + // u32 rainbowOpponent:1; + // u32 seaOfFirePlayer:1; + // u32 seaOfFireOpponent:1; + // u32 swampPlayer:1; + // u32 swampOpponent:1; +}; + struct Trainer { - /*0x00*/ u64 aiFlags; - /*0x04*/ const struct TrainerMon *party; - /*0x08*/ u16 items[MAX_TRAINER_ITEMS]; - /*0x10*/ u8 trainerClass; - /*0x11*/ u8 encounterMusic_gender; // last bit is gender - /*0x12*/ u8 trainerPic; - /*0x13*/ u8 trainerName[TRAINER_NAME_LENGTH + 1]; - /*0x1E*/ u8 battleType:2; - u8 startingStatus:6; // this trainer starts a battle with a given status. see include/constants/battle.h for values - /*0x1F*/ u8 mugshotColor; - /*0x20*/ u8 partySize; - /*0x21*/ u8 poolSize; - /*0x22*/ u8 poolRuleIndex; - /*0x23*/ u8 poolPickIndex; - /*0x24*/ u8 poolPruneIndex; - /*0x25*/ u16 overrideTrainer; - /*0x26*/ u8 trainerBackPic; + u64 aiFlags; + const struct TrainerMon *party; + enum Item items[MAX_TRAINER_ITEMS]; + struct StartingStatuses startingStatus; // this trainer starts a battle with a given status. see include/constants/battle.h for values + u8 trainerClass; + u8 encounterMusic:7; + u8 gender:1; + enum TrainerPicID trainerPic; + u8 trainerName[TRAINER_NAME_LENGTH + 1]; + u8 battleType:2; + u8 mugshotColor:6; + u8 partySize; + u8 poolSize; + u8 poolRuleIndex; + u8 poolPickIndex; + u8 poolPruneIndex; + u16 overrideTrainer; + enum TrainerPicID trainerBackPic; }; struct TrainerClass @@ -181,6 +206,8 @@ extern const struct Trainer gBattlePartners[DIFFICULTY_COUNT][PARTNER_COUNT]; extern const struct TrainerClass gTrainerClasses[TRAINER_CLASS_COUNT]; +extern const struct EggData gEggDatas[EGG_ID_COUNT]; + // Follower text messages extern const struct FollowerMsgInfo gFollowerHappyMessages[]; extern const struct FollowerMsgInfo gFollowerNeutralMessages[]; @@ -194,7 +221,6 @@ extern const struct FollowerMsgInfo gFollowerCuriousMessages[]; extern const struct FollowerMsgInfo gFollowerMusicMessages[]; extern const struct FollowerMsgInfo gFollowerPoisonedMessages[]; - static inline bool8 IsPartnerTrainerId(u16 trainerId) { if (trainerId >= TRAINER_PARTNER(PARTNER_NONE) && trainerId < TRAINER_PARTNER(PARTNER_COUNT)) @@ -204,8 +230,24 @@ static inline bool8 IsPartnerTrainerId(u16 trainerId) static inline u16 SanitizeTrainerId(u16 trainerId) { - if (trainerId >= TRAINERS_COUNT && !IsPartnerTrainerId(trainerId)) + switch (trainerId) + { + // case TRAINER_RECORD_MIXING_FRIEND: + // case TRAINER_RECORD_MIXING_APPRENTICE: + // case TRAINER_EREADER: + // case TRAINER_FRONTIER_BRAIN: + // case TRAINER_PLAYER: + case TRAINER_SECRET_BASE: + case TRAINER_LINK_OPPONENT: + case TRAINER_UNION_ROOM: return TRAINER_NONE; + } + + assertf(trainerId < TRAINERS_COUNT || IsPartnerTrainerId(trainerId), "invalid trainer: %d", trainerId) + { + return TRAINER_NONE; + } + return trainerId; } @@ -248,7 +290,7 @@ static inline const u8 *GetTrainerNameFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerName; } -static inline const u8 GetTrainerPicFromId(u16 trainerId) +static inline const enum TrainerPicID GetTrainerPicFromId(u16 trainerId) { enum DifficultyLevel partnerDifficulty = GetBattlePartnerDifficultyLevel(trainerId); @@ -268,7 +310,7 @@ static inline const u8 GetTrainerBackPicFromId(u16 trainerId) return GetTrainerStructFromId(trainerId)->trainerBackPic; } -static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) +static inline const struct StartingStatuses GetTrainerStartingStatusFromId(u16 trainerId) { return GetTrainerStructFromId(trainerId)->startingStatus; } diff --git a/include/generational_changes.h b/include/generational_changes.h index e8b701d09..90668f31b 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -3,78 +3,23 @@ #include "constants/generational_changes.h" #include "config/battle.h" +#include "config/pokerus.h" -static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = +#define UNPACK_CONFIG_STRUCT(_name, _field, _typeMaxValue, ...) INVOKE_WITH_(UNPACK_CONFIG_STRUCT_, _field, UNPACK_B(_typeMaxValue)); +#define UNPACK_CONFIG_STRUCT_(_field, _type, ...) _type FIRST(__VA_OPT__(_field:BIT_SIZE(FIRST(__VA_ARGS__)),) _field) + +struct GenChanges { - [GEN_CONFIG_CRIT_CHANCE] = B_CRIT_CHANCE, - [GEN_CONFIG_CRIT_MULTIPLIER] = B_CRIT_MULTIPLIER, - [GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO] = B_FOCUS_ENERGY_CRIT_RATIO, - [GEN_CONFIG_PARALYSIS_SPEED] = B_PARALYSIS_SPEED, - [GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE] = B_CONFUSION_SELF_DMG_CHANCE, - [GEN_CONFIG_MULTI_HIT_CHANCE] = B_MULTI_HIT_CHANCE, - [GEN_CONFIG_GALE_WINGS] = B_GALE_WINGS, - [GEN_CONFIG_HEAL_BELL_SOUNDPROOF] = B_HEAL_BELL_SOUNDPROOF, - [GEN_CONFIG_TELEPORT_BEHAVIOR] = B_TELEPORT_BEHAVIOR, - [GEN_CONFIG_ABILITY_WEATHER] = B_ABILITY_WEATHER, - [GEN_CONFIG_MOODY_STATS] = B_MOODY_ACC_EVASION, - [GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND, - [GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER, - [GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE, - [GEN_CONFIG_DEFIANT_STICKY_WEB] = B_DEFIANT_STICKY_WEB, - [GEN_CONFIG_ENCORE_TARGET] = B_ENCORE_TARGET, - [GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES] = B_TIME_OF_DAY_HEALING_MOVES, - [GEN_PICKUP_WILD] = B_PICKUP_WILD, - [GEN_PROTEAN_LIBERO] = B_PROTEAN_LIBERO, - [GEN_INTREPID_SWORD] = B_INTREPID_SWORD, - [GEN_DAUNTLESS_SHIELD] = B_DAUNTLESS_SHIELD, - [GEN_ILLUMINATE_EFFECT] = B_ILLUMINATE_EFFECT, - [GEN_STEAL_WILD_ITEMS] = B_STEAL_WILD_ITEMS, - [GEN_SNOW_WARNING] = B_SNOW_WARNING, - [GEN_ALLY_SWITCH_FAIL_CHANCE] = B_ALLY_SWITCH_FAIL_CHANCE, - [GEN_DREAM_EATER_LIQUID_OOZE] = B_DREAM_EATER_LIQUID_OOZE, - [GEN_CONFIG_TRANSISTOR_BOOST] = B_TRANSISTOR_BOOST, - [GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS] = B_RECALC_TURN_AFTER_ACTIONS, - [GEN_CONFIG_UPDATED_INTIMIDATE] = B_UPDATED_INTIMIDATE, - [GEN_CONFIG_DISGUISE_HP_LOSS] = B_DISGUISE_HP_LOSS, - [GEN_CONFIG_AFTER_YOU_TURN_ORDER] = B_AFTER_YOU_TURN_ORDER, - [GEN_CONFIG_HEALING_WISH_SWITCH] = B_HEALING_WISH_SWITCH, - [GEN_CONFIG_MEGA_EVO_TURN_ORDER] = B_MEGA_EVO_TURN_ORDER, - [GEN_CONFIG_SHEER_COLD_IMMUNITY] = B_SHEER_COLD_IMMUNITY, - [GEN_CONFIG_WEAK_ARMOR_SPEED] = B_WEAK_ARMOR_SPEED, - [GEN_CONFIG_PRANKSTER_DARK_TYPES] = B_PRANKSTER_DARK_TYPES, - [GEN_CONFIG_DESTINY_BOND_FAIL] = B_DESTINY_BOND_FAIL, - [GEN_CONFIG_POWDER_RAIN] = B_POWDER_RAIN, - [GEN_CONFIG_POWDER_GRASS] = B_POWDER_GRASS, - [GEN_CONFIG_POWDER_OVERCOAT] = B_POWDER_OVERCOAT, - [GEN_CONFIG_OBLIVIOUS_TAUNT] = B_OBLIVIOUS_TAUNT, - [GEN_CONFIG_TOXIC_NEVER_MISS] = B_TOXIC_NEVER_MISS, - [GEN_CONFIG_PARALYZE_ELECTRIC] = B_PARALYZE_ELECTRIC, - [GEN_CONFIG_BADGE_BOOST] = B_BADGE_BOOST + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_STRUCT) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_STRUCT) + // Expands to: + // u32 critChance:4; + // u32 critMultiplier:4; + // ... }; -#if TESTING -extern u8 *gGenerationalChangesTestOverride; -#endif - -static inline u32 GetGenConfig(enum GenConfigTag configTag) -{ - if (configTag >= GEN_CONFIG_COUNT) return GEN_LATEST; -#if TESTING - if (gGenerationalChangesTestOverride == NULL) return sGenerationalChanges[configTag]; - return gGenerationalChangesTestOverride[configTag]; -#else - return sGenerationalChanges[configTag]; -#endif -} - -static inline void SetGenConfig(enum GenConfigTag configTag, u32 value) -{ -#if TESTING - if (configTag >= GEN_CONFIG_COUNT) return; - if (gGenerationalChangesTestOverride == NULL) return; - gGenerationalChangesTestOverride[configTag] = value; -#endif -} +u32 GetConfig(enum ConfigTag configTag); +void SetConfig(enum ConfigTag configTag, u32 value); #if TESTING void TestInitConfigData(void); diff --git a/include/global.h b/include/global.h index ac81caa38..a865c3b47 100644 --- a/include/global.h +++ b/include/global.h @@ -177,6 +177,8 @@ extern u8 gStringVar4[1000]; #define FEATURE_FLAG_ASSERT(flag, id) STATIC_ASSERT(flag > TEMP_FLAGS_END || flag == 0, id) +#define READ_OTID_FROM_SAVE T1_READ_32(gSaveBlock2Ptr->playerTrainerId) + #ifndef NDEBUG static inline void CycleCountStart() { diff --git a/include/graphics.h b/include/graphics.h index 194491e24..9422c0259 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2874,6 +2874,7 @@ extern const u16 gItemIconPalette_UltraBall[]; extern const u32 gItemIcon_MasterBall[]; extern const u16 gItemIconPalette_MasterBall[]; extern const u32 gItemIcon_PremierBall[]; +extern const u16 gItemIconPalette_PremierBall[]; extern const u32 gItemIcon_HealBall[]; extern const u16 gItemIconPalette_HealBall[]; extern const u32 gItemIcon_NetBall[]; @@ -2996,17 +2997,12 @@ extern const u16 gItemIconPalette_PPUp[]; extern const u32 gItemIcon_PPMax[]; extern const u16 gItemIconPalette_PPMax[]; // EV Feathers -extern const u32 gItemIcon_HealthFeather[]; +extern const u32 gItemIcon_EVFeather[]; extern const u16 gItemIconPalette_HealthFeather[]; -extern const u32 gItemIcon_MuscleFeather[]; extern const u16 gItemIconPalette_MuscleFeather[]; -extern const u32 gItemIcon_ResistFeather[]; extern const u16 gItemIconPalette_ResistFeather[]; -extern const u32 gItemIcon_GeniusFeather[]; extern const u16 gItemIconPalette_GeniusFeather[]; -extern const u32 gItemIcon_CleverFeather[]; extern const u16 gItemIconPalette_CleverFeather[]; -extern const u32 gItemIcon_SwiftFeather[]; extern const u16 gItemIconPalette_SwiftFeather[]; // Ability Modifiers extern const u32 gItemIcon_AbilityCapsule[]; @@ -3164,19 +3160,13 @@ extern const u16 gItemIconPalette_SurpriseMulch[]; extern const u16 gItemIconPalette_BoostMulch[]; extern const u16 gItemIconPalette_AmazeMulch[]; // Apricorns -extern const u32 gItemIcon_RedApricorn[]; +extern const u32 gItemIcon_Apricorn[]; extern const u16 gItemIconPalette_RedApricorn[]; -extern const u32 gItemIcon_BlueApricorn[]; extern const u16 gItemIconPalette_BlueApricorn[]; -extern const u32 gItemIcon_YellowApricorn[]; extern const u16 gItemIconPalette_YellowApricorn[]; -extern const u32 gItemIcon_GreenApricorn[]; extern const u16 gItemIconPalette_GreenApricorn[]; -extern const u32 gItemIcon_PinkApricorn[]; extern const u16 gItemIconPalette_PinkApricorn[]; -extern const u32 gItemIcon_WhiteApricorn[]; extern const u16 gItemIconPalette_WhiteApricorn[]; -extern const u32 gItemIcon_BlackApricorn[]; extern const u16 gItemIconPalette_BlackApricorn[]; extern const u32 gItemIcon_WishingPiece[]; extern const u16 gItemIconPalette_WishingPiece[]; @@ -3294,57 +3284,35 @@ extern const u16 gItemIconPalette_MasterpieceTeacup[]; extern const u32 gItemIcon_MetalAlloy[]; extern const u16 gItemIconPalette_MetalAlloy[]; // Nectars -extern const u32 gItemIcon_RedNectar[]; +extern const u32 gItemIcon_Nectar[]; extern const u16 gItemIconPalette_RedNectar[]; -extern const u32 gItemIcon_YellowNectar[]; extern const u16 gItemIconPalette_YellowNectar[]; -extern const u32 gItemIcon_PinkNectar[]; extern const u16 gItemIconPalette_PinkNectar[]; -extern const u32 gItemIcon_PurpleNectar[]; extern const u16 gItemIconPalette_PurpleNectar[]; // Plates -extern const u32 gItemIcon_FlamePlate[]; +extern const u32 gItemIcon_Plate[]; extern const u16 gItemIconPalette_FlamePlate[]; -extern const u32 gItemIcon_SplashPlate[]; extern const u16 gItemIconPalette_SplashPlate[]; -extern const u32 gItemIcon_ZapPlate[]; extern const u16 gItemIconPalette_ZapPlate[]; -extern const u32 gItemIcon_MeadowPlate[]; extern const u16 gItemIconPalette_MeadowPlate[]; -extern const u32 gItemIcon_IciclePlate[]; extern const u16 gItemIconPalette_IciclePlate[]; -extern const u32 gItemIcon_FistPlate[]; extern const u16 gItemIconPalette_FistPlate[]; -extern const u32 gItemIcon_ToxicPlate[]; extern const u16 gItemIconPalette_ToxicPlate[]; -extern const u32 gItemIcon_EarthPlate[]; extern const u16 gItemIconPalette_EarthPlate[]; -extern const u32 gItemIcon_SkyPlate[]; extern const u16 gItemIconPalette_SkyPlate[]; -extern const u32 gItemIcon_MindPlate[]; extern const u16 gItemIconPalette_MindPlate[]; -extern const u32 gItemIcon_InsectPlate[]; extern const u16 gItemIconPalette_InsectPlate[]; -extern const u32 gItemIcon_StonePlate[]; extern const u16 gItemIconPalette_StonePlate[]; -extern const u32 gItemIcon_SpookyPlate[]; extern const u16 gItemIconPalette_SpookyPlate[]; -extern const u32 gItemIcon_DracoPlate[]; extern const u16 gItemIconPalette_DracoPlate[]; -extern const u32 gItemIcon_DreadPlate[]; extern const u16 gItemIconPalette_DreadPlate[]; -extern const u32 gItemIcon_IronPlate[]; extern const u16 gItemIconPalette_IronPlate[]; -extern const u32 gItemIcon_PixiePlate[]; extern const u16 gItemIconPalette_PixiePlate[]; // Drives -extern const u32 gItemIcon_DouseDrive[]; +extern const u32 gItemIcon_Drive[]; extern const u16 gItemIconPalette_DouseDrive[]; -extern const u32 gItemIcon_ShockDrive[]; extern const u16 gItemIconPalette_ShockDrive[]; -extern const u32 gItemIcon_BurnDrive[]; extern const u16 gItemIconPalette_BurnDrive[]; -extern const u32 gItemIcon_ChillDrive[]; extern const u16 gItemIconPalette_ChillDrive[]; // Memories extern const u32 gItemIcon_FireMemory[]; @@ -3485,41 +3453,24 @@ extern const u16 gItemIconPalette_Audinite[]; extern const u32 gItemIcon_Diancite[]; extern const u16 gItemIconPalette_Diancite[]; // Gems -extern const u32 gItemIcon_NormalGem[]; +extern const u32 gItemIcon_TypeGem[]; extern const u16 gItemIconPalette_NormalGem[]; -extern const u32 gItemIcon_FireGem[]; extern const u16 gItemIconPalette_FireGem[]; -extern const u32 gItemIcon_WaterGem[]; extern const u16 gItemIconPalette_WaterGem[]; -extern const u32 gItemIcon_ElectricGem[]; extern const u16 gItemIconPalette_ElectricGem[]; -extern const u32 gItemIcon_GrassGem[]; extern const u16 gItemIconPalette_GrassGem[]; -extern const u32 gItemIcon_IceGem[]; extern const u16 gItemIconPalette_IceGem[]; -extern const u32 gItemIcon_FightingGem[]; extern const u16 gItemIconPalette_FightingGem[]; -extern const u32 gItemIcon_PoisonGem[]; extern const u16 gItemIconPalette_PoisonGem[]; -extern const u32 gItemIcon_GroundGem[]; extern const u16 gItemIconPalette_GroundGem[]; -extern const u32 gItemIcon_FlyingGem[]; extern const u16 gItemIconPalette_FlyingGem[]; -extern const u32 gItemIcon_PsychicGem[]; extern const u16 gItemIconPalette_PsychicGem[]; -extern const u32 gItemIcon_BugGem[]; extern const u16 gItemIconPalette_BugGem[]; -extern const u32 gItemIcon_RockGem[]; extern const u16 gItemIconPalette_RockGem[]; -extern const u32 gItemIcon_GhostGem[]; extern const u16 gItemIconPalette_GhostGem[]; -extern const u32 gItemIcon_DragonGem[]; extern const u16 gItemIconPalette_DragonGem[]; -extern const u32 gItemIcon_DarkGem[]; extern const u16 gItemIconPalette_DarkGem[]; -extern const u32 gItemIcon_SteelGem[]; extern const u16 gItemIconPalette_SteelGem[]; -extern const u32 gItemIcon_FairyGem[]; extern const u16 gItemIconPalette_FairyGem[]; // Z-Crystals extern const u32 gItemIcon_NormaliumZ[]; @@ -3597,13 +3548,12 @@ extern const u32 gItemIcon_LightBall[]; extern const u16 gItemIconPalette_LightBall[]; extern const u32 gItemIcon_Leek[]; extern const u16 gItemIconPalette_Leek[]; -extern const u32 gItemIcon_ThickClub[]; -extern const u16 gItemIconPalette_ThickClub[]; +extern const u32 gItemIcon_Bone[]; +extern const u16 gItemIconPalette_Bone[]; extern const u32 gItemIcon_LuckyPunch[]; extern const u16 gItemIconPalette_LuckyPunch[]; -extern const u32 gItemIcon_MetalPowder[]; +extern const u32 gItemIcon_DittoPowder[]; extern const u16 gItemIconPalette_MetalPowder[]; -extern const u32 gItemIcon_QuickPowder[]; extern const u16 gItemIconPalette_QuickPowder[]; extern const u32 gItemIcon_DeepSeaScale[]; extern const u16 gItemIconPalette_DeepSeaScale[]; @@ -3675,7 +3625,7 @@ extern const u32 gItemIcon_BlackBelt[]; extern const u16 gItemIconPalette_BlackTypeEnhancingItem[]; extern const u32 gItemIcon_PoisonBarb[]; extern const u16 gItemIconPalette_PoisonBarb[]; -extern const u32 gItemIcon_SoftSand[]; +extern const u32 gItemIcon_Sand[]; extern const u16 gItemIconPalette_SoftSand[]; extern const u32 gItemIcon_SharpBeak[]; extern const u16 gItemIconPalette_SharpBeak[]; @@ -3714,13 +3664,10 @@ extern const u16 gItemIconPalette_SmoothRock[]; extern const u32 gItemIcon_IcyRock[]; extern const u16 gItemIconPalette_IcyRock[]; // Terrain Seeds -extern const u32 gItemIcon_ElectricSeed[]; +extern const u32 gItemIcon_TerrainSeed[]; extern const u16 gItemIconPalette_ElectricSeed[]; -extern const u32 gItemIcon_PsychicSeed[]; extern const u16 gItemIconPalette_PsychicSeed[]; -extern const u32 gItemIcon_MistySeed[]; extern const u16 gItemIconPalette_MistySeed[]; -extern const u32 gItemIcon_GrassySeed[]; extern const u16 gItemIconPalette_GrassySeed[]; // Type-activated Stat Modifiers extern const u32 gItemIcon_AbsorbBulb[]; diff --git a/include/item.h b/include/item.h index d7687a173..c43995324 100644 --- a/include/item.h +++ b/include/item.h @@ -9,27 +9,6 @@ #include "constants/item_effects.h" #include "constants/hold_effects.h" -/* Expands to: - * enum - * { - * ITEM_TM_FOCUS_PUNCH = ITEM_TM01, - * ... - * ITEM_HM_CUT = ITM_HM01, - * ... - * }; */ -#define ENUM_TM(n, id) CAT(ITEM_TM_, id) = CAT(ITEM_TM, n), -#define ENUM_HM(n, id) CAT(ITEM_HM_, id) = CAT(ITEM_HM, n), -#define TO_TMHM_NUMS(a, ...) (__VA_ARGS__) -enum TMHMItemId -{ - RECURSIVELY(R_ZIP(ENUM_TM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_TM(APPEND_COMMA)))) - RECURSIVELY(R_ZIP(ENUM_HM, TO_TMHM_NUMS NUMBERS_256, (FOREACH_HM(APPEND_COMMA)))) -}; - -#undef ENUM_TM -#undef ENUM_HM -#undef TO_TMHM_NUMS - /* Each of these TM_HM enums corresponds an index in the list of TMs + HMs item ids in * gTMHMItemMoveIds. The index for an item can be retrieved with GetItemTMHMIndex below. */ @@ -41,7 +20,6 @@ enum TMHMIndex NUM_TECHNICAL_MACHINES = (0 FOREACH_TM(PLUS_ONE)), NUM_HIDDEN_MACHINES = (0 FOREACH_HM(PLUS_ONE)), }; - #undef UNPACK_TM_HM_ENUM enum PACKED ItemSortType @@ -86,7 +64,7 @@ enum PACKED ItemSortType typedef void (*ItemUseFunc)(u8); -struct Item +struct ItemInfo { u32 price; u16 secondaryId; @@ -117,11 +95,11 @@ struct __attribute__((aligned(2))) BagPocket struct TmHmIndexKey { - enum TMHMItemId itemId:16; - u16 moveId; + enum Item itemId; + enum Move moveId; }; -extern const struct Item gItemsInfo[]; +extern const struct ItemInfo gItemsInfo[]; extern struct BagPocket gBagPockets[]; extern const struct TmHmIndexKey gTMHMItemMoveIds[]; @@ -169,7 +147,7 @@ static inline u16 GetItemTMHMMoveId(u16 item) #undef UNPACK_ITEM_TO_TM_MOVE_ID #undef UNPACK_ITEM_TO_HM_MOVE_ID -static inline enum TMHMItemId GetTMHMItemId(enum TMHMIndex index) +static inline enum Item GetTMHMItemId(enum TMHMIndex index) { return gTMHMItemMoveIds[index].itemId; } diff --git a/include/move.h b/include/move.h index fe2587a22..85e0b0dd9 100644 --- a/include/move.h +++ b/include/move.h @@ -3,20 +3,34 @@ #include "contest_effect.h" #include "constants/battle.h" +// #include "constants/battle_factory.h" #include "constants/battle_move_effects.h" #include "constants/battle_string_ids.h" #include "constants/moves.h" +enum FactoryStyle { + FACTORY_STYLE_NONE, + FACTORY_STYLE_PREPARATION, + FACTORY_STYLE_SLOW_STEADY, + FACTORY_STYLE_ENDURANCE, + FACTORY_STYLE_HIGH_RISK, + FACTORY_STYLE_WEAKENING, + FACTORY_STYLE_UNPREDICTABLE, + FACTORY_STYLE_WEATHER, + FACTORY_NUM_STYLES +}; + // For defining EFFECT_HIT etc. with battle TV scores and flags etc. struct __attribute__((packed, aligned(2))) BattleMoveEffect { const u8 *battleScript; u16 battleTvScore:3; + enum FactoryStyle battleFactoryStyle:4; u16 encourageEncore:1; u16 twoTurnEffect:1; u16 semiInvulnerableEffect:1; u16 usesProtectCounter:1; - u16 padding:9; + u16 padding:5; }; #define EFFECTS_ARR(...) (const struct AdditionalEffect[]) {__VA_ARGS__} @@ -29,7 +43,8 @@ struct AdditionalEffect u8 onlyIfTargetRaisedStats:1; u8 onChargeTurnOnly:1; u8 sheerForceOverride:1; // Handles edge cases for Sheer Force - if TRUE, boosts when it shouldn't, or doesn't boost when it should - u8 padding:4; + u8 preAttackEffect:1; + u8 padding:3; union PACKED { enum WrappedStringID wrapped; } multistring; @@ -60,6 +75,13 @@ enum ProtectMethod PROTECT_MAT_BLOCK, }; +enum TerrainGroundCheck +{ + GROUND_CHECK_NONE, + GROUND_CHECK_USER, + GROUND_CHECK_TARGET, +}; + struct MoveInfo { const u8 *name; @@ -79,6 +101,8 @@ struct MoveInfo // end of word s32 priority:4; u32 strikeCount:4; // Max 15 hits. Defaults to 1 if not set. May apply its effect on each hit. + u32 multiHit:1; // Takes precedence over strikeCount + u32 explosion:1; u32 criticalHitStage:2; bool32 alwaysCriticalHit:1; u32 numAdditionalEffects:3; // limited to 7 @@ -99,9 +123,9 @@ struct MoveInfo bool32 slicingMove:1; bool32 healingMove:1; bool32 minimizeDoubleDamage:1; + // end of word bool32 ignoresTargetAbility:1; bool32 ignoresTargetDefenseEvasionStages:1; - // end of word bool32 damagesUnderground:1; bool32 damagesUnderwater:1; bool32 damagesAirborne:1; @@ -131,14 +155,32 @@ struct MoveInfo bool32 dampBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:5; + u32 padding:3; // end of word union { struct { u16 stringId; - u16 status; + union { + u16 status; + u16 weather; + }; } twoTurnAttack; + struct { + u16 species; + u16 power:9; + u16 numOfHits:7; + } speciesPowerOverride; + struct { + u16 damagePercent:12; + u16 damageCategories:4; // bit field + } reflectDamage; + struct { + u16 terrain; + u16 percent:14; + enum TerrainGroundCheck groundCheck:2; + u16 hitsBothFoes:1; + } terrainBoost; u32 protectMethod; u32 status; u32 moveProperty; @@ -150,6 +192,7 @@ struct MoveInfo u32 recoilPercentage; u32 nonVolatileStatus; u32 overwriteAbility; + u32 weatherType; } argument; // primary/secondary effects @@ -167,25 +210,27 @@ extern const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL]; extern const u8 gNotDoneYetDescription[]; extern const struct BattleMoveEffect gBattleMoveEffects[]; -static inline u32 SanitizeMoveId(u32 moveId) +static inline enum Move SanitizeMoveId(enum Move moveId) { - if (moveId >= MOVES_COUNT_ALL) + assertf(moveId < MOVES_COUNT_ALL, "invalid move: %d", moveId) + { return MOVE_NONE; - else - return moveId; + } + + return moveId; } -static inline const u8 *GetMoveName(u32 moveId) +static inline const u8 *GetMoveName(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].name; } -static inline enum BattleMoveEffects GetMoveEffect(u32 moveId) +static inline enum BattleMoveEffects GetMoveEffect(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].effect; } -static inline const u8 *GetMoveDescription(u32 moveId) +static inline const u8 *GetMoveDescription(enum Move moveId) { moveId = SanitizeMoveId(moveId); if (GetMoveEffect(moveId) == EFFECT_PLACEHOLDER) @@ -193,363 +238,472 @@ static inline const u8 *GetMoveDescription(u32 moveId) return gMovesInfo[moveId].description; } -static inline enum Type GetMoveType(u32 moveId) +static inline enum Type GetMoveType(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].type; } -static inline enum DamageCategory GetMoveCategory(u32 moveId) +static inline enum DamageCategory GetMoveCategory(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].category; } -static inline u32 GetMovePower(u32 moveId) +static inline u32 GetMovePower(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].power; } -static inline u32 GetMoveAccuracy(u32 moveId) +static inline u32 GetMoveAccuracy(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].accuracy; } -static inline u32 GetMoveTarget(u32 moveId) +static inline enum MoveTarget GetMoveTarget(enum Move moveId) { - return gMovesInfo[SanitizeMoveId(moveId)].target; + moveId = SanitizeMoveId(moveId); + enum MoveTarget target = gMovesInfo[moveId].target; + assertf(target != TARGET_SMART || gMovesInfo[moveId].strikeCount > 1, "Smart target requires strikeCount > 1: %S", gMovesInfo[moveId].name); + return target; } -static inline u32 GetMovePP(u32 moveId) +static inline u32 GetMovePP(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].pp; } -static inline u32 GetMoveZEffect(u32 moveId) +static inline u32 GetMoveZEffect(enum Move moveId) { - return gMovesInfo[SanitizeMoveId(moveId)].zMove.effect; + moveId = SanitizeMoveId(moveId); + assertf(GetMoveCategory(moveId) == DAMAGE_CATEGORY_STATUS, "not a status move: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].zMove.effect; } -static inline u32 GetMoveZPowerOverride(u32 moveId) +static inline u32 GetMoveZPowerOverride(enum Move moveId) { - return gMovesInfo[SanitizeMoveId(moveId)].zMove.powerOverride; + moveId = SanitizeMoveId(moveId); + assertf(GetMoveCategory(moveId) != DAMAGE_CATEGORY_STATUS, "not a damaging move: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].zMove.powerOverride; } -static inline s32 GetMovePriority(u32 moveId) +static inline s32 GetMovePriority(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].priority; } -static inline u32 GetMoveStrikeCount(u32 moveId) +static inline u32 GetMoveStrikeCount(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].strikeCount; } -static inline u32 GetMoveCriticalHitStage(u32 moveId) +static inline u32 IsMultiHitMove(enum Move moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].multiHit; +} + +static inline u32 IsExplosionMove(enum Move move) +{ + return gMovesInfo[SanitizeMoveId(move)].explosion; +} + +static inline u32 GetMoveCriticalHitStage(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].criticalHitStage; } -static inline bool32 MoveAlwaysCrits(u32 moveId) +static inline bool32 MoveAlwaysCrits(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].alwaysCriticalHit; } -static inline u32 GetMoveAdditionalEffectCount(u32 moveId) +static inline u32 GetMoveAdditionalEffectCount(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].numAdditionalEffects; } -static inline bool32 MoveMakesContact(u32 moveId) +static inline bool32 MoveMakesContact(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].makesContact; } -static inline bool32 MoveIgnoresProtect(u32 moveId) +static inline bool32 MoveIgnoresProtect(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoresProtect; } -static inline bool32 MoveCanBeBouncedBack(u32 moveId) +static inline bool32 MoveCanBeBouncedBack(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].magicCoatAffected; } -static inline bool32 MoveCanBeSnatched(u32 moveId) +static inline bool32 MoveCanBeSnatched(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].snatchAffected; } -static inline bool32 MoveIgnoresKingsRock(u32 moveId) +static inline bool32 MoveIgnoresKingsRock(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoresKingsRock; } -static inline bool32 IsPunchingMove(u32 moveId) +static inline bool32 IsPunchingMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].punchingMove; } -static inline bool32 IsBitingMove(u32 moveId) +static inline bool32 IsBitingMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].bitingMove; } -static inline bool32 IsPulseMove(u32 moveId) +static inline bool32 IsPulseMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].pulseMove; } -static inline bool32 IsSoundMove(u32 moveId) +static inline bool32 IsSoundMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].soundMove; } -static inline bool32 IsBallisticMove(u32 moveId) +static inline bool32 IsBallisticMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ballisticMove; } -static inline bool32 IsPowderMove(u32 moveId) +static inline bool32 IsPowderMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].powderMove; } -static inline bool32 IsDanceMove(u32 moveId) +static inline bool32 IsDanceMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].danceMove; } -static inline bool32 IsWindMove(u32 moveId) +static inline bool32 IsWindMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].windMove; } -static inline bool32 IsSlicingMove(u32 moveId) +static inline bool32 IsSlicingMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].slicingMove; } -static inline bool32 IsHealingMove(u32 moveId) +static inline bool32 IsHealingMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].healingMove; } -static inline bool32 MoveIncreasesPowerToMinimizedTargets(u32 moveId) +static inline bool32 MoveIncreasesPowerToMinimizedTargets(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].minimizeDoubleDamage; } -static inline bool32 MoveIgnoresTargetAbility(u32 moveId) +static inline bool32 MoveIgnoresTargetAbility(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoresTargetAbility; } -static inline bool32 MoveIgnoresDefenseEvasionStages(u32 moveId) +static inline bool32 MoveIgnoresDefenseEvasionStages(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoresTargetDefenseEvasionStages; } -static inline bool32 MoveDamagesUnderground(u32 moveId) +static inline bool32 MoveDamagesUnderground(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].damagesUnderground; } -static inline bool32 MoveDamagesUnderWater(u32 moveId) +static inline bool32 MoveDamagesUnderWater(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].damagesUnderwater; } -static inline bool32 MoveDamagesAirborne(u32 moveId) +static inline bool32 MoveDamagesAirborne(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].damagesAirborne; } -static inline bool32 MoveDamagesAirborneDoubleDamage(u32 moveId) +static inline bool32 MoveDamagesAirborneDoubleDamage(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].damagesAirborneDoubleDamage; } -static inline bool32 MoveIgnoresTypeIfFlyingAndUngrounded(u32 moveId) +static inline bool32 MoveIgnoresTypeIfFlyingAndUngrounded(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoreTypeIfFlyingAndUngrounded; } -static inline bool32 MoveThawsUser(u32 moveId) +static inline bool32 MoveThawsUser(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].thawsUser; } -static inline bool32 MoveIgnoresSubstitute(u32 moveId) +static inline bool32 MoveIgnoresSubstitute(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].ignoresSubstitute; } -static inline bool32 MoveForcesPressure(u32 moveId) +static inline bool32 MoveForcesPressure(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].forcePressure; } -static inline bool32 MoveCantBeUsedTwice(u32 moveId) +static inline bool32 MoveCantBeUsedTwice(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].cantUseTwice; } -static inline bool32 MoveAlwaysHitsInRain(u32 moveId) +static inline bool32 MoveAlwaysHitsInRain(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].alwaysHitsInRain; } -static inline bool32 MoveHas50AccuracyInSun(u32 moveId) +static inline bool32 MoveHas50AccuracyInSun(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].accuracy50InSun; } -static inline bool32 MoveAlwaysHitsInHailSnow(u32 moveId) +static inline bool32 MoveAlwaysHitsInHailSnow(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].alwaysHitsInHailSnow; } -static inline bool32 IsMoveGravityBanned(u32 moveId) +static inline bool32 IsMoveGravityBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].gravityBanned; } -static inline bool32 IsMoveMirrorMoveBanned(u32 moveId) +static inline bool32 IsMoveMirrorMoveBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].mirrorMoveBanned; } -static inline bool32 IsMoveMeFirstBanned(u32 moveId) +static inline bool32 IsMoveMeFirstBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].meFirstBanned; } -static inline bool32 IsMoveMimicBanned(u32 moveId) +static inline bool32 IsMoveMimicBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].mimicBanned; } -static inline bool32 IsMoveMetronomeBanned(u32 moveId) +static inline bool32 IsMoveMetronomeBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].metronomeBanned; } -static inline bool32 IsMoveCopycatBanned(u32 moveId) +static inline bool32 IsMoveCopycatBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].copycatBanned; } -static inline bool32 IsMoveAssistBanned(u32 moveId) +static inline bool32 IsMoveAssistBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].assistBanned; } -static inline bool32 IsMoveSleepTalkBanned(u32 moveId) +static inline bool32 IsMoveSleepTalkBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].sleepTalkBanned; } -static inline bool32 IsMoveInstructBanned(u32 moveId) +static inline bool32 IsMoveInstructBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].instructBanned; } -static inline bool32 IsMoveEncoreBanned(u32 moveId) +static inline bool32 IsMoveEncoreBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].encoreBanned; } -static inline bool32 IsMoveParentalBondBanned(u32 moveId) +static inline bool32 IsMoveParentalBondBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].parentalBondBanned; } -static inline bool32 IsMoveSkyBattleBanned(u32 moveId) +static inline bool32 IsMoveSkyBattleBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].skyBattleBanned; } -static inline bool32 IsMoveSketchBanned(u32 moveId) +static inline bool32 IsMoveSketchBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].sketchBanned; } -static inline bool32 IsMoveDampBanned(u32 moveId) +static inline bool32 IsMoveDampBanned(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].dampBanned; } -static inline bool32 IsValidApprenticeMove(u32 moveId) +static inline bool32 IsValidApprenticeMove(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].validApprenticeMove; } -static inline u32 GetMoveTwoTurnAttackStringId(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.stringId; -} - -static inline u32 GetMoveTwoTurnAttackStatus(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; -} - -static inline u32 GetMoveTwoTurnAttackWeather(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.twoTurnAttack.status; -} - -static inline enum ProtectMethod GetMoveProtectMethod(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.protectMethod; -} - -static inline u32 GetMoveTerrainFlag(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.moveProperty; -} - -static inline u32 GetMoveEffectArg_Status(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.status; -} - -static inline u32 GetMoveEffectArg_MoveProperty(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.moveProperty; -} - -static inline u32 GetMoveEffectArg_HoldEffect(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.holdEffect; -} - -static inline u32 GetMoveArgType(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.type; -} - -static inline u32 GetMoveFixedHPDamage(u32 moveId) -{ - return gMovesInfo[SanitizeMoveId(moveId)].argument.fixedDamage; -} - -static inline u32 GetMoveAbsorbPercentage(u32 moveId) +static inline u32 GetMoveTwoTurnAttackStringId(enum Move moveId) { moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(gBattleMoveEffects[effect].twoTurnEffect, "not a two-turn move: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.twoTurnAttack.stringId; +} + +static inline u32 GetMoveTwoTurnAttackStatus(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_SEMI_INVULNERABLE || effect == EFFECT_SKY_DROP, "not a two-turn move with status: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.twoTurnAttack.status; +} + +static inline u32 GetMoveTwoTurnAttackWeather(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_TWO_TURNS_ATTACK || effect == EFFECT_SOLAR_BEAM, "not a two-turn move with weather: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.twoTurnAttack.weather; +} + +static inline u32 GetMoveSpeciesPowerOverride_Species(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_SPECIES_POWER_OVERRIDE, "not a species power override move: %S", GetMoveName(moveId)); + return gMovesInfo[SanitizeMoveId(moveId)].argument.speciesPowerOverride.species; +} + +static inline u32 GetMoveSpeciesPowerOverride_Power(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_SPECIES_POWER_OVERRIDE, "not a species power override move: %S", GetMoveName(moveId)); + return gMovesInfo[SanitizeMoveId(moveId)].argument.speciesPowerOverride.power; +} + +static inline u32 GetMoveSpeciesPowerOverride_NumOfHits(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_SPECIES_POWER_OVERRIDE, "not a species power override move: %S", GetMoveName(moveId)); + return gMovesInfo[SanitizeMoveId(moveId)].argument.speciesPowerOverride.numOfHits; +} + +static inline u32 GetMoveReflectDamage_DamagePercent(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_REFLECT_DAMAGE, "not a damage reflection move: %S", GetMoveName(moveId)); + return gMovesInfo[SanitizeMoveId(moveId)].argument.reflectDamage.damagePercent; +} + +static inline u32 GetMoveReflectDamage_DamageCategories(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_REFLECT_DAMAGE, "not a damage reflection move: %S", GetMoveName(moveId)); + return gMovesInfo[SanitizeMoveId(moveId)].argument.reflectDamage.damageCategories; +} + +static inline u32 GetMoveTerrainBoost_Terrain(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_TERRAIN_BOOST, "not a terrain boosted move: %S", GetMoveName(moveId)); + return gMovesInfo[moveId].argument.terrainBoost.terrain; +} + +static inline u32 GetMoveTerrainBoost_Percent(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_TERRAIN_BOOST, "not a terrain boosted move: %S", GetMoveName(moveId)); + return gMovesInfo[moveId].argument.terrainBoost.percent; +} + +static inline u32 GetMoveTerrainBoost_GroundCheck(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_TERRAIN_BOOST, "not a terrain boosted move: %S", GetMoveName(moveId)); + return gMovesInfo[moveId].argument.terrainBoost.groundCheck; +} + +static inline u32 GetMoveTerrainBoost_HitsBothFoes(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_TERRAIN_BOOST, "not a terrain boosted move: %S", GetMoveName(moveId)); + return gMovesInfo[moveId].argument.terrainBoost.hitsBothFoes; +} + +static inline enum ProtectMethod GetMoveProtectMethod(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_PROTECT || effect == EFFECT_ENDURE || effect == EFFECT_MAT_BLOCK, "not a protect move: %S", GetMoveName(moveId)); + return gMovesInfo[moveId].argument.protectMethod; +} + +static inline u32 GetMoveEffectArg_Status(enum Move moveId) +{ + // Forward-declared here because 'include/battle_util.h' includes + // this file. + extern bool32 MoveHasAdditionalEffect(enum Move move, enum MoveEffect moveEffect); + + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_FOCUS_ENERGY || effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS || MoveHasAdditionalEffect(moveId, MOVE_EFFECT_REMOVE_STATUS), "not a move with status: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.status; +} + +static inline u32 GetMoveEffectArg_MoveProperty(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_FIRST_TURN_ONLY || effect == EFFECT_HEAL_PULSE, "not a move with moveProperty: %S", gMovesInfo[moveId].name); + return gMovesInfo[SanitizeMoveId(moveId)].argument.moveProperty; +} + +static inline u32 GetMoveEffectArg_HoldEffect(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_CHANGE_TYPE_ON_ITEM, "not a move with a hold effect: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.holdEffect; +} + +static inline u32 GetMoveArgType(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_SOAK || effect == EFFECT_TWO_TYPED_MOVE || effect == EFFECT_THIRD_TYPE || effect == EFFECT_SUPER_EFFECTIVE_ON_ARG || effect == EFFECT_FAIL_IF_NOT_ARG_TYPE, "not a move with a type: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.type; +} + +static inline u32 GetMoveFixedHPDamage(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_FIXED_HP_DAMAGE, "not a fixed-damage move: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.fixedDamage; +} + +static inline u32 GetMoveAbsorbPercentage(enum Move moveId) +{ + moveId = SanitizeMoveId(moveId); + enum BattleMoveEffects effect = gMovesInfo[moveId].effect; + assertf(effect == EFFECT_ABSORB || effect == EFFECT_DREAM_EATER, "not an absorbing move: %S", gMovesInfo[moveId].name); if (gMovesInfo[moveId].argument.absorbPercentage == 0) return 50; return gMovesInfo[moveId].argument.absorbPercentage; } -static inline u32 GetMoveRecoil(u32 moveId) +static inline u32 GetMoveRecoil(enum Move moveId) { - return gMovesInfo[SanitizeMoveId(moveId)].argument.recoilPercentage; + moveId = SanitizeMoveId(moveId); + assertf(gMovesInfo[moveId].effect == EFFECT_RECOIL, "not a recoil move: %S", gMovesInfo[moveId].name); + return gMovesInfo[moveId].argument.recoilPercentage; } -static inline u32 GetMoveNonVolatileStatus(u32 move) +static inline u32 GetMoveNonVolatileStatus(enum Move move) { move = SanitizeMoveId(move); - switch(GetMoveEffect(move)) + switch (GetMoveEffect(move)) { case EFFECT_NON_VOLATILE_STATUS: case EFFECT_YAWN: @@ -560,58 +714,66 @@ static inline u32 GetMoveNonVolatileStatus(u32 move) } } -static inline u32 GetMoveDamagePercentage(u32 move) +static inline u32 GetMoveDamagePercentage(enum Move move) { - return gMovesInfo[SanitizeMoveId(move)].argument.damagePercentage; + move = SanitizeMoveId(move); + assertf(gMovesInfo[move].effect == EFFECT_FIXED_PERCENT_DAMAGE, "not a percentage-damage move: %S", gMovesInfo[move].name); + return gMovesInfo[move].argument.damagePercentage; } -static inline u32 GetMoveOverwriteAbility(u32 move) +static inline u32 GetMoveOverwriteAbility(enum Move move) { - return gMovesInfo[SanitizeMoveId(move)].argument.overwriteAbility; + move = SanitizeMoveId(move); + assertf(gMovesInfo[move].effect == EFFECT_OVERWRITE_ABILITY, "not a move that overwrites abilities: %S", gMovesInfo[move].name); + return gMovesInfo[move].argument.overwriteAbility; } -static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) +static inline u32 GetMoveWeatherType(enum Move move) +{ + assertf(gMovesInfo[move].effect == EFFECT_WEATHER || gMovesInfo[move].effect == EFFECT_WEATHER_AND_SWITCH, "not a move that sets weather: %S", gMovesInfo[move].name); + return gMovesInfo[SanitizeMoveId(move)].argument.weatherType; +} + +static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(enum Move moveId, u32 effect) { return &gMovesInfo[SanitizeMoveId(moveId)].additionalEffects[effect]; } -static inline u32 GetMoveContestEffect(u32 moveId) +static inline u32 GetMoveContestEffect(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].contestEffect; } -static inline u32 GetMoveContestCategory(u32 moveId) +static inline u32 GetMoveContestCategory(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].contestCategory; } -static inline u32 GetMoveContestComboStarter(u32 moveId) +static inline u32 GetMoveContestComboStarter(enum Move moveId) { return gMovesInfo[SanitizeMoveId(moveId)].contestComboStarterId; } -static inline u32 GetMoveContestComboMoves(u32 moveId, u32 comboMove) +static inline u32 GetMoveContestComboMoves(enum Move moveId, u32 comboMove) { return gMovesInfo[SanitizeMoveId(moveId)].contestComboMoves[comboMove]; } -static inline const u8 *GetMoveAnimationScript(u32 moveId) +static inline const u8 *GetMoveAnimationScript(enum Move moveId) { moveId = SanitizeMoveId(moveId); - if (gMovesInfo[moveId].battleAnimScript == NULL) + assertf(gMovesInfo[moveId].battleAnimScript, "No animation for %S", gMovesInfo[moveId].name) { - DebugPrintfLevel(MGBA_LOG_WARN, "No animation for moveId=%u", moveId); return gMovesInfo[MOVE_NONE].battleAnimScript; } return gMovesInfo[moveId].battleAnimScript; } -static inline const u8 *GetMoveBattleScript(u32 moveId) +static inline const u8 *GetMoveBattleScript(enum Move moveId) { moveId = SanitizeMoveId(moveId); - if (gBattleMoveEffects[GetMoveEffect(moveId)].battleScript == NULL) + assertf(gBattleMoveEffects[GetMoveEffect(moveId)].battleScript, "No battle script for %S", gMovesInfo[moveId].name) { - DebugPrintfLevel(MGBA_LOG_WARN, "No effect for moveId=%u", moveId); return gBattleMoveEffects[EFFECT_PLACEHOLDER].battleScript; } return gBattleMoveEffects[GetMoveEffect(moveId)].battleScript; diff --git a/include/ow_synchronize.h b/include/ow_synchronize.h new file mode 100644 index 000000000..83a7ed9c3 --- /dev/null +++ b/include/ow_synchronize.h @@ -0,0 +1,15 @@ +#ifndef GUARD_OW_SYNCHRONIZE_H +#define GUARD_OW_SYNCHRONIZE_H + +enum GeneratedMonOrigin +{ + WILDMON_ORIGIN, + STATIC_WILDMON_ORIGIN, + ROAMER_ORIGIN, + GIFTMON_ORIGIN +}; + +u32 GetSynchronizedNature(enum GeneratedMonOrigin origin, u32 species); +u32 GetSynchronizedGender(enum GeneratedMonOrigin origin, u32 species); + +#endif // GUARD_OW_SYNCHRONIZE_H diff --git a/include/pokeball.h b/include/pokeball.h index ff56a622e..6ec8c31fe 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -58,7 +58,6 @@ void DoHitAnimHealthboxEffect(u8 bank); void LoadBallGfx(u8 ballId); void FreeBallGfx(u8 ballId); void StartHealthboxSlideIn(u8 battler); -void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite); enum PokeBall ItemIdToBallId(u32 ballItem); #endif // GUARD_POKEBALL_H diff --git a/include/pokemon.h b/include/pokemon.h index f40e444fc..f10de6f0a 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -5,7 +5,9 @@ #include "sprite.h" #include "constants/battle.h" #include "constants/cries.h" +#include "constants/egg_ids.h" #include "constants/form_change_types.h" +#include "constants/hold_effects.h" #include "constants/items.h" #include "constants/map_groups.h" #include "constants/regions.h" @@ -63,6 +65,8 @@ enum MonData { MON_DATA_FRIENDSHIP, MON_DATA_SMART, MON_DATA_POKERUS, + MON_DATA_POKERUS_STRAIN, + MON_DATA_POKERUS_DAYS_LEFT, MON_DATA_MET_LOCATION, MON_DATA_MET_LEVEL, MON_DATA_MET_GAME, @@ -109,11 +113,6 @@ enum MonData { MON_DATA_KNOWN_MOVES, MON_DATA_RIBBON_COUNT, MON_DATA_RIBBONS, - MON_DATA_ATK2, - MON_DATA_DEF2, - MON_DATA_SPEED2, - MON_DATA_SPATK2, - MON_DATA_SPDEF2, MON_DATA_HYPER_TRAINED_HP, MON_DATA_HYPER_TRAINED_ATK, MON_DATA_HYPER_TRAINED_DEF, @@ -145,13 +144,13 @@ struct PokemonSubstruct0 struct PokemonSubstruct1 { - u16 move1:11; // 2047 moves. + enum Move move1:11; // 2047 moves. u16 evolutionTracker1:5; - u16 move2:11; // 2047 moves. + enum Move move2:11; // 2047 moves. u16 evolutionTracker2:5; - u16 move3:11; // 2047 moves. + enum Move move3:11; // 2047 moves. u16 unused_04:5; - u16 move4:11; // 2047 moves. + enum Move move4:11; // 2047 moves. u16 unused_06:3; u16 hyperTrainedHP:1; u16 hyperTrainedAttack:1; @@ -359,26 +358,7 @@ struct Volatiles // u32 confusionTurns:3; // u32 flinched:1; // u32 uproarTurns:3; - // u32 torment:1; - // u32 bideTurns:2; - // u32 lockConfusionTurns:2; - // u32 multipleTurns:1; - // u32 wrapped:1; - // u32 powder:1; - // u32 padding:1; - // u32 infatuation:4; // one bit for each battler - // u32 defenseCurl:1; - // u32 transformed:1; - // u32 recharge:1; - // u32 rage:1; - // u32 substitute:1; - // u32 destinyBond:1; - // u32 escapePrevention:1; - // u32 nightmare:1; - // u32 cursed:1; - // u32 foresight:1; - // u32 dragonCheer:1; - // u32 focusEnergy:1; + // etc. }; struct BattlePokemon @@ -389,7 +369,7 @@ struct BattlePokemon /*0x06*/ u16 speed; /*0x08*/ u16 spAttack; /*0x0A*/ u16 spDefense; - /*0x0C*/ u16 moves[MAX_MON_MOVES]; + /*0x0C*/ enum Move moves[MAX_MON_MOVES]; /*0x14*/ u32 hpIV:5; /*0x14*/ u32 attackIV:5; /*0x15*/ u32 defenseIV:5; @@ -405,7 +385,7 @@ struct BattlePokemon /*0x2B*/ u8 level; /*0x2C*/ u8 friendship; /*0x2D*/ u16 maxHP; - /*0x2F*/ u16 item; + /*0x2F*/ enum Item item; /*0x31*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; /*0x3C*/ u8 ppBonuses; /*0x3D*/ u8 otName[PLAYER_NAME_LENGTH + 1]; @@ -453,8 +433,8 @@ struct SpeciesInfo /*0xC4*/ u16 evYield_SpAttack:2; u16 evYield_SpDefense:2; u16 padding2:4; - u16 itemCommon; - u16 itemRare; + enum Item itemCommon; + enum Item itemRare; u8 genderRatio; u8 eggCycles; u8 friendship; @@ -515,7 +495,8 @@ struct SpeciesInfo /*0xC4*/ u8 pokemonJumpType:2; // According to the clerk, the Pokémon allowed in Pokémon Jump are all <= 28 inches/71 cm, and do not only swim, burrow, or fly. u8 enemyMonElevation; // This determines how much higher above the usual position the enemy Pokémon is during battle. Species that float or fly have nonzero values. // Flags - u32 isLegendary:1; + u32 isRestrictedLegendary:1; + u32 isSubLegendary:1; u32 isMythical:1; u32 isUltraBeast:1; u32 isParadox:1; @@ -532,15 +513,16 @@ struct SpeciesInfo /*0xC4*/ u32 cannotBeTraded:1; u32 perfectIVCount:3; // This species will always generate with the specified amount of perfect IVs. u32 dexForceRequired:1; // This species will be taken into account for Pokédex ratings even if they have the "isMythical" flag set. - u32 tmIlliterate:1; // This species will be unable to learn the universal moves. + u32 teachingType:1; // Not used in the ROM but used in compilation (check constants/teaching_types.h for explanations) u32 isFrontierBanned:1; // This species is not allowed to participate in Battle Frontier facilities. - u32 padding4:11; + u32 isSkyBattleBanned:1; + u32 padding4:9; // Shadow settings s8 enemyShadowXOffset; // This determines the X-offset for an enemy Pokémon's shadow during battle; negative values point left, positive values point right. s8 enemyShadowYOffset; // This determines the Y-offset for an enemy Pokémon's shadow during battle; negative values point up, positive values point down. u16 enemyShadowSize:3; // This determines the size of the shadow sprite used for an enemy Pokémon's front sprite during battle. u16 suppressEnemyShadow:1; // If set to true, then a shadow will not be drawn beneath an enemy Pokémon's front sprite during battle. - u16 padding5:12; + enum EggIds eggId:12; // Move Data const struct LevelUpMove *levelUpLearnset; const u16 *teachableLearnset; @@ -564,6 +546,17 @@ struct SpeciesInfo /*0xC4*/ #endif //OW_POKEMON_OBJECT_EVENTS }; +struct EggData +{ + const u8 *eggIcon; + const u32 *eggSprite; + const u16 *eggPalette; + const u32 *eggHatchGfx; + const u16 *eggHatchPal; + const u32 *eggShardsGfx; + const u8 eggIconPalIndex; +}; + struct AbilityInfo { u8 name[ABILITY_NAME_LENGTH + 1]; @@ -649,7 +642,7 @@ struct SpindaSpot struct LevelUpMove { - u16 move; + enum Move move; u16 level; }; @@ -672,7 +665,7 @@ enum FusionExtraMoveHandling struct Fusion { u16 fusionStorageIndex; - u16 itemId; + enum Item itemId; u16 targetSpecies1; u16 targetSpecies2; u16 fusingIntoMon; @@ -694,6 +687,7 @@ extern const u16 gKyuremBlackSwapMoveTable[][2]; #endif //P_FUSION_FORMS #define NUM_UNOWN_FORMS 28 +#define RANDOM_UNOWN_LETTER 0 #define GET_UNOWN_LETTER(personality) (( \ (((personality) & 0x03000000) >> 18) \ @@ -704,6 +698,16 @@ extern const u16 gKyuremBlackSwapMoveTable[][2]; #define GET_SHINY_VALUE(otId, personality) (HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality)) +struct OriginalTrainerId +{ + enum OtIdMethod method; + u32 value; +}; + +#define OTID_STRUCT_PLAYER_ID ((struct OriginalTrainerId) {OT_ID_PLAYER_ID, 0}) +#define OTID_STRUCT_PRESET(value) ((struct OriginalTrainerId) {OT_ID_PRESET, value}) +#define OTID_STRUCT_RANDOM_NO_SHINY ((struct OriginalTrainerId) {OT_ID_RANDOM_NO_SHINY, 0}) + extern u8 gPlayerPartyCount; extern struct Pokemon gPlayerParty[PARTY_SIZE]; extern u8 gEnemyPartyCount; @@ -727,46 +731,44 @@ extern const struct SpriteTemplate gBattlerSpriteTemplates[]; extern const u32 sExpCandyExperienceTable[]; extern const struct AbilityInfo gAbilitiesInfo[]; extern const struct NatureInfo gNaturesInfo[]; -#if P_TUTOR_MOVES_ARRAY -extern const u16 gTutorMoves[]; -#endif // P_TUTOR_MOVES_ARRAY void ZeroBoxMonData(struct BoxPokemon *boxMon); void ZeroMonData(struct Pokemon *mon); void ZeroPlayerPartyMons(void); void ZeroEnemyPartyMons(void); -void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); -void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId); -void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature); -void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter); +u32 GetMonPersonality(u16 species, u8 gender, u8 nature, u8 unownLetter); +void CreateMon(struct Pokemon *mon, u16 species, u8 level, u32 personality, struct OriginalTrainerId); +void CreateRandomMon(struct Pokemon *mon, u16 species, u8 level); +void CreateRandomMonWithIVs(struct Pokemon *mon, u16 species, u8 level, u8 fixedIv); +void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u32 personality, struct OriginalTrainerId); +void CreateMonWithIVs(struct Pokemon *mon, u16 species, u8 level, u32 personality, struct OriginalTrainerId trainerId, u8 fixedIV); +void SetBoxMonIVs(struct BoxPokemon *mon, u8 fixedIV); void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level); void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality); -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId); -void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread); void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src); void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50); // void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId); -void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId); void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest); -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler); -u16 GetUnionRoomTrainerPic(void); +enum TrainerPicID GetUnionRoomTrainerPic(void); enum TrainerClassID GetUnionRoomTrainerClass(void); void CreateEnemyEventMon(void); void CalculateMonStats(struct Pokemon *mon); void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest); u8 GetLevelFromMonExp(struct Pokemon *mon); u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon); -u16 GiveMoveToMon(struct Pokemon *mon, u16 move); -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move); -void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot); -void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot); +u16 GiveMoveToMon(struct Pokemon *mon, enum Move move); +u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, enum Move move); +u16 GiveMoveToBattleMon(struct BattlePokemon *mon, enum Move move); +void SetMonMoveSlot(struct Pokemon *mon, enum Move move, u8 slot); +void SetBattleMonMoveSlot(struct BattlePokemon *mon, enum Move move, u8 slot); void GiveMonInitialMoveset(struct Pokemon *mon); void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); -u16 MonTryLearningNewMoveAtLevel(struct Pokemon *mon, bool32 firstMove, u32 level); -u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); -void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); +void GiveMonDefaultMove(struct Pokemon *mon, u32 slot); +void GiveBoxMonDefaultMove(struct BoxPokemon *boxMon, u32 slot); +enum Move MonTryLearningNewMoveAtLevel(struct Pokemon *mon, bool32 firstMove, u32 level); +enum Move MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); +void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, enum Move move); +void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, enum Move move); u8 CountAliveMonsInBattle(u8 caseId, u32 battler); u8 GetDefaultMoveTarget(u8 battler); u8 GetMonGender(struct Pokemon *mon); @@ -774,9 +776,9 @@ u8 GetBoxMonGender(struct BoxPokemon *boxMon); u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality); bool32 IsPersonalityFemale(u16 species, u32 personality); u32 GetUnownSpeciesId(u32 personality); -void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition); -void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition); -void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPosition); +void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, enum BattlerPosition battlerPosition); +void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition); +void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition); /* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for * type safety we have a Get(Box)MonData macro which dispatches to @@ -793,7 +795,7 @@ u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field); void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg); void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg); void CopyMon(void *dest, void *src, size_t size); -u8 GiveMonToPlayer(struct Pokemon *mon); +u8 GiveCapturedMonToPlayer(struct Pokemon *mon); u8 CopyMonToPC(struct Pokemon *mon); u8 CalculatePlayerPartyCount(void); u8 CalculateEnemyPartyCount(void); @@ -803,7 +805,7 @@ u8 GetMonsStateToDoubles_2(void); enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum); enum Ability GetMonAbility(struct Pokemon *mon); // void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); -u8 GetSecretBaseTrainerPicIndex(void); +enum TrainerPicID GetSecretBaseTrainerPicIndex(void); enum TrainerClassID GetSecretBaseTrainerClass(void); bool8 IsPlayerPartyAndPokemonStorageFull(void); bool8 IsPokemonStorageFull(void); @@ -827,16 +829,16 @@ const u16 *GetSpeciesEggMoves(u16 species); const struct Evolution *GetSpeciesEvolutions(u16 species); const u16 *GetSpeciesFormTable(u16 species); const struct FormChange *GetSpeciesFormChanges(u16 species); -u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex); +u8 CalculatePPWithBonus(enum Move move, u8 ppBonuses, u8 moveIndex); void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst); void CopyPartyMonToBattleData(u32 battler, u32 partyIndex); -bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); -bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 usedByAI); +bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, enum Item item, u8 partyIndex, u8 moveIndex); +bool8 PokemonUseItemEffects(struct Pokemon *mon, enum Item item, u8 partyIndex, u8 moveIndex, u8 usedByAI); bool8 HealStatusConditions(struct Pokemon *mon, u32 healMask, u8 battler); -u8 GetItemEffectParamOffset(u32 battler, u16 itemId, u8 effectByte, u8 effectBit); -u8 *UseStatIncreaseItem(u16 itemId); +u8 GetItemEffectParamOffset(u32 battler, enum Item itemId, u8 effectByte, u8 effectBit); +u8 *UseStatIncreaseItem(enum Item itemId); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); u32 GetGMaxTargetSpecies(u32 species); @@ -844,9 +846,15 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo, enum EvoState evoState); bool8 IsMonPastEvolutionLevel(struct Pokemon *mon); u16 NationalPokedexNumToSpecies(enum NationalDexOrder nationalNum); +u32 NationalToRegionalOrder(enum NationalDexOrder nationalNum); +// enum KantoDexOrder NationalToKantoOrder(enum NationalDexOrder nationalNum); enum HoennDexOrder NationalToHoennOrder(enum NationalDexOrder nationalNum); enum NationalDexOrder SpeciesToNationalPokedexNum(u16 species); +u32 SpeciesToRegionalPokedexNum(u16 species); +// enum KantoDexOrder SpeciesToKantoPokedexNum(u16 species); enum HoennDexOrder SpeciesToHoennPokedexNum(u16 species); +enum NationalDexOrder RegionalToNationalOrder(u32 regionNum); +// enum NationalDexOrder KantoToNationalOrder(enum KantoDexOrder kantoNum); enum NationalDexOrder HoennToNationalOrder(enum HoennDexOrder hoennNum); enum KantoDexOrder SpeciesToKantoDexNum(u16 species); bool32 IsSpeciesInKantoDex(u16 species); @@ -863,23 +871,27 @@ s32 GetBattlerMultiplayerId(u16 id); u8 GetTrainerEncounterMusicId(u16 trainerOpponentId); u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex); void AdjustFriendship(struct Pokemon *mon, u8 event); +u8 CalculateFriendshipBonuses(struct Pokemon *mon, u32 modifier, enum HoldEffect itemHoldEffect); void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); u16 GetMonEVCount(struct Pokemon *mon); -void RandomlyGivePartyPokerus(struct Pokemon *party); -u8 CheckPartyPokerus(struct Pokemon *party, u8 selection); -u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection); -void UpdatePartyPokerusTime(u16 days); -void PartySpreadPokerus(struct Pokemon *party); bool8 TryIncrementMonLevel(struct Pokemon *mon); -u8 CanLearnTeachableMove(u16 species, u16 move); -u8 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves); -u8 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves); -u8 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves); -u8 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves); -u8 GetNumberOfLevelUpMoves(struct Pokemon *mon); -u8 GetNumberOfEggMoves(struct Pokemon *mon); -u8 GetNumberOfTMMoves(struct Pokemon *mon); -u8 GetNumberOfTutorMoves(struct Pokemon *mon); +u8 CanLearnTeachableMove(u16 species, enum Move move); +u32 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerLevelUpMovesBox(struct BoxPokemon *boxMon, u16 *moves); +u32 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerEggMovesBox(struct BoxPokemon *boxMon, u16 *moves); +u32 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerTMMovesBox(struct BoxPokemon *boxMon, u16 *moves); +u32 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves); +u32 GetRelearnerTutorMovesBox(struct BoxPokemon *boxMon, u16 *moves); +bool32 HasRelearnerLevelUpMoves(struct Pokemon *mon); +bool32 HasRelearnerLevelUpMovesBox(struct BoxPokemon *boxMon); +bool32 HasRelearnerEggMoves(struct Pokemon *mon); +bool32 HasRelearnerEggMovesBox(struct BoxPokemon *boxMon); +bool32 HasRelearnerTMMoves(struct Pokemon *mon); +bool32 HasRelearnerTMMovesBox(struct BoxPokemon *boxMon); +bool32 HasRelearnerTutorMoves(struct Pokemon *mon); +bool32 HasRelearnerTutorMovesBox(struct BoxPokemon *boxMon); u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves); u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves); u8 GetNumberOfRelearnableMoves(struct Pokemon *mon); @@ -891,9 +903,11 @@ void PlayMapChosenOrBattleBGM(u16 songId); void CreateTask_PlayMapChosenOrBattleBGM(u16 songId); const u16 *GetMonFrontSpritePal(struct Pokemon *mon); const u16 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, bool32 isShiny, u32 personality); +const u16 *GetMonSpritePalFromSpeciesAndPersonalityIsEgg(u16 species, bool32 isShiny, u32 personality, bool32 isEgg); const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFemale); -bool32 IsMoveHM(u16 move); -bool32 CannotForgetMove(u16 move); +const u16 *GetMonSpritePalFromSpeciesIsEgg(u16 species, bool32 isShiny, bool32 isFemale, bool32 isEgg); +bool32 IsMoveHM(enum Move move); +bool32 CannotForgetMove(enum Move move); bool8 IsMonSpriteNotFlipped(u16 species); s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); @@ -911,8 +925,8 @@ void PokemonSummaryDoMonAnimation(struct Sprite *sprite, u16 species, bool8 oneF void StopPokemonAnimationDelayTask(void); void BattleAnimateBackSprite(struct Sprite *sprite, u16 species); u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId); -u16 FacilityClassToPicIndex(u16 facilityClass); -u16 PlayerGenderToFrontTrainerPicId(u8 playerGender); +enum TrainerPicID FacilityClassToPicIndex(u16 facilityClass); +enum TrainerPicID PlayerGenderToFrontTrainerPicId(u8 playerGender); void HandleSetPokedexFlag(enum NationalDexOrder nationalNum, u8 caseId, u32 personality); void HandleSetPokedexFlagFromMon(struct Pokemon *mon, u32 caseId); bool8 HasTwoFramesAnimation(u16 species); @@ -942,7 +956,7 @@ void HealPokemon(struct Pokemon *mon); void HealBoxPokemon(struct BoxPokemon *boxMon); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); -enum Type CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state); +enum Type CheckDynamicMoveType(struct Pokemon *mon, enum Move move, u32 battler, enum MonState state); uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier); u32 GetRegionalFormByRegion(u32 species, u32 region); bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); @@ -952,6 +966,7 @@ struct Pokemon *GetSavedPlayerPartyMon(u32 index); u8 *GetSavedPlayerPartyCount(void); void SavePlayerPartyMon(u32 index, struct Pokemon *mon); bool32 IsSpeciesOfType(u32 species, enum Type type); +u32 GiveScriptedMonToPlayer(struct Pokemon *mon, u8 slot); // pokefirered u16 GetFirstPartnerMove(u16 species); diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index 561c5a49f..5e6af27a9 100644 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -72,7 +72,6 @@ enum PokemonSummaryScreenSkillPageMode struct StatData { u8 monDataStat; - u8 monDataStat2; u8 monDataEv; u8 monDataIv; u8 monDataHyperTrained; diff --git a/include/pokerus.h b/include/pokerus.h new file mode 100644 index 000000000..010071197 --- /dev/null +++ b/include/pokerus.h @@ -0,0 +1,14 @@ +#ifndef GUARD_POKERUS_H +#define GUARD_POKERUS_H + +u32 GetDaysLeftBasedOnStrain(u32 strain); +void RandomlyGivePartyPokerus(void); +bool32 IsPokerusInParty(void); +bool32 CheckMonPokerus(struct Pokemon *mon); +bool32 CheckMonHasHadPokerus(struct Pokemon *mon); +bool32 ShouldPokemonShowActivePokerus(struct Pokemon *mon); +bool32 ShouldPokemonShowCuredPokerus(struct Pokemon *mon); +void UpdatePartyPokerusTime(u32 days); +void PartySpreadPokerus(void); + +#endif // GUARD_POKERUS_H diff --git a/include/random.h b/include/random.h index 0a3a711da..0e44f805e 100644 --- a/include/random.h +++ b/include/random.h @@ -128,6 +128,7 @@ enum RandomTag RNG_NONE, RNG_ACCURACY, RNG_CONFUSION, + RNG_CONFUSION_TURNS, RNG_CRITICAL_HIT, RNG_CURSED_BODY, RNG_CUTE_CHARM, @@ -170,6 +171,9 @@ enum RandomTag RNG_TRACE, RNG_FICKLE_BEAM, RNG_AI_ABILITY, + RNG_AI_SCORE_TIE_DOUBLES_MOVE, + RNG_AI_SCORE_TIE_DOUBLES_TARGET, + RNG_AI_SCORE_TIE_SINGLES, RNG_AI_SWITCH_HASBADODDS, RNG_AI_SWITCH_BADLY_POISONED, RNG_AI_SWITCH_CURSED, @@ -191,11 +195,15 @@ enum RandomTag RNG_AI_SWITCH_TRAPPER, RNG_AI_SWITCH_FREE_TURN, RNG_AI_SWITCH_ALL_MOVES_BAD, + RNG_AI_SWITCH_DYN_FUNC, RNG_AI_CONSERVE_TERA, RNG_AI_SWITCH_ALL_SCORES_BAD, RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER, RNG_AI_PP_STALL_DISREGARD_MOVE, RNG_AI_SUCKER_PUNCH, + RNG_AI_CONSIDER_EXPLOSION, + RNG_AI_FINAL_GAMBIT, + RNG_AI_SHOULD_PIVOT_BREAK_SASH, RNG_SHELL_SIDE_ARM, RNG_RANDOM_TARGET, RNG_AI_PREDICT_ABILITY, @@ -205,8 +213,17 @@ enum RandomTag RNG_AI_BOOST_INTO_HAZE, RNG_AI_SHOULD_RECOVER, RNG_AI_PRIORITIZE_LAST_CHANCE, + RNG_AI_RANDOM_SWITCHIN_POST_KO, + RNG_AI_RANDOM_SWITCHIN_MID_BATTLE, + RNG_AI_RANDOM_VALID_SWITCHIN_POST_KO, + RNG_AI_RANDOM_VALID_SWITCHIN_MID_BATTLE, RNG_HEALER, RNG_DEXNAV_ENCOUNTER_LEVEL, + RNG_POKERUS_PARTY_MEMBER, + RNG_POKERUS_INFECTION, + RNG_POKERUS_STRAIN_DISTRIBUTION, + RNG_POKERUS_SPREAD, + RNG_POKERUS_SPREAD_SIDE, RNG_AI_ASSUME_STATUS_SLEEP, RNG_AI_ASSUME_STATUS_NONVOLATILE, RNG_AI_ASSUME_STATUS_HIGH_ODDS, @@ -223,11 +240,12 @@ enum RandomTag RNG_MAGNITUDE, RNG_FISHING_BITE, RNG_FISHING_GEN3_STICKY, + RNG_TAUNT, }; #define RandomWeighted(tag, ...) \ ({ \ - const u8 weights[] = { __VA_ARGS__ }; \ + const u16 weights[] = { __VA_ARGS__ }; \ u32 sum, i; \ for (i = 0, sum = 0; i < ARRAY_COUNT(weights); i++) \ sum += weights[i]; \ @@ -249,7 +267,7 @@ enum RandomTag } \ else \ { \ - const u8 weights[] = { 100 - t, t }; \ + const u16 weights[] = { 100 - t, t }; \ r = RandomWeightedArray(tag, 100, ARRAY_COUNT(weights), weights); \ } \ r; \ @@ -262,21 +280,24 @@ enum RandomTag u32 RandomUniform(enum RandomTag, u32 lo, u32 hi); u32 RandomUniformExcept(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); -u32 RandomWeightedArray(enum RandomTag, u32 sum, u32 n, const u8 *weights); +u32 RandomWeightedArray(enum RandomTag, u32 sum, u32 n, const u16 *weights); const void *RandomElementArray(enum RandomTag, const void *array, size_t size, size_t count); u32 RandomUniformDefault(enum RandomTag, u32 lo, u32 hi); u32 RandomUniformExceptDefault(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); -u32 RandomWeightedArrayDefault(enum RandomTag, u32 sum, u32 n, const u8 *weights); +u32 RandomWeightedArrayDefault(enum RandomTag, u32 sum, u32 n, const u16 *weights); const void *RandomElementArrayDefault(enum RandomTag, const void *array, size_t size, size_t count); u8 RandomWeightedIndex(u8 *weights, u8 length); +u32 RandomBit(enum RandomTag tag, u32 bits); +u32 RandomBitIndex(enum RandomTag tag, u32 bits); + #if TESTING u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); u32 RandomUniformDefaultValue(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); -u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller); -u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u8 *weights, void *caller); +u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u16 *weights, void *caller); +u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u16 *weights, void *caller); const void *RandomElementArrayTrials(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); const void *RandomElementArrayDefaultValue(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); #endif diff --git a/include/script_pokemon_util.h b/include/script_pokemon_util.h index ae3b2c550..a2e68c110 100644 --- a/include/script_pokemon_util.h +++ b/include/script_pokemon_util.h @@ -1,12 +1,12 @@ #ifndef GUARD_SCRIPT_POKEMON_UTIL_H #define GUARD_SCRIPT_POKEMON_UTIL_H -u32 ScriptGiveMon(u16 species, u8 level, u16 item); +u32 ScriptGiveMon(u16 species, u8 level, enum Item item); bool8 ScriptGiveEgg(u16 species); void ScriptSetMonMoveSlot(u8 partyIdx, u16 move, u8 slot); void HealPlayerParty(void); void ReducePlayerPartyToSelectedMons(void); void CreateScriptedWildMon(u16 species, u8 level, u16 item); -void CreateScriptedDoubleWildMon(u16 species1, u8 level1, u16 item1, u16 species2, u8 level2, u16 item2); +void CreateScriptedDoubleWildMon(u16 species1, u8 level1, enum Item item1, u16 species2, u8 level2, enum Item item2); #endif //GUARD_SCRIPT_POKEMON_UTIL_H diff --git a/include/test/battle.h b/include/test/battle.h index d0f0458a7..d925185b1 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -194,9 +194,9 @@ * ASSUME(GetMoveEffect(MOVE_POISON_STING) == EFFECT_POISON_HIT); * } * - * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), + * SINGLE_BATTLE_TEST(name, results...), DOUBLE_BATTLE_TEST(name, results...), MULTI_BATTLE_TEST(name, results...), * TWO_VS_ONE_BATTLE_TEST(name, results...), and ONE_VS_TWO_BATTLE_TEST(name, results...) - * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with + * Define single-, double-, 2v2-multi-, 2v1-multi-, and 1v2- battles. The names should start with * the name of the mechanic being tested so that it is easier to run all the related tests. results contains variable * declarations to be placed into the `results` array which is available in tests using `PARAMETRIZE` commands. * The main differences for doubles, 2v2, 2v1, and 1v2 are: @@ -204,7 +204,7 @@ * - Instead of player and opponent there is playerLeft, playerRight, * opponentLeft, and opponentRight. * - * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), + * AI_SINGLE_BATTLE_TEST(name, results...), AI_DOUBLE_BATTLE_TEST(name, results...), * AI_MULTI_BATTLE_TEST(name, results...), AI_TWO_VS_ONE_BATTLE_TEST(name, results...), and AI_ONE_VS_TWO_BATTLE_TEST(name, results...) * Define battles where opponent mons are controlled by AI, the same that runs * when battling regular Trainers. The flags for AI should be specified by @@ -306,10 +306,10 @@ * * WITH_CONFIG(configTag, value) * Runs the test with a specified config override. `configTag` must be - * of `enum GenConfigTag` + * of `enum ConfigTag` * Example: * GIVEN { - * WITH_CONFIG(GEN_CONFIG_GALE_WINGS, GEN_6); + * WITH_CONFIG(CONFIG_GALE_WINGS, GEN_6); * } * The `value` may be inferred from a local variable, e.g. set by * PARAMETRIZE. @@ -334,34 +334,34 @@ * Note if Moves is specified then MOVE will not automatically add moves * to the moveset. * - * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, - * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, + * For tests using MULTI_BATTLE_TEST, AI_MULTI_BATTLE_TEST, TWO_VS_ONE_BATTLE_TEST, + * AI_TWO_VS_ONE_BATTLE_TEST, ONE_VS_TWO_BATTLE_TEST, and AI_ONE_VS_TWO_BATTLE_TEST, * the below must be used instead of PLAYER(species) and OPPONENT(species). - * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and - * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, + * MULTI_PLAYER(species), MULTI_PARTNER(species), MULTI_OPPONENT_A(species), and + * MULTI_OPPONENT_B(species) Adds the species to the player's, player partner's, * opponent A's, or opponent B's party, respectively. * Pokemon can be customised as per the guidance for PLAYER(species) and OPPONENT(species). - * The functions assign the Pokémon to the party of the trainer at B_POSITION_PLAYER_LEFT, + * The functions assign the Pokémon to the party of the trainer at B_POSITION_PLAYER_LEFT, * B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_LEFT, and B_POSITION_OPPONENT_RIGHT, respectively. * MULTI_PLAYER(species) and MULTI_OPPONENT_A(species) set Pokémon starting at party index 0, - * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set Pokémon starting at party + * while MULTI_PARTNER(species) and MULTI_OPPONENT_B(species) set Pokémon starting at party * index 3. * For ONE_VS_TWO tests, MULTI_PLAYER(species) must be used for all player-side Pokémon, * and for TWO_VS_ONE tests, MULTI_OPPONENT_A(species) must be used for all opponent-side - * Pokémon. + * Pokémon. * All MULTI_PLAYER(species) Pokémon must be set before any MULTI_PARTNER(species) Pokémon, * and all MULTI_OPPONENT_A(species) must be set before any MULTI_OPPONENT_B(species) Pokémon, * else Pokémon will be set in the incorrect parties in the test. * Note where a side in a test has two trainers, the test setup manages the assigning of correct - * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A - * Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B + * multi-party orders, therefore when using functions such as SEND_OUT, Player and Opponent A + * Pokémon may be referenced using indexes 0, 1, and 2, and Player's Partner and Opponent B * Pokémon may be referenced using indexes 3, 4, and 5. * * AI_FLAGS * Specifies which AI flags are run for all battlers during the test. Has use only for AI tests. * The most common combination is AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT) * which is the general 'smart' AI. - * + * * BATTLER_AI_FLAGS * Specifies additional AI flags to be applied to specific battlers (battler 0/1/2/3). Has use only for AI tests. * Must be used strictly after AI_FLAGS(flags), which overwrites all existing flags. @@ -483,6 +483,12 @@ * ... * STATUS_ICON(player, status1); * + * CATCHING_CHANCE(address) + * Causes the test to fail if no catching attempt is made + * and then writes the computed catch chance in the `address`pointer + * u32 recordedCatchChance; + * CATCHING_CHANCE(&recordedCatchChance); + * * NOT * Causes the test to fail if the SCENE command succeeds before the * following command succeeds. @@ -567,7 +573,19 @@ #define MAX_QUEUED_EVENTS 30 #define MAX_EXPECTED_ACTIONS 10 -enum { BATTLE_TEST_SINGLES, BATTLE_TEST_DOUBLES, BATTLE_TEST_WILD, BATTLE_TEST_AI_SINGLES, BATTLE_TEST_AI_DOUBLES, BATTLE_TEST_MULTI, BATTLE_TEST_AI_MULTI, BATTLE_TEST_TWO_VS_ONE, BATTLE_TEST_AI_TWO_VS_ONE, BATTLE_TEST_ONE_VS_TWO, BATTLE_TEST_AI_ONE_VS_TWO }; +enum { + BATTLE_TEST_SINGLES, + BATTLE_TEST_DOUBLES, + BATTLE_TEST_WILD, + BATTLE_TEST_MULTI, + BATTLE_TEST_TWO_VS_ONE, + BATTLE_TEST_ONE_VS_TWO, + BATTLE_TEST_AI_SINGLES, + BATTLE_TEST_AI_DOUBLES, + BATTLE_TEST_AI_MULTI, + BATTLE_TEST_AI_TWO_VS_ONE, + BATTLE_TEST_AI_ONE_VS_TWO +}; typedef void (*SingleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *); typedef void (*DoubleBattleTestFunction)(void *, const u32, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *, struct BattlePokemon *); @@ -594,9 +612,11 @@ enum QUEUED_ABILITY_POPUP_EVENT, QUEUED_ANIMATION_EVENT, QUEUED_HP_EVENT, + QUEUED_SUB_HIT_EVENT, QUEUED_EXP_EVENT, QUEUED_MESSAGE_EVENT, QUEUED_STATUS_EVENT, + QUEUED_CATCH_CHANCE_EVENT, }; struct QueuedAbilityEvent @@ -623,6 +643,14 @@ struct QueuedHPEvent u32 address:28; }; +struct QueuedSubHitEvent +{ + u32 battlerId:3; + u32 checkBreak:1; + u32 breakSub:1; + u32 address:27; +}; + struct QueuedExpEvent { u32 battlerId:3; @@ -641,6 +669,11 @@ struct QueuedStatusEvent u32 mask:29; }; +struct QueuedCaptureEvent +{ + u32 address; +}; + struct QueuedEvent { u8 type; @@ -652,9 +685,11 @@ struct QueuedEvent struct QueuedAbilityEvent ability; struct QueuedAnimationEvent animation; struct QueuedHPEvent hp; + struct QueuedSubHitEvent subHit; struct QueuedExpEvent exp; struct QueuedMessageEvent message; struct QueuedStatusEvent status; + struct QueuedCaptureEvent capture; } as; }; @@ -703,6 +738,24 @@ struct AILogLine s16 score; }; +enum ScoreTieResolution +{ + SCORE_TIE_NONE, + SCORE_TIE_LO, + SCORE_TIE_HI, + SCORE_TIE_RANDOM, + SCORE_TIE_CHOSEN +}; + +enum TargetTieResolution +{ + TARGET_TIE_NONE, + TARGET_TIE_LO, + TARGET_TIE_HI, + TARGET_TIE_RANDOM, + TARGET_TIE_CHOSEN +}; + // Data which is updated by the test runner during a battle and needs to // be reset between trials. struct BattleTrialData @@ -710,26 +763,30 @@ struct BattleTrialData u8 lastActionTurn; u8 queuedEvent; u8 aiActionsPlayed[MAX_BATTLERS_COUNT]; + u8 scoreTieCount; + u8 targetTieCount; }; +extern struct BattleTrialData gBattleTrialData; + struct BattleTestData { u8 stack[BATTLE_TEST_STACK_SIZE]; u8 playerPartySize; u8 opponentPartySize; - u8 explicitMoves[MAX_BATTLERS_COUNT]; + u8 explicitMoves[MAX_BATTLE_TRAINERS]; bool8 hasExplicitSpeeds; - u8 explicitSpeeds[MAX_BATTLERS_COUNT]; + u8 explicitSpeeds[MAX_BATTLE_TRAINERS]; u16 slowerThan[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 currentPosition; + enum BattleTrainer battleTrainer; u8 currentPartyIndex; struct Pokemon *currentMon; u8 gender; u8 nature; bool8 isShiny; - enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; - u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; + enum Ability forcedAbilities[MAX_BATTLE_TRAINERS][PARTY_SIZE]; + u8 chosenGimmick[MAX_BATTLE_TRAINERS][PARTY_SIZE]; u8 forcedEnvironment; u8 currentMonIndexes[MAX_BATTLERS_COUNT]; @@ -757,8 +814,14 @@ struct BattleTestData struct AILogLine aiLogLines[MAX_BATTLERS_COUNT][MAX_MON_MOVES][MAX_AI_LOG_LINES]; u8 aiLogPrintedForMove[MAX_BATTLERS_COUNT]; // Marks ai score log as printed for move, so the same log isn't displayed multiple times. u16 flagId; + u16 varId; struct BattleTrialData trial; + enum ScoreTieResolution scoreTieResolution; + u8 scoreTieOverride; + enum RandomTag scoreTieTag; + enum TargetTieResolution targetTieResolution; + u8 targetTieOverride; }; struct BattleTestRunnerState @@ -936,7 +999,7 @@ void Randomly(u32 sourceLine, u32 passes, u32 trials, struct RandomlyContext); /* Given */ struct moveWithPP { - u16 moveId; + enum Move moveId; u8 pp; }; @@ -948,14 +1011,15 @@ struct moveWithPP { #define AI_LOG AILogScores(__LINE__) #define FLAG_SET(flagId) SetFlagForTest(__LINE__, flagId) +#define VAR_SET(varId, value) SetVarForTest(__LINE__, varId, value) #define WITH_CONFIG(configTag, value) TestSetConfig(__LINE__, configTag, value) -#define PLAYER(species) for (OpenPokemon(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define OPPONENT(species) for (OpenPokemon(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define MULTI_PLAYER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define MULTI_OPPONENT_A(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_LEFT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define MULTI_PARTNER(species) for (OpenPokemonMulti(__LINE__, B_POSITION_PLAYER_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) -#define MULTI_OPPONENT_B(species) for (OpenPokemonMulti(__LINE__, B_POSITION_OPPONENT_RIGHT, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define PLAYER(species) for (OpenPokemon(__LINE__, B_TRAINER_0, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define OPPONENT(species) for (OpenPokemon(__LINE__, B_TRAINER_1, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PLAYER(species) for (OpenPokemonMulti(__LINE__, B_TRAINER_0, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_A(species) for (OpenPokemonMulti(__LINE__, B_TRAINER_1, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_PARTNER(species) for (OpenPokemonMulti(__LINE__, B_TRAINER_2, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) +#define MULTI_OPPONENT_B(species) for (OpenPokemonMulti(__LINE__, B_TRAINER_3, species); gBattleTestRunnerState->data.currentMon; ClosePokemon(__LINE__)) #define Gender(gender) Gender_(__LINE__, gender) #define Nature(nature) Nature_(__LINE__, nature) @@ -988,10 +1052,14 @@ struct moveWithPP { #define Environment(environment) Environment_(__LINE__, environment) void SetFlagForTest(u32 sourceLine, u16 flagId); -void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value); +void SetVarForTest(u32 sourceLine, u16 varId, u16 value); +void TestSetConfig(u32 sourceLine, enum ConfigTag configTag, u32 value); +void TieBreakScore(u32 sourceLine, enum RandomTag rngTag, enum ScoreTieResolution scoreTieRes, u32 value); +void TieBreakTarget(u32 sourceLine, enum TargetTieResolution targetTieRes, u32 value); void ClearFlagAfterTest(void); -void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species); -void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species); +void ClearVarAfterTest(void); +void OpenPokemon(u32 sourceLine, enum BattleTrainer trainer, u32 species); +void OpenPokemonMulti(u32 sourceLine, enum BattleTrainer trainer, u32 species); void ClosePokemon(u32 sourceLine); void RNGSeed_(u32 sourceLine, rng_value_t seed); @@ -1021,7 +1089,7 @@ void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]); void Friendship_(u32 sourceLine, u32 friendship); void Status1_(u32 sourceLine, u32 status1); void OTName_(u32 sourceLine, const u8 *otName); -void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel); +void DynamaxLevel_(u32 sourceLine, s16 dynamaxLevel); void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor); void TeraType_(u32 sourceLine, enum Type teraType); void Shadow_(u32 sourceLine, bool32 isShadow); @@ -1047,7 +1115,7 @@ static inline bool8 IsMultibattleTest(void) // Created for easy use of EXPECT_MOVES, so the user can provide 1, 2, 3 or 4 moves for AI which can pass the test. struct FourMoves { - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; }; struct TestAIScoreStruct @@ -1094,6 +1162,8 @@ enum { TURN_CLOSED, TURN_OPEN, TURN_CLOSING }; #define SEND_OUT(battler, partyIndex) SendOut(__LINE__, battler, partyIndex) #define USE_ITEM(battler, ...) UseItem(__LINE__, battler, (struct ItemContext) { R_APPEND_TRUE(__VA_ARGS__) }) #define WITH_RNG(tag, value) rng: ((struct RiggedRNG) { tag, value }) +#define TIE_BREAK_SCORE(rngTag, scoreTieRes, value) TieBreakScore(__LINE__, rngTag, scoreTieRes, value) +#define TIE_BREAK_TARGET(targetTieRes, value) TieBreakTarget(__LINE__, targetTieRes, value) struct MoveContext { @@ -1124,7 +1194,7 @@ struct MoveContext struct ItemContext { - u16 itemId; + enum Item itemId; u16 explicitItemId:1; u16 partyIndex; u16 explicitPartyIndex:1; @@ -1161,10 +1231,12 @@ void SendOut(u32 sourceLine, struct BattlePokemon *, u32 partyIndex); #define ABILITY_POPUP(battler, ...) QueueAbility(__LINE__, battler, (struct AbilityEventContext) { __VA_ARGS__ }) #define ANIMATION(type, id, ...) QueueAnimation(__LINE__, type, id, (struct AnimationEventContext) { __VA_ARGS__ }) #define HP_BAR(battler, ...) QueueHP(__LINE__, battler, (struct HPEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) +#define SUB_HIT(battler, ...) QueueSubHit(__LINE__, battler, (struct SubHitEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) #define EXPERIENCE_BAR(battler, ...) QueueExp(__LINE__, battler, (struct ExpEventContext) { R_APPEND_TRUE(__VA_ARGS__) }) // Static const is needed to make the modern compiler put the pattern variable in the .rodata section, instead of putting it on stack(which can break the game). #define MESSAGE(pattern) do {static const u8 msg[] = _(pattern); QueueMessage(__LINE__, msg);} while (0) #define STATUS_ICON(battler, status) QueueStatus(__LINE__, battler, (struct StatusEventContext) { status }) +#define CATCHING_CHANCE(address) QueueCatchingChance(__LINE__, address) #define FREEZE_OR_FROSTBURN_STATUS(battler, isFrostbite) \ (B_USE_FROSTBITE ? STATUS_ICON(battler, frostbite: isFrostbite) : STATUS_ICON(battler, freeze: isFrostbite)) @@ -1213,6 +1285,15 @@ struct HPEventContext bool8 explicitCaptureDamage; }; +struct SubHitEventContext +{ + u8 _; + bool8 subBreak; + bool8 explicitSubBreak; + u16 *captureDamage; + bool8 explicitCaptureDamage; +}; + struct ExpEventContext { u8 _; @@ -1241,9 +1322,11 @@ void CloseQueueGroup(u32 sourceLine); void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityEventContext); void QueueAnimation(u32 sourceLine, u32 type, u32 id, struct AnimationEventContext); void QueueHP(u32 sourceLine, struct BattlePokemon *battler, struct HPEventContext); +void QueueSubHit(u32 sourceLine, struct BattlePokemon *battler, struct SubHitEventContext); void QueueExp(u32 sourceLine, struct BattlePokemon *battler, struct ExpEventContext); void QueueMessage(u32 sourceLine, const u8 *pattern); void QueueStatus(u32 sourceLine, struct BattlePokemon *battler, struct StatusEventContext); +void QueueCatchingChance(u32 sourceLine, u32 *captureAdress); /* Then */ diff --git a/include/test/overworld_script.h b/include/test/overworld_script.h index e849f87e0..650221499 100644 --- a/include/test/overworld_script.h +++ b/include/test/overworld_script.h @@ -49,9 +49,10 @@ asm(".set FALSE, 0\n" ".set PARTY_SIZE, " STR(PARTY_SIZE) "\n" ".set VARS_START, " STR(VARS_START) "\n" ".set VARS_END, " STR(VARS_END) "\n" + ".set MON_GENDER_MAY_CUTE_CHARM, " STR(MON_GENDER_MAY_CUTE_CHARM) "\n" + ".set NATURE_MAY_SYNCHRONIZE, " STR(NATURE_MAY_SYNCHRONIZE) "\n" ".set SPECIAL_VARS_START, " STR(SPECIAL_VARS_START) "\n" ".set SPECIAL_VARS_END, " STR(SPECIAL_VARS_END) "\n"); -asm(".include \"constants/gba_constants.inc\"\n"); // Make overworld script macros available. asm(".include \"constants/gba_constants.inc\"\n" diff --git a/include/test/test.h b/include/test/test.h index 3916a96df..a70806758 100644 --- a/include/test/test.h +++ b/include/test/test.h @@ -17,7 +17,7 @@ struct TestRunner bool32 (*checkProgress)(void *); bool32 (*handleExitWithResult)(void *, enum TestResult); u32 (*randomUniform)(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller); - u32 (*randomWeightedArray)(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller); + u32 (*randomWeightedArray)(enum RandomTag tag, u32 sum, u32 n, const u16 *weights, void *caller); const void* (*randomElementArray)(enum RandomTag tag, const void *array, size_t size, size_t count, void *caller); }; @@ -37,6 +37,16 @@ enum TestFilterMode TEST_FILTER_MODE_FILENAME_EXACT, }; +enum ExpectFailState +{ + NO_EXPECT_FAIL, + EXPECT_FAIL_OPEN, + EXPECT_FAIL_TURN_OPEN, + EXPECT_FAIL_SCENE_OPEN, + EXPECT_FAIL_SUCCESS, + EXPECT_FAIL_CLOSED +}; + struct TestRunnerState { u8 state; @@ -53,6 +63,8 @@ struct TestRunnerState bool8 inBenchmark:1; bool8 tearDown:1; u32 timeoutSeconds; + s32 expectedFailLine; + enum ExpectFailState expectedFailState; }; struct PersistentTestRunnerState @@ -94,6 +106,7 @@ void CB2_TestRunner(void); void Test_ExpectedResult(enum TestResult); void Test_ExpectLeaks(bool32); void Test_ExpectCrash(bool32); +void Test_ExpectFail(u32 failLine); u32 SourceLine(u32 sourceLineOffset); u32 SourceLineOffset(u32 sourceLine); void SetupRiggedRng(u32 sourceLine, enum RandomTag randomTag, u32 value); @@ -242,6 +255,8 @@ static inline struct Benchmark BenchmarkStop(void) #define KNOWN_CRASHING \ Test_ExpectCrash(TRUE) +#define EXPECT_FAIL for (u32 _expect_fail = (Test_ExpectFail(-1), 1); _expect_fail; Test_ExpectFail(__LINE__), _expect_fail = 0) + #define PARAMETRIZE if (gFunctionTestRunnerState->parameters++ == gFunctionTestRunnerState->runParameter) #define PARAMETRIZE_LABEL(f, label) if (gFunctionTestRunnerState->parameters++ == gFunctionTestRunnerState->runParameter && (Test_MgbaPrintf(":N%s: " f " (%d/%d)", gTestRunnerState.test->name, label, gFunctionTestRunnerState->runParameter + 1, gFunctionTestRunnerState->parameters), 1)) diff --git a/include/test_runner.h b/include/test_runner.h index 493cfabc4..539086b87 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -2,7 +2,11 @@ #define GUARD_TEST_RUNNER_H extern const bool8 gTestRunnerEnabled; +#if TESTING extern const bool8 gTestRunnerHeadless; +#else +#define gTestRunnerHeadless FALSE +#endif extern const bool8 gTestRunnerSkipIsFail; #if TESTING @@ -12,22 +16,23 @@ enum Gimmick; void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability); void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId); void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP); +void TestRunner_Battle_RecordSubHit(u32 battlerId, u32 damage, bool32 broke); void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp); void TestRunner_Battle_RecordMessage(const u8 *message); void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1); +void TestRunner_Battle_RecordCatchChance(u32 catchChance); void TestRunner_Battle_AfterLastTurn(void); -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick); +void TestRunner_Battle_CheckChosenMove(u32 battlerId, enum Move moveId, u32 target, enum Gimmick gimmick); void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex); void TestRunner_Battle_CheckAiMoveScores(u32 battlerId); void TestRunner_Battle_AISetScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score); void TestRunner_Battle_AIAdjustScore(const char *file, u32 line, u32 battlerId, u32 moveIndex, s32 score); -void TestRunner_Battle_InvalidNoHPMon(u32 battlerId, u32 partyIndex); void TestRunner_CheckMemory(void); void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordIndex, u32 actionType); -u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex); -u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); +u32 TestRunner_Battle_GetForcedAbility(enum BattleTrainer trainer, u32 partyIndex); +u32 TestRunner_Battle_GetChosenGimmick(enum BattleTrainer trainer, u32 partyIndex); u32 TestRunner_Battle_GetForcedEnvironment(void); #else @@ -35,16 +40,17 @@ u32 TestRunner_Battle_GetForcedEnvironment(void); #define TestRunner_Battle_RecordAbilityPopUp(...) (void)0 #define TestRunner_Battle_RecordAnimation(...) (void)0 #define TestRunner_Battle_RecordHP(...) (void)0 +#define TestRunner_Battle_RecordSubHit(...) (void)0 #define TestRunner_Battle_RecordExp(...) (void)0 #define TestRunner_Battle_RecordMessage(...) (void)0 #define TestRunner_Battle_RecordStatus1(...) (void)0 +#define TestRunner_Battle_RecordCatchChance(...) (void)0 #define TestRunner_Battle_AfterLastTurn(...) (void)0 #define TestRunner_Battle_CheckChosenMove(...) (void)0 #define TestRunner_Battle_CheckSwitch(...) (void)0 #define TestRunner_Battle_CheckAiMoveScores(...) (void)0 #define TestRunner_Battle_AISetScore(...) (void)0 #define TestRunner_Battle_AIAdjustScore(...) (void)0 -#define TestRunner_Battle_InvalidNoHPMon(...) (void)0 #define TestRunner_Battle_CheckBattleRecordActionType(...) (void)0 diff --git a/include/trainer_front_sprites.h b/include/trainer_front_sprites.h deleted file mode 100644 index 8855041a5..000000000 --- a/include/trainer_front_sprites.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef GUARD_TRAINER_FRONT_SPRITES_H -#define GUARD_TRAINER_FRONT_SPRITES_H - -#include "global.h" - -enum -{ - TRAINER_FRONT_PIC_HIKER, - TRAINER_FRONT_PIC_AQUA_GRUNT_M, - TRAINER_FRONT_PIC_PKMN_BREEDER_F, - TRAINER_FRONT_PIC_COOLTRAINER_M, - TRAINER_FRONT_PIC_BIRD_KEEPER, - TRAINER_FRONT_PIC_COLLECTOR, - TRAINER_FRONT_PIC_AQUA_GRUNT_F, - TRAINER_FRONT_PIC_SWIMMER_M, - TRAINER_FRONT_PIC_MAGMA_GRUNT_M, - TRAINER_FRONT_PIC_EXPERT_M, - TRAINER_FRONT_PIC_AQUA_ADMIN_M, - TRAINER_FRONT_PIC_BLACK_BELT, - TRAINER_FRONT_PIC_AQUA_ADMIN_F, - TRAINER_FRONT_PIC_AQUA_LEADER, - TRAINER_FRONT_PIC_HEX_MANIAC, - TRAINER_FRONT_PIC_AROMA_LADY, - TRAINER_FRONT_PIC_RUIN_MANIAC, - TRAINER_FRONT_PIC_INTERVIEWER, - TRAINER_FRONT_PIC_TUBER_F, - TRAINER_FRONT_PIC_TUBER_M, - TRAINER_FRONT_PIC_COOLTRAINER_F, - TRAINER_FRONT_PIC_LADY, - TRAINER_FRONT_PIC_BEAUTY, - TRAINER_FRONT_PIC_RICH_BOY, - TRAINER_FRONT_PIC_EXPERT_F, - TRAINER_FRONT_PIC_POKE_MANIAC, - TRAINER_FRONT_PIC_MAGMA_GRUNT_F, - TRAINER_FRONT_PIC_GUITARIST, - TRAINER_FRONT_PIC_KINDLER, - TRAINER_FRONT_PIC_CAMPER, - TRAINER_FRONT_PIC_PICNICKER, - TRAINER_FRONT_PIC_BUG_MANIAC, - TRAINER_FRONT_PIC_PKMN_BREEDER_M, - TRAINER_FRONT_PIC_PSYCHIC_M, - TRAINER_FRONT_PIC_PSYCHIC_F, - TRAINER_FRONT_PIC_GENTLEMAN, - TRAINER_FRONT_PIC_SIDNEY, - TRAINER_FRONT_PIC_PHOEBE, - TRAINER_FRONT_PIC_GLACIA, - TRAINER_FRONT_PIC_DRAKE, - TRAINER_FRONT_PIC_ROXANNE, - TRAINER_FRONT_PIC_BRAWLY, - TRAINER_FRONT_PIC_WATTSON, - TRAINER_FRONT_PIC_FLANNERY, - TRAINER_FRONT_PIC_NORMAN, - TRAINER_FRONT_PIC_WINONA, - TRAINER_FRONT_PIC_TATE_LIZA, - TRAINER_FRONT_PIC_JUAN, - TRAINER_FRONT_PIC_SCHOOL_KID_M, - TRAINER_FRONT_PIC_SCHOOL_KID_F, - TRAINER_FRONT_PIC_SR_JR, - TRAINER_FRONT_PIC_POKéFAN_M, - TRAINER_FRONT_PIC_POKéFAN_F, - TRAINER_FRONT_PIC_YOUNGSTER, - TRAINER_FRONT_PIC_WALLACE, - TRAINER_FRONT_PIC_FISHERMAN, - TRAINER_FRONT_PIC_TRIATHLETE_BIKER_M, - TRAINER_FRONT_PIC_TRIATHLETE_BIKER_F, - TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_M, - TRAINER_FRONT_PIC_TRIATHLETE_JOGGER_F, - TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_M, - TRAINER_FRONT_PIC_TRIATHLETE_SWIMMER_F, - TRAINER_FRONT_PIC_DRAGON_TAMER, - TRAINER_FRONT_PIC_NINJA_BOY, - TRAINER_FRONT_PIC_BATTLE_GIRL, - TRAINER_FRONT_PIC_PARASOL_LADY, - TRAINER_FRONT_PIC_SWIMMER_F, - TRAINER_FRONT_PIC_TWINS, - TRAINER_FRONT_PIC_SAILOR, - TRAINER_FRONT_PIC_MAGMA_ADMIN_M, - TRAINER_FRONT_PIC_WALLY, - TRAINER_FRONT_PIC_BRENDAN_E, - TRAINER_FRONT_PIC_MAY_E, - TRAINER_FRONT_PIC_BUG_CATCHER, - TRAINER_FRONT_PIC_PKMN_RANGER_M, - TRAINER_FRONT_PIC_PKMN_RANGER_F, - TRAINER_FRONT_PIC_MAGMA_LEADER, - TRAINER_FRONT_PIC_LASS, - TRAINER_FRONT_PIC_YOUNG_COUPLE, - TRAINER_FRONT_PIC_OLD_COUPLE, - TRAINER_FRONT_PIC_SIS_AND_BRO, - TRAINER_FRONT_PIC_STEVEN, - TRAINER_FRONT_PIC_ANABEL, - TRAINER_FRONT_PIC_TUCKER, - TRAINER_FRONT_PIC_SPENSER, - TRAINER_FRONT_PIC_GRETA, - TRAINER_FRONT_PIC_NOLAND, - TRAINER_FRONT_PIC_LUCY, - TRAINER_FRONT_PIC_BRANDON, - TRAINER_FRONT_PIC_RED, - TRAINER_FRONT_PIC_LEAF, - TRAINER_FRONT_PIC_BRENDAN_RS, - TRAINER_FRONT_PIC_MAY_RS -}; - -#endif // GUARD_TRAINER_FRONT_SPRITES_H diff --git a/include/trainer_slide.h b/include/trainer_slide.h index 19fdf7c24..7ff0bca66 100644 --- a/include/trainer_slide.h +++ b/include/trainer_slide.h @@ -6,20 +6,21 @@ struct MessageStatus { - u8 messageInitalized[TRAINER_SLIDE_ARRAY_SIZE]; - u8 messagePlayed[TRAINER_SLIDE_ARRAY_SIZE]; + u8 messageInitalized[MAX_BATTLERS_COUNT][TRAINER_SLIDE_ARRAY_SIZE]; + u8 messagePlayed[MAX_BATTLERS_COUNT][TRAINER_SLIDE_ARRAY_SIZE]; }; void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId); -void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType); +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, enum Type moveType); void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target); void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target); void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target); void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target); -bool32 IsTrainerSlideInitialized(enum TrainerSlideType slideId); -bool32 IsTrainerSlidePlayed(enum TrainerSlideType slideId); -void InitalizeTrainerSlide(enum TrainerSlideType slideId); -void MarkTrainerSlideAsPlayed(enum TrainerSlideType slideId); +bool32 IsTrainerSlideInitialized(u32 battler, enum TrainerSlideType slideId); +bool32 IsTrainerSlidePlayed(u32 battler, enum TrainerSlideType slideId); +void InitalizeTrainerSlide(u32 battler, enum TrainerSlideType slideId); +void MarkTrainerSlideAsPlayed(u32 battler, enum TrainerSlideType slideId); +void MarkInitializedTrainerSlidesAsPlayed(u32 battler, enum TrainerSlideType slideId); #endif // GUARD_TRAINER_SLIDE_H diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 7f1c49e55..10e3fd0b8 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -59,7 +59,6 @@ extern bool8 gIsSurfingEncounter; extern u16 gChainFishingDexNavStreak; void DisableWildEncounters(bool8 disabled); -u8 PickWildMonNature(void); bool8 StandardWildEncounter(u32 currMetatileAttrs, u16 previousMetaTileBehavior); bool8 SweetScentWildEncounter(void); bool8 DoesCurrentMapHaveFishingMons(void); @@ -68,7 +67,6 @@ u16 GetLocalWildMon(bool8 *isWaterMon); u16 GetLocalWaterMon(void); bool8 UpdateRepelCounter(void); void DisableWildEncounters(bool8 state); -u8 GetUnownLetterByPersonalityLoByte(u32 personality); bool8 SweetScentWildEncounter(void); void SeedWildEncounterRng(u16 randVal); void ResetEncounterRateModifiers(void); diff --git a/sound/cry_tables.inc b/sound/cry_tables.inc index 050fdac57..60207bc2e 100644 --- a/sound/cry_tables.inc +++ b/sound/cry_tables.inc @@ -5,26 +5,26 @@ gCryTable:: cry Cry_Bulbasaur cry Cry_Ivysaur cry Cry_Venusaur -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_VenusaurMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BULBASAUR .if P_FAMILY_CHARMANDER == TRUE cry Cry_Charmander cry Cry_Charmeleon cry Cry_Charizard -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_CharizardMegaX cry Cry_CharizardMegaY -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHARMANDER .if P_FAMILY_SQUIRTLE == TRUE cry Cry_Squirtle cry Cry_Wartortle cry Cry_Blastoise -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_BlastoiseMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SQUIRTLE .if P_FAMILY_CATERPIE == TRUE cry Cry_Caterpie @@ -35,17 +35,17 @@ gCryTable:: cry Cry_Weedle cry Cry_Kakuna cry Cry_Beedrill -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_BeedrillMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WEEDLE .if P_FAMILY_PIDGEY == TRUE cry Cry_Pidgey cry Cry_Pidgeotto cry Cry_Pidgeot -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_PidgeotMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIDGEY .if P_FAMILY_RATTATA == TRUE cry Cry_Rattata @@ -65,6 +65,10 @@ gCryTable:: .endif @ P_GEN_2_CROSS_EVOS cry Cry_Pikachu cry Cry_Raichu +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_RaichuMegaX + cry Cry_RaichuMegaY +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIKACHU .if P_FAMILY_SANDSHREW == TRUE cry Cry_Sandshrew @@ -84,6 +88,9 @@ gCryTable:: .endif @ P_GEN_2_CROSS_EVOS cry Cry_Clefairy cry Cry_Clefable +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ClefableMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CLEFAIRY .if P_FAMILY_VULPIX == TRUE cry Cry_Vulpix @@ -157,9 +164,9 @@ gCryTable:: cry Cry_Abra cry Cry_Kadabra cry Cry_Alakazam -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AlakazamMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABRA .if P_FAMILY_MACHOP == TRUE cry Cry_Machop @@ -170,6 +177,9 @@ gCryTable:: cry Cry_Bellsprout cry Cry_Weepinbell cry Cry_Victreebel +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_VictreebelMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELLSPROUT .if P_FAMILY_TENTACOOL == TRUE cry Cry_Tentacool @@ -190,9 +200,9 @@ gCryTable:: .if P_GEN_2_CROSS_EVOS == TRUE cry Cry_Slowking .endif @ P_GEN_2_CROSS_EVOS -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SlowbroMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GALARIAN_FORMS == TRUE cry Cry_SlowpokeGalar .endif @ P_GALARIAN_FORMS @@ -230,17 +240,17 @@ gCryTable:: cry Cry_Gastly cry Cry_Haunter cry Cry_Gengar -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GengarMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GASTLY .if P_FAMILY_ONIX == TRUE cry Cry_Onix .if P_GEN_2_CROSS_EVOS == TRUE cry Cry_Steelix -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SteelixMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .endif @ P_FAMILY_ONIX .if P_FAMILY_DROWZEE == TRUE @@ -307,9 +317,9 @@ gCryTable:: .endif @ P_FAMILY_TANGELA .if P_FAMILY_KANGASKHAN == TRUE cry Cry_Kangaskhan -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_KangaskhanMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_KANGASKHAN .if P_FAMILY_HORSEA == TRUE cry Cry_Horsea @@ -325,6 +335,9 @@ gCryTable:: .if P_FAMILY_STARYU == TRUE cry Cry_Staryu cry Cry_Starmie +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_StarmieMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARYU .if P_FAMILY_MR_MIME == TRUE .if P_GEN_4_CROSS_EVOS == TRUE @@ -339,9 +352,9 @@ gCryTable:: cry Cry_Scyther .if P_GEN_2_CROSS_EVOS == TRUE cry Cry_Scizor -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_ScizorMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .if P_GEN_8_CROSS_EVOS == TRUE cry Cry_Kleavor @@ -373,9 +386,9 @@ gCryTable:: .endif @ P_FAMILY_MAGMAR .if P_FAMILY_PINSIR == TRUE cry Cry_Pinsir -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_PinsirMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PINSIR .if P_FAMILY_TAUROS == TRUE cry Cry_Tauros @@ -383,9 +396,9 @@ gCryTable:: .if P_FAMILY_MAGIKARP == TRUE cry Cry_Magikarp cry Cry_Gyarados -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GyaradosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGIKARP .if P_FAMILY_LAPRAS == TRUE cry Cry_Lapras @@ -410,8 +423,8 @@ gCryTable:: cry Cry_Sylveon .endif @ P_GEN_6_CROSS_EVOS .endif @ P_FAMILY_EEVEE -.if P_FAMILY_PORYGON == TRUE cry Cry_Porygon +.if P_FAMILY_PORYGON == TRUE .if P_GEN_2_CROSS_EVOS == TRUE cry Cry_Porygon2 .if P_GEN_4_CROSS_EVOS == TRUE @@ -429,9 +442,9 @@ gCryTable:: .endif @ P_FAMILY_KABUTO .if P_FAMILY_AERODACTYL == TRUE cry Cry_Aerodactyl -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AerodactylMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AERODACTYL .if P_FAMILY_SNORLAX == TRUE .if P_GEN_4_CROSS_EVOS == TRUE @@ -452,13 +465,16 @@ gCryTable:: cry Cry_Dratini cry Cry_Dragonair cry Cry_Dragonite +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_DragoniteMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRATINI .if P_FAMILY_MEWTWO == TRUE cry Cry_Mewtwo -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_MewtwoMegaX cry Cry_MewtwoMegaY -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEWTWO .if P_FAMILY_MEW == TRUE cry Cry_Mew @@ -467,6 +483,9 @@ gCryTable:: cry Cry_Chikorita cry Cry_Bayleef cry Cry_Meganium +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_MeganiumMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIKORITA .if P_FAMILY_CYNDAQUIL == TRUE cry Cry_Cyndaquil @@ -477,6 +496,9 @@ gCryTable:: cry Cry_Totodile cry Cry_Croconaw cry Cry_Feraligatr +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_FeraligatrMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TOTODILE .if P_FAMILY_SENTRET == TRUE cry Cry_Sentret @@ -513,9 +535,9 @@ gCryTable:: cry Cry_Mareep cry Cry_Flaaffy cry Cry_Ampharos -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AmpharosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAREEP .if P_FAMILY_MARILL == TRUE .if P_GEN_3_CROSS_EVOS == TRUE @@ -608,9 +630,9 @@ gCryTable:: .endif @ P_FAMILY_SHUCKLE .if P_FAMILY_HERACROSS == TRUE cry Cry_Heracross -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_HeracrossMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HERACROSS .if P_FAMILY_SNEASEL == TRUE cry Cry_Sneasel @@ -626,6 +648,7 @@ gCryTable:: cry Cry_Ursaring .if P_GEN_8_CROSS_EVOS == TRUE cry Cry_Ursaluna + cry Cry_UrsalunaBloodmoon .endif @ P_GEN_8_CROSS_EVOS .endif @ P_FAMILY_TEDDIURSA .if P_FAMILY_SLUGMA == TRUE @@ -660,13 +683,16 @@ gCryTable:: .endif @ P_FAMILY_MANTINE .if P_FAMILY_SKARMORY == TRUE cry Cry_Skarmory +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_SkarmoryMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKARMORY .if P_FAMILY_HOUNDOUR == TRUE cry Cry_Houndour cry Cry_Houndoom -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_HoundoomMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HOUNDOUR .if P_FAMILY_PHANPY == TRUE cry Cry_Phanpy @@ -697,9 +723,9 @@ gCryTable:: cry Cry_Larvitar cry Cry_Pupitar cry Cry_Tyranitar -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_TyranitarMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LARVITAR .if P_FAMILY_LUGIA == TRUE cry Cry_Lugia @@ -714,25 +740,25 @@ gCryTable:: cry Cry_Treecko cry Cry_Grovyle cry Cry_Sceptile -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SceptileMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TREECKO .if P_FAMILY_TORCHIC == TRUE cry Cry_Torchic cry Cry_Combusken cry Cry_Blaziken -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_BlazikenMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TORCHIC .if P_FAMILY_MUDKIP == TRUE cry Cry_Mudkip cry Cry_Marshtomp cry Cry_Swampert -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SwampertMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MUDKIP .if P_FAMILY_POOCHYENA == TRUE cry Cry_Poochyena @@ -774,14 +800,14 @@ gCryTable:: cry Cry_Ralts cry Cry_Kirlia cry Cry_Gardevoir -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GardevoirMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE cry Cry_Gallade -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GalladeMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_RALTS .if P_FAMILY_SURSKIT == TRUE @@ -823,37 +849,37 @@ gCryTable:: .endif @ P_FAMILY_SKITTY .if P_FAMILY_SABLEYE == TRUE cry Cry_Sableye -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SableyeMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SABLEYE .if P_FAMILY_MAWILE == TRUE cry Cry_Mawile -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_MawileMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAWILE .if P_FAMILY_ARON == TRUE cry Cry_Aron cry Cry_Lairon cry Cry_Aggron -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AggronMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ARON .if P_FAMILY_MEDITITE == TRUE cry Cry_Meditite cry Cry_Medicham -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_MedichamMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEDITITE .if P_FAMILY_ELECTRIKE == TRUE cry Cry_Electrike cry Cry_Manectric -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_ManectricMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ELECTRIKE .if P_FAMILY_PLUSLE == TRUE cry Cry_Plusle @@ -881,9 +907,9 @@ gCryTable:: .if P_FAMILY_CARVANHA == TRUE cry Cry_Carvanha cry Cry_Sharpedo -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SharpedoMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CARVANHA .if P_FAMILY_WAILMER == TRUE cry Cry_Wailmer @@ -892,9 +918,9 @@ gCryTable:: .if P_FAMILY_NUMEL == TRUE cry Cry_Numel cry Cry_Camerupt -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_CameruptMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_NUMEL .if P_FAMILY_TORKOAL == TRUE cry Cry_Torkoal @@ -918,9 +944,9 @@ gCryTable:: .if P_FAMILY_SWABLU == TRUE cry Cry_Swablu cry Cry_Altaria -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AltariaMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SWABLU .if P_FAMILY_ZANGOOSE == TRUE cry Cry_Zangoose @@ -967,9 +993,9 @@ gCryTable:: .if P_FAMILY_SHUPPET == TRUE cry Cry_Shuppet cry Cry_Banette -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_BanetteMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SHUPPET .if P_FAMILY_DUSKULL == TRUE cry Cry_Duskull @@ -986,21 +1012,28 @@ gCryTable:: cry Cry_Chingling .endif @ P_GEN_4_CROSS_EVOS cry Cry_Chimecho +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ChimechoMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIMECHO .if P_FAMILY_ABSOL == TRUE cry Cry_Absol -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AbsolMega -.endif @ P_MEGA_EVOLUTIONS + cry Cry_AbsolMegaZ +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABSOL .if P_FAMILY_SNORUNT == TRUE cry Cry_Snorunt cry Cry_Glalie -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GlalieMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE cry Cry_Froslass +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_FroslassMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_SNORUNT .if P_FAMILY_SPHEAL == TRUE @@ -1023,17 +1056,17 @@ gCryTable:: cry Cry_Bagon cry Cry_Shelgon cry Cry_Salamence -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_SalamenceMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BAGON .if P_FAMILY_BELDUM == TRUE cry Cry_Beldum cry Cry_Metang cry Cry_Metagross -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_MetagrossMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELDUM .if P_FAMILY_REGIROCK == TRUE cry Cry_Regirock @@ -1046,15 +1079,15 @@ gCryTable:: .endif @ P_FAMILY_REGISTEEL .if P_FAMILY_LATIAS == TRUE cry Cry_Latias -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_LatiasMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIAS .if P_FAMILY_LATIOS == TRUE cry Cry_Latios -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_LatiosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIOS .if P_FAMILY_KYOGRE == TRUE cry Cry_Kyogre @@ -1070,9 +1103,9 @@ gCryTable:: .endif @ P_FAMILY_GROUDON .if P_FAMILY_RAYQUAZA == TRUE cry Cry_Rayquaza -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_RayquazaMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RAYQUAZA .if P_FAMILY_JIRACHI == TRUE cry Cry_Jirachi @@ -1099,6 +1132,9 @@ gCryTable:: cry Cry_Starly cry Cry_Staravia cry Cry_Staraptor +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_StaraptorMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARLY .if P_FAMILY_BIDOOF == TRUE cry Cry_Bidoof @@ -1152,9 +1188,9 @@ gCryTable:: .if P_FAMILY_BUNEARY == TRUE cry Cry_Buneary cry Cry_Lopunny -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_LopunnyMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BUNEARY .if P_FAMILY_GLAMEOW == TRUE cry Cry_Glameow @@ -1178,16 +1214,17 @@ gCryTable:: cry Cry_Gible cry Cry_Gabite cry Cry_Garchomp -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_GarchompMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GIBLE .if P_FAMILY_RIOLU == TRUE cry Cry_Riolu cry Cry_Lucario -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_LucarioMega -.endif @ P_MEGA_EVOLUTIONS + cry Cry_LucarioMegaZ +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RIOLU .if P_FAMILY_HIPPOPOTAS == TRUE cry Cry_Hippopotas @@ -1211,9 +1248,9 @@ gCryTable:: .if P_FAMILY_SNOVER == TRUE cry Cry_Snover cry Cry_Abomasnow -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AbomasnowMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SNOVER .if P_FAMILY_ROTOM == TRUE cry Cry_Rotom @@ -1235,6 +1272,9 @@ gCryTable:: .endif @ P_FAMILY_PALKIA .if P_FAMILY_HEATRAN == TRUE cry Cry_Heatran +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_HeatranMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HEATRAN .if P_FAMILY_REGIGIGAS == TRUE cry Cry_Regigigas @@ -1251,6 +1291,9 @@ gCryTable:: .endif @ P_FAMILY_MANAPHY .if P_FAMILY_DARKRAI == TRUE cry Cry_Darkrai +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_DarkraiMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DARKRAI .if P_FAMILY_SHAYMIN == TRUE cry Cry_ShayminLand @@ -1271,6 +1314,9 @@ gCryTable:: cry Cry_Tepig cry Cry_Pignite cry Cry_Emboar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_EmboarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TEPIG .if P_FAMILY_OSHAWOTT == TRUE cry Cry_Oshawott @@ -1327,12 +1373,15 @@ gCryTable:: .if P_FAMILY_DRILBUR == TRUE cry Cry_Drilbur cry Cry_Excadrill +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ExcadrillMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRILBUR .if P_FAMILY_AUDINO == TRUE cry Cry_Audino -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_AudinoMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AUDINO .if P_FAMILY_TIMBURR == TRUE cry Cry_Timburr @@ -1359,6 +1408,9 @@ gCryTable:: cry Cry_Venipede cry Cry_Whirlipede cry Cry_Scolipede +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ScolipedeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_VENIPEDE .if P_FAMILY_COTTONEE == TRUE cry Cry_Cottonee @@ -1393,6 +1445,9 @@ gCryTable:: .if P_FAMILY_SCRAGGY == TRUE cry Cry_Scraggy cry Cry_Scrafty +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ScraftyMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SCRAGGY .if P_FAMILY_SIGILYPH == TRUE cry Cry_Sigilyph @@ -1482,6 +1537,9 @@ gCryTable:: cry Cry_Tynamo cry Cry_Eelektrik cry Cry_Eelektross +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_EelektrossMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TYNAMO .if P_FAMILY_ELGYEM == TRUE cry Cry_Elgyem @@ -1491,6 +1549,9 @@ gCryTable:: cry Cry_Litwick cry Cry_Lampent cry Cry_Chandelure +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ChandelureMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITWICK .if P_FAMILY_AXEW == TRUE cry Cry_Axew @@ -1521,6 +1582,9 @@ gCryTable:: .if P_FAMILY_GOLETT == TRUE cry Cry_Golett cry Cry_Golurk +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_GolurkMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GOLETT .if P_FAMILY_PAWNIARD == TRUE cry Cry_Pawniard @@ -1602,16 +1666,25 @@ gCryTable:: cry Cry_Chespin cry Cry_Quilladin cry Cry_Chesnaught +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ChesnaughtMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHESPIN .if P_FAMILY_FENNEKIN == TRUE cry Cry_Fennekin cry Cry_Braixen cry Cry_Delphox +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_DelphoxMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FENNEKIN .if P_FAMILY_FROAKIE == TRUE cry Cry_Froakie cry Cry_Frogadier cry Cry_Greninja +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_GreninjaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FROAKIE .if P_FAMILY_BUNNELBY == TRUE cry Cry_Bunnelby @@ -1630,11 +1703,17 @@ gCryTable:: .if P_FAMILY_LITLEO == TRUE cry Cry_Litleo cry Cry_Pyroar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_PyroarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITLEO .if P_FAMILY_FLABEBE == TRUE cry Cry_Flabebe cry Cry_Floette cry Cry_FloetteEternal +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_FloetteMega +.endif @ P_MODIFIED_MEGA_CRIES cry Cry_Florges .endif @ P_FAMILY_FLABEBE .if P_FAMILY_SKIDDO == TRUE @@ -1651,6 +1730,9 @@ gCryTable:: .if P_FAMILY_ESPURR == TRUE cry Cry_Espurr cry Cry_Meowstic +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_MeowsticMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ESPURR .if P_FAMILY_HONEDGE == TRUE cry Cry_Honedge @@ -1668,14 +1750,23 @@ gCryTable:: .if P_FAMILY_INKAY == TRUE cry Cry_Inkay cry Cry_Malamar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_MalamarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_INKAY .if P_FAMILY_BINACLE == TRUE cry Cry_Binacle cry Cry_Barbaracle +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_BarbaracleMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BINACLE .if P_FAMILY_SKRELP == TRUE cry Cry_Skrelp cry Cry_Dragalge +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_DragalgeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKRELP .if P_FAMILY_CLAUNCHER == TRUE cry Cry_Clauncher @@ -1695,6 +1786,9 @@ gCryTable:: .endif @ P_FAMILY_AMAURA .if P_FAMILY_HAWLUCHA == TRUE cry Cry_Hawlucha +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_HawluchaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HAWLUCHA .if P_FAMILY_DEDENNE == TRUE cry Cry_Dedenne @@ -1738,12 +1832,15 @@ gCryTable:: cry Cry_Zygarde50 cry Cry_Zygarde10 cry Cry_ZygardeComplete +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ZygardeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZYGARDE .if P_FAMILY_DIANCIE == TRUE cry Cry_Diancie -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry Cry_DiancieMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DIANCIE .if P_FAMILY_HOOPA == TRUE cry Cry_HoopaConfined @@ -1784,6 +1881,9 @@ gCryTable:: .if P_FAMILY_CRABRAWLER == TRUE cry Cry_Crabrawler cry Cry_Crabominable +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_CrabominableMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CRABRAWLER .if P_FAMILY_ORICORIO == TRUE cry Cry_OricorioBaile @@ -1850,6 +1950,9 @@ gCryTable:: .if P_FAMILY_WIMPOD == TRUE cry Cry_Wimpod cry Cry_Golisopod +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_GolisopodMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WIMPOD .if P_FAMILY_SANDYGAST == TRUE cry Cry_Sandygast @@ -1882,6 +1985,9 @@ gCryTable:: .endif @ P_FAMILY_BRUXISH .if P_FAMILY_DRAMPA == TRUE cry Cry_Drampa +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_DrampaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRAMPA .if P_FAMILY_DHELMISE == TRUE cry Cry_Dhelmise @@ -1942,6 +2048,9 @@ gCryTable:: .endif @ P_FAMILY_NECROZMA .if P_FAMILY_MAGEARNA == TRUE cry Cry_Magearna +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_MagearnaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGEARNA .if P_FAMILY_MARSHADOW == TRUE cry Cry_Marshadow @@ -1958,6 +2067,9 @@ gCryTable:: .endif @ P_FAMILY_BLACEPHALON .if P_FAMILY_ZERAORA == TRUE cry Cry_Zeraora +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ZeraoraMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZERAORA .if P_FAMILY_MELTAN == TRUE cry Cry_Meltan @@ -2032,6 +2144,7 @@ gCryTable:: .endif @ P_FAMILY_SILICOBRA .if P_FAMILY_CRAMORANT == TRUE cry Cry_Cramorant + cry Cry_CramorantGulping .endif @ P_FAMILY_CRAMORANT .if P_FAMILY_ARROKUDA == TRUE cry Cry_Arrokuda @@ -2070,6 +2183,9 @@ gCryTable:: .endif @ P_FAMILY_MILCERY .if P_FAMILY_FALINKS == TRUE cry Cry_Falinks +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_FalinksMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FALINKS .if P_FAMILY_PINCURCHIN == TRUE cry Cry_Pincurchin @@ -2253,6 +2369,9 @@ gCryTable:: .if P_FAMILY_CAPSAKID == TRUE cry Cry_Capsakid cry Cry_Scovillain +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_ScovillainMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CAPSAKID .if P_FAMILY_RELLOR == TRUE cry Cry_Rellor @@ -2292,6 +2411,9 @@ gCryTable:: .if P_FAMILY_GLIMMET == TRUE cry Cry_Glimmet cry Cry_Glimmora +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_GlimmoraMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GLIMMET .if P_FAMILY_GREAVARD == TRUE cry Cry_Greavard @@ -2314,6 +2436,9 @@ gCryTable:: cry Cry_TatsugiriCurly cry Cry_TatsugiriDroopy cry Cry_TatsugiriStretchy +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_TatsugiriMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TATSUGIRI .if P_FAMILY_GREAT_TUSK == TRUE cry Cry_GreatTusk @@ -2355,6 +2480,9 @@ gCryTable:: cry Cry_Frigibax cry Cry_Arctibax cry Cry_Baxcalibur +.if P_MODIFIED_MEGA_CRIES == TRUE + cry Cry_BaxcaliburMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FRIGIBAX .if P_FAMILY_GIMMIGHOUL == TRUE cry Cry_Gimmighoul @@ -2433,26 +2561,26 @@ gCryTable_Reverse:: cry_reverse Cry_Bulbasaur cry_reverse Cry_Ivysaur cry_reverse Cry_Venusaur -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_VenusaurMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BULBASAUR .if P_FAMILY_CHARMANDER == TRUE cry_reverse Cry_Charmander cry_reverse Cry_Charmeleon cry_reverse Cry_Charizard -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_CharizardMegaX cry_reverse Cry_CharizardMegaY -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHARMANDER .if P_FAMILY_SQUIRTLE == TRUE cry_reverse Cry_Squirtle cry_reverse Cry_Wartortle cry_reverse Cry_Blastoise -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_BlastoiseMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SQUIRTLE .if P_FAMILY_CATERPIE == TRUE cry_reverse Cry_Caterpie @@ -2463,17 +2591,17 @@ gCryTable_Reverse:: cry_reverse Cry_Weedle cry_reverse Cry_Kakuna cry_reverse Cry_Beedrill -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_BeedrillMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WEEDLE .if P_FAMILY_PIDGEY == TRUE cry_reverse Cry_Pidgey cry_reverse Cry_Pidgeotto cry_reverse Cry_Pidgeot -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_PidgeotMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIDGEY .if P_FAMILY_RATTATA == TRUE cry_reverse Cry_Rattata @@ -2493,6 +2621,10 @@ gCryTable_Reverse:: .endif @ P_GEN_2_CROSS_EVOS cry_reverse Cry_Pikachu cry_reverse Cry_Raichu +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_RaichuMegaX + cry_reverse Cry_RaichuMegaY +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIKACHU .if P_FAMILY_SANDSHREW == TRUE cry_reverse Cry_Sandshrew @@ -2512,6 +2644,9 @@ gCryTable_Reverse:: .endif @ P_GEN_2_CROSS_EVOS cry_reverse Cry_Clefairy cry_reverse Cry_Clefable +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ClefableMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CLEFAIRY .if P_FAMILY_VULPIX == TRUE cry_reverse Cry_Vulpix @@ -2585,9 +2720,9 @@ gCryTable_Reverse:: cry_reverse Cry_Abra cry_reverse Cry_Kadabra cry_reverse Cry_Alakazam -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AlakazamMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABRA .if P_FAMILY_MACHOP == TRUE cry_reverse Cry_Machop @@ -2598,6 +2733,9 @@ gCryTable_Reverse:: cry_reverse Cry_Bellsprout cry_reverse Cry_Weepinbell cry_reverse Cry_Victreebel +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_VictreebelMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELLSPROUT .if P_FAMILY_TENTACOOL == TRUE cry_reverse Cry_Tentacool @@ -2618,9 +2756,9 @@ gCryTable_Reverse:: .if P_GEN_2_CROSS_EVOS == TRUE cry_reverse Cry_Slowking .endif @ P_GEN_2_CROSS_EVOS -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SlowbroMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GALARIAN_FORMS == TRUE cry_reverse Cry_SlowpokeGalar .endif @ P_GALARIAN_FORMS @@ -2658,17 +2796,17 @@ gCryTable_Reverse:: cry_reverse Cry_Gastly cry_reverse Cry_Haunter cry_reverse Cry_Gengar -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GengarMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GASTLY .if P_FAMILY_ONIX == TRUE cry_reverse Cry_Onix .if P_GEN_2_CROSS_EVOS == TRUE cry_reverse Cry_Steelix -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SteelixMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .endif @ P_FAMILY_ONIX .if P_FAMILY_DROWZEE == TRUE @@ -2735,9 +2873,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_TANGELA .if P_FAMILY_KANGASKHAN == TRUE cry_reverse Cry_Kangaskhan -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_KangaskhanMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_KANGASKHAN .if P_FAMILY_HORSEA == TRUE cry_reverse Cry_Horsea @@ -2753,6 +2891,9 @@ gCryTable_Reverse:: .if P_FAMILY_STARYU == TRUE cry_reverse Cry_Staryu cry_reverse Cry_Starmie +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_StarmieMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARYU .if P_FAMILY_MR_MIME == TRUE .if P_GEN_4_CROSS_EVOS == TRUE @@ -2767,9 +2908,9 @@ gCryTable_Reverse:: cry_reverse Cry_Scyther .if P_GEN_2_CROSS_EVOS == TRUE cry_reverse Cry_Scizor -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_ScizorMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .if P_GEN_8_CROSS_EVOS == TRUE cry_reverse Cry_Kleavor @@ -2801,9 +2942,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_MAGMAR .if P_FAMILY_PINSIR == TRUE cry_reverse Cry_Pinsir -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_PinsirMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PINSIR .if P_FAMILY_TAUROS == TRUE cry_reverse Cry_Tauros @@ -2811,9 +2952,9 @@ gCryTable_Reverse:: .if P_FAMILY_MAGIKARP == TRUE cry_reverse Cry_Magikarp cry_reverse Cry_Gyarados -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GyaradosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGIKARP .if P_FAMILY_LAPRAS == TRUE cry_reverse Cry_Lapras @@ -2857,9 +2998,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_KABUTO .if P_FAMILY_AERODACTYL == TRUE cry_reverse Cry_Aerodactyl -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AerodactylMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AERODACTYL .if P_FAMILY_SNORLAX == TRUE .if P_GEN_4_CROSS_EVOS == TRUE @@ -2880,13 +3021,16 @@ gCryTable_Reverse:: cry_reverse Cry_Dratini cry_reverse Cry_Dragonair cry_reverse Cry_Dragonite +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_DragoniteMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRATINI .if P_FAMILY_MEWTWO == TRUE cry_reverse Cry_Mewtwo -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_MewtwoMegaX cry_reverse Cry_MewtwoMegaY -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEWTWO .if P_FAMILY_MEW == TRUE cry_reverse Cry_Mew @@ -2895,6 +3039,9 @@ gCryTable_Reverse:: cry_reverse Cry_Chikorita cry_reverse Cry_Bayleef cry_reverse Cry_Meganium +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_MeganiumMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIKORITA .if P_FAMILY_CYNDAQUIL == TRUE cry_reverse Cry_Cyndaquil @@ -2905,6 +3052,9 @@ gCryTable_Reverse:: cry_reverse Cry_Totodile cry_reverse Cry_Croconaw cry_reverse Cry_Feraligatr +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_FeraligatrMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TOTODILE .if P_FAMILY_SENTRET == TRUE cry_reverse Cry_Sentret @@ -2941,9 +3091,9 @@ gCryTable_Reverse:: cry_reverse Cry_Mareep cry_reverse Cry_Flaaffy cry_reverse Cry_Ampharos -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AmpharosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAREEP .if P_FAMILY_MARILL == TRUE .if P_GEN_3_CROSS_EVOS == TRUE @@ -3036,9 +3186,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_SHUCKLE .if P_FAMILY_HERACROSS == TRUE cry_reverse Cry_Heracross -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_HeracrossMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HERACROSS .if P_FAMILY_SNEASEL == TRUE cry_reverse Cry_Sneasel @@ -3054,6 +3204,7 @@ gCryTable_Reverse:: cry_reverse Cry_Ursaring .if P_GEN_8_CROSS_EVOS == TRUE cry_reverse Cry_Ursaluna + cry_reverse Cry_UrsalunaBloodmoon .endif @ P_GEN_8_CROSS_EVOS .endif @ P_FAMILY_TEDDIURSA .if P_FAMILY_SLUGMA == TRUE @@ -3088,13 +3239,16 @@ gCryTable_Reverse:: .endif @ P_FAMILY_MANTINE .if P_FAMILY_SKARMORY == TRUE cry_reverse Cry_Skarmory +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_SkarmoryMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKARMORY .if P_FAMILY_HOUNDOUR == TRUE cry_reverse Cry_Houndour cry_reverse Cry_Houndoom -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_HoundoomMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HOUNDOUR .if P_FAMILY_PHANPY == TRUE cry_reverse Cry_Phanpy @@ -3125,9 +3279,9 @@ gCryTable_Reverse:: cry_reverse Cry_Larvitar cry_reverse Cry_Pupitar cry_reverse Cry_Tyranitar -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_TyranitarMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LARVITAR .if P_FAMILY_LUGIA == TRUE cry_reverse Cry_Lugia @@ -3142,25 +3296,25 @@ gCryTable_Reverse:: cry_reverse Cry_Treecko cry_reverse Cry_Grovyle cry_reverse Cry_Sceptile -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SceptileMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TREECKO .if P_FAMILY_TORCHIC == TRUE cry_reverse Cry_Torchic cry_reverse Cry_Combusken cry_reverse Cry_Blaziken -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_BlazikenMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TORCHIC .if P_FAMILY_MUDKIP == TRUE cry_reverse Cry_Mudkip cry_reverse Cry_Marshtomp cry_reverse Cry_Swampert -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SwampertMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MUDKIP .if P_FAMILY_POOCHYENA == TRUE cry_reverse Cry_Poochyena @@ -3202,14 +3356,14 @@ gCryTable_Reverse:: cry_reverse Cry_Ralts cry_reverse Cry_Kirlia cry_reverse Cry_Gardevoir -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GardevoirMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE cry_reverse Cry_Gallade -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GalladeMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_RALTS .if P_FAMILY_SURSKIT == TRUE @@ -3251,37 +3405,37 @@ gCryTable_Reverse:: .endif @ P_FAMILY_SKITTY .if P_FAMILY_SABLEYE == TRUE cry_reverse Cry_Sableye -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SableyeMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SABLEYE .if P_FAMILY_MAWILE == TRUE cry_reverse Cry_Mawile -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_MawileMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAWILE .if P_FAMILY_ARON == TRUE cry_reverse Cry_Aron cry_reverse Cry_Lairon cry_reverse Cry_Aggron -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AggronMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ARON .if P_FAMILY_MEDITITE == TRUE cry_reverse Cry_Meditite cry_reverse Cry_Medicham -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_MedichamMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEDITITE .if P_FAMILY_ELECTRIKE == TRUE cry_reverse Cry_Electrike cry_reverse Cry_Manectric -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_ManectricMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ELECTRIKE .if P_FAMILY_PLUSLE == TRUE cry_reverse Cry_Plusle @@ -3309,9 +3463,9 @@ gCryTable_Reverse:: .if P_FAMILY_CARVANHA == TRUE cry_reverse Cry_Carvanha cry_reverse Cry_Sharpedo -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SharpedoMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CARVANHA .if P_FAMILY_WAILMER == TRUE cry_reverse Cry_Wailmer @@ -3320,9 +3474,9 @@ gCryTable_Reverse:: .if P_FAMILY_NUMEL == TRUE cry_reverse Cry_Numel cry_reverse Cry_Camerupt -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_CameruptMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_NUMEL .if P_FAMILY_TORKOAL == TRUE cry_reverse Cry_Torkoal @@ -3346,9 +3500,9 @@ gCryTable_Reverse:: .if P_FAMILY_SWABLU == TRUE cry_reverse Cry_Swablu cry_reverse Cry_Altaria -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AltariaMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SWABLU .if P_FAMILY_ZANGOOSE == TRUE cry_reverse Cry_Zangoose @@ -3395,9 +3549,9 @@ gCryTable_Reverse:: .if P_FAMILY_SHUPPET == TRUE cry_reverse Cry_Shuppet cry_reverse Cry_Banette -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_BanetteMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SHUPPET .if P_FAMILY_DUSKULL == TRUE cry_reverse Cry_Duskull @@ -3414,21 +3568,28 @@ gCryTable_Reverse:: cry_reverse Cry_Chingling .endif @ P_GEN_4_CROSS_EVOS cry_reverse Cry_Chimecho +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ChimechoMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIMECHO .if P_FAMILY_ABSOL == TRUE cry_reverse Cry_Absol -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AbsolMega -.endif @ P_MEGA_EVOLUTIONS + cry_reverse Cry_AbsolMegaZ +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABSOL .if P_FAMILY_SNORUNT == TRUE cry_reverse Cry_Snorunt cry_reverse Cry_Glalie -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GlalieMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE cry_reverse Cry_Froslass +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_FroslassMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_SNORUNT .if P_FAMILY_SPHEAL == TRUE @@ -3451,17 +3612,17 @@ gCryTable_Reverse:: cry_reverse Cry_Bagon cry_reverse Cry_Shelgon cry_reverse Cry_Salamence -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_SalamenceMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BAGON .if P_FAMILY_BELDUM == TRUE cry_reverse Cry_Beldum cry_reverse Cry_Metang cry_reverse Cry_Metagross -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_MetagrossMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELDUM .if P_FAMILY_REGIROCK == TRUE cry_reverse Cry_Regirock @@ -3474,15 +3635,15 @@ gCryTable_Reverse:: .endif @ P_FAMILY_REGISTEEL .if P_FAMILY_LATIAS == TRUE cry_reverse Cry_Latias -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_LatiasMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIAS .if P_FAMILY_LATIOS == TRUE cry_reverse Cry_Latios -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_LatiosMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIOS .if P_FAMILY_KYOGRE == TRUE cry_reverse Cry_Kyogre @@ -3498,9 +3659,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_GROUDON .if P_FAMILY_RAYQUAZA == TRUE cry_reverse Cry_Rayquaza -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_RayquazaMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RAYQUAZA .if P_FAMILY_JIRACHI == TRUE cry_reverse Cry_Jirachi @@ -3527,6 +3688,9 @@ gCryTable_Reverse:: cry_reverse Cry_Starly cry_reverse Cry_Staravia cry_reverse Cry_Staraptor +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_StaraptorMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARLY .if P_FAMILY_BIDOOF == TRUE cry_reverse Cry_Bidoof @@ -3580,9 +3744,9 @@ gCryTable_Reverse:: .if P_FAMILY_BUNEARY == TRUE cry_reverse Cry_Buneary cry_reverse Cry_Lopunny -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_LopunnyMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BUNEARY .if P_FAMILY_GLAMEOW == TRUE cry_reverse Cry_Glameow @@ -3606,16 +3770,17 @@ gCryTable_Reverse:: cry_reverse Cry_Gible cry_reverse Cry_Gabite cry_reverse Cry_Garchomp -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_GarchompMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GIBLE .if P_FAMILY_RIOLU == TRUE cry_reverse Cry_Riolu cry_reverse Cry_Lucario -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_LucarioMega -.endif @ P_MEGA_EVOLUTIONS + cry_reverse Cry_LucarioMegaZ +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RIOLU .if P_FAMILY_HIPPOPOTAS == TRUE cry_reverse Cry_Hippopotas @@ -3639,9 +3804,9 @@ gCryTable_Reverse:: .if P_FAMILY_SNOVER == TRUE cry_reverse Cry_Snover cry_reverse Cry_Abomasnow -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AbomasnowMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SNOVER .if P_FAMILY_ROTOM == TRUE cry_reverse Cry_Rotom @@ -3663,6 +3828,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_PALKIA .if P_FAMILY_HEATRAN == TRUE cry_reverse Cry_Heatran +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_HeatranMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HEATRAN .if P_FAMILY_REGIGIGAS == TRUE cry_reverse Cry_Regigigas @@ -3679,6 +3847,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_MANAPHY .if P_FAMILY_DARKRAI == TRUE cry_reverse Cry_Darkrai +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_DarkraiMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DARKRAI .if P_FAMILY_SHAYMIN == TRUE cry_reverse Cry_ShayminLand @@ -3699,6 +3870,9 @@ gCryTable_Reverse:: cry_reverse Cry_Tepig cry_reverse Cry_Pignite cry_reverse Cry_Emboar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_EmboarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TEPIG .if P_FAMILY_OSHAWOTT == TRUE cry_reverse Cry_Oshawott @@ -3755,12 +3929,15 @@ gCryTable_Reverse:: .if P_FAMILY_DRILBUR == TRUE cry_reverse Cry_Drilbur cry_reverse Cry_Excadrill +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ExcadrillMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRILBUR .if P_FAMILY_AUDINO == TRUE cry_reverse Cry_Audino -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_AudinoMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AUDINO .if P_FAMILY_TIMBURR == TRUE cry_reverse Cry_Timburr @@ -3787,6 +3964,9 @@ gCryTable_Reverse:: cry_reverse Cry_Venipede cry_reverse Cry_Whirlipede cry_reverse Cry_Scolipede +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ScolipedeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_VENIPEDE .if P_FAMILY_COTTONEE == TRUE cry_reverse Cry_Cottonee @@ -3821,6 +4001,9 @@ gCryTable_Reverse:: .if P_FAMILY_SCRAGGY == TRUE cry_reverse Cry_Scraggy cry_reverse Cry_Scrafty +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ScraftyMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SCRAGGY .if P_FAMILY_SIGILYPH == TRUE cry_reverse Cry_Sigilyph @@ -3910,6 +4093,9 @@ gCryTable_Reverse:: cry_reverse Cry_Tynamo cry_reverse Cry_Eelektrik cry_reverse Cry_Eelektross +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_EelektrossMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TYNAMO .if P_FAMILY_ELGYEM == TRUE cry_reverse Cry_Elgyem @@ -3919,6 +4105,9 @@ gCryTable_Reverse:: cry_reverse Cry_Litwick cry_reverse Cry_Lampent cry_reverse Cry_Chandelure +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ChandelureMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITWICK .if P_FAMILY_AXEW == TRUE cry_reverse Cry_Axew @@ -3949,6 +4138,9 @@ gCryTable_Reverse:: .if P_FAMILY_GOLETT == TRUE cry_reverse Cry_Golett cry_reverse Cry_Golurk +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_GolurkMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GOLETT .if P_FAMILY_PAWNIARD == TRUE cry_reverse Cry_Pawniard @@ -4030,16 +4222,25 @@ gCryTable_Reverse:: cry_reverse Cry_Chespin cry_reverse Cry_Quilladin cry_reverse Cry_Chesnaught +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ChesnaughtMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHESPIN .if P_FAMILY_FENNEKIN == TRUE cry_reverse Cry_Fennekin cry_reverse Cry_Braixen cry_reverse Cry_Delphox +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_DelphoxMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FENNEKIN .if P_FAMILY_FROAKIE == TRUE cry_reverse Cry_Froakie cry_reverse Cry_Frogadier cry_reverse Cry_Greninja +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_GreninjaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FROAKIE .if P_FAMILY_BUNNELBY == TRUE cry_reverse Cry_Bunnelby @@ -4058,11 +4259,17 @@ gCryTable_Reverse:: .if P_FAMILY_LITLEO == TRUE cry_reverse Cry_Litleo cry_reverse Cry_Pyroar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_PyroarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITLEO .if P_FAMILY_FLABEBE == TRUE cry_reverse Cry_Flabebe cry_reverse Cry_Floette cry_reverse Cry_FloetteEternal +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_FloetteMega +.endif @ P_MODIFIED_MEGA_CRIES cry_reverse Cry_Florges .endif @ P_FAMILY_FLABEBE .if P_FAMILY_SKIDDO == TRUE @@ -4079,6 +4286,9 @@ gCryTable_Reverse:: .if P_FAMILY_ESPURR == TRUE cry_reverse Cry_Espurr cry_reverse Cry_Meowstic +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_MeowsticMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ESPURR .if P_FAMILY_HONEDGE == TRUE cry_reverse Cry_Honedge @@ -4096,14 +4306,23 @@ gCryTable_Reverse:: .if P_FAMILY_INKAY == TRUE cry_reverse Cry_Inkay cry_reverse Cry_Malamar +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_MalamarMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_INKAY .if P_FAMILY_BINACLE == TRUE cry_reverse Cry_Binacle cry_reverse Cry_Barbaracle +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_BarbaracleMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BINACLE .if P_FAMILY_SKRELP == TRUE cry_reverse Cry_Skrelp cry_reverse Cry_Dragalge +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_DragalgeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKRELP .if P_FAMILY_CLAUNCHER == TRUE cry_reverse Cry_Clauncher @@ -4123,6 +4342,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_AMAURA .if P_FAMILY_HAWLUCHA == TRUE cry_reverse Cry_Hawlucha +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_HawluchaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HAWLUCHA .if P_FAMILY_DEDENNE == TRUE cry_reverse Cry_Dedenne @@ -4166,12 +4388,15 @@ gCryTable_Reverse:: cry_reverse Cry_Zygarde50 cry_reverse Cry_Zygarde10 cry_reverse Cry_ZygardeComplete +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ZygardeMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZYGARDE .if P_FAMILY_DIANCIE == TRUE cry_reverse Cry_Diancie -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE cry_reverse Cry_DiancieMega -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DIANCIE .if P_FAMILY_HOOPA == TRUE cry_reverse Cry_HoopaConfined @@ -4212,6 +4437,9 @@ gCryTable_Reverse:: .if P_FAMILY_CRABRAWLER == TRUE cry_reverse Cry_Crabrawler cry_reverse Cry_Crabominable +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_CrabominableMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CRABRAWLER .if P_FAMILY_ORICORIO == TRUE cry_reverse Cry_OricorioBaile @@ -4278,6 +4506,9 @@ gCryTable_Reverse:: .if P_FAMILY_WIMPOD == TRUE cry_reverse Cry_Wimpod cry_reverse Cry_Golisopod +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_GolisopodMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WIMPOD .if P_FAMILY_SANDYGAST == TRUE cry_reverse Cry_Sandygast @@ -4310,6 +4541,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_BRUXISH .if P_FAMILY_DRAMPA == TRUE cry_reverse Cry_Drampa +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_DrampaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRAMPA .if P_FAMILY_DHELMISE == TRUE cry_reverse Cry_Dhelmise @@ -4370,6 +4604,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_NECROZMA .if P_FAMILY_MAGEARNA == TRUE cry_reverse Cry_Magearna +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_MagearnaMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGEARNA .if P_FAMILY_MARSHADOW == TRUE cry_reverse Cry_Marshadow @@ -4386,6 +4623,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_BLACEPHALON .if P_FAMILY_ZERAORA == TRUE cry_reverse Cry_Zeraora +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ZeraoraMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZERAORA .if P_FAMILY_MELTAN == TRUE cry_reverse Cry_Meltan @@ -4460,6 +4700,7 @@ gCryTable_Reverse:: .endif @ P_FAMILY_SILICOBRA .if P_FAMILY_CRAMORANT == TRUE cry_reverse Cry_Cramorant + cry_reverse Cry_CramorantGulping .endif @ P_FAMILY_CRAMORANT .if P_FAMILY_ARROKUDA == TRUE cry_reverse Cry_Arrokuda @@ -4498,6 +4739,9 @@ gCryTable_Reverse:: .endif @ P_FAMILY_MILCERY .if P_FAMILY_FALINKS == TRUE cry_reverse Cry_Falinks +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_FalinksMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FALINKS .if P_FAMILY_PINCURCHIN == TRUE cry_reverse Cry_Pincurchin @@ -4681,6 +4925,9 @@ gCryTable_Reverse:: .if P_FAMILY_CAPSAKID == TRUE cry_reverse Cry_Capsakid cry_reverse Cry_Scovillain +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_ScovillainMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CAPSAKID .if P_FAMILY_RELLOR == TRUE cry_reverse Cry_Rellor @@ -4720,6 +4967,9 @@ gCryTable_Reverse:: .if P_FAMILY_GLIMMET == TRUE cry_reverse Cry_Glimmet cry_reverse Cry_Glimmora +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_GlimmoraMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GLIMMET .if P_FAMILY_GREAVARD == TRUE cry_reverse Cry_Greavard @@ -4742,6 +4992,9 @@ gCryTable_Reverse:: cry_reverse Cry_TatsugiriCurly cry_reverse Cry_TatsugiriDroopy cry_reverse Cry_TatsugiriStretchy +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_TatsugiriMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TATSUGIRI .if P_FAMILY_GREAT_TUSK == TRUE cry_reverse Cry_GreatTusk @@ -4783,6 +5036,9 @@ gCryTable_Reverse:: cry_reverse Cry_Frigibax cry_reverse Cry_Arctibax cry_reverse Cry_Baxcalibur +.if P_MODIFIED_MEGA_CRIES == TRUE + cry_reverse Cry_BaxcaliburMega +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FRIGIBAX .if P_FAMILY_GIMMIGHOUL == TRUE cry_reverse Cry_Gimmighoul diff --git a/sound/direct_sound_data.inc b/sound/direct_sound_data.inc index 5a79bd3ca..ab02f476a 100644 --- a/sound/direct_sound_data.inc +++ b/sound/direct_sound_data.inc @@ -316,11 +316,11 @@ Cry_Ivysaur:: Cry_Venusaur:: .incbin "sound/direct_sound_samples/cries/venusaur.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_VenusaurMega:: .incbin "sound/direct_sound_samples/cries/venusaur_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BULBASAUR .if P_FAMILY_CHARMANDER == TRUE @@ -336,7 +336,7 @@ Cry_Charmeleon:: Cry_Charizard:: .incbin "sound/direct_sound_samples/cries/charizard.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_CharizardMegaX:: .incbin "sound/direct_sound_samples/cries/charizard_mega_x.bin" @@ -344,7 +344,7 @@ Cry_CharizardMegaX:: .align 2 Cry_CharizardMegaY:: .incbin "sound/direct_sound_samples/cries/charizard_mega_y.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHARMANDER .if P_FAMILY_SQUIRTLE == TRUE @@ -360,11 +360,11 @@ Cry_Wartortle:: Cry_Blastoise:: .incbin "sound/direct_sound_samples/cries/blastoise.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_BlastoiseMega:: .incbin "sound/direct_sound_samples/cries/blastoise_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SQUIRTLE .if P_FAMILY_CATERPIE == TRUE @@ -394,11 +394,11 @@ Cry_Kakuna:: Cry_Beedrill:: .incbin "sound/direct_sound_samples/cries/beedrill.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_BeedrillMega:: .incbin "sound/direct_sound_samples/cries/beedrill_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WEEDLE .if P_FAMILY_PIDGEY == TRUE @@ -414,11 +414,11 @@ Cry_Pidgeotto:: Cry_Pidgeot:: .incbin "sound/direct_sound_samples/cries/pidgeot.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_PidgeotMega:: .incbin "sound/direct_sound_samples/cries/pidgeot_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIDGEY .if P_FAMILY_RATTATA == TRUE @@ -465,6 +465,16 @@ Cry_Pikachu:: .align 2 Cry_Raichu:: .incbin "sound/direct_sound_samples/cries/raichu.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_RaichuMegaX:: + .incbin "sound/direct_sound_samples/cries/raichu_mega_x.bin" + + .align 2 +Cry_RaichuMegaY:: + .incbin "sound/direct_sound_samples/cries/raichu_mega_y.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PIKACHU .if P_FAMILY_SANDSHREW == TRUE @@ -517,6 +527,12 @@ Cry_Clefairy:: .align 2 Cry_Clefable:: .incbin "sound/direct_sound_samples/cries/clefable.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ClefableMega:: + .incbin "sound/direct_sound_samples/cries/clefable_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CLEFAIRY .if P_FAMILY_VULPIX == TRUE @@ -697,11 +713,11 @@ Cry_Kadabra:: Cry_Alakazam:: .incbin "sound/direct_sound_samples/cries/alakazam.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AlakazamMega:: .incbin "sound/direct_sound_samples/cries/alakazam_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABRA .if P_FAMILY_MACHOP == TRUE @@ -730,6 +746,12 @@ Cry_Weepinbell:: .align 2 Cry_Victreebel:: .incbin "sound/direct_sound_samples/cries/victreebel.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_VictreebelMega:: + .incbin "sound/direct_sound_samples/cries/victreebel_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELLSPROUT .if P_FAMILY_TENTACOOL == TRUE @@ -780,11 +802,11 @@ Cry_Slowbro:: Cry_Slowking:: .incbin "sound/direct_sound_samples/cries/slowking.bin" .endif @ P_GEN_2_CROSS_EVOS -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SlowbroMega:: .incbin "sound/direct_sound_samples/cries/slowbro_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GALARIAN_FORMS == TRUE .align 2 Cry_SlowpokeGalar:: @@ -875,11 +897,11 @@ Cry_Haunter:: Cry_Gengar:: .incbin "sound/direct_sound_samples/cries/gengar.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GengarMega:: .incbin "sound/direct_sound_samples/cries/gengar_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GASTLY .if P_FAMILY_ONIX == TRUE @@ -892,11 +914,11 @@ Cry_Onix:: Cry_Steelix:: .incbin "sound/direct_sound_samples/cries/steelix.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SteelixMega:: .incbin "sound/direct_sound_samples/cries/steelix_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .endif @ P_FAMILY_ONIX @@ -1045,11 +1067,11 @@ Cry_Tangrowth:: Cry_Kangaskhan:: .incbin "sound/direct_sound_samples/cries/kangaskhan.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_KangaskhanMega:: .incbin "sound/direct_sound_samples/cries/kangaskhan_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_KANGASKHAN .if P_FAMILY_HORSEA == TRUE @@ -1086,6 +1108,12 @@ Cry_Staryu:: .align 2 Cry_Starmie:: .incbin "sound/direct_sound_samples/cries/starmie.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_StarmieMega:: + .incbin "sound/direct_sound_samples/cries/starmie_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARYU .if P_FAMILY_MR_MIME == TRUE @@ -1117,11 +1145,11 @@ Cry_Scyther:: Cry_Scizor:: .incbin "sound/direct_sound_samples/cries/scizor.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_ScizorMega:: .incbin "sound/direct_sound_samples/cries/scizor_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_2_CROSS_EVOS .if P_GEN_8_CROSS_EVOS == TRUE .align 2 @@ -1183,11 +1211,11 @@ Cry_Magmortar:: Cry_Pinsir:: .incbin "sound/direct_sound_samples/cries/pinsir.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_PinsirMega:: .incbin "sound/direct_sound_samples/cries/pinsir_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_PINSIR .if P_FAMILY_TAUROS == TRUE @@ -1205,11 +1233,11 @@ Cry_Magikarp:: Cry_Gyarados:: .incbin "sound/direct_sound_samples/cries/gyarados.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GyaradosMega:: .incbin "sound/direct_sound_samples/cries/gyarados_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGIKARP .if P_FAMILY_LAPRAS == TRUE @@ -1266,11 +1294,11 @@ Cry_Sylveon:: .endif @ P_GEN_6_CROSS_EVOS .endif @ P_FAMILY_EEVEE -.if P_FAMILY_PORYGON == TRUE .align 2 Cry_Porygon:: .incbin "sound/direct_sound_samples/cries/porygon.bin" +.if P_FAMILY_PORYGON == TRUE .if P_GEN_2_CROSS_EVOS == TRUE .align 2 Cry_Porygon2:: @@ -1309,11 +1337,11 @@ Cry_Kabutops:: Cry_Aerodactyl:: .incbin "sound/direct_sound_samples/cries/aerodactyl.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AerodactylMega:: .incbin "sound/direct_sound_samples/cries/aerodactyl_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AERODACTYL .if P_FAMILY_SNORLAX == TRUE @@ -1358,6 +1386,12 @@ Cry_Dragonair:: .align 2 Cry_Dragonite:: .incbin "sound/direct_sound_samples/cries/dragonite.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_DragoniteMega:: + .incbin "sound/direct_sound_samples/cries/dragonite_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRATINI .if P_FAMILY_MEWTWO == TRUE @@ -1365,7 +1399,7 @@ Cry_Dragonite:: Cry_Mewtwo:: .incbin "sound/direct_sound_samples/cries/mewtwo.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_MewtwoMegaX:: .incbin "sound/direct_sound_samples/cries/mewtwo_mega_x.bin" @@ -1373,7 +1407,7 @@ Cry_MewtwoMegaX:: .align 2 Cry_MewtwoMegaY:: .incbin "sound/direct_sound_samples/cries/mewtwo_mega_y.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEWTWO .if P_FAMILY_MEW == TRUE @@ -1394,6 +1428,12 @@ Cry_Bayleef:: .align 2 Cry_Meganium:: .incbin "sound/direct_sound_samples/cries/meganium.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_MeganiumMega:: + .incbin "sound/direct_sound_samples/cries/meganium_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIKORITA .if P_FAMILY_CYNDAQUIL == TRUE @@ -1422,6 +1462,12 @@ Cry_Croconaw:: .align 2 Cry_Feraligatr:: .incbin "sound/direct_sound_samples/cries/feraligatr.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_FeraligatrMega:: + .incbin "sound/direct_sound_samples/cries/feraligatr_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TOTODILE .if P_FAMILY_SENTRET == TRUE @@ -1513,11 +1559,11 @@ Cry_Flaaffy:: Cry_Ampharos:: .incbin "sound/direct_sound_samples/cries/ampharos.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AmpharosMega:: .incbin "sound/direct_sound_samples/cries/ampharos_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAREEP .if P_FAMILY_MARILL == TRUE @@ -1727,11 +1773,11 @@ Cry_Shuckle:: Cry_Heracross:: .incbin "sound/direct_sound_samples/cries/heracross.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_HeracrossMega:: .incbin "sound/direct_sound_samples/cries/heracross_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HERACROSS .if P_FAMILY_SNEASEL == TRUE @@ -1765,6 +1811,10 @@ Cry_Ursaring:: .align 2 Cry_Ursaluna:: .incbin "sound/direct_sound_samples/cries/ursaluna.bin" + + .align 2 +Cry_UrsalunaBloodmoon:: + .incbin "sound/direct_sound_samples/cries/ursaluna_bloodmoon.bin" .endif @ P_GEN_8_CROSS_EVOS .endif @ P_FAMILY_TEDDIURSA @@ -1839,6 +1889,12 @@ Cry_Mantine:: .align 2 Cry_Skarmory:: .incbin "sound/direct_sound_samples/cries/skarmory.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_SkarmoryMega:: + .incbin "sound/direct_sound_samples/cries/skarmory_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKARMORY .if P_FAMILY_HOUNDOUR == TRUE @@ -1850,11 +1906,11 @@ Cry_Houndour:: Cry_Houndoom:: .incbin "sound/direct_sound_samples/cries/houndoom.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_HoundoomMega:: .incbin "sound/direct_sound_samples/cries/houndoom_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HOUNDOUR .if P_FAMILY_PHANPY == TRUE @@ -1922,11 +1978,11 @@ Cry_Pupitar:: Cry_Tyranitar:: .incbin "sound/direct_sound_samples/cries/tyranitar.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_TyranitarMega:: .incbin "sound/direct_sound_samples/cries/tyranitar_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LARVITAR .if P_FAMILY_LUGIA == TRUE @@ -1960,11 +2016,11 @@ Cry_Grovyle:: Cry_Sceptile:: .incbin "sound/direct_sound_samples/cries/sceptile.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SceptileMega:: .incbin "sound/direct_sound_samples/cries/sceptile_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TREECKO .if P_FAMILY_TORCHIC == TRUE @@ -1980,11 +2036,11 @@ Cry_Combusken:: Cry_Blaziken:: .incbin "sound/direct_sound_samples/cries/blaziken.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_BlazikenMega:: .incbin "sound/direct_sound_samples/cries/blaziken_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TORCHIC .if P_FAMILY_MUDKIP == TRUE @@ -2000,11 +2056,11 @@ Cry_Marshtomp:: Cry_Swampert:: .incbin "sound/direct_sound_samples/cries/swampert.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SwampertMega:: .incbin "sound/direct_sound_samples/cries/swampert_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MUDKIP .if P_FAMILY_POOCHYENA == TRUE @@ -2117,21 +2173,21 @@ Cry_Kirlia:: Cry_Gardevoir:: .incbin "sound/direct_sound_samples/cries/gardevoir.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GardevoirMega:: .incbin "sound/direct_sound_samples/cries/gardevoir_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE .align 2 Cry_Gallade:: .incbin "sound/direct_sound_samples/cries/gallade.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GalladeMega:: .incbin "sound/direct_sound_samples/cries/gallade_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_RALTS @@ -2234,11 +2290,11 @@ Cry_Delcatty:: Cry_Sableye:: .incbin "sound/direct_sound_samples/cries/sableye.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SableyeMega:: .incbin "sound/direct_sound_samples/cries/sableye_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SABLEYE .if P_FAMILY_MAWILE == TRUE @@ -2246,11 +2302,11 @@ Cry_SableyeMega:: Cry_Mawile:: .incbin "sound/direct_sound_samples/cries/mawile.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_MawileMega:: .incbin "sound/direct_sound_samples/cries/mawile_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAWILE .if P_FAMILY_ARON == TRUE @@ -2266,11 +2322,11 @@ Cry_Lairon:: Cry_Aggron:: .incbin "sound/direct_sound_samples/cries/aggron.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AggronMega:: .incbin "sound/direct_sound_samples/cries/aggron_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ARON .if P_FAMILY_MEDITITE == TRUE @@ -2282,11 +2338,11 @@ Cry_Meditite:: Cry_Medicham:: .incbin "sound/direct_sound_samples/cries/medicham.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_MedichamMega:: .incbin "sound/direct_sound_samples/cries/medicham_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MEDITITE .if P_FAMILY_ELECTRIKE == TRUE @@ -2298,11 +2354,11 @@ Cry_Electrike:: Cry_Manectric:: .incbin "sound/direct_sound_samples/cries/manectric.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_ManectricMega:: .incbin "sound/direct_sound_samples/cries/manectric_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ELECTRIKE .if P_FAMILY_PLUSLE == TRUE @@ -2364,11 +2420,11 @@ Cry_Carvanha:: Cry_Sharpedo:: .incbin "sound/direct_sound_samples/cries/sharpedo.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SharpedoMega:: .incbin "sound/direct_sound_samples/cries/sharpedo_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CARVANHA .if P_FAMILY_WAILMER == TRUE @@ -2390,11 +2446,11 @@ Cry_Numel:: Cry_Camerupt:: .incbin "sound/direct_sound_samples/cries/camerupt.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_CameruptMega:: .incbin "sound/direct_sound_samples/cries/camerupt_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_NUMEL .if P_FAMILY_TORKOAL == TRUE @@ -2452,11 +2508,11 @@ Cry_Swablu:: Cry_Altaria:: .incbin "sound/direct_sound_samples/cries/altaria.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AltariaMega:: .incbin "sound/direct_sound_samples/cries/altaria_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SWABLU .if P_FAMILY_ZANGOOSE == TRUE @@ -2564,11 +2620,11 @@ Cry_Shuppet:: Cry_Banette:: .incbin "sound/direct_sound_samples/cries/banette.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_BanetteMega:: .incbin "sound/direct_sound_samples/cries/banette_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SHUPPET .if P_FAMILY_DUSKULL == TRUE @@ -2603,6 +2659,12 @@ Cry_Chingling:: .align 2 Cry_Chimecho:: .incbin "sound/direct_sound_samples/cries/chimecho.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ChimechoMega:: + .incbin "sound/direct_sound_samples/cries/chimecho_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHIMECHO .if P_FAMILY_ABSOL == TRUE @@ -2610,11 +2672,15 @@ Cry_Chimecho:: Cry_Absol:: .incbin "sound/direct_sound_samples/cries/absol.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AbsolMega:: .incbin "sound/direct_sound_samples/cries/absol_mega.bin" -.endif @ P_MEGA_EVOLUTIONS + + .align 2 +Cry_AbsolMegaZ:: + .incbin "sound/direct_sound_samples/cries/absol_mega_z.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ABSOL .if P_FAMILY_SNORUNT == TRUE @@ -2626,15 +2692,21 @@ Cry_Snorunt:: Cry_Glalie:: .incbin "sound/direct_sound_samples/cries/glalie.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GlalieMega:: .incbin "sound/direct_sound_samples/cries/glalie_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .if P_GEN_4_CROSS_EVOS == TRUE .align 2 Cry_Froslass:: .incbin "sound/direct_sound_samples/cries/froslass.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_FroslassMega:: + .incbin "sound/direct_sound_samples/cries/froslass_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_GEN_4_CROSS_EVOS .endif @ P_FAMILY_SNORUNT @@ -2691,11 +2763,11 @@ Cry_Shelgon:: Cry_Salamence:: .incbin "sound/direct_sound_samples/cries/salamence.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_SalamenceMega:: .incbin "sound/direct_sound_samples/cries/salamence_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BAGON .if P_FAMILY_BELDUM == TRUE @@ -2711,11 +2783,11 @@ Cry_Metang:: Cry_Metagross:: .incbin "sound/direct_sound_samples/cries/metagross.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_MetagrossMega:: .incbin "sound/direct_sound_samples/cries/metagross_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BELDUM .if P_FAMILY_REGIROCK == TRUE @@ -2741,11 +2813,11 @@ Cry_Registeel:: Cry_Latias:: .incbin "sound/direct_sound_samples/cries/latias.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_LatiasMega:: .incbin "sound/direct_sound_samples/cries/latias_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIAS .if P_FAMILY_LATIOS == TRUE @@ -2753,11 +2825,11 @@ Cry_LatiasMega:: Cry_Latios:: .incbin "sound/direct_sound_samples/cries/latios.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_LatiosMega:: .incbin "sound/direct_sound_samples/cries/latios_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LATIOS .if P_FAMILY_KYOGRE == TRUE @@ -2791,11 +2863,11 @@ Cry_GroudonPrimal:: Cry_Rayquaza:: .incbin "sound/direct_sound_samples/cries/rayquaza.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_RayquazaMega:: .incbin "sound/direct_sound_samples/cries/rayquaza_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RAYQUAZA .if P_FAMILY_JIRACHI == TRUE @@ -2864,6 +2936,12 @@ Cry_Staravia:: .align 2 Cry_Staraptor:: .incbin "sound/direct_sound_samples/cries/staraptor.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_StaraptorMega:: + .incbin "sound/direct_sound_samples/cries/staraptor_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_STARLY .if P_FAMILY_BIDOOF == TRUE @@ -2999,11 +3077,11 @@ Cry_Buneary:: Cry_Lopunny:: .incbin "sound/direct_sound_samples/cries/lopunny.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_LopunnyMega:: .incbin "sound/direct_sound_samples/cries/lopunny_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BUNEARY .if P_FAMILY_GLAMEOW == TRUE @@ -3061,11 +3139,11 @@ Cry_Gabite:: Cry_Garchomp:: .incbin "sound/direct_sound_samples/cries/garchomp.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_GarchompMega:: .incbin "sound/direct_sound_samples/cries/garchomp_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GIBLE .if P_FAMILY_RIOLU == TRUE @@ -3077,11 +3155,15 @@ Cry_Riolu:: Cry_Lucario:: .incbin "sound/direct_sound_samples/cries/lucario.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_LucarioMega:: .incbin "sound/direct_sound_samples/cries/lucario_mega.bin" -.endif @ P_MEGA_EVOLUTIONS + + .align 2 +Cry_LucarioMegaZ:: + .incbin "sound/direct_sound_samples/cries/lucario_mega_z.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_RIOLU .if P_FAMILY_HIPPOPOTAS == TRUE @@ -3139,11 +3221,11 @@ Cry_Snover:: Cry_Abomasnow:: .incbin "sound/direct_sound_samples/cries/abomasnow.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AbomasnowMega:: .incbin "sound/direct_sound_samples/cries/abomasnow_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SNOVER .if P_FAMILY_ROTOM == TRUE @@ -3186,6 +3268,12 @@ Cry_Palkia:: .align 2 Cry_Heatran:: .incbin "sound/direct_sound_samples/cries/heatran.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_HeatranMega:: + .incbin "sound/direct_sound_samples/cries/heatran_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HEATRAN .if P_FAMILY_REGIGIGAS == TRUE @@ -3220,6 +3308,12 @@ Cry_Manaphy:: .align 2 Cry_Darkrai:: .incbin "sound/direct_sound_samples/cries/darkrai.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_DarkraiMega:: + .incbin "sound/direct_sound_samples/cries/darkrai_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DARKRAI .if P_FAMILY_SHAYMIN == TRUE @@ -3270,6 +3364,12 @@ Cry_Pignite:: .align 2 Cry_Emboar:: .incbin "sound/direct_sound_samples/cries/emboar.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_EmboarMega:: + .incbin "sound/direct_sound_samples/cries/emboar_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TEPIG .if P_FAMILY_OSHAWOTT == TRUE @@ -3416,6 +3516,12 @@ Cry_Drilbur:: .align 2 Cry_Excadrill:: .incbin "sound/direct_sound_samples/cries/excadrill.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ExcadrillMega:: + .incbin "sound/direct_sound_samples/cries/excadrill_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRILBUR .if P_FAMILY_AUDINO == TRUE @@ -3423,11 +3529,11 @@ Cry_Excadrill:: Cry_Audino:: .incbin "sound/direct_sound_samples/cries/audino.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_AudinoMega:: .incbin "sound/direct_sound_samples/cries/audino_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_AUDINO .if P_FAMILY_TIMBURR == TRUE @@ -3496,6 +3602,12 @@ Cry_Whirlipede:: .align 2 Cry_Scolipede:: .incbin "sound/direct_sound_samples/cries/scolipede.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ScolipedeMega:: + .incbin "sound/direct_sound_samples/cries/scolipede_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_VENIPEDE .if P_FAMILY_COTTONEE == TRUE @@ -3579,6 +3691,12 @@ Cry_Scraggy:: .align 2 Cry_Scrafty:: .incbin "sound/direct_sound_samples/cries/scrafty.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ScraftyMega:: + .incbin "sound/direct_sound_samples/cries/scrafty_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SCRAGGY .if P_FAMILY_SIGILYPH == TRUE @@ -3804,6 +3922,12 @@ Cry_Eelektrik:: .align 2 Cry_Eelektross:: .incbin "sound/direct_sound_samples/cries/eelektross.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_EelektrossMega:: + .incbin "sound/direct_sound_samples/cries/eelektross_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TYNAMO .if P_FAMILY_ELGYEM == TRUE @@ -3828,6 +3952,12 @@ Cry_Lampent:: .align 2 Cry_Chandelure:: .incbin "sound/direct_sound_samples/cries/chandelure.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ChandelureMega:: + .incbin "sound/direct_sound_samples/cries/chandelure_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITWICK .if P_FAMILY_AXEW == TRUE @@ -3900,6 +4030,12 @@ Cry_Golett:: .align 2 Cry_Golurk:: .incbin "sound/direct_sound_samples/cries/golurk.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_GolurkMega:: + .incbin "sound/direct_sound_samples/cries/golurk_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GOLETT .if P_FAMILY_PAWNIARD == TRUE @@ -4087,6 +4223,12 @@ Cry_Quilladin:: .align 2 Cry_Chesnaught:: .incbin "sound/direct_sound_samples/cries/chesnaught.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ChesnaughtMega:: + .incbin "sound/direct_sound_samples/cries/chesnaught_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CHESPIN .if P_FAMILY_FENNEKIN == TRUE @@ -4101,6 +4243,12 @@ Cry_Braixen:: .align 2 Cry_Delphox:: .incbin "sound/direct_sound_samples/cries/delphox.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_DelphoxMega:: + .incbin "sound/direct_sound_samples/cries/delphox_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FENNEKIN .if P_FAMILY_FROAKIE == TRUE @@ -4115,6 +4263,12 @@ Cry_Frogadier:: .align 2 Cry_Greninja:: .incbin "sound/direct_sound_samples/cries/greninja.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_GreninjaMega:: + .incbin "sound/direct_sound_samples/cries/greninja_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FROAKIE .if P_FAMILY_BUNNELBY == TRUE @@ -4163,6 +4317,12 @@ Cry_Litleo:: .align 2 Cry_Pyroar:: .incbin "sound/direct_sound_samples/cries/pyroar.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_PyroarMega:: + .incbin "sound/direct_sound_samples/cries/pyroar_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_LITLEO .if P_FAMILY_FLABEBE == TRUE @@ -4178,6 +4338,12 @@ Cry_Floette:: Cry_FloetteEternal:: .incbin "sound/direct_sound_samples/cries/floette_eternal.bin" +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_FloetteMega:: + .incbin "sound/direct_sound_samples/cries/floette_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES + .align 2 Cry_Florges:: .incbin "sound/direct_sound_samples/cries/florges.bin" @@ -4217,6 +4383,12 @@ Cry_Espurr:: .align 2 Cry_Meowstic:: .incbin "sound/direct_sound_samples/cries/meowstic.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_MeowsticMega:: + .incbin "sound/direct_sound_samples/cries/meowstic_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ESPURR .if P_FAMILY_HONEDGE == TRUE @@ -4261,6 +4433,12 @@ Cry_Inkay:: .align 2 Cry_Malamar:: .incbin "sound/direct_sound_samples/cries/malamar.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_MalamarMega:: + .incbin "sound/direct_sound_samples/cries/malamar_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_INKAY .if P_FAMILY_BINACLE == TRUE @@ -4271,6 +4449,12 @@ Cry_Binacle:: .align 2 Cry_Barbaracle:: .incbin "sound/direct_sound_samples/cries/barbaracle.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_BarbaracleMega:: + .incbin "sound/direct_sound_samples/cries/barbaracle_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_BINACLE .if P_FAMILY_SKRELP == TRUE @@ -4281,6 +4465,12 @@ Cry_Skrelp:: .align 2 Cry_Dragalge:: .incbin "sound/direct_sound_samples/cries/dragalge.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_DragalgeMega:: + .incbin "sound/direct_sound_samples/cries/dragalge_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_SKRELP .if P_FAMILY_CLAUNCHER == TRUE @@ -4327,6 +4517,12 @@ Cry_Aurorus:: .align 2 Cry_Hawlucha:: .incbin "sound/direct_sound_samples/cries/hawlucha.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_HawluchaMega:: + .incbin "sound/direct_sound_samples/cries/hawlucha_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_HAWLUCHA .if P_FAMILY_DEDENNE == TRUE @@ -4433,6 +4629,12 @@ Cry_Zygarde10:: .align 2 Cry_ZygardeComplete:: .incbin "sound/direct_sound_samples/cries/zygarde_complete.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ZygardeMega:: + .incbin "sound/direct_sound_samples/cries/zygarde_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZYGARDE .if P_FAMILY_DIANCIE == TRUE @@ -4440,11 +4642,11 @@ Cry_ZygardeComplete:: Cry_Diancie:: .incbin "sound/direct_sound_samples/cries/diancie.bin" -.if P_MEGA_EVOLUTIONS == TRUE +.if P_MODIFIED_MEGA_CRIES == TRUE .align 2 Cry_DiancieMega:: .incbin "sound/direct_sound_samples/cries/diancie_mega.bin" -.endif @ P_MEGA_EVOLUTIONS +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DIANCIE .if P_FAMILY_HOOPA == TRUE @@ -4551,6 +4753,12 @@ Cry_Crabrawler:: .align 2 Cry_Crabominable:: .incbin "sound/direct_sound_samples/cries/crabominable.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_CrabominableMega:: + .incbin "sound/direct_sound_samples/cries/crabominable_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CRABRAWLER .if P_FAMILY_ORICORIO == TRUE @@ -4719,6 +4927,12 @@ Cry_Wimpod:: .align 2 Cry_Golisopod:: .incbin "sound/direct_sound_samples/cries/golisopod.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_GolisopodMega:: + .incbin "sound/direct_sound_samples/cries/golisopod_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_WIMPOD .if P_FAMILY_SANDYGAST == TRUE @@ -4787,6 +5001,12 @@ Cry_Bruxish:: .align 2 Cry_Drampa:: .incbin "sound/direct_sound_samples/cries/drampa.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_DrampaMega:: + .incbin "sound/direct_sound_samples/cries/drampa_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_DRAMPA .if P_FAMILY_DHELMISE == TRUE @@ -4920,6 +5140,12 @@ Cry_NecrozmaUltra:: .align 2 Cry_Magearna:: .incbin "sound/direct_sound_samples/cries/magearna.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_MagearnaMega:: + .incbin "sound/direct_sound_samples/cries/magearna_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_MAGEARNA .if P_FAMILY_MARSHADOW == TRUE @@ -4954,6 +5180,12 @@ Cry_Blacephalon:: .align 2 Cry_Zeraora:: .incbin "sound/direct_sound_samples/cries/zeraora.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ZeraoraMega:: + .incbin "sound/direct_sound_samples/cries/zeraora_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_ZERAORA .if P_FAMILY_MELTAN == TRUE @@ -5148,6 +5380,10 @@ Cry_Sandaconda:: .align 2 Cry_Cramorant:: .incbin "sound/direct_sound_samples/cries/cramorant.bin" + + .align 2 +Cry_CramorantGulping:: + .incbin "sound/direct_sound_samples/cries/cramorant_gulping.bin" .endif @ P_FAMILY_CRAMORANT .if P_FAMILY_ARROKUDA == TRUE @@ -5246,6 +5482,12 @@ Cry_Alcremie:: .align 2 Cry_Falinks:: .incbin "sound/direct_sound_samples/cries/falinks.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_FalinksMega:: + .incbin "sound/direct_sound_samples/cries/falinks_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FALINKS .if P_FAMILY_PINCURCHIN == TRUE @@ -5695,6 +5937,12 @@ Cry_Capsakid:: .align 2 Cry_Scovillain:: .incbin "sound/direct_sound_samples/cries/scovillain.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_ScovillainMega:: + .incbin "sound/direct_sound_samples/cries/scovillain_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_CAPSAKID .if P_FAMILY_RELLOR == TRUE @@ -5791,6 +6039,12 @@ Cry_Glimmet:: .align 2 Cry_Glimmora:: .incbin "sound/direct_sound_samples/cries/glimmora.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_GlimmoraMega:: + .incbin "sound/direct_sound_samples/cries/glimmora_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_GLIMMET .if P_FAMILY_GREAVARD == TRUE @@ -5843,6 +6097,12 @@ Cry_TatsugiriDroopy:: .align 2 Cry_TatsugiriStretchy:: .incbin "sound/direct_sound_samples/cries/tatsugiri_stretchy.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_TatsugiriMega:: + .incbin "sound/direct_sound_samples/cries/tatsugiri_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_TATSUGIRI .if P_FAMILY_GREAT_TUSK == TRUE @@ -5929,6 +6189,12 @@ Cry_Arctibax:: .align 2 Cry_Baxcalibur:: .incbin "sound/direct_sound_samples/cries/baxcalibur.bin" + +.if P_MODIFIED_MEGA_CRIES == TRUE + .align 2 +Cry_BaxcaliburMega:: + .incbin "sound/direct_sound_samples/cries/baxcalibur_mega.bin" +.endif @ P_MODIFIED_MEGA_CRIES .endif @ P_FAMILY_FRIGIBAX .if P_FAMILY_GIMMIGHOUL == TRUE diff --git a/sound/direct_sound_samples/cries/abra.wav b/sound/direct_sound_samples/cries/abra.wav index 14aba2d7a..34d645d9d 100644 Binary files a/sound/direct_sound_samples/cries/abra.wav and b/sound/direct_sound_samples/cries/abra.wav differ diff --git a/sound/direct_sound_samples/cries/absol.wav b/sound/direct_sound_samples/cries/absol.wav index 4a90ec5c0..2da72c44a 100644 Binary files a/sound/direct_sound_samples/cries/absol.wav and b/sound/direct_sound_samples/cries/absol.wav differ diff --git a/sound/direct_sound_samples/cries/absol_mega_z.wav b/sound/direct_sound_samples/cries/absol_mega_z.wav new file mode 100644 index 000000000..b77e93c11 Binary files /dev/null and b/sound/direct_sound_samples/cries/absol_mega_z.wav differ diff --git a/sound/direct_sound_samples/cries/aerodactyl.wav b/sound/direct_sound_samples/cries/aerodactyl.wav index 95518884b..23479e744 100644 Binary files a/sound/direct_sound_samples/cries/aerodactyl.wav and b/sound/direct_sound_samples/cries/aerodactyl.wav differ diff --git a/sound/direct_sound_samples/cries/aggron.wav b/sound/direct_sound_samples/cries/aggron.wav index bc75b2dbd..1d2247036 100644 Binary files a/sound/direct_sound_samples/cries/aggron.wav and b/sound/direct_sound_samples/cries/aggron.wav differ diff --git a/sound/direct_sound_samples/cries/aipom.wav b/sound/direct_sound_samples/cries/aipom.wav index 4d7bc829c..2fe15f875 100644 Binary files a/sound/direct_sound_samples/cries/aipom.wav and b/sound/direct_sound_samples/cries/aipom.wav differ diff --git a/sound/direct_sound_samples/cries/alakazam.wav b/sound/direct_sound_samples/cries/alakazam.wav index f397363d1..911472dec 100644 Binary files a/sound/direct_sound_samples/cries/alakazam.wav and b/sound/direct_sound_samples/cries/alakazam.wav differ diff --git a/sound/direct_sound_samples/cries/altaria.wav b/sound/direct_sound_samples/cries/altaria.wav index ca35cbf51..08395d0d6 100644 Binary files a/sound/direct_sound_samples/cries/altaria.wav and b/sound/direct_sound_samples/cries/altaria.wav differ diff --git a/sound/direct_sound_samples/cries/ampharos.wav b/sound/direct_sound_samples/cries/ampharos.wav index 346b2aa48..da0bd761c 100644 Binary files a/sound/direct_sound_samples/cries/ampharos.wav and b/sound/direct_sound_samples/cries/ampharos.wav differ diff --git a/sound/direct_sound_samples/cries/anorith.wav b/sound/direct_sound_samples/cries/anorith.wav index 349ffacf0..5840c5769 100644 Binary files a/sound/direct_sound_samples/cries/anorith.wav and b/sound/direct_sound_samples/cries/anorith.wav differ diff --git a/sound/direct_sound_samples/cries/arbok.wav b/sound/direct_sound_samples/cries/arbok.wav index cebc9e3e5..a7b9de89e 100644 Binary files a/sound/direct_sound_samples/cries/arbok.wav and b/sound/direct_sound_samples/cries/arbok.wav differ diff --git a/sound/direct_sound_samples/cries/arcanine.wav b/sound/direct_sound_samples/cries/arcanine.wav index f6e3e3680..65aa4e21f 100644 Binary files a/sound/direct_sound_samples/cries/arcanine.wav and b/sound/direct_sound_samples/cries/arcanine.wav differ diff --git a/sound/direct_sound_samples/cries/ariados.wav b/sound/direct_sound_samples/cries/ariados.wav index f059bcfc9..168f97552 100644 Binary files a/sound/direct_sound_samples/cries/ariados.wav and b/sound/direct_sound_samples/cries/ariados.wav differ diff --git a/sound/direct_sound_samples/cries/armaldo.wav b/sound/direct_sound_samples/cries/armaldo.wav index de1179566..aecebd18e 100644 Binary files a/sound/direct_sound_samples/cries/armaldo.wav and b/sound/direct_sound_samples/cries/armaldo.wav differ diff --git a/sound/direct_sound_samples/cries/aron.wav b/sound/direct_sound_samples/cries/aron.wav index 35c69f8dc..42860d46b 100644 Binary files a/sound/direct_sound_samples/cries/aron.wav and b/sound/direct_sound_samples/cries/aron.wav differ diff --git a/sound/direct_sound_samples/cries/articuno.wav b/sound/direct_sound_samples/cries/articuno.wav index 348fbcd2f..7ad8dfcd0 100644 Binary files a/sound/direct_sound_samples/cries/articuno.wav and b/sound/direct_sound_samples/cries/articuno.wav differ diff --git a/sound/direct_sound_samples/cries/azumarill.wav b/sound/direct_sound_samples/cries/azumarill.wav index f9e9ed89a..331da9d90 100644 Binary files a/sound/direct_sound_samples/cries/azumarill.wav and b/sound/direct_sound_samples/cries/azumarill.wav differ diff --git a/sound/direct_sound_samples/cries/azurill.wav b/sound/direct_sound_samples/cries/azurill.wav index 65fa56e65..b3eda262b 100644 Binary files a/sound/direct_sound_samples/cries/azurill.wav and b/sound/direct_sound_samples/cries/azurill.wav differ diff --git a/sound/direct_sound_samples/cries/bagon.wav b/sound/direct_sound_samples/cries/bagon.wav index af36a96eb..2f36926ee 100644 Binary files a/sound/direct_sound_samples/cries/bagon.wav and b/sound/direct_sound_samples/cries/bagon.wav differ diff --git a/sound/direct_sound_samples/cries/baltoy.wav b/sound/direct_sound_samples/cries/baltoy.wav index 395954b56..59867a0ed 100644 Binary files a/sound/direct_sound_samples/cries/baltoy.wav and b/sound/direct_sound_samples/cries/baltoy.wav differ diff --git a/sound/direct_sound_samples/cries/banette.wav b/sound/direct_sound_samples/cries/banette.wav index f030fb66c..b2af33b68 100644 Binary files a/sound/direct_sound_samples/cries/banette.wav and b/sound/direct_sound_samples/cries/banette.wav differ diff --git a/sound/direct_sound_samples/cries/barbaracle_mega.wav b/sound/direct_sound_samples/cries/barbaracle_mega.wav new file mode 100644 index 000000000..00dba7cad Binary files /dev/null and b/sound/direct_sound_samples/cries/barbaracle_mega.wav differ diff --git a/sound/direct_sound_samples/cries/barboach.wav b/sound/direct_sound_samples/cries/barboach.wav index 40539ce51..a955c76c2 100644 Binary files a/sound/direct_sound_samples/cries/barboach.wav and b/sound/direct_sound_samples/cries/barboach.wav differ diff --git a/sound/direct_sound_samples/cries/baxcalibur_mega.wav b/sound/direct_sound_samples/cries/baxcalibur_mega.wav new file mode 100644 index 000000000..1abf12552 Binary files /dev/null and b/sound/direct_sound_samples/cries/baxcalibur_mega.wav differ diff --git a/sound/direct_sound_samples/cries/bayleef.wav b/sound/direct_sound_samples/cries/bayleef.wav index 754e6e6e6..6dbcaf918 100644 Binary files a/sound/direct_sound_samples/cries/bayleef.wav and b/sound/direct_sound_samples/cries/bayleef.wav differ diff --git a/sound/direct_sound_samples/cries/beautifly.wav b/sound/direct_sound_samples/cries/beautifly.wav index f9c3f26a5..248428abc 100644 Binary files a/sound/direct_sound_samples/cries/beautifly.wav and b/sound/direct_sound_samples/cries/beautifly.wav differ diff --git a/sound/direct_sound_samples/cries/beedrill.wav b/sound/direct_sound_samples/cries/beedrill.wav index 6ba426bae..a3fa107ac 100644 Binary files a/sound/direct_sound_samples/cries/beedrill.wav and b/sound/direct_sound_samples/cries/beedrill.wav differ diff --git a/sound/direct_sound_samples/cries/beldum.wav b/sound/direct_sound_samples/cries/beldum.wav index 5d6514af4..427bb2477 100644 Binary files a/sound/direct_sound_samples/cries/beldum.wav and b/sound/direct_sound_samples/cries/beldum.wav differ diff --git a/sound/direct_sound_samples/cries/bellossom.wav b/sound/direct_sound_samples/cries/bellossom.wav index 71680c16b..7d47d8a78 100644 Binary files a/sound/direct_sound_samples/cries/bellossom.wav and b/sound/direct_sound_samples/cries/bellossom.wav differ diff --git a/sound/direct_sound_samples/cries/bellsprout.wav b/sound/direct_sound_samples/cries/bellsprout.wav index dc7da2e27..0f7a8ed63 100644 Binary files a/sound/direct_sound_samples/cries/bellsprout.wav and b/sound/direct_sound_samples/cries/bellsprout.wav differ diff --git a/sound/direct_sound_samples/cries/blastoise.wav b/sound/direct_sound_samples/cries/blastoise.wav index fecb7733b..bcd068dd8 100644 Binary files a/sound/direct_sound_samples/cries/blastoise.wav and b/sound/direct_sound_samples/cries/blastoise.wav differ diff --git a/sound/direct_sound_samples/cries/blaziken.wav b/sound/direct_sound_samples/cries/blaziken.wav index b7b663d8e..dd570e0bb 100644 Binary files a/sound/direct_sound_samples/cries/blaziken.wav and b/sound/direct_sound_samples/cries/blaziken.wav differ diff --git a/sound/direct_sound_samples/cries/blissey.wav b/sound/direct_sound_samples/cries/blissey.wav index a5012768c..5cd44825d 100644 Binary files a/sound/direct_sound_samples/cries/blissey.wav and b/sound/direct_sound_samples/cries/blissey.wav differ diff --git a/sound/direct_sound_samples/cries/breloom.wav b/sound/direct_sound_samples/cries/breloom.wav index 49f57f53e..226a65193 100644 Binary files a/sound/direct_sound_samples/cries/breloom.wav and b/sound/direct_sound_samples/cries/breloom.wav differ diff --git a/sound/direct_sound_samples/cries/bulbasaur.wav b/sound/direct_sound_samples/cries/bulbasaur.wav index 77a2d1bd1..d081218ba 100644 Binary files a/sound/direct_sound_samples/cries/bulbasaur.wav and b/sound/direct_sound_samples/cries/bulbasaur.wav differ diff --git a/sound/direct_sound_samples/cries/butterfree.wav b/sound/direct_sound_samples/cries/butterfree.wav index 796a1afa9..19e781569 100644 Binary files a/sound/direct_sound_samples/cries/butterfree.wav and b/sound/direct_sound_samples/cries/butterfree.wav differ diff --git a/sound/direct_sound_samples/cries/cacnea.wav b/sound/direct_sound_samples/cries/cacnea.wav index b2786069b..dcf4323c4 100644 Binary files a/sound/direct_sound_samples/cries/cacnea.wav and b/sound/direct_sound_samples/cries/cacnea.wav differ diff --git a/sound/direct_sound_samples/cries/cacturne.wav b/sound/direct_sound_samples/cries/cacturne.wav index 34c452522..bc5446317 100644 Binary files a/sound/direct_sound_samples/cries/cacturne.wav and b/sound/direct_sound_samples/cries/cacturne.wav differ diff --git a/sound/direct_sound_samples/cries/camerupt.wav b/sound/direct_sound_samples/cries/camerupt.wav index 95fdce357..bef89f41d 100644 Binary files a/sound/direct_sound_samples/cries/camerupt.wav and b/sound/direct_sound_samples/cries/camerupt.wav differ diff --git a/sound/direct_sound_samples/cries/carvanha.wav b/sound/direct_sound_samples/cries/carvanha.wav index ae10c3b10..07a2f9d45 100644 Binary files a/sound/direct_sound_samples/cries/carvanha.wav and b/sound/direct_sound_samples/cries/carvanha.wav differ diff --git a/sound/direct_sound_samples/cries/cascoon.wav b/sound/direct_sound_samples/cries/cascoon.wav index fff0be681..3e3daf626 100644 Binary files a/sound/direct_sound_samples/cries/cascoon.wav and b/sound/direct_sound_samples/cries/cascoon.wav differ diff --git a/sound/direct_sound_samples/cries/castform.wav b/sound/direct_sound_samples/cries/castform.wav index 83748d45b..8b50b35d9 100644 Binary files a/sound/direct_sound_samples/cries/castform.wav and b/sound/direct_sound_samples/cries/castform.wav differ diff --git a/sound/direct_sound_samples/cries/caterpie.wav b/sound/direct_sound_samples/cries/caterpie.wav index ccdf1ba1a..c50736446 100644 Binary files a/sound/direct_sound_samples/cries/caterpie.wav and b/sound/direct_sound_samples/cries/caterpie.wav differ diff --git a/sound/direct_sound_samples/cries/celebi.wav b/sound/direct_sound_samples/cries/celebi.wav index e217a99e8..c5a560e4b 100644 Binary files a/sound/direct_sound_samples/cries/celebi.wav and b/sound/direct_sound_samples/cries/celebi.wav differ diff --git a/sound/direct_sound_samples/cries/chandelure_mega.wav b/sound/direct_sound_samples/cries/chandelure_mega.wav new file mode 100644 index 000000000..218a00b7f Binary files /dev/null and b/sound/direct_sound_samples/cries/chandelure_mega.wav differ diff --git a/sound/direct_sound_samples/cries/chansey.wav b/sound/direct_sound_samples/cries/chansey.wav index 62d8e6cd9..418acc387 100644 Binary files a/sound/direct_sound_samples/cries/chansey.wav and b/sound/direct_sound_samples/cries/chansey.wav differ diff --git a/sound/direct_sound_samples/cries/charizard.wav b/sound/direct_sound_samples/cries/charizard.wav index fbbf3c555..fd748e8ee 100644 Binary files a/sound/direct_sound_samples/cries/charizard.wav and b/sound/direct_sound_samples/cries/charizard.wav differ diff --git a/sound/direct_sound_samples/cries/charmander.wav b/sound/direct_sound_samples/cries/charmander.wav index 3d82aca2f..09762f210 100644 Binary files a/sound/direct_sound_samples/cries/charmander.wav and b/sound/direct_sound_samples/cries/charmander.wav differ diff --git a/sound/direct_sound_samples/cries/charmeleon.wav b/sound/direct_sound_samples/cries/charmeleon.wav index a491f0586..a5289e2b0 100644 Binary files a/sound/direct_sound_samples/cries/charmeleon.wav and b/sound/direct_sound_samples/cries/charmeleon.wav differ diff --git a/sound/direct_sound_samples/cries/chesnaught_mega.wav b/sound/direct_sound_samples/cries/chesnaught_mega.wav new file mode 100644 index 000000000..1303aad23 Binary files /dev/null and b/sound/direct_sound_samples/cries/chesnaught_mega.wav differ diff --git a/sound/direct_sound_samples/cries/chikorita.wav b/sound/direct_sound_samples/cries/chikorita.wav index 65cb0c176..485f364e7 100644 Binary files a/sound/direct_sound_samples/cries/chikorita.wav and b/sound/direct_sound_samples/cries/chikorita.wav differ diff --git a/sound/direct_sound_samples/cries/chimecho.wav b/sound/direct_sound_samples/cries/chimecho.wav index a063bf739..2ffa59350 100644 Binary files a/sound/direct_sound_samples/cries/chimecho.wav and b/sound/direct_sound_samples/cries/chimecho.wav differ diff --git a/sound/direct_sound_samples/cries/chimecho_mega.wav b/sound/direct_sound_samples/cries/chimecho_mega.wav new file mode 100644 index 000000000..2cb6c67d3 Binary files /dev/null and b/sound/direct_sound_samples/cries/chimecho_mega.wav differ diff --git a/sound/direct_sound_samples/cries/chinchou.wav b/sound/direct_sound_samples/cries/chinchou.wav index 882299682..4fe6c6a77 100644 Binary files a/sound/direct_sound_samples/cries/chinchou.wav and b/sound/direct_sound_samples/cries/chinchou.wav differ diff --git a/sound/direct_sound_samples/cries/clamperl.wav b/sound/direct_sound_samples/cries/clamperl.wav index 6615de877..5e80ebab6 100644 Binary files a/sound/direct_sound_samples/cries/clamperl.wav and b/sound/direct_sound_samples/cries/clamperl.wav differ diff --git a/sound/direct_sound_samples/cries/claydol.wav b/sound/direct_sound_samples/cries/claydol.wav index 037a9a406..27b7ed576 100644 Binary files a/sound/direct_sound_samples/cries/claydol.wav and b/sound/direct_sound_samples/cries/claydol.wav differ diff --git a/sound/direct_sound_samples/cries/clefable.wav b/sound/direct_sound_samples/cries/clefable.wav index 09b0d19b8..602577cab 100644 Binary files a/sound/direct_sound_samples/cries/clefable.wav and b/sound/direct_sound_samples/cries/clefable.wav differ diff --git a/sound/direct_sound_samples/cries/clefable_mega.wav b/sound/direct_sound_samples/cries/clefable_mega.wav new file mode 100644 index 000000000..94e378fc5 Binary files /dev/null and b/sound/direct_sound_samples/cries/clefable_mega.wav differ diff --git a/sound/direct_sound_samples/cries/clefairy.wav b/sound/direct_sound_samples/cries/clefairy.wav index b447b700c..2214cb445 100644 Binary files a/sound/direct_sound_samples/cries/clefairy.wav and b/sound/direct_sound_samples/cries/clefairy.wav differ diff --git a/sound/direct_sound_samples/cries/cleffa.wav b/sound/direct_sound_samples/cries/cleffa.wav index 53d18df41..946a75959 100644 Binary files a/sound/direct_sound_samples/cries/cleffa.wav and b/sound/direct_sound_samples/cries/cleffa.wav differ diff --git a/sound/direct_sound_samples/cries/cloyster.wav b/sound/direct_sound_samples/cries/cloyster.wav index 4fc766ae1..acd5f7fc3 100644 Binary files a/sound/direct_sound_samples/cries/cloyster.wav and b/sound/direct_sound_samples/cries/cloyster.wav differ diff --git a/sound/direct_sound_samples/cries/combusken.wav b/sound/direct_sound_samples/cries/combusken.wav index 8da9de64a..6c23eb499 100644 Binary files a/sound/direct_sound_samples/cries/combusken.wav and b/sound/direct_sound_samples/cries/combusken.wav differ diff --git a/sound/direct_sound_samples/cries/corphish.wav b/sound/direct_sound_samples/cries/corphish.wav index 990029d33..72af4a9e0 100644 Binary files a/sound/direct_sound_samples/cries/corphish.wav and b/sound/direct_sound_samples/cries/corphish.wav differ diff --git a/sound/direct_sound_samples/cries/corsola.wav b/sound/direct_sound_samples/cries/corsola.wav index 890208bc7..c40b570a1 100644 Binary files a/sound/direct_sound_samples/cries/corsola.wav and b/sound/direct_sound_samples/cries/corsola.wav differ diff --git a/sound/direct_sound_samples/cries/crabominable_mega.wav b/sound/direct_sound_samples/cries/crabominable_mega.wav new file mode 100644 index 000000000..0b5d5e734 Binary files /dev/null and b/sound/direct_sound_samples/cries/crabominable_mega.wav differ diff --git a/sound/direct_sound_samples/cries/cradily.wav b/sound/direct_sound_samples/cries/cradily.wav index bb9d5bd42..ba4f755c7 100644 Binary files a/sound/direct_sound_samples/cries/cradily.wav and b/sound/direct_sound_samples/cries/cradily.wav differ diff --git a/sound/direct_sound_samples/cries/cramorant_gulping.wav b/sound/direct_sound_samples/cries/cramorant_gulping.wav new file mode 100644 index 000000000..981f0256e Binary files /dev/null and b/sound/direct_sound_samples/cries/cramorant_gulping.wav differ diff --git a/sound/direct_sound_samples/cries/crawdaunt.wav b/sound/direct_sound_samples/cries/crawdaunt.wav index e270a3179..2ce6659a3 100644 Binary files a/sound/direct_sound_samples/cries/crawdaunt.wav and b/sound/direct_sound_samples/cries/crawdaunt.wav differ diff --git a/sound/direct_sound_samples/cries/crobat.wav b/sound/direct_sound_samples/cries/crobat.wav index fdad8d4a6..9000b8c29 100644 Binary files a/sound/direct_sound_samples/cries/crobat.wav and b/sound/direct_sound_samples/cries/crobat.wav differ diff --git a/sound/direct_sound_samples/cries/croconaw.wav b/sound/direct_sound_samples/cries/croconaw.wav index deb2a7003..9fd775fc0 100644 Binary files a/sound/direct_sound_samples/cries/croconaw.wav and b/sound/direct_sound_samples/cries/croconaw.wav differ diff --git a/sound/direct_sound_samples/cries/cubone.wav b/sound/direct_sound_samples/cries/cubone.wav index b198c2540..44b97c4bb 100644 Binary files a/sound/direct_sound_samples/cries/cubone.wav and b/sound/direct_sound_samples/cries/cubone.wav differ diff --git a/sound/direct_sound_samples/cries/cyndaquil.wav b/sound/direct_sound_samples/cries/cyndaquil.wav index 87921c52e..23e9b3273 100644 Binary files a/sound/direct_sound_samples/cries/cyndaquil.wav and b/sound/direct_sound_samples/cries/cyndaquil.wav differ diff --git a/sound/direct_sound_samples/cries/darkrai_mega.wav b/sound/direct_sound_samples/cries/darkrai_mega.wav new file mode 100644 index 000000000..d4cfc819f Binary files /dev/null and b/sound/direct_sound_samples/cries/darkrai_mega.wav differ diff --git a/sound/direct_sound_samples/cries/delcatty.wav b/sound/direct_sound_samples/cries/delcatty.wav index dce5e73b7..780705266 100644 Binary files a/sound/direct_sound_samples/cries/delcatty.wav and b/sound/direct_sound_samples/cries/delcatty.wav differ diff --git a/sound/direct_sound_samples/cries/delibird.wav b/sound/direct_sound_samples/cries/delibird.wav index 7ccf645de..f4b27e732 100644 Binary files a/sound/direct_sound_samples/cries/delibird.wav and b/sound/direct_sound_samples/cries/delibird.wav differ diff --git a/sound/direct_sound_samples/cries/delphox_mega.wav b/sound/direct_sound_samples/cries/delphox_mega.wav new file mode 100644 index 000000000..1e980bcb7 Binary files /dev/null and b/sound/direct_sound_samples/cries/delphox_mega.wav differ diff --git a/sound/direct_sound_samples/cries/deoxys.wav b/sound/direct_sound_samples/cries/deoxys.wav index 7ed0f65cc..c5943318d 100644 Binary files a/sound/direct_sound_samples/cries/deoxys.wav and b/sound/direct_sound_samples/cries/deoxys.wav differ diff --git a/sound/direct_sound_samples/cries/dewgong.wav b/sound/direct_sound_samples/cries/dewgong.wav index 24af04411..c99284027 100644 Binary files a/sound/direct_sound_samples/cries/dewgong.wav and b/sound/direct_sound_samples/cries/dewgong.wav differ diff --git a/sound/direct_sound_samples/cries/diglett.wav b/sound/direct_sound_samples/cries/diglett.wav index 8eecd3bed..ba098f64a 100644 Binary files a/sound/direct_sound_samples/cries/diglett.wav and b/sound/direct_sound_samples/cries/diglett.wav differ diff --git a/sound/direct_sound_samples/cries/ditto.wav b/sound/direct_sound_samples/cries/ditto.wav index bbd9d0280..b26b2d56c 100644 Binary files a/sound/direct_sound_samples/cries/ditto.wav and b/sound/direct_sound_samples/cries/ditto.wav differ diff --git a/sound/direct_sound_samples/cries/dodrio.wav b/sound/direct_sound_samples/cries/dodrio.wav index e43a8a977..c23d097d8 100644 Binary files a/sound/direct_sound_samples/cries/dodrio.wav and b/sound/direct_sound_samples/cries/dodrio.wav differ diff --git a/sound/direct_sound_samples/cries/doduo.wav b/sound/direct_sound_samples/cries/doduo.wav index 065e9fd62..3d7bad39e 100644 Binary files a/sound/direct_sound_samples/cries/doduo.wav and b/sound/direct_sound_samples/cries/doduo.wav differ diff --git a/sound/direct_sound_samples/cries/donphan.wav b/sound/direct_sound_samples/cries/donphan.wav index ba6caf5bd..64a69a34f 100644 Binary files a/sound/direct_sound_samples/cries/donphan.wav and b/sound/direct_sound_samples/cries/donphan.wav differ diff --git a/sound/direct_sound_samples/cries/dragalge_mega.wav b/sound/direct_sound_samples/cries/dragalge_mega.wav new file mode 100644 index 000000000..2594a1fee Binary files /dev/null and b/sound/direct_sound_samples/cries/dragalge_mega.wav differ diff --git a/sound/direct_sound_samples/cries/dragonair.wav b/sound/direct_sound_samples/cries/dragonair.wav index 3fd2efee2..ab902f69d 100644 Binary files a/sound/direct_sound_samples/cries/dragonair.wav and b/sound/direct_sound_samples/cries/dragonair.wav differ diff --git a/sound/direct_sound_samples/cries/dragonite.wav b/sound/direct_sound_samples/cries/dragonite.wav index 8517e0da0..98f044cc3 100644 Binary files a/sound/direct_sound_samples/cries/dragonite.wav and b/sound/direct_sound_samples/cries/dragonite.wav differ diff --git a/sound/direct_sound_samples/cries/dragonite_mega.wav b/sound/direct_sound_samples/cries/dragonite_mega.wav new file mode 100644 index 000000000..1be6f9489 Binary files /dev/null and b/sound/direct_sound_samples/cries/dragonite_mega.wav differ diff --git a/sound/direct_sound_samples/cries/drampa_mega.wav b/sound/direct_sound_samples/cries/drampa_mega.wav new file mode 100644 index 000000000..ea67c9471 Binary files /dev/null and b/sound/direct_sound_samples/cries/drampa_mega.wav differ diff --git a/sound/direct_sound_samples/cries/dratini.wav b/sound/direct_sound_samples/cries/dratini.wav index 711c6b9a3..ab59d4c18 100644 Binary files a/sound/direct_sound_samples/cries/dratini.wav and b/sound/direct_sound_samples/cries/dratini.wav differ diff --git a/sound/direct_sound_samples/cries/drowzee.wav b/sound/direct_sound_samples/cries/drowzee.wav index 413210966..3294d5f83 100644 Binary files a/sound/direct_sound_samples/cries/drowzee.wav and b/sound/direct_sound_samples/cries/drowzee.wav differ diff --git a/sound/direct_sound_samples/cries/dugtrio.wav b/sound/direct_sound_samples/cries/dugtrio.wav index d159a2fae..59be4c5a7 100644 Binary files a/sound/direct_sound_samples/cries/dugtrio.wav and b/sound/direct_sound_samples/cries/dugtrio.wav differ diff --git a/sound/direct_sound_samples/cries/dunsparce.wav b/sound/direct_sound_samples/cries/dunsparce.wav index 5154546d1..b3bc21a04 100644 Binary files a/sound/direct_sound_samples/cries/dunsparce.wav and b/sound/direct_sound_samples/cries/dunsparce.wav differ diff --git a/sound/direct_sound_samples/cries/dusclops.wav b/sound/direct_sound_samples/cries/dusclops.wav index 81353887b..0ae486972 100644 Binary files a/sound/direct_sound_samples/cries/dusclops.wav and b/sound/direct_sound_samples/cries/dusclops.wav differ diff --git a/sound/direct_sound_samples/cries/duskull.wav b/sound/direct_sound_samples/cries/duskull.wav index eba8fc3ff..7ef72a397 100644 Binary files a/sound/direct_sound_samples/cries/duskull.wav and b/sound/direct_sound_samples/cries/duskull.wav differ diff --git a/sound/direct_sound_samples/cries/dustox.wav b/sound/direct_sound_samples/cries/dustox.wav index 42f23c128..764758562 100644 Binary files a/sound/direct_sound_samples/cries/dustox.wav and b/sound/direct_sound_samples/cries/dustox.wav differ diff --git a/sound/direct_sound_samples/cries/eelektross_mega.wav b/sound/direct_sound_samples/cries/eelektross_mega.wav new file mode 100644 index 000000000..eb26ab228 Binary files /dev/null and b/sound/direct_sound_samples/cries/eelektross_mega.wav differ diff --git a/sound/direct_sound_samples/cries/eevee.wav b/sound/direct_sound_samples/cries/eevee.wav index e21ce1f0e..833528278 100644 Binary files a/sound/direct_sound_samples/cries/eevee.wav and b/sound/direct_sound_samples/cries/eevee.wav differ diff --git a/sound/direct_sound_samples/cries/ekans.wav b/sound/direct_sound_samples/cries/ekans.wav index 2ae3e4a18..5a7515847 100644 Binary files a/sound/direct_sound_samples/cries/ekans.wav and b/sound/direct_sound_samples/cries/ekans.wav differ diff --git a/sound/direct_sound_samples/cries/electabuzz.wav b/sound/direct_sound_samples/cries/electabuzz.wav index b555d6631..8443823fb 100644 Binary files a/sound/direct_sound_samples/cries/electabuzz.wav and b/sound/direct_sound_samples/cries/electabuzz.wav differ diff --git a/sound/direct_sound_samples/cries/electrike.wav b/sound/direct_sound_samples/cries/electrike.wav index 8a210865b..9b09301ff 100644 Binary files a/sound/direct_sound_samples/cries/electrike.wav and b/sound/direct_sound_samples/cries/electrike.wav differ diff --git a/sound/direct_sound_samples/cries/electrode.wav b/sound/direct_sound_samples/cries/electrode.wav index 8f2852146..4ad346759 100644 Binary files a/sound/direct_sound_samples/cries/electrode.wav and b/sound/direct_sound_samples/cries/electrode.wav differ diff --git a/sound/direct_sound_samples/cries/elekid.wav b/sound/direct_sound_samples/cries/elekid.wav index 82a9a2f67..249111386 100644 Binary files a/sound/direct_sound_samples/cries/elekid.wav and b/sound/direct_sound_samples/cries/elekid.wav differ diff --git a/sound/direct_sound_samples/cries/emboar_mega.wav b/sound/direct_sound_samples/cries/emboar_mega.wav new file mode 100644 index 000000000..4ebaeb494 Binary files /dev/null and b/sound/direct_sound_samples/cries/emboar_mega.wav differ diff --git a/sound/direct_sound_samples/cries/entei.wav b/sound/direct_sound_samples/cries/entei.wav index cf7e9c0c2..cce2db4b0 100644 Binary files a/sound/direct_sound_samples/cries/entei.wav and b/sound/direct_sound_samples/cries/entei.wav differ diff --git a/sound/direct_sound_samples/cries/espeon.wav b/sound/direct_sound_samples/cries/espeon.wav index 20743268e..8456a350d 100644 Binary files a/sound/direct_sound_samples/cries/espeon.wav and b/sound/direct_sound_samples/cries/espeon.wav differ diff --git a/sound/direct_sound_samples/cries/excadrill_mega.wav b/sound/direct_sound_samples/cries/excadrill_mega.wav new file mode 100644 index 000000000..627245dae Binary files /dev/null and b/sound/direct_sound_samples/cries/excadrill_mega.wav differ diff --git a/sound/direct_sound_samples/cries/exeggcute.wav b/sound/direct_sound_samples/cries/exeggcute.wav index bfd825f80..865aedc1f 100644 Binary files a/sound/direct_sound_samples/cries/exeggcute.wav and b/sound/direct_sound_samples/cries/exeggcute.wav differ diff --git a/sound/direct_sound_samples/cries/exeggutor.wav b/sound/direct_sound_samples/cries/exeggutor.wav index f2a0d6bed..831eb36cd 100644 Binary files a/sound/direct_sound_samples/cries/exeggutor.wav and b/sound/direct_sound_samples/cries/exeggutor.wav differ diff --git a/sound/direct_sound_samples/cries/exploud.wav b/sound/direct_sound_samples/cries/exploud.wav index 9b3cbf896..1b81512ce 100644 Binary files a/sound/direct_sound_samples/cries/exploud.wav and b/sound/direct_sound_samples/cries/exploud.wav differ diff --git a/sound/direct_sound_samples/cries/falinks_mega.wav b/sound/direct_sound_samples/cries/falinks_mega.wav new file mode 100644 index 000000000..5c9354ae6 Binary files /dev/null and b/sound/direct_sound_samples/cries/falinks_mega.wav differ diff --git a/sound/direct_sound_samples/cries/farfetchd.wav b/sound/direct_sound_samples/cries/farfetchd.wav index d090445d4..294322e04 100644 Binary files a/sound/direct_sound_samples/cries/farfetchd.wav and b/sound/direct_sound_samples/cries/farfetchd.wav differ diff --git a/sound/direct_sound_samples/cries/fearow.wav b/sound/direct_sound_samples/cries/fearow.wav index 6ef7eadee..d2ab288dd 100644 Binary files a/sound/direct_sound_samples/cries/fearow.wav and b/sound/direct_sound_samples/cries/fearow.wav differ diff --git a/sound/direct_sound_samples/cries/feebas.wav b/sound/direct_sound_samples/cries/feebas.wav index a8f60a55f..1e9037b7e 100644 Binary files a/sound/direct_sound_samples/cries/feebas.wav and b/sound/direct_sound_samples/cries/feebas.wav differ diff --git a/sound/direct_sound_samples/cries/feraligatr.wav b/sound/direct_sound_samples/cries/feraligatr.wav index d1da192f9..f17eec474 100644 Binary files a/sound/direct_sound_samples/cries/feraligatr.wav and b/sound/direct_sound_samples/cries/feraligatr.wav differ diff --git a/sound/direct_sound_samples/cries/feraligatr_mega.wav b/sound/direct_sound_samples/cries/feraligatr_mega.wav new file mode 100644 index 000000000..6c634ac6b Binary files /dev/null and b/sound/direct_sound_samples/cries/feraligatr_mega.wav differ diff --git a/sound/direct_sound_samples/cries/flaaffy.wav b/sound/direct_sound_samples/cries/flaaffy.wav index a0cf3df06..9459c8e06 100644 Binary files a/sound/direct_sound_samples/cries/flaaffy.wav and b/sound/direct_sound_samples/cries/flaaffy.wav differ diff --git a/sound/direct_sound_samples/cries/flareon.wav b/sound/direct_sound_samples/cries/flareon.wav index 6bd51168b..d138a75e0 100644 Binary files a/sound/direct_sound_samples/cries/flareon.wav and b/sound/direct_sound_samples/cries/flareon.wav differ diff --git a/sound/direct_sound_samples/cries/floette_mega.wav b/sound/direct_sound_samples/cries/floette_mega.wav new file mode 100644 index 000000000..a781d3d6a Binary files /dev/null and b/sound/direct_sound_samples/cries/floette_mega.wav differ diff --git a/sound/direct_sound_samples/cries/flygon.wav b/sound/direct_sound_samples/cries/flygon.wav index b6c5d90ba..2d64627ee 100644 Binary files a/sound/direct_sound_samples/cries/flygon.wav and b/sound/direct_sound_samples/cries/flygon.wav differ diff --git a/sound/direct_sound_samples/cries/forretress.wav b/sound/direct_sound_samples/cries/forretress.wav index 3f704f65b..008140c1e 100644 Binary files a/sound/direct_sound_samples/cries/forretress.wav and b/sound/direct_sound_samples/cries/forretress.wav differ diff --git a/sound/direct_sound_samples/cries/froslass_mega.wav b/sound/direct_sound_samples/cries/froslass_mega.wav new file mode 100644 index 000000000..b3db54cd7 Binary files /dev/null and b/sound/direct_sound_samples/cries/froslass_mega.wav differ diff --git a/sound/direct_sound_samples/cries/furret.wav b/sound/direct_sound_samples/cries/furret.wav index e3e4ec584..605eeec17 100644 Binary files a/sound/direct_sound_samples/cries/furret.wav and b/sound/direct_sound_samples/cries/furret.wav differ diff --git a/sound/direct_sound_samples/cries/gardevoir.wav b/sound/direct_sound_samples/cries/gardevoir.wav index bd3a99acc..a40ef1262 100644 Binary files a/sound/direct_sound_samples/cries/gardevoir.wav and b/sound/direct_sound_samples/cries/gardevoir.wav differ diff --git a/sound/direct_sound_samples/cries/gastly.wav b/sound/direct_sound_samples/cries/gastly.wav index 1bc2ff966..7d9c25de3 100644 Binary files a/sound/direct_sound_samples/cries/gastly.wav and b/sound/direct_sound_samples/cries/gastly.wav differ diff --git a/sound/direct_sound_samples/cries/gengar.wav b/sound/direct_sound_samples/cries/gengar.wav index 9e8c24c28..74ec623df 100644 Binary files a/sound/direct_sound_samples/cries/gengar.wav and b/sound/direct_sound_samples/cries/gengar.wav differ diff --git a/sound/direct_sound_samples/cries/geodude.wav b/sound/direct_sound_samples/cries/geodude.wav index f355fc7e1..0c1336a8e 100644 Binary files a/sound/direct_sound_samples/cries/geodude.wav and b/sound/direct_sound_samples/cries/geodude.wav differ diff --git a/sound/direct_sound_samples/cries/girafarig.wav b/sound/direct_sound_samples/cries/girafarig.wav index d78162a29..089b8bb04 100644 Binary files a/sound/direct_sound_samples/cries/girafarig.wav and b/sound/direct_sound_samples/cries/girafarig.wav differ diff --git a/sound/direct_sound_samples/cries/glalie.wav b/sound/direct_sound_samples/cries/glalie.wav index bf35bd147..6f81e7a2a 100644 Binary files a/sound/direct_sound_samples/cries/glalie.wav and b/sound/direct_sound_samples/cries/glalie.wav differ diff --git a/sound/direct_sound_samples/cries/gligar.wav b/sound/direct_sound_samples/cries/gligar.wav index 8fa3efa6b..fa49131d8 100644 Binary files a/sound/direct_sound_samples/cries/gligar.wav and b/sound/direct_sound_samples/cries/gligar.wav differ diff --git a/sound/direct_sound_samples/cries/glimmora_mega.wav b/sound/direct_sound_samples/cries/glimmora_mega.wav new file mode 100644 index 000000000..c140cb661 Binary files /dev/null and b/sound/direct_sound_samples/cries/glimmora_mega.wav differ diff --git a/sound/direct_sound_samples/cries/gloom.wav b/sound/direct_sound_samples/cries/gloom.wav index abc408a0f..ce3da9708 100644 Binary files a/sound/direct_sound_samples/cries/gloom.wav and b/sound/direct_sound_samples/cries/gloom.wav differ diff --git a/sound/direct_sound_samples/cries/golbat.wav b/sound/direct_sound_samples/cries/golbat.wav index 20d2ecf5c..4f098e5f2 100644 Binary files a/sound/direct_sound_samples/cries/golbat.wav and b/sound/direct_sound_samples/cries/golbat.wav differ diff --git a/sound/direct_sound_samples/cries/goldeen.wav b/sound/direct_sound_samples/cries/goldeen.wav index 342df710c..ec3b48ad4 100644 Binary files a/sound/direct_sound_samples/cries/goldeen.wav and b/sound/direct_sound_samples/cries/goldeen.wav differ diff --git a/sound/direct_sound_samples/cries/golduck.wav b/sound/direct_sound_samples/cries/golduck.wav index a9bf91b2d..bc6cc95af 100644 Binary files a/sound/direct_sound_samples/cries/golduck.wav and b/sound/direct_sound_samples/cries/golduck.wav differ diff --git a/sound/direct_sound_samples/cries/golem.wav b/sound/direct_sound_samples/cries/golem.wav index 17ed6128e..9a26adcc9 100644 Binary files a/sound/direct_sound_samples/cries/golem.wav and b/sound/direct_sound_samples/cries/golem.wav differ diff --git a/sound/direct_sound_samples/cries/golisopod_mega.wav b/sound/direct_sound_samples/cries/golisopod_mega.wav new file mode 100644 index 000000000..38cd234d4 Binary files /dev/null and b/sound/direct_sound_samples/cries/golisopod_mega.wav differ diff --git a/sound/direct_sound_samples/cries/golurk_mega.wav b/sound/direct_sound_samples/cries/golurk_mega.wav new file mode 100644 index 000000000..e24877b8e Binary files /dev/null and b/sound/direct_sound_samples/cries/golurk_mega.wav differ diff --git a/sound/direct_sound_samples/cries/gorebyss.wav b/sound/direct_sound_samples/cries/gorebyss.wav index 3d375f6dc..cd14f26dd 100644 Binary files a/sound/direct_sound_samples/cries/gorebyss.wav and b/sound/direct_sound_samples/cries/gorebyss.wav differ diff --git a/sound/direct_sound_samples/cries/granbull.wav b/sound/direct_sound_samples/cries/granbull.wav index 959793b72..faffbc562 100644 Binary files a/sound/direct_sound_samples/cries/granbull.wav and b/sound/direct_sound_samples/cries/granbull.wav differ diff --git a/sound/direct_sound_samples/cries/graveler.wav b/sound/direct_sound_samples/cries/graveler.wav index 6b8591406..e5a2e9d19 100644 Binary files a/sound/direct_sound_samples/cries/graveler.wav and b/sound/direct_sound_samples/cries/graveler.wav differ diff --git a/sound/direct_sound_samples/cries/greninja_mega.wav b/sound/direct_sound_samples/cries/greninja_mega.wav new file mode 100644 index 000000000..9a890b68f Binary files /dev/null and b/sound/direct_sound_samples/cries/greninja_mega.wav differ diff --git a/sound/direct_sound_samples/cries/grimer.wav b/sound/direct_sound_samples/cries/grimer.wav index 092dfeed6..8ae15f406 100644 Binary files a/sound/direct_sound_samples/cries/grimer.wav and b/sound/direct_sound_samples/cries/grimer.wav differ diff --git a/sound/direct_sound_samples/cries/groudon.wav b/sound/direct_sound_samples/cries/groudon.wav index 680d0ec04..057120579 100644 Binary files a/sound/direct_sound_samples/cries/groudon.wav and b/sound/direct_sound_samples/cries/groudon.wav differ diff --git a/sound/direct_sound_samples/cries/grovyle.wav b/sound/direct_sound_samples/cries/grovyle.wav index 7e2f1acd0..6ae949e00 100644 Binary files a/sound/direct_sound_samples/cries/grovyle.wav and b/sound/direct_sound_samples/cries/grovyle.wav differ diff --git a/sound/direct_sound_samples/cries/growlithe.wav b/sound/direct_sound_samples/cries/growlithe.wav index 3f72ea6f9..96ea21385 100644 Binary files a/sound/direct_sound_samples/cries/growlithe.wav and b/sound/direct_sound_samples/cries/growlithe.wav differ diff --git a/sound/direct_sound_samples/cries/grumpig.wav b/sound/direct_sound_samples/cries/grumpig.wav index e9c8157e0..99f7684d1 100644 Binary files a/sound/direct_sound_samples/cries/grumpig.wav and b/sound/direct_sound_samples/cries/grumpig.wav differ diff --git a/sound/direct_sound_samples/cries/gulpin.wav b/sound/direct_sound_samples/cries/gulpin.wav index d1ab06b6b..af1c2dd99 100644 Binary files a/sound/direct_sound_samples/cries/gulpin.wav and b/sound/direct_sound_samples/cries/gulpin.wav differ diff --git a/sound/direct_sound_samples/cries/gyarados.wav b/sound/direct_sound_samples/cries/gyarados.wav index 6a4124085..b76327da2 100644 Binary files a/sound/direct_sound_samples/cries/gyarados.wav and b/sound/direct_sound_samples/cries/gyarados.wav differ diff --git a/sound/direct_sound_samples/cries/hariyama.wav b/sound/direct_sound_samples/cries/hariyama.wav index 5567aae3a..879f7d1e1 100644 Binary files a/sound/direct_sound_samples/cries/hariyama.wav and b/sound/direct_sound_samples/cries/hariyama.wav differ diff --git a/sound/direct_sound_samples/cries/haunter.wav b/sound/direct_sound_samples/cries/haunter.wav index e22b1cfc1..999a0d02d 100644 Binary files a/sound/direct_sound_samples/cries/haunter.wav and b/sound/direct_sound_samples/cries/haunter.wav differ diff --git a/sound/direct_sound_samples/cries/hawlucha_mega.wav b/sound/direct_sound_samples/cries/hawlucha_mega.wav new file mode 100644 index 000000000..27ccc4340 Binary files /dev/null and b/sound/direct_sound_samples/cries/hawlucha_mega.wav differ diff --git a/sound/direct_sound_samples/cries/heatran_mega.wav b/sound/direct_sound_samples/cries/heatran_mega.wav new file mode 100644 index 000000000..c4e9625ce Binary files /dev/null and b/sound/direct_sound_samples/cries/heatran_mega.wav differ diff --git a/sound/direct_sound_samples/cries/heracross.wav b/sound/direct_sound_samples/cries/heracross.wav index ed68648ba..148249908 100644 Binary files a/sound/direct_sound_samples/cries/heracross.wav and b/sound/direct_sound_samples/cries/heracross.wav differ diff --git a/sound/direct_sound_samples/cries/hitmonchan.wav b/sound/direct_sound_samples/cries/hitmonchan.wav index 806d206d3..130169e6e 100644 Binary files a/sound/direct_sound_samples/cries/hitmonchan.wav and b/sound/direct_sound_samples/cries/hitmonchan.wav differ diff --git a/sound/direct_sound_samples/cries/hitmonlee.wav b/sound/direct_sound_samples/cries/hitmonlee.wav index e40d852b9..9ec63520a 100644 Binary files a/sound/direct_sound_samples/cries/hitmonlee.wav and b/sound/direct_sound_samples/cries/hitmonlee.wav differ diff --git a/sound/direct_sound_samples/cries/hitmontop.wav b/sound/direct_sound_samples/cries/hitmontop.wav index 652222dc6..fa26c699b 100644 Binary files a/sound/direct_sound_samples/cries/hitmontop.wav and b/sound/direct_sound_samples/cries/hitmontop.wav differ diff --git a/sound/direct_sound_samples/cries/ho_oh.wav b/sound/direct_sound_samples/cries/ho_oh.wav index acf881253..e098f9806 100644 Binary files a/sound/direct_sound_samples/cries/ho_oh.wav and b/sound/direct_sound_samples/cries/ho_oh.wav differ diff --git a/sound/direct_sound_samples/cries/hoothoot.wav b/sound/direct_sound_samples/cries/hoothoot.wav index e7ca2f578..303fddb12 100644 Binary files a/sound/direct_sound_samples/cries/hoothoot.wav and b/sound/direct_sound_samples/cries/hoothoot.wav differ diff --git a/sound/direct_sound_samples/cries/hoppip.wav b/sound/direct_sound_samples/cries/hoppip.wav index ab14fdaec..525c720e9 100644 Binary files a/sound/direct_sound_samples/cries/hoppip.wav and b/sound/direct_sound_samples/cries/hoppip.wav differ diff --git a/sound/direct_sound_samples/cries/horsea.wav b/sound/direct_sound_samples/cries/horsea.wav index ab67381ed..26efb0ca7 100644 Binary files a/sound/direct_sound_samples/cries/horsea.wav and b/sound/direct_sound_samples/cries/horsea.wav differ diff --git a/sound/direct_sound_samples/cries/houndoom.wav b/sound/direct_sound_samples/cries/houndoom.wav index a34e4cda2..1add97cb8 100644 Binary files a/sound/direct_sound_samples/cries/houndoom.wav and b/sound/direct_sound_samples/cries/houndoom.wav differ diff --git a/sound/direct_sound_samples/cries/houndour.wav b/sound/direct_sound_samples/cries/houndour.wav index 51310524a..ef683e68f 100644 Binary files a/sound/direct_sound_samples/cries/houndour.wav and b/sound/direct_sound_samples/cries/houndour.wav differ diff --git a/sound/direct_sound_samples/cries/huntail.wav b/sound/direct_sound_samples/cries/huntail.wav index b2e3f9985..9c4e7af02 100644 Binary files a/sound/direct_sound_samples/cries/huntail.wav and b/sound/direct_sound_samples/cries/huntail.wav differ diff --git a/sound/direct_sound_samples/cries/hypno.wav b/sound/direct_sound_samples/cries/hypno.wav index 4369110c2..3b1e2dab6 100644 Binary files a/sound/direct_sound_samples/cries/hypno.wav and b/sound/direct_sound_samples/cries/hypno.wav differ diff --git a/sound/direct_sound_samples/cries/igglybuff.wav b/sound/direct_sound_samples/cries/igglybuff.wav index efec9bf4c..0b8a7dfca 100644 Binary files a/sound/direct_sound_samples/cries/igglybuff.wav and b/sound/direct_sound_samples/cries/igglybuff.wav differ diff --git a/sound/direct_sound_samples/cries/illumise.wav b/sound/direct_sound_samples/cries/illumise.wav index 6570492f7..f0234b92e 100644 Binary files a/sound/direct_sound_samples/cries/illumise.wav and b/sound/direct_sound_samples/cries/illumise.wav differ diff --git a/sound/direct_sound_samples/cries/ivysaur.wav b/sound/direct_sound_samples/cries/ivysaur.wav index 07d10c0e8..1110a6338 100644 Binary files a/sound/direct_sound_samples/cries/ivysaur.wav and b/sound/direct_sound_samples/cries/ivysaur.wav differ diff --git a/sound/direct_sound_samples/cries/jigglypuff.wav b/sound/direct_sound_samples/cries/jigglypuff.wav index d3e925fe9..4b8d4ccc8 100644 Binary files a/sound/direct_sound_samples/cries/jigglypuff.wav and b/sound/direct_sound_samples/cries/jigglypuff.wav differ diff --git a/sound/direct_sound_samples/cries/jirachi.wav b/sound/direct_sound_samples/cries/jirachi.wav index 43850cbaa..f548e50bf 100644 Binary files a/sound/direct_sound_samples/cries/jirachi.wav and b/sound/direct_sound_samples/cries/jirachi.wav differ diff --git a/sound/direct_sound_samples/cries/jolteon.wav b/sound/direct_sound_samples/cries/jolteon.wav index 8c5f8bea4..61b5cb160 100644 Binary files a/sound/direct_sound_samples/cries/jolteon.wav and b/sound/direct_sound_samples/cries/jolteon.wav differ diff --git a/sound/direct_sound_samples/cries/jumpluff.wav b/sound/direct_sound_samples/cries/jumpluff.wav index cce951b1f..d58b0b11f 100644 Binary files a/sound/direct_sound_samples/cries/jumpluff.wav and b/sound/direct_sound_samples/cries/jumpluff.wav differ diff --git a/sound/direct_sound_samples/cries/jynx.wav b/sound/direct_sound_samples/cries/jynx.wav index faacb1e95..bb833749e 100644 Binary files a/sound/direct_sound_samples/cries/jynx.wav and b/sound/direct_sound_samples/cries/jynx.wav differ diff --git a/sound/direct_sound_samples/cries/kabuto.wav b/sound/direct_sound_samples/cries/kabuto.wav index 448b17891..598845740 100644 Binary files a/sound/direct_sound_samples/cries/kabuto.wav and b/sound/direct_sound_samples/cries/kabuto.wav differ diff --git a/sound/direct_sound_samples/cries/kabutops.wav b/sound/direct_sound_samples/cries/kabutops.wav index 0c7b74fea..9cc76e453 100644 Binary files a/sound/direct_sound_samples/cries/kabutops.wav and b/sound/direct_sound_samples/cries/kabutops.wav differ diff --git a/sound/direct_sound_samples/cries/kadabra.wav b/sound/direct_sound_samples/cries/kadabra.wav index d7030b27a..f2e3788e4 100644 Binary files a/sound/direct_sound_samples/cries/kadabra.wav and b/sound/direct_sound_samples/cries/kadabra.wav differ diff --git a/sound/direct_sound_samples/cries/kakuna.wav b/sound/direct_sound_samples/cries/kakuna.wav index f147428e3..0a7b43f94 100644 Binary files a/sound/direct_sound_samples/cries/kakuna.wav and b/sound/direct_sound_samples/cries/kakuna.wav differ diff --git a/sound/direct_sound_samples/cries/kangaskhan.wav b/sound/direct_sound_samples/cries/kangaskhan.wav index eaf724462..32a12fcbc 100644 Binary files a/sound/direct_sound_samples/cries/kangaskhan.wav and b/sound/direct_sound_samples/cries/kangaskhan.wav differ diff --git a/sound/direct_sound_samples/cries/kecleon.wav b/sound/direct_sound_samples/cries/kecleon.wav index 96ab74ff2..5d16ee144 100644 Binary files a/sound/direct_sound_samples/cries/kecleon.wav and b/sound/direct_sound_samples/cries/kecleon.wav differ diff --git a/sound/direct_sound_samples/cries/kingdra.wav b/sound/direct_sound_samples/cries/kingdra.wav index 2a47d1479..2263e72cb 100644 Binary files a/sound/direct_sound_samples/cries/kingdra.wav and b/sound/direct_sound_samples/cries/kingdra.wav differ diff --git a/sound/direct_sound_samples/cries/kingler.wav b/sound/direct_sound_samples/cries/kingler.wav index 62418456d..6d3f58e8c 100644 Binary files a/sound/direct_sound_samples/cries/kingler.wav and b/sound/direct_sound_samples/cries/kingler.wav differ diff --git a/sound/direct_sound_samples/cries/kirlia.wav b/sound/direct_sound_samples/cries/kirlia.wav index c7dd3078c..36706ca6f 100644 Binary files a/sound/direct_sound_samples/cries/kirlia.wav and b/sound/direct_sound_samples/cries/kirlia.wav differ diff --git a/sound/direct_sound_samples/cries/koffing.wav b/sound/direct_sound_samples/cries/koffing.wav index afa520c03..5fd7b7d4a 100644 Binary files a/sound/direct_sound_samples/cries/koffing.wav and b/sound/direct_sound_samples/cries/koffing.wav differ diff --git a/sound/direct_sound_samples/cries/krabby.wav b/sound/direct_sound_samples/cries/krabby.wav index 0072ea777..31644bacc 100644 Binary files a/sound/direct_sound_samples/cries/krabby.wav and b/sound/direct_sound_samples/cries/krabby.wav differ diff --git a/sound/direct_sound_samples/cries/kyogre.wav b/sound/direct_sound_samples/cries/kyogre.wav index 00db984c6..d73951bb6 100644 Binary files a/sound/direct_sound_samples/cries/kyogre.wav and b/sound/direct_sound_samples/cries/kyogre.wav differ diff --git a/sound/direct_sound_samples/cries/lairon.wav b/sound/direct_sound_samples/cries/lairon.wav index 574ffac74..1d82d0654 100644 Binary files a/sound/direct_sound_samples/cries/lairon.wav and b/sound/direct_sound_samples/cries/lairon.wav differ diff --git a/sound/direct_sound_samples/cries/lanturn.wav b/sound/direct_sound_samples/cries/lanturn.wav index 6d8b21dd9..3b68f58ad 100644 Binary files a/sound/direct_sound_samples/cries/lanturn.wav and b/sound/direct_sound_samples/cries/lanturn.wav differ diff --git a/sound/direct_sound_samples/cries/lapras.wav b/sound/direct_sound_samples/cries/lapras.wav index d79819a97..2c0714995 100644 Binary files a/sound/direct_sound_samples/cries/lapras.wav and b/sound/direct_sound_samples/cries/lapras.wav differ diff --git a/sound/direct_sound_samples/cries/larvitar.wav b/sound/direct_sound_samples/cries/larvitar.wav index e0e22cd6f..6ef5d4566 100644 Binary files a/sound/direct_sound_samples/cries/larvitar.wav and b/sound/direct_sound_samples/cries/larvitar.wav differ diff --git a/sound/direct_sound_samples/cries/latias.wav b/sound/direct_sound_samples/cries/latias.wav index 87e6205ad..dac6c463f 100644 Binary files a/sound/direct_sound_samples/cries/latias.wav and b/sound/direct_sound_samples/cries/latias.wav differ diff --git a/sound/direct_sound_samples/cries/latios.wav b/sound/direct_sound_samples/cries/latios.wav index 1409dba11..f07efb29f 100644 Binary files a/sound/direct_sound_samples/cries/latios.wav and b/sound/direct_sound_samples/cries/latios.wav differ diff --git a/sound/direct_sound_samples/cries/ledian.wav b/sound/direct_sound_samples/cries/ledian.wav index 554829075..075bb15f0 100644 Binary files a/sound/direct_sound_samples/cries/ledian.wav and b/sound/direct_sound_samples/cries/ledian.wav differ diff --git a/sound/direct_sound_samples/cries/ledyba.wav b/sound/direct_sound_samples/cries/ledyba.wav index e539c3d60..95d9dff2e 100644 Binary files a/sound/direct_sound_samples/cries/ledyba.wav and b/sound/direct_sound_samples/cries/ledyba.wav differ diff --git a/sound/direct_sound_samples/cries/lickitung.wav b/sound/direct_sound_samples/cries/lickitung.wav index 33a0ab5ff..89808fd3d 100644 Binary files a/sound/direct_sound_samples/cries/lickitung.wav and b/sound/direct_sound_samples/cries/lickitung.wav differ diff --git a/sound/direct_sound_samples/cries/lileep.wav b/sound/direct_sound_samples/cries/lileep.wav index f890086d3..5fd0ba803 100644 Binary files a/sound/direct_sound_samples/cries/lileep.wav and b/sound/direct_sound_samples/cries/lileep.wav differ diff --git a/sound/direct_sound_samples/cries/linoone.wav b/sound/direct_sound_samples/cries/linoone.wav index b8c191bcd..a182b4f32 100644 Binary files a/sound/direct_sound_samples/cries/linoone.wav and b/sound/direct_sound_samples/cries/linoone.wav differ diff --git a/sound/direct_sound_samples/cries/lombre.wav b/sound/direct_sound_samples/cries/lombre.wav index 6d7888619..f7c36acdd 100644 Binary files a/sound/direct_sound_samples/cries/lombre.wav and b/sound/direct_sound_samples/cries/lombre.wav differ diff --git a/sound/direct_sound_samples/cries/lotad.wav b/sound/direct_sound_samples/cries/lotad.wav index 8e28b10f3..ee0cb6f69 100644 Binary files a/sound/direct_sound_samples/cries/lotad.wav and b/sound/direct_sound_samples/cries/lotad.wav differ diff --git a/sound/direct_sound_samples/cries/loudred.wav b/sound/direct_sound_samples/cries/loudred.wav index ff8b2c810..06495bf49 100644 Binary files a/sound/direct_sound_samples/cries/loudred.wav and b/sound/direct_sound_samples/cries/loudred.wav differ diff --git a/sound/direct_sound_samples/cries/lucario_mega_z.wav b/sound/direct_sound_samples/cries/lucario_mega_z.wav new file mode 100644 index 000000000..ee9712883 Binary files /dev/null and b/sound/direct_sound_samples/cries/lucario_mega_z.wav differ diff --git a/sound/direct_sound_samples/cries/ludicolo.wav b/sound/direct_sound_samples/cries/ludicolo.wav index 420ac5459..fa300674f 100644 Binary files a/sound/direct_sound_samples/cries/ludicolo.wav and b/sound/direct_sound_samples/cries/ludicolo.wav differ diff --git a/sound/direct_sound_samples/cries/lugia.wav b/sound/direct_sound_samples/cries/lugia.wav index 855920839..1a1c46ef4 100644 Binary files a/sound/direct_sound_samples/cries/lugia.wav and b/sound/direct_sound_samples/cries/lugia.wav differ diff --git a/sound/direct_sound_samples/cries/lunatone.wav b/sound/direct_sound_samples/cries/lunatone.wav index 8edd9a17e..afd9473b8 100644 Binary files a/sound/direct_sound_samples/cries/lunatone.wav and b/sound/direct_sound_samples/cries/lunatone.wav differ diff --git a/sound/direct_sound_samples/cries/luvdisc.wav b/sound/direct_sound_samples/cries/luvdisc.wav index da1c84b80..c4261d76e 100644 Binary files a/sound/direct_sound_samples/cries/luvdisc.wav and b/sound/direct_sound_samples/cries/luvdisc.wav differ diff --git a/sound/direct_sound_samples/cries/machamp.wav b/sound/direct_sound_samples/cries/machamp.wav index b7e091dc7..9535dcbab 100644 Binary files a/sound/direct_sound_samples/cries/machamp.wav and b/sound/direct_sound_samples/cries/machamp.wav differ diff --git a/sound/direct_sound_samples/cries/machoke.wav b/sound/direct_sound_samples/cries/machoke.wav index 5e0fc98bf..de76612e3 100644 Binary files a/sound/direct_sound_samples/cries/machoke.wav and b/sound/direct_sound_samples/cries/machoke.wav differ diff --git a/sound/direct_sound_samples/cries/machop.wav b/sound/direct_sound_samples/cries/machop.wav index a34a0ccc8..2e5af3e55 100644 Binary files a/sound/direct_sound_samples/cries/machop.wav and b/sound/direct_sound_samples/cries/machop.wav differ diff --git a/sound/direct_sound_samples/cries/magby.wav b/sound/direct_sound_samples/cries/magby.wav index 8b083206c..c8129db69 100644 Binary files a/sound/direct_sound_samples/cries/magby.wav and b/sound/direct_sound_samples/cries/magby.wav differ diff --git a/sound/direct_sound_samples/cries/magcargo.wav b/sound/direct_sound_samples/cries/magcargo.wav index 6d97b90c1..1bdd97d3b 100644 Binary files a/sound/direct_sound_samples/cries/magcargo.wav and b/sound/direct_sound_samples/cries/magcargo.wav differ diff --git a/sound/direct_sound_samples/cries/magearna_mega.wav b/sound/direct_sound_samples/cries/magearna_mega.wav new file mode 100644 index 000000000..88027ef21 Binary files /dev/null and b/sound/direct_sound_samples/cries/magearna_mega.wav differ diff --git a/sound/direct_sound_samples/cries/magikarp.wav b/sound/direct_sound_samples/cries/magikarp.wav index 6c665d9e7..115fa23f2 100644 Binary files a/sound/direct_sound_samples/cries/magikarp.wav and b/sound/direct_sound_samples/cries/magikarp.wav differ diff --git a/sound/direct_sound_samples/cries/magmar.wav b/sound/direct_sound_samples/cries/magmar.wav index 902c15bf2..6a3621c3c 100644 Binary files a/sound/direct_sound_samples/cries/magmar.wav and b/sound/direct_sound_samples/cries/magmar.wav differ diff --git a/sound/direct_sound_samples/cries/magnemite.wav b/sound/direct_sound_samples/cries/magnemite.wav index 4fdc93f29..7dd1d550b 100644 Binary files a/sound/direct_sound_samples/cries/magnemite.wav and b/sound/direct_sound_samples/cries/magnemite.wav differ diff --git a/sound/direct_sound_samples/cries/magneton.wav b/sound/direct_sound_samples/cries/magneton.wav index d69c27644..12513343d 100644 Binary files a/sound/direct_sound_samples/cries/magneton.wav and b/sound/direct_sound_samples/cries/magneton.wav differ diff --git a/sound/direct_sound_samples/cries/makuhita.wav b/sound/direct_sound_samples/cries/makuhita.wav index 79b055ef9..6df74f2c1 100644 Binary files a/sound/direct_sound_samples/cries/makuhita.wav and b/sound/direct_sound_samples/cries/makuhita.wav differ diff --git a/sound/direct_sound_samples/cries/malamar_mega.wav b/sound/direct_sound_samples/cries/malamar_mega.wav new file mode 100644 index 000000000..ddcf9586c Binary files /dev/null and b/sound/direct_sound_samples/cries/malamar_mega.wav differ diff --git a/sound/direct_sound_samples/cries/manectric.wav b/sound/direct_sound_samples/cries/manectric.wav index 939fc1609..db806c46a 100644 Binary files a/sound/direct_sound_samples/cries/manectric.wav and b/sound/direct_sound_samples/cries/manectric.wav differ diff --git a/sound/direct_sound_samples/cries/mankey.wav b/sound/direct_sound_samples/cries/mankey.wav index ab15ac9af..9cf9f4866 100644 Binary files a/sound/direct_sound_samples/cries/mankey.wav and b/sound/direct_sound_samples/cries/mankey.wav differ diff --git a/sound/direct_sound_samples/cries/mantine.wav b/sound/direct_sound_samples/cries/mantine.wav index 919242e8f..bc6f17e5e 100644 Binary files a/sound/direct_sound_samples/cries/mantine.wav and b/sound/direct_sound_samples/cries/mantine.wav differ diff --git a/sound/direct_sound_samples/cries/mareep.wav b/sound/direct_sound_samples/cries/mareep.wav index 386925f5d..b0a523d7d 100644 Binary files a/sound/direct_sound_samples/cries/mareep.wav and b/sound/direct_sound_samples/cries/mareep.wav differ diff --git a/sound/direct_sound_samples/cries/marill.wav b/sound/direct_sound_samples/cries/marill.wav index 93201d1c5..8842fb018 100644 Binary files a/sound/direct_sound_samples/cries/marill.wav and b/sound/direct_sound_samples/cries/marill.wav differ diff --git a/sound/direct_sound_samples/cries/marowak.wav b/sound/direct_sound_samples/cries/marowak.wav index 7bddb4b34..6701514d2 100644 Binary files a/sound/direct_sound_samples/cries/marowak.wav and b/sound/direct_sound_samples/cries/marowak.wav differ diff --git a/sound/direct_sound_samples/cries/marshtomp.wav b/sound/direct_sound_samples/cries/marshtomp.wav index 0caa959e2..ed906f7d1 100644 Binary files a/sound/direct_sound_samples/cries/marshtomp.wav and b/sound/direct_sound_samples/cries/marshtomp.wav differ diff --git a/sound/direct_sound_samples/cries/masquerain.wav b/sound/direct_sound_samples/cries/masquerain.wav index b0c5372ae..d7f5c700a 100644 Binary files a/sound/direct_sound_samples/cries/masquerain.wav and b/sound/direct_sound_samples/cries/masquerain.wav differ diff --git a/sound/direct_sound_samples/cries/mawile.wav b/sound/direct_sound_samples/cries/mawile.wav index 9c54d40a4..bf0eb2e0a 100644 Binary files a/sound/direct_sound_samples/cries/mawile.wav and b/sound/direct_sound_samples/cries/mawile.wav differ diff --git a/sound/direct_sound_samples/cries/medicham.wav b/sound/direct_sound_samples/cries/medicham.wav index be3668b17..e0853bfa7 100644 Binary files a/sound/direct_sound_samples/cries/medicham.wav and b/sound/direct_sound_samples/cries/medicham.wav differ diff --git a/sound/direct_sound_samples/cries/meditite.wav b/sound/direct_sound_samples/cries/meditite.wav index 23db4f297..08675830b 100644 Binary files a/sound/direct_sound_samples/cries/meditite.wav and b/sound/direct_sound_samples/cries/meditite.wav differ diff --git a/sound/direct_sound_samples/cries/meganium.wav b/sound/direct_sound_samples/cries/meganium.wav index 8f7920e93..2aaf87034 100644 Binary files a/sound/direct_sound_samples/cries/meganium.wav and b/sound/direct_sound_samples/cries/meganium.wav differ diff --git a/sound/direct_sound_samples/cries/meganium_mega.wav b/sound/direct_sound_samples/cries/meganium_mega.wav new file mode 100644 index 000000000..8d8d44a14 Binary files /dev/null and b/sound/direct_sound_samples/cries/meganium_mega.wav differ diff --git a/sound/direct_sound_samples/cries/meowstic_mega.wav b/sound/direct_sound_samples/cries/meowstic_mega.wav new file mode 100644 index 000000000..04d2c24c3 Binary files /dev/null and b/sound/direct_sound_samples/cries/meowstic_mega.wav differ diff --git a/sound/direct_sound_samples/cries/meowth.wav b/sound/direct_sound_samples/cries/meowth.wav index bebca1c27..a3b97ff95 100644 Binary files a/sound/direct_sound_samples/cries/meowth.wav and b/sound/direct_sound_samples/cries/meowth.wav differ diff --git a/sound/direct_sound_samples/cries/metagross.wav b/sound/direct_sound_samples/cries/metagross.wav index 5112b3afa..35aa032c4 100644 Binary files a/sound/direct_sound_samples/cries/metagross.wav and b/sound/direct_sound_samples/cries/metagross.wav differ diff --git a/sound/direct_sound_samples/cries/metang.wav b/sound/direct_sound_samples/cries/metang.wav index 700759d20..d9203a330 100644 Binary files a/sound/direct_sound_samples/cries/metang.wav and b/sound/direct_sound_samples/cries/metang.wav differ diff --git a/sound/direct_sound_samples/cries/metapod.wav b/sound/direct_sound_samples/cries/metapod.wav index 6df3b6aef..1ef8849fc 100644 Binary files a/sound/direct_sound_samples/cries/metapod.wav and b/sound/direct_sound_samples/cries/metapod.wav differ diff --git a/sound/direct_sound_samples/cries/mew.wav b/sound/direct_sound_samples/cries/mew.wav index e75fa95f3..067c71b85 100644 Binary files a/sound/direct_sound_samples/cries/mew.wav and b/sound/direct_sound_samples/cries/mew.wav differ diff --git a/sound/direct_sound_samples/cries/mewtwo.wav b/sound/direct_sound_samples/cries/mewtwo.wav index 947984f67..554564c04 100644 Binary files a/sound/direct_sound_samples/cries/mewtwo.wav and b/sound/direct_sound_samples/cries/mewtwo.wav differ diff --git a/sound/direct_sound_samples/cries/mightyena.wav b/sound/direct_sound_samples/cries/mightyena.wav index 0149976e2..4c818b12b 100644 Binary files a/sound/direct_sound_samples/cries/mightyena.wav and b/sound/direct_sound_samples/cries/mightyena.wav differ diff --git a/sound/direct_sound_samples/cries/milotic.wav b/sound/direct_sound_samples/cries/milotic.wav index 20db44692..016657130 100644 Binary files a/sound/direct_sound_samples/cries/milotic.wav and b/sound/direct_sound_samples/cries/milotic.wav differ diff --git a/sound/direct_sound_samples/cries/miltank.wav b/sound/direct_sound_samples/cries/miltank.wav index 5f51f525b..949fd2812 100644 Binary files a/sound/direct_sound_samples/cries/miltank.wav and b/sound/direct_sound_samples/cries/miltank.wav differ diff --git a/sound/direct_sound_samples/cries/minun.wav b/sound/direct_sound_samples/cries/minun.wav index 9e9a62f7e..80d608c67 100644 Binary files a/sound/direct_sound_samples/cries/minun.wav and b/sound/direct_sound_samples/cries/minun.wav differ diff --git a/sound/direct_sound_samples/cries/misdreavus.wav b/sound/direct_sound_samples/cries/misdreavus.wav index f632986da..cce18c27b 100644 Binary files a/sound/direct_sound_samples/cries/misdreavus.wav and b/sound/direct_sound_samples/cries/misdreavus.wav differ diff --git a/sound/direct_sound_samples/cries/moltres.wav b/sound/direct_sound_samples/cries/moltres.wav index 7173a8cad..c9c65b334 100644 Binary files a/sound/direct_sound_samples/cries/moltres.wav and b/sound/direct_sound_samples/cries/moltres.wav differ diff --git a/sound/direct_sound_samples/cries/mr_mime.wav b/sound/direct_sound_samples/cries/mr_mime.wav index 23cf31053..a8121159b 100644 Binary files a/sound/direct_sound_samples/cries/mr_mime.wav and b/sound/direct_sound_samples/cries/mr_mime.wav differ diff --git a/sound/direct_sound_samples/cries/mudkip.wav b/sound/direct_sound_samples/cries/mudkip.wav index c965efe30..bcb613e41 100644 Binary files a/sound/direct_sound_samples/cries/mudkip.wav and b/sound/direct_sound_samples/cries/mudkip.wav differ diff --git a/sound/direct_sound_samples/cries/muk.wav b/sound/direct_sound_samples/cries/muk.wav index 27cd6bdeb..3cb281382 100644 Binary files a/sound/direct_sound_samples/cries/muk.wav and b/sound/direct_sound_samples/cries/muk.wav differ diff --git a/sound/direct_sound_samples/cries/murkrow.wav b/sound/direct_sound_samples/cries/murkrow.wav index 5da336fa9..1ba1f5514 100644 Binary files a/sound/direct_sound_samples/cries/murkrow.wav and b/sound/direct_sound_samples/cries/murkrow.wav differ diff --git a/sound/direct_sound_samples/cries/natu.wav b/sound/direct_sound_samples/cries/natu.wav index 4a2c85317..3cf1fc15b 100644 Binary files a/sound/direct_sound_samples/cries/natu.wav and b/sound/direct_sound_samples/cries/natu.wav differ diff --git a/sound/direct_sound_samples/cries/nidoking.wav b/sound/direct_sound_samples/cries/nidoking.wav index 556b20bda..4a068c909 100644 Binary files a/sound/direct_sound_samples/cries/nidoking.wav and b/sound/direct_sound_samples/cries/nidoking.wav differ diff --git a/sound/direct_sound_samples/cries/nidoqueen.wav b/sound/direct_sound_samples/cries/nidoqueen.wav index 7c23623a1..2835f1b36 100644 Binary files a/sound/direct_sound_samples/cries/nidoqueen.wav and b/sound/direct_sound_samples/cries/nidoqueen.wav differ diff --git a/sound/direct_sound_samples/cries/nidoran_f.wav b/sound/direct_sound_samples/cries/nidoran_f.wav index 2997c2b57..3d50a6917 100644 Binary files a/sound/direct_sound_samples/cries/nidoran_f.wav and b/sound/direct_sound_samples/cries/nidoran_f.wav differ diff --git a/sound/direct_sound_samples/cries/nidoran_m.wav b/sound/direct_sound_samples/cries/nidoran_m.wav index 160ab71e7..94fcf0e5b 100644 Binary files a/sound/direct_sound_samples/cries/nidoran_m.wav and b/sound/direct_sound_samples/cries/nidoran_m.wav differ diff --git a/sound/direct_sound_samples/cries/nidorina.wav b/sound/direct_sound_samples/cries/nidorina.wav index a46c41670..a2e1aa9d6 100644 Binary files a/sound/direct_sound_samples/cries/nidorina.wav and b/sound/direct_sound_samples/cries/nidorina.wav differ diff --git a/sound/direct_sound_samples/cries/nidorino.wav b/sound/direct_sound_samples/cries/nidorino.wav index 38db59c2f..f4dea729c 100644 Binary files a/sound/direct_sound_samples/cries/nidorino.wav and b/sound/direct_sound_samples/cries/nidorino.wav differ diff --git a/sound/direct_sound_samples/cries/nincada.wav b/sound/direct_sound_samples/cries/nincada.wav index dd5feb818..ec9b88858 100644 Binary files a/sound/direct_sound_samples/cries/nincada.wav and b/sound/direct_sound_samples/cries/nincada.wav differ diff --git a/sound/direct_sound_samples/cries/ninetales.wav b/sound/direct_sound_samples/cries/ninetales.wav index f84b87436..0e5939ed2 100644 Binary files a/sound/direct_sound_samples/cries/ninetales.wav and b/sound/direct_sound_samples/cries/ninetales.wav differ diff --git a/sound/direct_sound_samples/cries/ninjask.wav b/sound/direct_sound_samples/cries/ninjask.wav index b61f4d37f..20b496bc3 100644 Binary files a/sound/direct_sound_samples/cries/ninjask.wav and b/sound/direct_sound_samples/cries/ninjask.wav differ diff --git a/sound/direct_sound_samples/cries/noctowl.wav b/sound/direct_sound_samples/cries/noctowl.wav index ab705b6f2..64f38a044 100644 Binary files a/sound/direct_sound_samples/cries/noctowl.wav and b/sound/direct_sound_samples/cries/noctowl.wav differ diff --git a/sound/direct_sound_samples/cries/nosepass.wav b/sound/direct_sound_samples/cries/nosepass.wav index 1e15fb10d..996cfbe7d 100644 Binary files a/sound/direct_sound_samples/cries/nosepass.wav and b/sound/direct_sound_samples/cries/nosepass.wav differ diff --git a/sound/direct_sound_samples/cries/numel.wav b/sound/direct_sound_samples/cries/numel.wav index 2d2d16f02..a0ae3ebd8 100644 Binary files a/sound/direct_sound_samples/cries/numel.wav and b/sound/direct_sound_samples/cries/numel.wav differ diff --git a/sound/direct_sound_samples/cries/nuzleaf.wav b/sound/direct_sound_samples/cries/nuzleaf.wav index 5efb6e806..60d0809ef 100644 Binary files a/sound/direct_sound_samples/cries/nuzleaf.wav and b/sound/direct_sound_samples/cries/nuzleaf.wav differ diff --git a/sound/direct_sound_samples/cries/octillery.wav b/sound/direct_sound_samples/cries/octillery.wav index 190d42c67..11bc1361d 100644 Binary files a/sound/direct_sound_samples/cries/octillery.wav and b/sound/direct_sound_samples/cries/octillery.wav differ diff --git a/sound/direct_sound_samples/cries/oddish.wav b/sound/direct_sound_samples/cries/oddish.wav index de6855d36..bffae4bcf 100644 Binary files a/sound/direct_sound_samples/cries/oddish.wav and b/sound/direct_sound_samples/cries/oddish.wav differ diff --git a/sound/direct_sound_samples/cries/oinkologne_f.wav b/sound/direct_sound_samples/cries/oinkologne_f.wav index f075ebb3c..a0f55e4c5 100644 Binary files a/sound/direct_sound_samples/cries/oinkologne_f.wav and b/sound/direct_sound_samples/cries/oinkologne_f.wav differ diff --git a/sound/direct_sound_samples/cries/omanyte.wav b/sound/direct_sound_samples/cries/omanyte.wav index 3db237ac3..46e47b0a2 100644 Binary files a/sound/direct_sound_samples/cries/omanyte.wav and b/sound/direct_sound_samples/cries/omanyte.wav differ diff --git a/sound/direct_sound_samples/cries/omastar.wav b/sound/direct_sound_samples/cries/omastar.wav index 69a4ea868..021355da9 100644 Binary files a/sound/direct_sound_samples/cries/omastar.wav and b/sound/direct_sound_samples/cries/omastar.wav differ diff --git a/sound/direct_sound_samples/cries/onix.wav b/sound/direct_sound_samples/cries/onix.wav index 57da60141..f0dd1f45e 100644 Binary files a/sound/direct_sound_samples/cries/onix.wav and b/sound/direct_sound_samples/cries/onix.wav differ diff --git a/sound/direct_sound_samples/cries/paras.wav b/sound/direct_sound_samples/cries/paras.wav index ba4a051c9..27101a52f 100644 Binary files a/sound/direct_sound_samples/cries/paras.wav and b/sound/direct_sound_samples/cries/paras.wav differ diff --git a/sound/direct_sound_samples/cries/parasect.wav b/sound/direct_sound_samples/cries/parasect.wav index 5ff6ac290..909803da7 100644 Binary files a/sound/direct_sound_samples/cries/parasect.wav and b/sound/direct_sound_samples/cries/parasect.wav differ diff --git a/sound/direct_sound_samples/cries/pelipper.wav b/sound/direct_sound_samples/cries/pelipper.wav index 665dbcac9..5af1e7998 100644 Binary files a/sound/direct_sound_samples/cries/pelipper.wav and b/sound/direct_sound_samples/cries/pelipper.wav differ diff --git a/sound/direct_sound_samples/cries/persian.wav b/sound/direct_sound_samples/cries/persian.wav index 96acf8296..890089a51 100644 Binary files a/sound/direct_sound_samples/cries/persian.wav and b/sound/direct_sound_samples/cries/persian.wav differ diff --git a/sound/direct_sound_samples/cries/phanpy.wav b/sound/direct_sound_samples/cries/phanpy.wav index 4de13cafe..dcd679342 100644 Binary files a/sound/direct_sound_samples/cries/phanpy.wav and b/sound/direct_sound_samples/cries/phanpy.wav differ diff --git a/sound/direct_sound_samples/cries/pichu.wav b/sound/direct_sound_samples/cries/pichu.wav index d32510371..cfbbb6adb 100644 Binary files a/sound/direct_sound_samples/cries/pichu.wav and b/sound/direct_sound_samples/cries/pichu.wav differ diff --git a/sound/direct_sound_samples/cries/pidgeot.wav b/sound/direct_sound_samples/cries/pidgeot.wav index f93ed9965..d56e2e559 100644 Binary files a/sound/direct_sound_samples/cries/pidgeot.wav and b/sound/direct_sound_samples/cries/pidgeot.wav differ diff --git a/sound/direct_sound_samples/cries/pidgeotto.wav b/sound/direct_sound_samples/cries/pidgeotto.wav index 8b40a41e9..b8d075754 100644 Binary files a/sound/direct_sound_samples/cries/pidgeotto.wav and b/sound/direct_sound_samples/cries/pidgeotto.wav differ diff --git a/sound/direct_sound_samples/cries/pidgey.wav b/sound/direct_sound_samples/cries/pidgey.wav index 34a1d1bd6..5b58ae59b 100644 Binary files a/sound/direct_sound_samples/cries/pidgey.wav and b/sound/direct_sound_samples/cries/pidgey.wav differ diff --git a/sound/direct_sound_samples/cries/pikachu.wav b/sound/direct_sound_samples/cries/pikachu.wav index d5f68416f..dc1d354c8 100644 Binary files a/sound/direct_sound_samples/cries/pikachu.wav and b/sound/direct_sound_samples/cries/pikachu.wav differ diff --git a/sound/direct_sound_samples/cries/piloswine.wav b/sound/direct_sound_samples/cries/piloswine.wav index 4f181b7ec..f28be1f9b 100644 Binary files a/sound/direct_sound_samples/cries/piloswine.wav and b/sound/direct_sound_samples/cries/piloswine.wav differ diff --git a/sound/direct_sound_samples/cries/pineco.wav b/sound/direct_sound_samples/cries/pineco.wav index 70d841b9e..cfaf5b9ee 100644 Binary files a/sound/direct_sound_samples/cries/pineco.wav and b/sound/direct_sound_samples/cries/pineco.wav differ diff --git a/sound/direct_sound_samples/cries/pinsir.wav b/sound/direct_sound_samples/cries/pinsir.wav index 3d3dcc792..76ac8fa15 100644 Binary files a/sound/direct_sound_samples/cries/pinsir.wav and b/sound/direct_sound_samples/cries/pinsir.wav differ diff --git a/sound/direct_sound_samples/cries/plusle.wav b/sound/direct_sound_samples/cries/plusle.wav index 1b3cf8749..dcbe5fdd0 100644 Binary files a/sound/direct_sound_samples/cries/plusle.wav and b/sound/direct_sound_samples/cries/plusle.wav differ diff --git a/sound/direct_sound_samples/cries/politoed.wav b/sound/direct_sound_samples/cries/politoed.wav index 6472a08f5..9a90e1785 100644 Binary files a/sound/direct_sound_samples/cries/politoed.wav and b/sound/direct_sound_samples/cries/politoed.wav differ diff --git a/sound/direct_sound_samples/cries/poliwag.wav b/sound/direct_sound_samples/cries/poliwag.wav index d35c8f4d8..64fe686c9 100644 Binary files a/sound/direct_sound_samples/cries/poliwag.wav and b/sound/direct_sound_samples/cries/poliwag.wav differ diff --git a/sound/direct_sound_samples/cries/poliwhirl.wav b/sound/direct_sound_samples/cries/poliwhirl.wav index 0c59fbed6..924bb457c 100644 Binary files a/sound/direct_sound_samples/cries/poliwhirl.wav and b/sound/direct_sound_samples/cries/poliwhirl.wav differ diff --git a/sound/direct_sound_samples/cries/poliwrath.wav b/sound/direct_sound_samples/cries/poliwrath.wav index c32bd4485..93afcf2b6 100644 Binary files a/sound/direct_sound_samples/cries/poliwrath.wav and b/sound/direct_sound_samples/cries/poliwrath.wav differ diff --git a/sound/direct_sound_samples/cries/ponyta.wav b/sound/direct_sound_samples/cries/ponyta.wav index 911954226..bfa5b06ef 100644 Binary files a/sound/direct_sound_samples/cries/ponyta.wav and b/sound/direct_sound_samples/cries/ponyta.wav differ diff --git a/sound/direct_sound_samples/cries/poochyena.wav b/sound/direct_sound_samples/cries/poochyena.wav index 16cabc29c..8d46225c5 100644 Binary files a/sound/direct_sound_samples/cries/poochyena.wav and b/sound/direct_sound_samples/cries/poochyena.wav differ diff --git a/sound/direct_sound_samples/cries/porygon.wav b/sound/direct_sound_samples/cries/porygon.wav index 11dd528dd..48c43c2db 100644 Binary files a/sound/direct_sound_samples/cries/porygon.wav and b/sound/direct_sound_samples/cries/porygon.wav differ diff --git a/sound/direct_sound_samples/cries/porygon2.wav b/sound/direct_sound_samples/cries/porygon2.wav index 5699d8e45..965c1b703 100644 Binary files a/sound/direct_sound_samples/cries/porygon2.wav and b/sound/direct_sound_samples/cries/porygon2.wav differ diff --git a/sound/direct_sound_samples/cries/primeape.wav b/sound/direct_sound_samples/cries/primeape.wav index bcd98e6bb..146e92407 100644 Binary files a/sound/direct_sound_samples/cries/primeape.wav and b/sound/direct_sound_samples/cries/primeape.wav differ diff --git a/sound/direct_sound_samples/cries/psyduck.wav b/sound/direct_sound_samples/cries/psyduck.wav index bdc0d673e..7b1a76da7 100644 Binary files a/sound/direct_sound_samples/cries/psyduck.wav and b/sound/direct_sound_samples/cries/psyduck.wav differ diff --git a/sound/direct_sound_samples/cries/pupitar.wav b/sound/direct_sound_samples/cries/pupitar.wav index 5e797d420..776896729 100644 Binary files a/sound/direct_sound_samples/cries/pupitar.wav and b/sound/direct_sound_samples/cries/pupitar.wav differ diff --git a/sound/direct_sound_samples/cries/pyroar_mega.wav b/sound/direct_sound_samples/cries/pyroar_mega.wav new file mode 100644 index 000000000..1998d11ad Binary files /dev/null and b/sound/direct_sound_samples/cries/pyroar_mega.wav differ diff --git a/sound/direct_sound_samples/cries/quagsire.wav b/sound/direct_sound_samples/cries/quagsire.wav index e4a8c0aad..116c1bdf4 100644 Binary files a/sound/direct_sound_samples/cries/quagsire.wav and b/sound/direct_sound_samples/cries/quagsire.wav differ diff --git a/sound/direct_sound_samples/cries/quilava.wav b/sound/direct_sound_samples/cries/quilava.wav index ef0bd7381..5b44632ec 100644 Binary files a/sound/direct_sound_samples/cries/quilava.wav and b/sound/direct_sound_samples/cries/quilava.wav differ diff --git a/sound/direct_sound_samples/cries/qwilfish.wav b/sound/direct_sound_samples/cries/qwilfish.wav index 0b11276de..1f857d2c2 100644 Binary files a/sound/direct_sound_samples/cries/qwilfish.wav and b/sound/direct_sound_samples/cries/qwilfish.wav differ diff --git a/sound/direct_sound_samples/cries/raichu.wav b/sound/direct_sound_samples/cries/raichu.wav index 4e5dbaeb4..7b93bb5a3 100644 Binary files a/sound/direct_sound_samples/cries/raichu.wav and b/sound/direct_sound_samples/cries/raichu.wav differ diff --git a/sound/direct_sound_samples/cries/raichu_mega_x.wav b/sound/direct_sound_samples/cries/raichu_mega_x.wav new file mode 100644 index 000000000..23c164ee6 Binary files /dev/null and b/sound/direct_sound_samples/cries/raichu_mega_x.wav differ diff --git a/sound/direct_sound_samples/cries/raichu_mega_y.wav b/sound/direct_sound_samples/cries/raichu_mega_y.wav new file mode 100644 index 000000000..0047debec Binary files /dev/null and b/sound/direct_sound_samples/cries/raichu_mega_y.wav differ diff --git a/sound/direct_sound_samples/cries/raikou.wav b/sound/direct_sound_samples/cries/raikou.wav index fefeb1e3a..35757a0ac 100644 Binary files a/sound/direct_sound_samples/cries/raikou.wav and b/sound/direct_sound_samples/cries/raikou.wav differ diff --git a/sound/direct_sound_samples/cries/ralts.wav b/sound/direct_sound_samples/cries/ralts.wav index 4327c13a1..37948dc49 100644 Binary files a/sound/direct_sound_samples/cries/ralts.wav and b/sound/direct_sound_samples/cries/ralts.wav differ diff --git a/sound/direct_sound_samples/cries/rapidash.wav b/sound/direct_sound_samples/cries/rapidash.wav index 14ce75be7..953acc450 100644 Binary files a/sound/direct_sound_samples/cries/rapidash.wav and b/sound/direct_sound_samples/cries/rapidash.wav differ diff --git a/sound/direct_sound_samples/cries/raticate.wav b/sound/direct_sound_samples/cries/raticate.wav index 545ebfcf1..bbef0c0af 100644 Binary files a/sound/direct_sound_samples/cries/raticate.wav and b/sound/direct_sound_samples/cries/raticate.wav differ diff --git a/sound/direct_sound_samples/cries/rattata.wav b/sound/direct_sound_samples/cries/rattata.wav index 9e7a6b3cf..951c3bd8a 100644 Binary files a/sound/direct_sound_samples/cries/rattata.wav and b/sound/direct_sound_samples/cries/rattata.wav differ diff --git a/sound/direct_sound_samples/cries/rayquaza.wav b/sound/direct_sound_samples/cries/rayquaza.wav index c4e50535f..94c4f7c01 100644 Binary files a/sound/direct_sound_samples/cries/rayquaza.wav and b/sound/direct_sound_samples/cries/rayquaza.wav differ diff --git a/sound/direct_sound_samples/cries/regice.wav b/sound/direct_sound_samples/cries/regice.wav index b65a79b4d..8a2bfe742 100644 Binary files a/sound/direct_sound_samples/cries/regice.wav and b/sound/direct_sound_samples/cries/regice.wav differ diff --git a/sound/direct_sound_samples/cries/regirock.wav b/sound/direct_sound_samples/cries/regirock.wav index 0df3c1a72..271b91f31 100644 Binary files a/sound/direct_sound_samples/cries/regirock.wav and b/sound/direct_sound_samples/cries/regirock.wav differ diff --git a/sound/direct_sound_samples/cries/registeel.wav b/sound/direct_sound_samples/cries/registeel.wav index 0e2b21beb..8bab7591f 100644 Binary files a/sound/direct_sound_samples/cries/registeel.wav and b/sound/direct_sound_samples/cries/registeel.wav differ diff --git a/sound/direct_sound_samples/cries/relicanth.wav b/sound/direct_sound_samples/cries/relicanth.wav index 1a8c04473..8561780d6 100644 Binary files a/sound/direct_sound_samples/cries/relicanth.wav and b/sound/direct_sound_samples/cries/relicanth.wav differ diff --git a/sound/direct_sound_samples/cries/remoraid.wav b/sound/direct_sound_samples/cries/remoraid.wav index 0465e033f..ebab789ad 100644 Binary files a/sound/direct_sound_samples/cries/remoraid.wav and b/sound/direct_sound_samples/cries/remoraid.wav differ diff --git a/sound/direct_sound_samples/cries/rhydon.wav b/sound/direct_sound_samples/cries/rhydon.wav index e4f024f31..2c3907c91 100644 Binary files a/sound/direct_sound_samples/cries/rhydon.wav and b/sound/direct_sound_samples/cries/rhydon.wav differ diff --git a/sound/direct_sound_samples/cries/rhyhorn.wav b/sound/direct_sound_samples/cries/rhyhorn.wav index 10c6841f4..858375991 100644 Binary files a/sound/direct_sound_samples/cries/rhyhorn.wav and b/sound/direct_sound_samples/cries/rhyhorn.wav differ diff --git a/sound/direct_sound_samples/cries/roselia.wav b/sound/direct_sound_samples/cries/roselia.wav index cd01f19f6..f9c67fae1 100644 Binary files a/sound/direct_sound_samples/cries/roselia.wav and b/sound/direct_sound_samples/cries/roselia.wav differ diff --git a/sound/direct_sound_samples/cries/sableye.wav b/sound/direct_sound_samples/cries/sableye.wav index 9f32fbdd6..a1458cadc 100644 Binary files a/sound/direct_sound_samples/cries/sableye.wav and b/sound/direct_sound_samples/cries/sableye.wav differ diff --git a/sound/direct_sound_samples/cries/salamence.wav b/sound/direct_sound_samples/cries/salamence.wav index 1c426adfa..135d90ecd 100644 Binary files a/sound/direct_sound_samples/cries/salamence.wav and b/sound/direct_sound_samples/cries/salamence.wav differ diff --git a/sound/direct_sound_samples/cries/sandshrew.wav b/sound/direct_sound_samples/cries/sandshrew.wav index 8c324ed3d..94f98193d 100644 Binary files a/sound/direct_sound_samples/cries/sandshrew.wav and b/sound/direct_sound_samples/cries/sandshrew.wav differ diff --git a/sound/direct_sound_samples/cries/sandslash.wav b/sound/direct_sound_samples/cries/sandslash.wav index 95bcdb869..ba3e29e08 100644 Binary files a/sound/direct_sound_samples/cries/sandslash.wav and b/sound/direct_sound_samples/cries/sandslash.wav differ diff --git a/sound/direct_sound_samples/cries/sceptile.wav b/sound/direct_sound_samples/cries/sceptile.wav index 32673bc77..5ff4d5101 100644 Binary files a/sound/direct_sound_samples/cries/sceptile.wav and b/sound/direct_sound_samples/cries/sceptile.wav differ diff --git a/sound/direct_sound_samples/cries/scizor.wav b/sound/direct_sound_samples/cries/scizor.wav index 8196df16b..bc37f521c 100644 Binary files a/sound/direct_sound_samples/cries/scizor.wav and b/sound/direct_sound_samples/cries/scizor.wav differ diff --git a/sound/direct_sound_samples/cries/scolipede_mega.wav b/sound/direct_sound_samples/cries/scolipede_mega.wav new file mode 100644 index 000000000..8f8fe6755 Binary files /dev/null and b/sound/direct_sound_samples/cries/scolipede_mega.wav differ diff --git a/sound/direct_sound_samples/cries/scovillain_mega.wav b/sound/direct_sound_samples/cries/scovillain_mega.wav new file mode 100644 index 000000000..409f53f9d Binary files /dev/null and b/sound/direct_sound_samples/cries/scovillain_mega.wav differ diff --git a/sound/direct_sound_samples/cries/scrafty_mega.wav b/sound/direct_sound_samples/cries/scrafty_mega.wav new file mode 100644 index 000000000..6ed412f84 Binary files /dev/null and b/sound/direct_sound_samples/cries/scrafty_mega.wav differ diff --git a/sound/direct_sound_samples/cries/scyther.wav b/sound/direct_sound_samples/cries/scyther.wav index 5b6ba415a..021a6e017 100644 Binary files a/sound/direct_sound_samples/cries/scyther.wav and b/sound/direct_sound_samples/cries/scyther.wav differ diff --git a/sound/direct_sound_samples/cries/seadra.wav b/sound/direct_sound_samples/cries/seadra.wav index c68a68a19..84c6ad7c7 100644 Binary files a/sound/direct_sound_samples/cries/seadra.wav and b/sound/direct_sound_samples/cries/seadra.wav differ diff --git a/sound/direct_sound_samples/cries/seaking.wav b/sound/direct_sound_samples/cries/seaking.wav index 6f2533e94..0534a12ed 100644 Binary files a/sound/direct_sound_samples/cries/seaking.wav and b/sound/direct_sound_samples/cries/seaking.wav differ diff --git a/sound/direct_sound_samples/cries/sealeo.wav b/sound/direct_sound_samples/cries/sealeo.wav index ad01a5fed..744ab7390 100644 Binary files a/sound/direct_sound_samples/cries/sealeo.wav and b/sound/direct_sound_samples/cries/sealeo.wav differ diff --git a/sound/direct_sound_samples/cries/seedot.wav b/sound/direct_sound_samples/cries/seedot.wav index b4d74f65d..367104936 100644 Binary files a/sound/direct_sound_samples/cries/seedot.wav and b/sound/direct_sound_samples/cries/seedot.wav differ diff --git a/sound/direct_sound_samples/cries/seel.wav b/sound/direct_sound_samples/cries/seel.wav index 6e252b375..95e027d5e 100644 Binary files a/sound/direct_sound_samples/cries/seel.wav and b/sound/direct_sound_samples/cries/seel.wav differ diff --git a/sound/direct_sound_samples/cries/sentret.wav b/sound/direct_sound_samples/cries/sentret.wav index 0c6746c45..c7e1bb8a6 100644 Binary files a/sound/direct_sound_samples/cries/sentret.wav and b/sound/direct_sound_samples/cries/sentret.wav differ diff --git a/sound/direct_sound_samples/cries/seviper.wav b/sound/direct_sound_samples/cries/seviper.wav index b467378f4..73529d9c1 100644 Binary files a/sound/direct_sound_samples/cries/seviper.wav and b/sound/direct_sound_samples/cries/seviper.wav differ diff --git a/sound/direct_sound_samples/cries/sharpedo.wav b/sound/direct_sound_samples/cries/sharpedo.wav index 26c52b43c..7f773d4fb 100644 Binary files a/sound/direct_sound_samples/cries/sharpedo.wav and b/sound/direct_sound_samples/cries/sharpedo.wav differ diff --git a/sound/direct_sound_samples/cries/shedinja.wav b/sound/direct_sound_samples/cries/shedinja.wav index 956ae0be9..6dda64b5d 100644 Binary files a/sound/direct_sound_samples/cries/shedinja.wav and b/sound/direct_sound_samples/cries/shedinja.wav differ diff --git a/sound/direct_sound_samples/cries/shelgon.wav b/sound/direct_sound_samples/cries/shelgon.wav index 7648d06f9..85ed3939c 100644 Binary files a/sound/direct_sound_samples/cries/shelgon.wav and b/sound/direct_sound_samples/cries/shelgon.wav differ diff --git a/sound/direct_sound_samples/cries/shellder.wav b/sound/direct_sound_samples/cries/shellder.wav index 1fe4367d7..5c38501ba 100644 Binary files a/sound/direct_sound_samples/cries/shellder.wav and b/sound/direct_sound_samples/cries/shellder.wav differ diff --git a/sound/direct_sound_samples/cries/shiftry.wav b/sound/direct_sound_samples/cries/shiftry.wav index 533115f40..dbba7208b 100644 Binary files a/sound/direct_sound_samples/cries/shiftry.wav and b/sound/direct_sound_samples/cries/shiftry.wav differ diff --git a/sound/direct_sound_samples/cries/shroomish.wav b/sound/direct_sound_samples/cries/shroomish.wav index 07658c880..05fa69670 100644 Binary files a/sound/direct_sound_samples/cries/shroomish.wav and b/sound/direct_sound_samples/cries/shroomish.wav differ diff --git a/sound/direct_sound_samples/cries/shuckle.wav b/sound/direct_sound_samples/cries/shuckle.wav index bb196dbfe..afc303e4d 100644 Binary files a/sound/direct_sound_samples/cries/shuckle.wav and b/sound/direct_sound_samples/cries/shuckle.wav differ diff --git a/sound/direct_sound_samples/cries/shuppet.wav b/sound/direct_sound_samples/cries/shuppet.wav index 6b043a277..da206414c 100644 Binary files a/sound/direct_sound_samples/cries/shuppet.wav and b/sound/direct_sound_samples/cries/shuppet.wav differ diff --git a/sound/direct_sound_samples/cries/silcoon.wav b/sound/direct_sound_samples/cries/silcoon.wav index 15827329e..e5af66fbc 100644 Binary files a/sound/direct_sound_samples/cries/silcoon.wav and b/sound/direct_sound_samples/cries/silcoon.wav differ diff --git a/sound/direct_sound_samples/cries/skarmory.wav b/sound/direct_sound_samples/cries/skarmory.wav index 292497302..7062c9813 100644 Binary files a/sound/direct_sound_samples/cries/skarmory.wav and b/sound/direct_sound_samples/cries/skarmory.wav differ diff --git a/sound/direct_sound_samples/cries/skarmory_mega.wav b/sound/direct_sound_samples/cries/skarmory_mega.wav new file mode 100644 index 000000000..ce841d953 Binary files /dev/null and b/sound/direct_sound_samples/cries/skarmory_mega.wav differ diff --git a/sound/direct_sound_samples/cries/skiploom.wav b/sound/direct_sound_samples/cries/skiploom.wav index 30f9c2666..8aa05f5b7 100644 Binary files a/sound/direct_sound_samples/cries/skiploom.wav and b/sound/direct_sound_samples/cries/skiploom.wav differ diff --git a/sound/direct_sound_samples/cries/skitty.wav b/sound/direct_sound_samples/cries/skitty.wav index 02aaa4fcb..ee5717d07 100644 Binary files a/sound/direct_sound_samples/cries/skitty.wav and b/sound/direct_sound_samples/cries/skitty.wav differ diff --git a/sound/direct_sound_samples/cries/slaking.wav b/sound/direct_sound_samples/cries/slaking.wav index ef34d94d6..44681126d 100644 Binary files a/sound/direct_sound_samples/cries/slaking.wav and b/sound/direct_sound_samples/cries/slaking.wav differ diff --git a/sound/direct_sound_samples/cries/slakoth.wav b/sound/direct_sound_samples/cries/slakoth.wav index d4588b3a2..4c442f9c1 100644 Binary files a/sound/direct_sound_samples/cries/slakoth.wav and b/sound/direct_sound_samples/cries/slakoth.wav differ diff --git a/sound/direct_sound_samples/cries/slowbro.wav b/sound/direct_sound_samples/cries/slowbro.wav index fe03ab4cd..c46e751f5 100644 Binary files a/sound/direct_sound_samples/cries/slowbro.wav and b/sound/direct_sound_samples/cries/slowbro.wav differ diff --git a/sound/direct_sound_samples/cries/slowking.wav b/sound/direct_sound_samples/cries/slowking.wav index f80279628..a32fea33d 100644 Binary files a/sound/direct_sound_samples/cries/slowking.wav and b/sound/direct_sound_samples/cries/slowking.wav differ diff --git a/sound/direct_sound_samples/cries/slowpoke.wav b/sound/direct_sound_samples/cries/slowpoke.wav index b3a45bef0..275c2d9da 100644 Binary files a/sound/direct_sound_samples/cries/slowpoke.wav and b/sound/direct_sound_samples/cries/slowpoke.wav differ diff --git a/sound/direct_sound_samples/cries/slugma.wav b/sound/direct_sound_samples/cries/slugma.wav index 389bc8865..fed73cced 100644 Binary files a/sound/direct_sound_samples/cries/slugma.wav and b/sound/direct_sound_samples/cries/slugma.wav differ diff --git a/sound/direct_sound_samples/cries/smeargle.wav b/sound/direct_sound_samples/cries/smeargle.wav index e206f8f61..abb48580b 100644 Binary files a/sound/direct_sound_samples/cries/smeargle.wav and b/sound/direct_sound_samples/cries/smeargle.wav differ diff --git a/sound/direct_sound_samples/cries/smoochum.wav b/sound/direct_sound_samples/cries/smoochum.wav index a4abdde7e..33f50b046 100644 Binary files a/sound/direct_sound_samples/cries/smoochum.wav and b/sound/direct_sound_samples/cries/smoochum.wav differ diff --git a/sound/direct_sound_samples/cries/sneasel.wav b/sound/direct_sound_samples/cries/sneasel.wav index da76aefb7..dc960be0d 100644 Binary files a/sound/direct_sound_samples/cries/sneasel.wav and b/sound/direct_sound_samples/cries/sneasel.wav differ diff --git a/sound/direct_sound_samples/cries/snorlax.wav b/sound/direct_sound_samples/cries/snorlax.wav index 12e717be1..c0e45a457 100644 Binary files a/sound/direct_sound_samples/cries/snorlax.wav and b/sound/direct_sound_samples/cries/snorlax.wav differ diff --git a/sound/direct_sound_samples/cries/snorunt.wav b/sound/direct_sound_samples/cries/snorunt.wav index b4ecc4537..586c13116 100644 Binary files a/sound/direct_sound_samples/cries/snorunt.wav and b/sound/direct_sound_samples/cries/snorunt.wav differ diff --git a/sound/direct_sound_samples/cries/snubbull.wav b/sound/direct_sound_samples/cries/snubbull.wav index 37cacda8f..626da01c1 100644 Binary files a/sound/direct_sound_samples/cries/snubbull.wav and b/sound/direct_sound_samples/cries/snubbull.wav differ diff --git a/sound/direct_sound_samples/cries/solrock.wav b/sound/direct_sound_samples/cries/solrock.wav index 12f766af7..d99dcbd2b 100644 Binary files a/sound/direct_sound_samples/cries/solrock.wav and b/sound/direct_sound_samples/cries/solrock.wav differ diff --git a/sound/direct_sound_samples/cries/spearow.wav b/sound/direct_sound_samples/cries/spearow.wav index a64848136..e441d27ed 100644 Binary files a/sound/direct_sound_samples/cries/spearow.wav and b/sound/direct_sound_samples/cries/spearow.wav differ diff --git a/sound/direct_sound_samples/cries/spheal.wav b/sound/direct_sound_samples/cries/spheal.wav index 818caf8cd..560239934 100644 Binary files a/sound/direct_sound_samples/cries/spheal.wav and b/sound/direct_sound_samples/cries/spheal.wav differ diff --git a/sound/direct_sound_samples/cries/spinarak.wav b/sound/direct_sound_samples/cries/spinarak.wav index 3c4573132..764efce71 100644 Binary files a/sound/direct_sound_samples/cries/spinarak.wav and b/sound/direct_sound_samples/cries/spinarak.wav differ diff --git a/sound/direct_sound_samples/cries/spinda.wav b/sound/direct_sound_samples/cries/spinda.wav index 4481e3a88..a86581778 100644 Binary files a/sound/direct_sound_samples/cries/spinda.wav and b/sound/direct_sound_samples/cries/spinda.wav differ diff --git a/sound/direct_sound_samples/cries/spoink.wav b/sound/direct_sound_samples/cries/spoink.wav index 36447fb84..880637b5c 100644 Binary files a/sound/direct_sound_samples/cries/spoink.wav and b/sound/direct_sound_samples/cries/spoink.wav differ diff --git a/sound/direct_sound_samples/cries/squirtle.wav b/sound/direct_sound_samples/cries/squirtle.wav index 0cf32c6b6..fb533d718 100644 Binary files a/sound/direct_sound_samples/cries/squirtle.wav and b/sound/direct_sound_samples/cries/squirtle.wav differ diff --git a/sound/direct_sound_samples/cries/stantler.wav b/sound/direct_sound_samples/cries/stantler.wav index f59953beb..febf2e616 100644 Binary files a/sound/direct_sound_samples/cries/stantler.wav and b/sound/direct_sound_samples/cries/stantler.wav differ diff --git a/sound/direct_sound_samples/cries/staraptor_mega.wav b/sound/direct_sound_samples/cries/staraptor_mega.wav new file mode 100644 index 000000000..5f8a7c9d6 Binary files /dev/null and b/sound/direct_sound_samples/cries/staraptor_mega.wav differ diff --git a/sound/direct_sound_samples/cries/starmie.wav b/sound/direct_sound_samples/cries/starmie.wav index e3ace4fcf..40edec6b9 100644 Binary files a/sound/direct_sound_samples/cries/starmie.wav and b/sound/direct_sound_samples/cries/starmie.wav differ diff --git a/sound/direct_sound_samples/cries/starmie_mega.wav b/sound/direct_sound_samples/cries/starmie_mega.wav new file mode 100644 index 000000000..60b596437 Binary files /dev/null and b/sound/direct_sound_samples/cries/starmie_mega.wav differ diff --git a/sound/direct_sound_samples/cries/staryu.wav b/sound/direct_sound_samples/cries/staryu.wav index c726206f4..611c0571b 100644 Binary files a/sound/direct_sound_samples/cries/staryu.wav and b/sound/direct_sound_samples/cries/staryu.wav differ diff --git a/sound/direct_sound_samples/cries/steelix.wav b/sound/direct_sound_samples/cries/steelix.wav index 8683e3d24..85de343ab 100644 Binary files a/sound/direct_sound_samples/cries/steelix.wav and b/sound/direct_sound_samples/cries/steelix.wav differ diff --git a/sound/direct_sound_samples/cries/sudowoodo.wav b/sound/direct_sound_samples/cries/sudowoodo.wav index 48661df94..97bb1d51a 100644 Binary files a/sound/direct_sound_samples/cries/sudowoodo.wav and b/sound/direct_sound_samples/cries/sudowoodo.wav differ diff --git a/sound/direct_sound_samples/cries/suicune.wav b/sound/direct_sound_samples/cries/suicune.wav index f675d8fdc..90218ad01 100644 Binary files a/sound/direct_sound_samples/cries/suicune.wav and b/sound/direct_sound_samples/cries/suicune.wav differ diff --git a/sound/direct_sound_samples/cries/sunflora.wav b/sound/direct_sound_samples/cries/sunflora.wav index 613422881..ccad9c8c3 100644 Binary files a/sound/direct_sound_samples/cries/sunflora.wav and b/sound/direct_sound_samples/cries/sunflora.wav differ diff --git a/sound/direct_sound_samples/cries/sunkern.wav b/sound/direct_sound_samples/cries/sunkern.wav index b183f9ee9..0b670dadb 100644 Binary files a/sound/direct_sound_samples/cries/sunkern.wav and b/sound/direct_sound_samples/cries/sunkern.wav differ diff --git a/sound/direct_sound_samples/cries/surskit.wav b/sound/direct_sound_samples/cries/surskit.wav index 04b1be882..650fde3d1 100644 Binary files a/sound/direct_sound_samples/cries/surskit.wav and b/sound/direct_sound_samples/cries/surskit.wav differ diff --git a/sound/direct_sound_samples/cries/swablu.wav b/sound/direct_sound_samples/cries/swablu.wav index f24d34930..0fafb27d0 100644 Binary files a/sound/direct_sound_samples/cries/swablu.wav and b/sound/direct_sound_samples/cries/swablu.wav differ diff --git a/sound/direct_sound_samples/cries/swalot.wav b/sound/direct_sound_samples/cries/swalot.wav index cfed97934..56e0b170b 100644 Binary files a/sound/direct_sound_samples/cries/swalot.wav and b/sound/direct_sound_samples/cries/swalot.wav differ diff --git a/sound/direct_sound_samples/cries/swampert.wav b/sound/direct_sound_samples/cries/swampert.wav index a06f15992..eab813edb 100644 Binary files a/sound/direct_sound_samples/cries/swampert.wav and b/sound/direct_sound_samples/cries/swampert.wav differ diff --git a/sound/direct_sound_samples/cries/swellow.wav b/sound/direct_sound_samples/cries/swellow.wav index 637ff4654..118eb684c 100644 Binary files a/sound/direct_sound_samples/cries/swellow.wav and b/sound/direct_sound_samples/cries/swellow.wav differ diff --git a/sound/direct_sound_samples/cries/swinub.wav b/sound/direct_sound_samples/cries/swinub.wav index 93eafa458..e84ba9454 100644 Binary files a/sound/direct_sound_samples/cries/swinub.wav and b/sound/direct_sound_samples/cries/swinub.wav differ diff --git a/sound/direct_sound_samples/cries/taillow.wav b/sound/direct_sound_samples/cries/taillow.wav index 9f1bb25f4..7d4135c76 100644 Binary files a/sound/direct_sound_samples/cries/taillow.wav and b/sound/direct_sound_samples/cries/taillow.wav differ diff --git a/sound/direct_sound_samples/cries/tangela.wav b/sound/direct_sound_samples/cries/tangela.wav index 023a0362f..991b787ff 100644 Binary files a/sound/direct_sound_samples/cries/tangela.wav and b/sound/direct_sound_samples/cries/tangela.wav differ diff --git a/sound/direct_sound_samples/cries/tatsugiri_mega.wav b/sound/direct_sound_samples/cries/tatsugiri_mega.wav new file mode 100644 index 000000000..740d57707 Binary files /dev/null and b/sound/direct_sound_samples/cries/tatsugiri_mega.wav differ diff --git a/sound/direct_sound_samples/cries/tauros.wav b/sound/direct_sound_samples/cries/tauros.wav index a982d052d..f7610d2dd 100644 Binary files a/sound/direct_sound_samples/cries/tauros.wav and b/sound/direct_sound_samples/cries/tauros.wav differ diff --git a/sound/direct_sound_samples/cries/teddiursa.wav b/sound/direct_sound_samples/cries/teddiursa.wav index adc9b80d9..d55bc9e4a 100644 Binary files a/sound/direct_sound_samples/cries/teddiursa.wav and b/sound/direct_sound_samples/cries/teddiursa.wav differ diff --git a/sound/direct_sound_samples/cries/tentacool.wav b/sound/direct_sound_samples/cries/tentacool.wav index cd8f5afc7..f35d2a625 100644 Binary files a/sound/direct_sound_samples/cries/tentacool.wav and b/sound/direct_sound_samples/cries/tentacool.wav differ diff --git a/sound/direct_sound_samples/cries/tentacruel.wav b/sound/direct_sound_samples/cries/tentacruel.wav index dfbc8c7f0..3799a1075 100644 Binary files a/sound/direct_sound_samples/cries/tentacruel.wav and b/sound/direct_sound_samples/cries/tentacruel.wav differ diff --git a/sound/direct_sound_samples/cries/togepi.wav b/sound/direct_sound_samples/cries/togepi.wav index e13355c55..ac6bbf9ff 100644 Binary files a/sound/direct_sound_samples/cries/togepi.wav and b/sound/direct_sound_samples/cries/togepi.wav differ diff --git a/sound/direct_sound_samples/cries/togetic.wav b/sound/direct_sound_samples/cries/togetic.wav index 957a45dc9..f8b70c0f4 100644 Binary files a/sound/direct_sound_samples/cries/togetic.wav and b/sound/direct_sound_samples/cries/togetic.wav differ diff --git a/sound/direct_sound_samples/cries/torchic.wav b/sound/direct_sound_samples/cries/torchic.wav index 39a2522b3..5dd5c56be 100644 Binary files a/sound/direct_sound_samples/cries/torchic.wav and b/sound/direct_sound_samples/cries/torchic.wav differ diff --git a/sound/direct_sound_samples/cries/torkoal.wav b/sound/direct_sound_samples/cries/torkoal.wav index 497e92af2..aed384296 100644 Binary files a/sound/direct_sound_samples/cries/torkoal.wav and b/sound/direct_sound_samples/cries/torkoal.wav differ diff --git a/sound/direct_sound_samples/cries/totodile.wav b/sound/direct_sound_samples/cries/totodile.wav index 93c078847..4a4263ec2 100644 Binary files a/sound/direct_sound_samples/cries/totodile.wav and b/sound/direct_sound_samples/cries/totodile.wav differ diff --git a/sound/direct_sound_samples/cries/trapinch.wav b/sound/direct_sound_samples/cries/trapinch.wav index 5cad4ad23..abb851c1b 100644 Binary files a/sound/direct_sound_samples/cries/trapinch.wav and b/sound/direct_sound_samples/cries/trapinch.wav differ diff --git a/sound/direct_sound_samples/cries/treecko.wav b/sound/direct_sound_samples/cries/treecko.wav index 0c982f840..da4304845 100644 Binary files a/sound/direct_sound_samples/cries/treecko.wav and b/sound/direct_sound_samples/cries/treecko.wav differ diff --git a/sound/direct_sound_samples/cries/tropius.wav b/sound/direct_sound_samples/cries/tropius.wav index 55de362aa..f7f7cbc38 100644 Binary files a/sound/direct_sound_samples/cries/tropius.wav and b/sound/direct_sound_samples/cries/tropius.wav differ diff --git a/sound/direct_sound_samples/cries/typhlosion.wav b/sound/direct_sound_samples/cries/typhlosion.wav index f1759989d..cd525d561 100644 Binary files a/sound/direct_sound_samples/cries/typhlosion.wav and b/sound/direct_sound_samples/cries/typhlosion.wav differ diff --git a/sound/direct_sound_samples/cries/tyranitar.wav b/sound/direct_sound_samples/cries/tyranitar.wav index 5bec5f727..f2b768210 100644 Binary files a/sound/direct_sound_samples/cries/tyranitar.wav and b/sound/direct_sound_samples/cries/tyranitar.wav differ diff --git a/sound/direct_sound_samples/cries/tyrogue.wav b/sound/direct_sound_samples/cries/tyrogue.wav index 46d032063..4905a8566 100644 Binary files a/sound/direct_sound_samples/cries/tyrogue.wav and b/sound/direct_sound_samples/cries/tyrogue.wav differ diff --git a/sound/direct_sound_samples/cries/umbreon.wav b/sound/direct_sound_samples/cries/umbreon.wav index 48f62064a..8735d9fde 100644 Binary files a/sound/direct_sound_samples/cries/umbreon.wav and b/sound/direct_sound_samples/cries/umbreon.wav differ diff --git a/sound/direct_sound_samples/cries/unown.wav b/sound/direct_sound_samples/cries/unown.wav index 1956ecef7..befaaedd0 100644 Binary files a/sound/direct_sound_samples/cries/unown.wav and b/sound/direct_sound_samples/cries/unown.wav differ diff --git a/sound/direct_sound_samples/cries/unused_265.wav b/sound/direct_sound_samples/cries/unused_265.wav index 12c3d8640..5735db46f 100644 Binary files a/sound/direct_sound_samples/cries/unused_265.wav and b/sound/direct_sound_samples/cries/unused_265.wav differ diff --git a/sound/direct_sound_samples/cries/unused_268.wav b/sound/direct_sound_samples/cries/unused_268.wav index 3501b24ef..c698955e8 100644 Binary files a/sound/direct_sound_samples/cries/unused_268.wav and b/sound/direct_sound_samples/cries/unused_268.wav differ diff --git a/sound/direct_sound_samples/cries/ursaluna_bloodmoon.wav b/sound/direct_sound_samples/cries/ursaluna_bloodmoon.wav new file mode 100644 index 000000000..680859434 Binary files /dev/null and b/sound/direct_sound_samples/cries/ursaluna_bloodmoon.wav differ diff --git a/sound/direct_sound_samples/cries/ursaring.wav b/sound/direct_sound_samples/cries/ursaring.wav index b3d4a99cb..e8ccc67ca 100644 Binary files a/sound/direct_sound_samples/cries/ursaring.wav and b/sound/direct_sound_samples/cries/ursaring.wav differ diff --git a/sound/direct_sound_samples/cries/vaporeon.wav b/sound/direct_sound_samples/cries/vaporeon.wav index 8ec309485..861bc93cb 100644 Binary files a/sound/direct_sound_samples/cries/vaporeon.wav and b/sound/direct_sound_samples/cries/vaporeon.wav differ diff --git a/sound/direct_sound_samples/cries/venomoth.wav b/sound/direct_sound_samples/cries/venomoth.wav index ab5179df6..76deea6e8 100644 Binary files a/sound/direct_sound_samples/cries/venomoth.wav and b/sound/direct_sound_samples/cries/venomoth.wav differ diff --git a/sound/direct_sound_samples/cries/venonat.wav b/sound/direct_sound_samples/cries/venonat.wav index 450c2bb22..52763c4ea 100644 Binary files a/sound/direct_sound_samples/cries/venonat.wav and b/sound/direct_sound_samples/cries/venonat.wav differ diff --git a/sound/direct_sound_samples/cries/venusaur.wav b/sound/direct_sound_samples/cries/venusaur.wav index fdd299ae2..4273ac847 100644 Binary files a/sound/direct_sound_samples/cries/venusaur.wav and b/sound/direct_sound_samples/cries/venusaur.wav differ diff --git a/sound/direct_sound_samples/cries/vibrava.wav b/sound/direct_sound_samples/cries/vibrava.wav index 537010487..9f4b2b362 100644 Binary files a/sound/direct_sound_samples/cries/vibrava.wav and b/sound/direct_sound_samples/cries/vibrava.wav differ diff --git a/sound/direct_sound_samples/cries/victreebel.wav b/sound/direct_sound_samples/cries/victreebel.wav index 19f11202f..cea271b30 100644 Binary files a/sound/direct_sound_samples/cries/victreebel.wav and b/sound/direct_sound_samples/cries/victreebel.wav differ diff --git a/sound/direct_sound_samples/cries/victreebel_mega.wav b/sound/direct_sound_samples/cries/victreebel_mega.wav new file mode 100644 index 000000000..63cc49b18 Binary files /dev/null and b/sound/direct_sound_samples/cries/victreebel_mega.wav differ diff --git a/sound/direct_sound_samples/cries/vigoroth.wav b/sound/direct_sound_samples/cries/vigoroth.wav index 5d21bd23b..800a4989f 100644 Binary files a/sound/direct_sound_samples/cries/vigoroth.wav and b/sound/direct_sound_samples/cries/vigoroth.wav differ diff --git a/sound/direct_sound_samples/cries/vileplume.wav b/sound/direct_sound_samples/cries/vileplume.wav index 7189097b1..06dfaab47 100644 Binary files a/sound/direct_sound_samples/cries/vileplume.wav and b/sound/direct_sound_samples/cries/vileplume.wav differ diff --git a/sound/direct_sound_samples/cries/volbeat.wav b/sound/direct_sound_samples/cries/volbeat.wav index ae6375b95..d29a8ddbe 100644 Binary files a/sound/direct_sound_samples/cries/volbeat.wav and b/sound/direct_sound_samples/cries/volbeat.wav differ diff --git a/sound/direct_sound_samples/cries/voltorb.wav b/sound/direct_sound_samples/cries/voltorb.wav index e303a3db7..0c698af27 100644 Binary files a/sound/direct_sound_samples/cries/voltorb.wav and b/sound/direct_sound_samples/cries/voltorb.wav differ diff --git a/sound/direct_sound_samples/cries/vulpix.wav b/sound/direct_sound_samples/cries/vulpix.wav index 71d58b0a7..895bf7f35 100644 Binary files a/sound/direct_sound_samples/cries/vulpix.wav and b/sound/direct_sound_samples/cries/vulpix.wav differ diff --git a/sound/direct_sound_samples/cries/wailmer.wav b/sound/direct_sound_samples/cries/wailmer.wav index ef43c515f..514200f85 100644 Binary files a/sound/direct_sound_samples/cries/wailmer.wav and b/sound/direct_sound_samples/cries/wailmer.wav differ diff --git a/sound/direct_sound_samples/cries/wailord.wav b/sound/direct_sound_samples/cries/wailord.wav index a7e9d89f6..163660c6a 100644 Binary files a/sound/direct_sound_samples/cries/wailord.wav and b/sound/direct_sound_samples/cries/wailord.wav differ diff --git a/sound/direct_sound_samples/cries/walrein.wav b/sound/direct_sound_samples/cries/walrein.wav index cbc5fa8cb..9389f9227 100644 Binary files a/sound/direct_sound_samples/cries/walrein.wav and b/sound/direct_sound_samples/cries/walrein.wav differ diff --git a/sound/direct_sound_samples/cries/wartortle.wav b/sound/direct_sound_samples/cries/wartortle.wav index 950f87d74..040292e12 100644 Binary files a/sound/direct_sound_samples/cries/wartortle.wav and b/sound/direct_sound_samples/cries/wartortle.wav differ diff --git a/sound/direct_sound_samples/cries/weedle.wav b/sound/direct_sound_samples/cries/weedle.wav index 6a209fede..2c891cd30 100644 Binary files a/sound/direct_sound_samples/cries/weedle.wav and b/sound/direct_sound_samples/cries/weedle.wav differ diff --git a/sound/direct_sound_samples/cries/weepinbell.wav b/sound/direct_sound_samples/cries/weepinbell.wav index 48f7225cf..206bd24e4 100644 Binary files a/sound/direct_sound_samples/cries/weepinbell.wav and b/sound/direct_sound_samples/cries/weepinbell.wav differ diff --git a/sound/direct_sound_samples/cries/weezing.wav b/sound/direct_sound_samples/cries/weezing.wav index b5a7b189d..ee6058595 100644 Binary files a/sound/direct_sound_samples/cries/weezing.wav and b/sound/direct_sound_samples/cries/weezing.wav differ diff --git a/sound/direct_sound_samples/cries/whiscash.wav b/sound/direct_sound_samples/cries/whiscash.wav index ebec93d18..927713b05 100644 Binary files a/sound/direct_sound_samples/cries/whiscash.wav and b/sound/direct_sound_samples/cries/whiscash.wav differ diff --git a/sound/direct_sound_samples/cries/whismur.wav b/sound/direct_sound_samples/cries/whismur.wav index af3e3e0e3..3470acc99 100644 Binary files a/sound/direct_sound_samples/cries/whismur.wav and b/sound/direct_sound_samples/cries/whismur.wav differ diff --git a/sound/direct_sound_samples/cries/wigglytuff.wav b/sound/direct_sound_samples/cries/wigglytuff.wav index a6b632a6c..7e9e668a4 100644 Binary files a/sound/direct_sound_samples/cries/wigglytuff.wav and b/sound/direct_sound_samples/cries/wigglytuff.wav differ diff --git a/sound/direct_sound_samples/cries/wingull.wav b/sound/direct_sound_samples/cries/wingull.wav index 4e158409a..b78029593 100644 Binary files a/sound/direct_sound_samples/cries/wingull.wav and b/sound/direct_sound_samples/cries/wingull.wav differ diff --git a/sound/direct_sound_samples/cries/wobbuffet.wav b/sound/direct_sound_samples/cries/wobbuffet.wav index 17e7464ad..049aa83ba 100644 Binary files a/sound/direct_sound_samples/cries/wobbuffet.wav and b/sound/direct_sound_samples/cries/wobbuffet.wav differ diff --git a/sound/direct_sound_samples/cries/wooper.wav b/sound/direct_sound_samples/cries/wooper.wav index 83c7e589d..280845b2b 100644 Binary files a/sound/direct_sound_samples/cries/wooper.wav and b/sound/direct_sound_samples/cries/wooper.wav differ diff --git a/sound/direct_sound_samples/cries/wurmple.wav b/sound/direct_sound_samples/cries/wurmple.wav index b58d5007c..09ac95d59 100644 Binary files a/sound/direct_sound_samples/cries/wurmple.wav and b/sound/direct_sound_samples/cries/wurmple.wav differ diff --git a/sound/direct_sound_samples/cries/wynaut.wav b/sound/direct_sound_samples/cries/wynaut.wav index 6febe26aa..dcdc2b339 100644 Binary files a/sound/direct_sound_samples/cries/wynaut.wav and b/sound/direct_sound_samples/cries/wynaut.wav differ diff --git a/sound/direct_sound_samples/cries/xatu.wav b/sound/direct_sound_samples/cries/xatu.wav index 7c84f6572..47c470c4c 100644 Binary files a/sound/direct_sound_samples/cries/xatu.wav and b/sound/direct_sound_samples/cries/xatu.wav differ diff --git a/sound/direct_sound_samples/cries/yanma.wav b/sound/direct_sound_samples/cries/yanma.wav index 166b37361..3fea5ab36 100644 Binary files a/sound/direct_sound_samples/cries/yanma.wav and b/sound/direct_sound_samples/cries/yanma.wav differ diff --git a/sound/direct_sound_samples/cries/zangoose.wav b/sound/direct_sound_samples/cries/zangoose.wav index b1e3e9ffc..a5306a2d1 100644 Binary files a/sound/direct_sound_samples/cries/zangoose.wav and b/sound/direct_sound_samples/cries/zangoose.wav differ diff --git a/sound/direct_sound_samples/cries/zapdos.wav b/sound/direct_sound_samples/cries/zapdos.wav index 58415b934..f8168a603 100644 Binary files a/sound/direct_sound_samples/cries/zapdos.wav and b/sound/direct_sound_samples/cries/zapdos.wav differ diff --git a/sound/direct_sound_samples/cries/zeraora_mega.wav b/sound/direct_sound_samples/cries/zeraora_mega.wav new file mode 100644 index 000000000..3b3448707 Binary files /dev/null and b/sound/direct_sound_samples/cries/zeraora_mega.wav differ diff --git a/sound/direct_sound_samples/cries/zigzagoon.wav b/sound/direct_sound_samples/cries/zigzagoon.wav index ac0b68edc..fca81cf0f 100644 Binary files a/sound/direct_sound_samples/cries/zigzagoon.wav and b/sound/direct_sound_samples/cries/zigzagoon.wav differ diff --git a/sound/direct_sound_samples/cries/zubat.wav b/sound/direct_sound_samples/cries/zubat.wav index dc0756a06..58c0c16e5 100644 Binary files a/sound/direct_sound_samples/cries/zubat.wav and b/sound/direct_sound_samples/cries/zubat.wav differ diff --git a/sound/direct_sound_samples/cries/zygarde_mega.wav b/sound/direct_sound_samples/cries/zygarde_mega.wav new file mode 100644 index 000000000..ba3cee2c9 Binary files /dev/null and b/sound/direct_sound_samples/cries/zygarde_mega.wav differ diff --git a/src/battle_ai_field_statuses.c b/src/battle_ai_field_statuses.c index 80efa6b4d..fcb702162 100644 --- a/src/battle_ai_field_statuses.c +++ b/src/battle_ai_field_statuses.c @@ -6,7 +6,6 @@ #include "battle_ai_field_statuses.h" #include "battle_ai_util.h" #include "battle_ai_main.h" -#include "battle_ai_switch_items.h" // #include "battle_factory.h" #include "battle_setup.h" #include "event_data.h" @@ -26,7 +25,7 @@ static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather); static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus); // A move is light sensitive if it is boosted by Sunny Day and weakened by low light weathers. -static bool32 IsLightSensitiveMove(u32 move); +static bool32 IsLightSensitiveMove(enum Move move); static bool32 HasLightSensitiveMove(u32 battler); // The following functions all feed into WeatherChecker, which is then called by ShouldSetWeather and ShouldClearWeather. // BenefitsFrom functions all return FIELD_EFFECT_POSITIVE if the weather or field effect is good to have in place from the perspective of the battler, FIELD_EFFECT_NEUTRAL if it is neither good nor bad, and FIELD_EFFECT_NEGATIVE if it is bad. @@ -46,6 +45,23 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler); static enum FieldEffectOutcome BenefitsFromGravity(u32 battler); static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler); +static bool32 HasBattlerTerrainBoostMove(u32 battler, u32 terrain) +{ + if (!IsBattlerAlive(battler)) + return FALSE; + + enum Move *moves = GetMovesArray(battler); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + enum Move move = moves[moveIndex]; + if (GetMoveEffect(move) == EFFECT_TERRAIN_BOOST + && GetMoveTerrainBoost_Terrain(move) == terrain) + return TRUE; + } + + return FALSE; +} + bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredResult) { if (IsWeatherActive(B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) @@ -54,13 +70,12 @@ bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredR enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; - u32 i; u32 battlersOnSide = 1; if (HasPartner(battler)) battlersOnSide = 2; - for (i = 0; i < battlersOnSide; i++) + for (u32 battlerIndex = 0; battlerIndex < battlersOnSide; battlerIndex++) { if (weather & B_WEATHER_RAIN) result = BenefitsFromRain(battler); @@ -75,7 +90,7 @@ bool32 WeatherChecker(u32 battler, u32 weather, enum FieldEffectOutcome desiredR if (result != FIELD_EFFECT_NEUTRAL) { - if (weather & B_WEATHER_DAMAGING_ANY && i == 0 && battlersOnSide == 2) + if (weather & B_WEATHER_DAMAGING_ANY && battlerIndex == 0 && battlersOnSide == 2) firstResult = result; } } @@ -88,14 +103,13 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome { enum FieldEffectOutcome result = FIELD_EFFECT_NEUTRAL; enum FieldEffectOutcome firstResult = FIELD_EFFECT_NEUTRAL; - u32 i; u32 battlersOnSide = 1; if (HasPartner(battler)) battlersOnSide = 2; - for (i = 0; i < battlersOnSide; i++) + for (u32 battlerIndex = 0; battlerIndex < battlersOnSide; battlerIndex++) { // terrains if (fieldStatus & STATUS_FIELD_ELECTRIC_TERRAIN) @@ -118,7 +132,7 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome if (result != FIELD_EFFECT_NEUTRAL) { // Trick room wants both pokemon to agree, not just one - if (fieldStatus & STATUS_FIELD_TRICK_ROOM && i == 0 && battlersOnSide == 2) + if (fieldStatus & STATUS_FIELD_TRICK_ROOM && battlerIndex == 0 && battlersOnSide == 2) firstResult = result; } } @@ -186,7 +200,7 @@ static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldS return FALSE; } -static bool32 IsLightSensitiveMove(u32 move) +static bool32 IsLightSensitiveMove(enum Move move) { switch (GetMoveEffect(move)) { @@ -203,12 +217,11 @@ static bool32 IsLightSensitiveMove(u32 move) static bool32 HasLightSensitiveMove(u32 battler) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 battlerIndex = 0; battlerIndex < MAX_MON_MOVES; battlerIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsLightSensitiveMove(moves[i])) + if (moves[battlerIndex] != MOVE_NONE && moves[battlerIndex] != MOVE_UNAVAILABLE && IsLightSensitiveMove(moves[battlerIndex])) return TRUE; } @@ -308,7 +321,7 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_ELECTRIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasMoveWithEffect(battler, EFFECT_RISING_VOLTAGE)) + if (HasBattlerTerrainBoostMove(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; if ((HasMoveWithEffect(LEFT_FOE(battler), EFFECT_REST) && AI_IsBattlerGrounded(LEFT_FOE(battler))) @@ -324,7 +337,8 @@ static enum FieldEffectOutcome BenefitsFromElectricTerrain(u32 battler) || HasDamagingMoveOfType(battler, TYPE_ELECTRIC))) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_RISING_VOLTAGE)) + if (HasBattlerTerrainBoostMove(LEFT_FOE(battler), STATUS_FIELD_ELECTRIC_TERRAIN) + || HasBattlerTerrainBoostMove(RIGHT_FOE(battler), STATUS_FIELD_ELECTRIC_TERRAIN)) return FIELD_EFFECT_NEGATIVE; @@ -365,7 +379,8 @@ static enum FieldEffectOutcome BenefitsFromMistyTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_MISTY_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(battler, EFFECT_MISTY_EXPLOSION)) + if (HasBattlerTerrainBoostMove(battler, STATUS_FIELD_MISTY_TERRAIN) + || HasBattlerTerrainBoostMove(BATTLE_PARTNER(battler), STATUS_FIELD_MISTY_TERRAIN)) return FIELD_EFFECT_POSITIVE; bool32 grounded = AI_IsBattlerGrounded(battler); @@ -398,7 +413,8 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (DoesAbilityBenefitFromFieldStatus(gAiLogicData->abilities[battler], STATUS_FIELD_PSYCHIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(battler, EFFECT_EXPANDING_FORCE)) + if (HasBattlerTerrainBoostMove(battler, STATUS_FIELD_PSYCHIC_TERRAIN) + || HasBattlerTerrainBoostMove(BATTLE_PARTNER(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) return FIELD_EFFECT_POSITIVE; bool32 grounded = AI_IsBattlerGrounded(battler); @@ -419,7 +435,8 @@ static enum FieldEffectOutcome BenefitsFromPsychicTerrain(u32 battler) if (grounded && HasDamagingMoveOfType(battler, TYPE_PSYCHIC)) return FIELD_EFFECT_POSITIVE; - if (HasBattlerSideMoveWithEffect(LEFT_FOE(battler), EFFECT_EXPANDING_FORCE)) + if (HasBattlerTerrainBoostMove(LEFT_FOE(battler), STATUS_FIELD_PSYCHIC_TERRAIN) + || HasBattlerTerrainBoostMove(RIGHT_FOE(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) return FIELD_EFFECT_NEGATIVE; if (AI_IsAbilityOnSide(battler, ABILITY_GALE_WINGS) @@ -476,10 +493,10 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) // First checking if we have enough priority for one pokemon to disregard Trick Room entirely. if (!(gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN)) { - u16* aiMoves = GetMovesArray(battler); - for (int i = 0; i < MAX_MON_MOVES; i++) + enum Move *aiMoves = GetMovesArray(battler); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u16 move = aiMoves[i]; + enum Move move = aiMoves[moveIndex]; if (GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > 0 && !(GetMovePriority(move) > 0 && IsBattleMoveStatus(move))) { return FIELD_EFFECT_POSITIVE; @@ -494,4 +511,96 @@ static enum FieldEffectOutcome BenefitsFromTrickRoom(u32 battler) return FIELD_EFFECT_POSITIVE; } +s32 CalcWeatherScore(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) +{ + s32 score = 0; + + switch (GetMoveWeatherType(move)) + { + case BATTLE_WEATHER_RAIN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) + { + score += DECENT_EFFECT; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + score += WEAK_EFFECT; + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) + score += WEAK_EFFECT; + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) + || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + score += WEAK_EFFECT; + if (HasDamagingMoveOfType(battlerDef, TYPE_FIRE) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) + score += WEAK_EFFECT; + } + break; + case BATTLE_WEATHER_SUN: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) + { + score += DECENT_EFFECT; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + score += WEAK_EFFECT; + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_HEAT_ROCK) + score += WEAK_EFFECT; + if (HasDamagingMoveOfType(battlerDef, TYPE_WATER) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) + score += WEAK_EFFECT; + if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) + score += WEAK_EFFECT; + } + break; + case BATTLE_WEATHER_SANDSTORM: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) + { + score += DECENT_EFFECT; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + score += WEAK_EFFECT; + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) + score += WEAK_EFFECT; + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + score += WEAK_EFFECT; + } + break; + case BATTLE_WEATHER_HAIL: + if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) + { + score += DECENT_EFFECT; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + score += GOOD_EFFECT; + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + score += WEAK_EFFECT; + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) + score += WEAK_EFFECT; + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + score += WEAK_EFFECT; + } + break; + case BATTLE_WEATHER_SNOW: + if (ShouldSetWeather(battlerAtk, B_WEATHER_SNOW)) + { + score += DECENT_EFFECT; + + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) + score += GOOD_EFFECT; + if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) + score += WEAK_EFFECT; + if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) + score += WEAK_EFFECT; + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) + score += WEAK_EFFECT; + } + break; + } + + return score; +} diff --git a/src/battle_ai_items.c b/src/battle_ai_items.c new file mode 100644 index 000000000..29af4258a --- /dev/null +++ b/src/battle_ai_items.c @@ -0,0 +1,263 @@ +#include "global.h" +#include "battle.h" +#include "constants/battle_ai.h" +#include "battle_ai_items.h" +#include "battle_ai_main.h" +#include "battle_ai_util.h" +#include "battle_util.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_main.h" +#include "battle_setup.h" +#include "data.h" +#include "item.h" +#include "party_menu.h" +#include "pokemon.h" +#include "random.h" +#include "util.h" +#include "constants/abilities.h" +#include "constants/item_effects.h" +#include "constants/battle_move_effects.h" +#include "constants/items.h" +#include "constants/moves.h" + +// this file's functions +static bool32 AI_ShouldHeal(u32 battler, u32 healAmount); +static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); + +bool32 ShouldUseItem(u32 battler) +{ + struct Pokemon *party; + u8 validMons = 0; + bool32 shouldUse = FALSE; + u32 healAmount = 0; + + if (IsAiVsAiBattle()) + return FALSE; + + // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) + || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) + return FALSE; + + if (gBattleMons[battler].volatiles.embargo) + return FALSE; + + if (AiExpectsToFaintPlayer(battler)) + return FALSE; + + party = GetBattlerParty(battler); + + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) + { + if (IsValidForBattle(&party[monIndex])) + { + validMons++; + } + } + + for (u32 itemIndex = 0; itemIndex < MAX_TRAINER_ITEMS; itemIndex++) + { + enum Item item; + const u8 *itemEffects; + u8 battlerSide; + + item = gBattleHistory->trainerItems[itemIndex]; + if (item == ITEM_NONE) + continue; + itemEffects = GetItemEffect(item); + if (itemEffects == NULL) + continue; + + switch (GetItemBattleUsage(item)) + { + case EFFECT_ITEM_HEAL_AND_CURE_STATUS: + healAmount = GetHPHealAmount(itemEffects[GetItemEffectParamOffset(battler, item, 4, ITEM4_HEAL_HP)], GetBattlerMon(battler)); + shouldUse = AI_ShouldHeal(battler, healAmount); + break; + case EFFECT_ITEM_RESTORE_HP: + healAmount = GetHPHealAmount(itemEffects[GetItemEffectParamOffset(battler, item, 4, ITEM4_HEAL_HP)], GetBattlerMon(battler)); + shouldUse = AI_ShouldHeal(battler, healAmount); + break; + case EFFECT_ITEM_CURE_STATUS: + if ((itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) + || (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) + || (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) + || (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) + || (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) + || (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0)) + shouldUse = ShouldCureStatusWithItem(battler, battler, gAiLogicData); + break; + case EFFECT_ITEM_INCREASE_STAT: + if (gBattleStruct->battlerState[battler].isFirstTurn || !AI_OpponentCanFaintAiWithMod(battler, 0)) + { + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_FORCE_SETUP_FIRST_TURN) + { + shouldUse = TRUE; + break; + } + + enum StatChange statChange = STAT_CHANGE_ATK; + + if (B_X_ITEMS_BUFF >= GEN_7) + statChange = STAT_CHANGE_ATK_2; + + statChange = statChange + itemEffects[1] - STAT_ATK; + + if (IsBattlerAlive(LEFT_FOE(battler)) && IncreaseStatUpScore(battler, LEFT_FOE(battler), statChange) > NO_INCREASE) + shouldUse = TRUE; + + if (IsBattlerAlive(RIGHT_FOE(battler)) && IncreaseStatUpScore(battler, RIGHT_FOE(battler), statChange) > NO_INCREASE) + shouldUse = TRUE; + + break; + } + break; + case EFFECT_ITEM_INCREASE_ALL_STATS: + if (gAiLogicData->abilities[battler] == ABILITY_CONTRARY) + break; + if (gBattleStruct->battlerState[battler].isFirstTurn || !AI_OpponentCanFaintAiWithMod(battler, 0)) + { + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_FORCE_SETUP_FIRST_TURN) + { + shouldUse = TRUE; + break; + } + + if (IsBattlerAlive(LEFT_FOE(battler))) + { + if (ShouldRaiseAnyStat(battler, LEFT_FOE(battler))) + shouldUse = TRUE; + else + break; + } + + if (IsBattlerAlive(RIGHT_FOE(battler))) + { + if (ShouldRaiseAnyStat(battler, RIGHT_FOE(battler))) + shouldUse = TRUE; + else + break; + } + } + break; + case EFFECT_ITEM_SET_FOCUS_ENERGY: + if (!gBattleStruct->battlerState[battler].isFirstTurn + || gBattleMons[battler].volatiles.dragonCheer + || gBattleMons[battler].volatiles.focusEnergy + || AI_OpponentCanFaintAiWithMod(battler, 0)) + { + break; + } + else + { + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_FORCE_SETUP_FIRST_TURN) + { + shouldUse = TRUE; + break; + } + + if (gAiLogicData->abilities[battler] == ABILITY_SUPER_LUCK + || gAiLogicData->abilities[battler] == ABILITY_SNIPER + || gAiLogicData->holdEffects[battler] == HOLD_EFFECT_SCOPE_LENS + || HasMoveWithFlag(battler, GetMoveCriticalHitStage)) + shouldUse = TRUE; + } + break; + case EFFECT_ITEM_SET_MIST: + battlerSide = GetBattlerSide(battler); + if (gBattleStruct->battlerState[battler].isFirstTurn && !(gSideStatuses[battlerSide] & SIDE_STATUS_MIST)) + shouldUse = TRUE; + break; + case EFFECT_ITEM_REVIVE: + gBattleStruct->itemPartyIndex[battler] = GetFirstFaintedPartyIndex(battler); + if (gBattleStruct->itemPartyIndex[battler] != PARTY_SIZE) // Revive if possible. + shouldUse = TRUE; + break; + case EFFECT_ITEM_USE_POKE_FLUTE: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + shouldUse = TRUE; + break; + default: + return FALSE; + } + if (shouldUse) + { + // Set selected party ID to current battler if none chosen. + if (gBattleStruct->itemPartyIndex[battler] == PARTY_SIZE) + gBattleStruct->itemPartyIndex[battler] = gBattlerPartyIndexes[battler]; + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); + gBattleStruct->chosenItem[battler] = item; + gBattleHistory->trainerItems[itemIndex] = 0; + return shouldUse; + } + } + + return FALSE; +} + +static bool32 AI_ShouldHeal(u32 battler, u32 healAmount) +{ + bool32 shouldHeal = FALSE; + u32 maxDamage = 0; + u32 dmg = 0; + + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP / 4 + || gBattleMons[battler].hp == 0 + || (healAmount != 0 && gBattleMons[battler].maxHP - gBattleMons[battler].hp > healAmount)) + { + // We have low enough HP to consider healing + shouldHeal = !AI_OpponentCanFaintAiWithMod(battler, healAmount); // if target can kill us even after we heal, why bother + } + + //calculate max expected damage from the opponent + for (u32 battlerIndex = 0; battlerIndex < gBattlersCount; battlerIndex++) + { + if (IsOnPlayerSide(battlerIndex)) + { + dmg = GetBestDmgFromBattler(battlerIndex, battler, AI_DEFENDING); + + if (dmg > maxDamage) + maxDamage = dmg; + } + } + + // also heal if a 2HKO is outhealed + if (AI_OpponentCanFaintAiWithMod(battler, 0) + && !AI_OpponentCanFaintAiWithMod(battler, healAmount) + && healAmount > 2*maxDamage) + return TRUE; + + // also heal, if the expected damage is outhealed and it's the last remaining mon + if (AI_OpponentCanFaintAiWithMod(battler, 0) + && !AI_OpponentCanFaintAiWithMod(battler, healAmount) + && CountUsablePartyMons(battler) == 0) + return TRUE; + + return shouldHeal; +} + +static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon) +{ + switch (itemEffectParam) + { + case ITEM6_HEAL_HP_FULL: + itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP) - GetMonData(mon, MON_DATA_HP); + break; + case ITEM6_HEAL_HP_HALF: + itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP) / 2; + if (itemEffectParam == 0) + itemEffectParam = 1; + break; + case ITEM6_HEAL_HP_LVL_UP: + itemEffectParam = gBattleScripting.levelUpHP; + break; + case ITEM6_HEAL_HP_QUARTER: + itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP) / 4; + if (itemEffectParam == 0) + itemEffectParam = 1; + break; + } + + return itemEffectParam; +} diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 13ae0ad00..903b59c02 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4,6 +4,8 @@ #include "battle.h" #include "battle_anim.h" #include "battle_ai_util.h" +#include "battle_ai_items.h" +#include "battle_ai_switch.h" #include "battle_ai_main.h" #include "battle_controllers.h" // #include "battle_factory.h" @@ -27,6 +29,10 @@ #include "constants/items.h" #include "constants/trainers.h" +#if TESTING +#include "test/battle.h" +#endif + #define AI_ACTION_DONE (1 << 0) #define AI_ACTION_FLEE (1 << 1) #define AI_ACTION_WATCH (1 << 2) @@ -38,32 +44,34 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler); static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAtk, u32 battlerDef); static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef); static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect); +static bool32 DoesAbilityBenefitFromSunOrRain(u32 battler, enum Ability ability, u32 weather); static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests EWRAM_DATA AiScoreFunc sDynamicAiFunc = NULL; +EWRAM_DATA AiSwitchFunc gDynamicAiSwitchFunc = NULL; // const rom data -static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); -static s32 AI_CheckPpStall(u32 battlerAtk, u32 battlerDef, u32 move, s32 score); +static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); +static s32 AI_CheckPpStall(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score); -static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = +static s32 (*const sBattleAiFuncTable[])(u32, u32, enum Move, s32) = { [0] = AI_CheckBadMove, // AI_FLAG_CHECK_BAD_MOVE [1] = AI_TryToFaint, // AI_FLAG_TRY_TO_FAINT @@ -134,11 +142,10 @@ static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = // Functions void BattleAI_SetupItems(void) { - s32 i; u8 *data = (u8 *)gBattleHistory; const u16 *items = GetTrainerItemsFromId(TRAINER_BATTLE_PARAM.opponentA); - for (i = 0; i < sizeof(struct BattleHistory); i++) + for (u32 i = 0; i < sizeof(struct BattleHistory); i++) data[i] = 0; // Items are allowed to use in ONLY trainer battles. @@ -149,11 +156,11 @@ void BattleAI_SetupItems(void) ) ) { - for (i = 0; i < MAX_TRAINER_ITEMS; i++) + for (u32 itemIndex = 0; itemIndex < MAX_TRAINER_ITEMS; itemIndex++) { - if (items[i] != ITEM_NONE) + if (items[itemIndex] != ITEM_NONE) { - gBattleHistory->trainerItems[gBattleHistory->itemsNo] = items[i]; + gBattleHistory->trainerItems[gBattleHistory->itemsNo] = items[itemIndex]; gBattleHistory->itemsNo++; } } @@ -292,7 +299,6 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) { u32 moveLimitations; u64 flags[MAX_BATTLERS_COUNT]; - u32 moveIndex; // Clear AI data but preserve the flags. memcpy(&flags[0], &gAiThinkingStruct->aiFlags[0], sizeof(u64) * MAX_BATTLERS_COUNT); @@ -302,7 +308,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) moveLimitations = gAiLogicData->moveLimitations[battler]; // Conditional score reset, unlike Ruby. - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (moveLimitations & (1u << moveIndex)) SET_SCORE(battler, moveIndex, 0); @@ -358,16 +364,16 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) void ComputeBattlerDecisions(u32 battler) { bool32 isAiBattler = (gBattleTypeFlags & BATTLE_TYPE_HAS_AI || IsWildMonSmart()) && (BattlerHasAi(battler) && !(gBattleTypeFlags & BATTLE_TYPE_PALACE)); - if (isAiBattler || CanAiPredictMove()) + if (isAiBattler || CanAiPredictMove(battler)) { // Risky AI switches aggressively even mid battle - enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; + enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE_OPTIONAL; gAiLogicData->aiCalcInProgress = TRUE; // Setup battler and prediction data BattleAI_SetupAIData(0xF, battler); - SetupAIPredictionData(battler, switchType); + SetupAIPredictionData(battler, SWITCH_MID_BATTLE_OPTIONAL); // AI's own switching data if (isAiBattler) @@ -388,7 +394,7 @@ void ComputeBattlerDecisions(u32 battler) } } -void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, u16 move) +void ReconsiderGimmick(u32 battlerAtk, u32 battlerDef, enum Move move) { // After choosing a move for battlerAtk assuming that a gimmick will be used, reconsider whether the gimmick is necessary. @@ -406,11 +412,70 @@ static u32 ChooseMoveOrAction(u32 battler) return ChooseMoveOrAction_Singles(battler); } +static void SetupRandomRollsForAIMoveSelection(u32 battler) +{ + gAiLogicData->shouldConsiderExplosion = RandomPercentage(RNG_AI_CONSIDER_EXPLOSION, GetAIExplosionChanceFromHP(gAiLogicData->hpPercents[battler])); + gAiLogicData->shouldConsiderFinalGambit = RandomPercentage(RNG_AI_FINAL_GAMBIT, FINAL_GAMBIT_CHANCE); +} + +void AI_TrySwitchOrUseItem(u32 battler) +{ + struct Pokemon *party; + u32 battlerIn1, battlerIn2; + s32 firstId; + s32 lastId; // + 1 + party = GetBattlerParty(battler); + + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + { + if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) + { + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); + SetAIUsingGimmick(battler, NO_GIMMICK); + if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) + { + s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; + if (monToSwitchId == PARTY_SIZE) + { + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); + GetAIPartyIndexes(battler, &firstId, &lastId); + + for (monToSwitchId = (lastId-1); monToSwitchId >= firstId; monToSwitchId--) + { + if (!IsValidForBattle(&party[monToSwitchId])) + continue; + if (IsPartyMonOnFieldOrChosenToSwitch(monToSwitchId, battlerIn1, battlerIn2)) + continue; + if (IsAceMon(battler, monToSwitchId)) + continue; + + break; + } + } + + gBattleStruct->AI_monToSwitchIntoId[battler] = monToSwitchId; + } + + gBattleStruct->monToSwitchIntoId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; + gAiLogicData->monToSwitchInId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; + return; + } + else if (ShouldUseItem(battler)) + { + SetAIUsingGimmick(battler, NO_GIMMICK); + return; + } + } + + BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(battler) << 8); +} + u32 BattleAI_ChooseMoveIndex(u32 battler) { u32 chosenMoveIndex; SetAIUsingGimmick(battler, USE_GIMMICK); + SetupRandomRollsForAIMoveSelection(battler); if (gBattleStruct->gimmick.usableGimmick[battler] == GIMMICK_TERA && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_TERA)) DecideTerastal(battler); @@ -430,7 +495,7 @@ u32 BattleAI_ChooseMoveIndex(u32 battler) return chosenMoveIndex; } -static void CopyBattlerDataToAIParty(u32 bPosition, u32 side) +static void CopyBattlerDataToAIParty(u32 bPosition, enum BattleSide side) { u32 battler = GetBattlerAtPosition(bPosition); struct AiPartyMon *aiMon = &gAiPartyData->mons[side][gBattlerPartyIndexes[battler]]; @@ -447,8 +512,8 @@ static void CopyBattlerDataToAIParty(u32 bPosition, u32 side) void Ai_InitPartyStruct(void) { - u32 i; bool32 isOmniscient = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); + bool32 hasPartyKnowledge = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_KNOW_OPPONENT_PARTY) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_KNOW_OPPONENT_PARTY); struct Pokemon *mon; gAiPartyData->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); @@ -467,28 +532,32 @@ void Ai_InitPartyStruct(void) } // Find fainted mons - for (i = 0; i < gAiPartyData->count[B_SIDE_PLAYER]; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - gAiPartyData->mons[B_SIDE_PLAYER][i].isFainted = TRUE; + if (GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES) == SPECIES_NONE) + continue; + + mon = &gPlayerParty[monIndex]; + if (GetMonData(&gPlayerParty[monIndex], MON_DATA_HP) == 0) + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].isFainted = TRUE; + + if (isOmniscient || hasPartyKnowledge) + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].species = GetMonData(mon, MON_DATA_SPECIES); if (isOmniscient) { - u32 j; - mon = &gPlayerParty[i]; - gAiPartyData->mons[B_SIDE_PLAYER][i].item = GetMonData(mon, MON_DATA_HELD_ITEM); - gAiPartyData->mons[B_SIDE_PLAYER][i].heldEffect = GetItemHoldEffect(gAiPartyData->mons[B_SIDE_PLAYER][i].item); - gAiPartyData->mons[B_SIDE_PLAYER][i].ability = GetMonAbility(mon); - for (j = 0; j < MAX_MON_MOVES; j++) - gAiPartyData->mons[B_SIDE_PLAYER][i].moves[j] = GetMonData(mon, MON_DATA_MOVE1 + j); + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].item = GetMonData(mon, MON_DATA_HELD_ITEM); + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].heldEffect = GetItemHoldEffect(gAiPartyData->mons[B_SIDE_PLAYER][monIndex].item); + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].ability = GetMonAbility(mon); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + gAiPartyData->mons[B_SIDE_PLAYER][monIndex].moves[moveIndex] = GetMonData(mon, MON_DATA_MOVE1 + moveIndex); } } } void Ai_UpdateSwitchInData(u32 battler) { - u32 i; - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); struct AiPartyMon *aiMon = &gAiPartyData->mons[side][gBattlerPartyIndexes[battler]]; // See if the switched-in mon has been already in battle @@ -498,10 +567,10 @@ void Ai_UpdateSwitchInData(u32 battler) gBattleHistory->abilities[battler] = aiMon->ability; if (aiMon->heldEffect) gBattleHistory->itemEffects[battler] = aiMon->heldEffect; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (aiMon->moves[i]) - gBattleHistory->usedMoves[battler][i] = aiMon->moves[i]; + if (aiMon->moves[moveIndex]) + gBattleHistory->usedMoves[battler][moveIndex] = aiMon->moves[moveIndex]; } aiMon->switchInCount++; aiMon->status = gBattleMons[battler].status1; // Copy status, because it could've been changed in battle. @@ -526,10 +595,9 @@ void Ai_UpdateFaintData(u32 battler) void RecordMovesBasedOnStab(u32 battler) { - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 playerMove = gBattleMons[battler].moves[i]; + enum Move playerMove = gBattleMons[battler].moves[moveIndex]; if (IsSpeciesOfType(gBattleMons[battler].species, GetMoveType(playerMove)) && GetMovePower(playerMove != 0)) RecordKnownMove(battler, playerMove); } @@ -537,10 +605,9 @@ void RecordMovesBasedOnStab(u32 battler) void RecordStatusMoves(u32 battler) { - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 playerMove = gBattleMons[battler].moves[i]; + enum Move playerMove = gBattleMons[battler].moves[moveIndex]; if (ShouldRecordStatusMove(playerMove)) RecordKnownMove(battler, playerMove); } @@ -560,15 +627,15 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData) aiData->moveLimitations[battler] = CheckMoveLimitations(battler, 0, MOVE_LIMITATIONS_ALL); aiData->speedStats[battler] = GetBattlerTotalSpeedStat(battler, ability, holdEffect); - if (IsAiBattlerAssumingStab()) + if (IsAiBattlerAssumingStab(battler)) RecordMovesBasedOnStab(battler); - if (IsAiBattlerAssumingStatusMoves()) + if (IsAiBattlerAssumingStatusMoves(battler)) RecordStatusMoves(battler); } #define BYPASSES_ACCURACY_CALC 101 // 101 indicates for ai that the move will always hit -static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 move) +static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, enum Move move) { u32 accuracy; enum Ability abilityAtk = aiData->abilities[battlerAtk]; @@ -589,13 +656,13 @@ static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 ba } #undef BYPASSES_ACCURACY_CALC -static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather) +void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 weather, u32 fieldStatus) { - u32 moveIndex, move; - u16 *moves = GetMovesArray(battlerAtk); + enum Move move; + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = aiData->moveLimitations[battlerAtk]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { struct SimulatedDamage dmg = {0}; uq4_12_t effectiveness = Q_4_12(0.0); @@ -605,7 +672,7 @@ static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u continue; // Also get effectiveness of status moves - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, USE_GIMMICK, NO_GIMMICK, weather); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, USE_GIMMICK, NO_GIMMICK, weather, fieldStatus); aiData->moveAccuracy[battlerAtk][battlerDef][moveIndex] = Ai_SetMoveAccuracy(aiData, battlerAtk, battlerDef, move); aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = dmg; @@ -615,19 +682,18 @@ static void CalcBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u32 battlersCount, u32 weather) { - u32 battlerDef; SaveBattlerData(battlerAtk); SetBattlerData(battlerAtk); // Simulate dmg for both ai controlled mons and for player controlled mons. - for (battlerDef = 0; battlerDef < battlersCount; battlerDef++) + for (u32 battlerDef = 0; battlerDef < battlersCount; battlerDef++) { if (battlerAtk == battlerDef || !IsBattlerAlive(battlerDef)) continue; SaveBattlerData(battlerDef); SetBattlerData(battlerDef); - CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, weather); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, weather, gFieldStatuses); RestoreBattlerData(battlerDef); } RestoreBattlerData(battlerAtk); @@ -635,9 +701,10 @@ static void SetBattlerAiMovesData(struct AiLogicData *aiData, u32 battlerAtk, u3 void SetAiLogicDataForTurn(struct AiLogicData *aiData) { - u32 battlerAtk, battlersCount, weather; + u32 battlersCount, weather; memset(aiData, 0, sizeof(struct AiLogicData)); + gAiBattleData->aiUsingGimmick = 0; if (!(gBattleTypeFlags & BATTLE_TYPE_HAS_AI) && !IsWildMonSmart()) return; @@ -653,7 +720,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) gAiLogicData->aiCalcInProgress = TRUE; if (DEBUG_AI_DELAY_TIMER) CycleCountStart(); - for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) + for (u32 battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) { if (!IsBattlerAlive(battlerAtk)) continue; @@ -661,7 +728,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) SetBattlerAiData(battlerAtk, aiData); } - for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) + for (u32 battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) { if (!IsBattlerAlive(battlerAtk)) continue; @@ -669,10 +736,10 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) SetBattlerAiMovesData(aiData, battlerAtk, battlersCount, weather); } - for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) + for (u32 battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) { // Prediction limited to player side but can be expanded to read partners move in the future - if (!IsOnPlayerSide(battlerAtk) || !CanAiPredictMove()) + if (!IsOnPlayerSide(battlerAtk) || !CanAiPredictMove(battlerAtk)) continue; // This can potentially be cleaned up more @@ -696,7 +763,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon) return ability; } -static u32 PpStallReduction(u32 move, u32 battlerAtk) +static u32 PpStallReduction(enum Move move, u32 battlerAtk) { if (move == MOVE_NONE) return 0; @@ -704,6 +771,11 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk) u32 totalStallValue = 0; u32 returnValue = 0; struct BattlePokemon backupBattleMon; + struct BattleContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.abilityAtk = gAiLogicData->abilities[battlerAtk]; + ctx.move = ctx.chosenMove = move; + ctx.moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now memcpy(&backupBattleMon, &gBattleMons[tempBattleMonIndex], sizeof(struct BattlePokemon)); for (u32 partyIndex = 0; partyIndex < PARTY_SIZE; partyIndex++) { @@ -711,16 +783,12 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk) if (currentStallValue == 0 || GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP) == 0) continue; PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[tempBattleMonIndex]); - u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES); - enum Ability abilityAtk = ABILITY_NONE; - enum Ability abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]); - enum Type moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now - if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, CHECK_TRIGGER) - || CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, CHECK_TRIGGER) - || (CalcPartyMonTypeEffectivenessMultiplier(move, species, abilityDef) == 0)) - { + ctx.battlerDef = tempBattleMonIndex; + ctx.abilityDef = GetBattlerAbility(ctx.battlerDef); + ctx.holdEffectDef = GetBattlerHoldEffect(ctx.battlerDef); + if (AI_CanMoveBeBlockedByTarget(&ctx) + || CalcTypeEffectivenessMultiplier(&ctx) == UQ_4_12(0.0)) totalStallValue += currentStallValue; - } } for (u32 i = 0; returnValue == 0 && i < totalStallValue; i++) @@ -739,7 +807,6 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) u8 currentMoveArray[MAX_MON_MOVES]; u8 consideredMoveArray[MAX_MON_MOVES]; u32 numOfBestMoves; - s32 i; u64 flags = gAiThinkingStruct->aiFlags[battler]; u32 opposingBattler = GetOppositeBattler(battler); @@ -759,43 +826,46 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) flags >>= (u64)1; gAiThinkingStruct->aiLogicId++; } - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CHECK_VIABILITY) AI_CompareDamagingMoves(battler, opposingBattler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gAiBattleData->finalScore[battler][opposingBattler][i] = gAiThinkingStruct->score[i]; + gAiBattleData->finalScore[battler][opposingBattler][moveIndex] = gAiThinkingStruct->score[moveIndex]; } numOfBestMoves = 1; currentMoveArray[0] = gAiThinkingStruct->score[0]; consideredMoveArray[0] = 0; - for (i = 1; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 1; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[battler].moves[i] != MOVE_NONE) + if (gBattleMons[battler].moves[moveIndex] != MOVE_NONE) { // In ruby, the order of these if statements is reversed. - if (currentMoveArray[0] == gAiThinkingStruct->score[i]) + if (currentMoveArray[0] == gAiThinkingStruct->score[moveIndex]) { - currentMoveArray[numOfBestMoves] = gAiThinkingStruct->score[i]; - consideredMoveArray[numOfBestMoves++] = i; + currentMoveArray[numOfBestMoves] = gAiThinkingStruct->score[moveIndex]; + consideredMoveArray[numOfBestMoves++] = moveIndex; } - if (currentMoveArray[0] < gAiThinkingStruct->score[i]) + if (currentMoveArray[0] < gAiThinkingStruct->score[moveIndex]) { numOfBestMoves = 1; - currentMoveArray[0] = gAiThinkingStruct->score[i]; - consideredMoveArray[0] = i; + currentMoveArray[0] = gAiThinkingStruct->score[moveIndex]; + consideredMoveArray[0] = moveIndex; } } } - return consideredMoveArray[Random() % numOfBestMoves]; + +#if TESTING + gBattleTestRunnerState->data.trial.scoreTieCount = numOfBestMoves; +#endif + + return consideredMoveArray[RandomUniform(RNG_AI_SCORE_TIE_SINGLES, 0, numOfBestMoves - 1)]; } static u32 ChooseMoveOrAction_Doubles(u32 battler) { - s32 i, j; u64 flags; s32 bestMovePointsForTarget[MAX_BATTLERS_COUNT]; u8 mostViableTargetsArray[MAX_BATTLERS_COUNT]; @@ -806,12 +876,12 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) u32 mostViableMovesNo; s32 mostMovePoints; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + for (u32 battlerIndex = 0; battlerIndex < MAX_BATTLERS_COUNT; battlerIndex++) { - if (i == battler || gBattleMons[i].hp == 0) + if (battlerIndex == battler || gBattleMons[battlerIndex].hp == 0) { - actionOrMoveIndex[i] = 0xFF; - bestMovePointsForTarget[i] = -1; + actionOrMoveIndex[battlerIndex] = 0xFF; + bestMovePointsForTarget[battlerIndex] = -1; } else { @@ -820,7 +890,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) else BattleAI_SetupAIData(0xF, battler); - gBattlerTarget = i; + gBattlerTarget = battlerIndex; gAiLogicData->partnerMove = GetAllyChosenMove(battler); gAiThinkingStruct->aiLogicId = 0; @@ -845,39 +915,44 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) mostViableMovesScores[0] = gAiThinkingStruct->score[0]; mostViableMovesIndices[0] = 0; mostViableMovesNo = 1; - for (j = 1; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 1; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[battler].moves[j] != 0) + if (gBattleMons[battler].moves[moveIndex] != 0) { - if (!CanTargetBattler(battler, i, gBattleMons[battler].moves[j])) + if (!CanTargetBattler(battler, battlerIndex, gBattleMons[battler].moves[moveIndex])) continue; - if (mostViableMovesScores[0] == gAiThinkingStruct->score[j]) + if (mostViableMovesScores[0] == gAiThinkingStruct->score[moveIndex]) { - mostViableMovesScores[mostViableMovesNo] = gAiThinkingStruct->score[j]; - mostViableMovesIndices[mostViableMovesNo] = j; + mostViableMovesScores[mostViableMovesNo] = gAiThinkingStruct->score[moveIndex]; + mostViableMovesIndices[mostViableMovesNo] = moveIndex; mostViableMovesNo++; } - if (mostViableMovesScores[0] < gAiThinkingStruct->score[j]) + if (mostViableMovesScores[0] < gAiThinkingStruct->score[moveIndex]) { - mostViableMovesScores[0] = gAiThinkingStruct->score[j]; - mostViableMovesIndices[0] = j; + mostViableMovesScores[0] = gAiThinkingStruct->score[moveIndex]; + mostViableMovesIndices[0] = moveIndex; mostViableMovesNo = 1; } } } - actionOrMoveIndex[i] = mostViableMovesIndices[Random() % mostViableMovesNo]; - bestMovePointsForTarget[i] = mostViableMovesScores[0]; + +#if TESTING + gBattleTestRunnerState->data.trial.scoreTieCount = mostViableMovesNo; +#endif + + actionOrMoveIndex[battlerIndex] = mostViableMovesIndices[RandomUniform(RNG_AI_SCORE_TIE_DOUBLES_MOVE, 0, mostViableMovesNo - 1)]; + bestMovePointsForTarget[battlerIndex] = mostViableMovesScores[0]; // Don't use a move against ally if it has less than 100 points. - if (i == BATTLE_PARTNER(battler) && bestMovePointsForTarget[i] < AI_SCORE_DEFAULT) + if (battlerIndex == BATTLE_PARTNER(battler) && bestMovePointsForTarget[battlerIndex] < AI_SCORE_DEFAULT) { - bestMovePointsForTarget[i] = -1; + bestMovePointsForTarget[battlerIndex] = -1; } - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gAiBattleData->finalScore[battler][gBattlerTarget][j] = gAiThinkingStruct->score[j]; + gAiBattleData->finalScore[battler][gBattlerTarget][moveIndex] = gAiThinkingStruct->score[moveIndex]; } } } @@ -886,32 +961,37 @@ static u32 ChooseMoveOrAction_Doubles(u32 battler) mostViableTargetsArray[0] = 0; mostViableTargetsNo = 1; - for (i = 1; i < MAX_BATTLERS_COUNT; i++) + for (u32 battlerIndex = 1; battlerIndex < MAX_BATTLERS_COUNT; battlerIndex++) { - if (mostMovePoints == bestMovePointsForTarget[i]) + if (mostMovePoints == bestMovePointsForTarget[battlerIndex]) { - mostViableTargetsArray[mostViableTargetsNo] = i; + mostViableTargetsArray[mostViableTargetsNo] = battlerIndex; mostViableTargetsNo++; } - if (mostMovePoints < bestMovePointsForTarget[i]) + if (mostMovePoints < bestMovePointsForTarget[battlerIndex]) { - mostMovePoints = bestMovePointsForTarget[i]; - mostViableTargetsArray[0] = i; + mostMovePoints = bestMovePointsForTarget[battlerIndex]; + mostViableTargetsArray[0] = battlerIndex; mostViableTargetsNo = 1; } } - gBattlerTarget = mostViableTargetsArray[Random() % mostViableTargetsNo]; +#if TESTING + gBattleTestRunnerState->data.trial.targetTieCount = mostViableTargetsNo; +#endif + + gBattlerTarget = mostViableTargetsArray[RandomUniform(RNG_AI_SCORE_TIE_DOUBLES_TARGET, 0, mostViableTargetsNo - 1)]; gAiBattleData->chosenTarget[battler] = gBattlerTarget; + return actionOrMoveIndex[gBattlerTarget]; } -static inline bool32 ShouldConsiderMoveForBattler(u32 battlerAi, u32 battlerDef, u32 move) +static inline bool32 ShouldConsiderMoveForBattler(u32 battlerAi, u32 battlerDef, enum Move move) { if (battlerAi == BATTLE_PARTNER(battlerDef)) { - u32 target = GetBattlerMoveTargetType(battlerAi, move); - if (target == MOVE_TARGET_BOTH || target == MOVE_TARGET_OPPONENTS_FIELD) + enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAi, move); + if (target == TARGET_BOTH || target == TARGET_OPPONENTS_FIELD) return FALSE; } return TRUE; @@ -966,10 +1046,9 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct Pokemon *party = GetBattlerParty(battlerDef); struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); - u32 moveIndex; // Store battler moves data to save time over recalculating it - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { simulatedDamageSwitchout[moveIndex] = aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex]; effectivenessSwitchout[moveIndex] = aiData->effectiveness[battlerAtk][battlerDef][moveIndex]; @@ -979,8 +1058,10 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, // Get battler and move data for predicted switchin PokemonToBattleMon(&party[aiData->mostSuitableMonId[battlerDef]], &switchinCandidate); gBattleMons[battlerDef] = switchinCandidate; + gAiThinkingStruct->saved[battlerDef].saved = TRUE; SetBattlerAiData(battlerDef, aiData); - CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather()); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather(), gFieldStatuses); + gAiThinkingStruct->saved[battlerDef].saved = FALSE; // Regular processing with new battler do @@ -1054,7 +1135,7 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, // Restore original battler data and moves FreeRestoreBattleMons(savedBattleMons); SetBattlerAiData(battlerDef, aiData); - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex] = simulatedDamageSwitchout[moveIndex]; aiData->effectiveness[battlerAtk][battlerDef][moveIndex] = effectivenessSwitchout[moveIndex]; @@ -1064,7 +1145,7 @@ void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, // AI Score Functions // AI_FLAG_CHECK_BAD_MOVE - decreases move scores -static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (IsTargetingPartner(battlerAtk, battlerDef)) return score; @@ -1073,16 +1154,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); enum Type moveType; - u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); + enum MoveTarget moveTarget = AI_GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; bool32 isBattle1v1 = IsBattle1v1(); bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); bool32 hasPartner = HasPartner(battlerAtk); - u32 i; - u32 weather; - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 weather = AI_GetWeather(); + enum Move predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); enum Ability abilityAtk = aiData->abilities[battlerAtk]; enum Ability abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); @@ -1093,7 +1173,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsPowderMove(move) && !IsAffectedByPowderMove(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef])) RETURN_SCORE_MINUS(10); - if (!BreaksThroughSemiInvulnerablity(battlerDef, move) && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + if (!BreaksThroughSemiInvulnerablity(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move) + && moveEffect != EFFECT_SEMI_INVULNERABLE && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) RETURN_SCORE_MINUS(10); if (IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move) && CanTargetFaintAi(battlerDef, battlerAtk)) @@ -1106,7 +1187,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && nonVolatileStatus != MOVE_EFFECT_SLEEP && GetMoveEffect(predictedMove) != EFFECT_FOCUS_PUNCH - && GetMoveEffect(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == EFFECT_FOCUS_PUNCH + && BestDmgMoveHasEffect(battlerDef, battlerAtk, AI_DEFENDING, EFFECT_FOCUS_PUNCH) && RandomPercentage(RNG_AI_STATUS_FOCUS_PUNCH, STATUS_MOVE_FOCUS_PUNCH_CHANCE)) { RETURN_SCORE_MINUS(20); @@ -1116,10 +1197,10 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (((GetMoveType(move) == TYPE_FIRE && GetMovePower(move) != 0) || CanBurnHitThaw(move)) && effectiveness < UQ_4_12(2.0) && (gBattleMons[battlerDef].status1 & STATUS1_ICY_ANY)) { u32 aiMove; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = gBattleMons[battlerAtk].moves[i]; - if (GetMoveType(aiMove) != TYPE_FIRE && !CanBurnHitThaw(aiMove) && GetMovePower(gBattleMons[battlerAtk].moves[i]) != 0) + aiMove = gBattleMons[battlerAtk].moves[moveIndex]; + if (GetMoveType(aiMove) != TYPE_FIRE && !CanBurnHitThaw(aiMove) && GetMovePower(gBattleMons[battlerAtk].moves[moveIndex]) != 0) { ADJUST_SCORE(-1); break; @@ -1140,15 +1221,22 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-5); // check non-user target - if (!(moveTarget & MOVE_TARGET_USER)) + if (moveTarget != TARGET_USER) { if (Ai_IsPriorityBlocked(battlerAtk, battlerDef, move, aiData)) RETURN_SCORE_MINUS(20); - if (CanAbilityBlockMove(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK)) - RETURN_SCORE_MINUS(20); + struct BattleContext ctx = {0}; + ctx.battlerAtk = battlerAtk; + ctx.battlerDef = battlerDef; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.abilityAtk = abilityAtk; + ctx.abilityDef = abilityDef; + ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; + ctx.holdEffectDef = aiData->holdEffects[battlerDef]; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, move, moveType, AI_CHECK)) + if (AI_CanMoveBeBlockedByTarget(&ctx)) RETURN_SCORE_MINUS(20); switch (abilityDef) @@ -1243,7 +1331,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); break; case ABILITY_MAGIC_BOUNCE: - if (MoveCanBeBouncedBack(move) && moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD)) + if (CanMoveBeBouncedBack(battlerAtk, move)) RETURN_SCORE_MINUS(20); break; case ABILITY_SWEET_VEIL: @@ -1264,68 +1352,58 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // def partner ability checks // gen7+ dark type mons immune to priority->elevated moves from prankster - if (GetGenConfig(GEN_CONFIG_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) + if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IsBattleMoveStatus(move) - && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) + && moveTarget != TARGET_OPPONENTS_FIELD + && moveTarget != TARGET_USER) RETURN_SCORE_MINUS(10); // terrain & effect checks - if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsElectricTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], gFieldStatuses)) { if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN)) + if (IsMistyTerrainAffected(battlerDef, abilityDef, aiData->holdEffects[battlerDef], gFieldStatuses)) { if (IsNonVolatileStatusMove(move) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - if (IsBattlerTerrainAffected(battlerAtk, abilityAtk, aiData->holdEffects[battlerAtk], STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) + if (atkPriority > 0 && IsPsychicTerrainAffected(battlerAtk, abilityAtk, aiData->holdEffects[battlerAtk], gFieldStatuses)) { RETURN_SCORE_MINUS(20); } - } // end check MOVE_TARGET_USER + } // end check TARGET_USER // the following checks apply to any target (including user) // throat chop check - if (gDisableStructs[battlerAtk].throatChopTimer > 0 && IsSoundMove(move)) + if (gBattleMons[battlerAtk].volatiles.throatChopTimer > 0 && IsSoundMove(move)) return 0; // Can't even select move at all // heal block check if (gBattleMons[battlerAtk].volatiles.healBlock && IsHealBlockPreventingMove(battlerAtk, move)) return 0; // Can't even select heal blocked move - // primal weather check - weather = AI_GetWeather(); - if (weather & B_WEATHER_PRIMAL_ANY) + if (IsExplosionMove(move)) { - switch (moveEffect) + if (!aiData->shouldConsiderExplosion) + ADJUST_SCORE(-5); + if (effectiveness == UQ_4_12(0.0)) { - case EFFECT_SUNNY_DAY: - case EFFECT_RAIN_DANCE: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_SANDSTORM: - RETURN_SCORE_MINUS(30); - break; - default: - break; + ADJUST_SCORE(-10); } - - if (!IsBattleMoveStatus(move)) + else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { - if (weather & B_WEATHER_SUN_PRIMAL) - { - if (moveType == TYPE_WATER) - RETURN_SCORE_MINUS(30); - } - else if (weather & B_WEATHER_RAIN_PRIMAL) - { - if (moveType == TYPE_FIRE) - RETURN_SCORE_MINUS(30); - } + ADJUST_SCORE(-10); + } + else if (CountUsablePartyMons(battlerAtk) == 0 && LAST_MON_PREFERS_NOT_SACRIFICE) + { + if (CountUsablePartyMons(battlerDef) != 0) + ADJUST_SCORE(-10); + else + ADJUST_SCORE(-1); } } @@ -1338,20 +1416,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; default: break; // check move damage - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) - ADJUST_SCORE(-2); - - if (effectiveness == UQ_4_12(0.0)) + case EFFECT_FINAL_GAMBIT: + if (!aiData->shouldConsiderFinalGambit) + { + ADJUST_SCORE(-5); + } + if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); } - else if (IsAbilityOnField(ABILITY_DAMP) && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) - { - ADJUST_SCORE(-10); - } - else if (CountUsablePartyMons(battlerAtk) == 0) + else if (CountUsablePartyMons(battlerAtk) == 0 && LAST_MON_PREFERS_NOT_SACRIFICE) { if (CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE(-10); @@ -1362,7 +1436,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // stat raising effects case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_2: - case EFFECT_ATTACK_UP_USER_ALLY: if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_ATK) || !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)) ADJUST_SCORE(-10); break; @@ -1445,7 +1518,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case EFFECT_CHARGE: - if (gBattleMons[battlerAtk].volatiles.charge) + if (gBattleMons[battlerAtk].volatiles.chargeTimer > 0) ADJUST_SCORE(-20); else if (!HasMoveWithType(battlerAtk, TYPE_ELECTRIC)) ADJUST_SCORE(-10); @@ -1655,14 +1728,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else { - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerAtk].statStages[i] > DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerAtk)].statStages[i] > DEFAULT_STAT_STAGE) + if (gBattleMons[battlerAtk].statStages[statId] > DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerAtk)].statStages[statId] > DEFAULT_STAT_STAGE) ADJUST_SCORE(-10); // Don't want to reset our boosted stats } - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerDef].statStages[i] < DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerDef)].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battlerDef].statStages[statId] < DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerDef)].statStages[statId] < DEFAULT_STAT_STAGE) ADJUST_SCORE(-10); //Don't want to reset enemy lowered stats } } @@ -1683,8 +1756,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); break; - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: + case EFFECT_REFLECT_DAMAGE: if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) || gBattleMons[battlerDef].volatiles.infatuation || gBattleMons[battlerDef].volatiles.confusionTurns > 0) @@ -1726,7 +1798,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SHEER_COLD: - if (GetGenConfig(GEN_CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) RETURN_SCORE_MINUS(20); // fallthrough case EFFECT_OHKO: @@ -1784,7 +1856,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_DISABLE: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (gDisableStructs[battlerDef].disableTimer == 0 + else if (gBattleMons[battlerDef].volatiles.disableTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { @@ -1806,7 +1878,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_ENCORE: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) ADJUST_SCORE(-10); - else if (gDisableStructs[battlerDef].encoreTimer == 0 + else if (gBattleMons[battlerDef].volatiles.encoreTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && !DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { @@ -1888,7 +1960,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FORESIGHT: if (gBattleMons[battlerDef].volatiles.foresight) ADJUST_SCORE(-10); - else if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 + else if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= DEFAULT_STAT_STAGE - 2 || !(IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-9); @@ -1925,25 +1997,35 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); } break; - case EFFECT_SANDSTORM: - if (weather & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) - ADJUST_SCORE(-8); - break; - case EFFECT_SUNNY_DAY: - if (weather & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) - ADJUST_SCORE(-8); - break; - case EFFECT_RAIN_DANCE: - if (weather & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) - ADJUST_SCORE(-8); - break; - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) + case EFFECT_WEATHER_AND_SWITCH: + if (CountUsablePartyMons(battlerAtk) == 0) + { + ADJUST_SCORE(-10); + break; + } + // fallthrough + case EFFECT_WEATHER: + switch (GetMoveWeatherType(move)) + { + case BATTLE_WEATHER_RAIN: + if (weather & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY)) + ADJUST_SCORE(-8); + break; + case BATTLE_WEATHER_SUN: + if (weather & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY)) + ADJUST_SCORE(-8); + break; + case BATTLE_WEATHER_SANDSTORM: + if (weather & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY)) + ADJUST_SCORE(-8); + break; + case BATTLE_WEATHER_HAIL: + case BATTLE_WEATHER_SNOW: + if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY)) + ADJUST_SCORE(-8); + break; + } + if (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-8); break; case EFFECT_ATTRACT: @@ -1978,13 +2060,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_HIT_ESCAPE: break; - case EFFECT_CHILLY_RECEPTION: - if (CountUsablePartyMons(battlerAtk) == 0) - ADJUST_SCORE(-10); - else if (weather & (B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) - || (HasPartner(battlerAtk) && AreMovesEquivalent(battlerAtk, BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))) - ADJUST_SCORE(-8); - break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) @@ -1995,8 +2070,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FUTURE_SIGHT: - if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0 - || gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0) + if (gBattleStruct->futureSight[LEFT_FOE(battlerAtk)].counter > 0 + || gBattleStruct->futureSight[RIGHT_FOE(battlerAtk)].counter > 0) ADJUST_SCORE(-12); else ADJUST_SCORE(GOOD_EFFECT); @@ -2005,17 +2080,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FIRST_TURN_ONLY: - if (!gDisableStructs[battlerAtk].isFirstTurn) + if (!gBattleStruct->battlerState[battlerAtk].isFirstTurn) ADJUST_SCORE(-10); if (HasChoiceEffect(battlerAtk)) ADJUST_SCORE(-5); break; case EFFECT_STOCKPILE: - if (gDisableStructs[battlerAtk].stockpileCounter >= 3) + if (gBattleMons[battlerAtk].volatiles.stockpileCounter >= 3) ADJUST_SCORE(-10); break; case EFFECT_SWALLOW: - if (gDisableStructs[battlerAtk].stockpileCounter == 0) + if (gBattleMons[battlerAtk].volatiles.stockpileCounter == 0) { ADJUST_SCORE(-10); } @@ -2046,14 +2121,28 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FOLLOW_ME: + if (!hasPartner + || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) + || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) + ADJUST_SCORE(-20); + break; case EFFECT_HELPING_HAND: if (!hasPartner || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove) + || aiData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_GOOD_AS_GOLD || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove)) || gBattleStruct->monToSwitchIntoId[BATTLE_PARTNER(battlerAtk)] != PARTY_SIZE) //Partner is switching out. ADJUST_SCORE(-20); break; case EFFECT_TRICK: + if ((gBattleMons[battlerAtk].item == ITEM_NONE && aiData->items[battlerDef] == ITEM_NONE) + || !CanBattlerGetOrLoseItem(battlerAtk, battlerDef, gBattleMons[battlerAtk].item) + || !CanBattlerGetOrLoseItem(battlerAtk, battlerDef, aiData->items[battlerDef]) + || !CanBattlerGetOrLoseItem(battlerDef, battlerAtk, aiData->items[battlerDef]) + || !CanBattlerGetOrLoseItem(battlerDef, battlerAtk, gBattleMons[battlerAtk].item) + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) + ADJUST_SCORE(-10); case EFFECT_KNOCK_OFF: case EFFECT_CORROSIVE_GAS: if (aiData->abilities[battlerDef] == ABILITY_STICKY_HOLD) @@ -2076,7 +2165,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_REFRESH: - if (!(gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE)) + if (!(gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) + || !ShouldCureStatus(battlerAtk, battlerAtk, aiData)) ADJUST_SCORE(-10); break; case EFFECT_PSYCHO_SHIFT: @@ -2107,10 +2197,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; - case EFFECT_ABSORB: - if (aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE) - ADJUST_SCORE(-6); - break; case EFFECT_STRENGTH_SAP: if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(-10); @@ -2278,12 +2364,15 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case PROTECT_WIDE_GUARD: - if (!(GetBattlerMoveTargetType(battlerAtk, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH))) + { + enum MoveTarget predictedTargetType = AI_GetBattlerMoveTargetType(battlerDef, predictedMove); + if (!(predictedTargetType == TARGET_BOTH || predictedTargetType == TARGET_FOES_AND_ALLY)) { ADJUST_SCORE(-10); decreased = TRUE; } break; + } case PROTECT_CRAFTY_SHIELD: if (!hasPartner) { @@ -2292,7 +2381,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case PROTECT_MAT_BLOCK: - if (!gDisableStructs[battlerAtk].isFirstTurn) + if (!gBattleStruct->battlerState[battlerAtk].isFirstTurn) { ADJUST_SCORE(-10); decreased = TRUE; @@ -2304,6 +2393,20 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (decreased) break; + if (predictedMove != MOVE_NONE && predictedMove != MOVE_UNAVAILABLE) + { + if (MoveIgnoresProtect(predictedMove)) + { + ADJUST_SCORE(-10); + break; + } + } + if (protectMethod != PROTECT_MAX_GUARD + && IsUnseenFistContactMove(battlerDef, battlerAtk, predictedMove)) + { + ADJUST_SCORE(-10); + break; + } if (IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef])) { ADJUST_SCORE(-10); @@ -2319,14 +2422,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); //Don't protect if you're going to faint after protecting } - else if (gDisableStructs[battlerAtk].protectUses == 1 && Random() % 100 < 50) + else if (gBattleMons[battlerAtk].volatiles.consecutiveMoveUses == 1 && Random() % 100 < 50) { if (isBattle1v1) ADJUST_SCORE(-6); else ADJUST_SCORE(-10); //Don't try double protecting in doubles } - else if (gDisableStructs[battlerAtk].protectUses >= 2) + else if (gBattleMons[battlerAtk].volatiles.consecutiveMoveUses >= 2) { ADJUST_SCORE(-10); } @@ -2347,7 +2450,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (gBattleMons[battlerDef].volatiles.miracleEye) ADJUST_SCORE(-10); - if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= 4 + if (gBattleMons[battlerDef].statStages[STAT_EVASION] <= DEFAULT_STAT_STAGE - 2 || !(IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-9); @@ -2403,14 +2506,14 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_PSYCH_UP: // haze stats check { - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerAtk].statStages[i] > DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerAtk)].statStages[i] > DEFAULT_STAT_STAGE) + if (gBattleMons[battlerAtk].statStages[statId] > DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerAtk)].statStages[statId] > DEFAULT_STAT_STAGE) ADJUST_SCORE(-10); // Don't want to reset our boosted stats } - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerDef].statStages[i] < DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerDef)].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battlerDef].statStages[statId] < DEFAULT_STAT_STAGE || gBattleMons[BATTLE_PARTNER(battlerDef)].statStages[statId] < DEFAULT_STAT_STAGE) ADJUST_SCORE(-10); //Don't want to copy enemy lowered stats } } @@ -2431,27 +2534,26 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (IsPartyFullyHealedExceptBattler(battlerAtk)) ADJUST_SCORE(-10); break; - case EFFECT_FINAL_GAMBIT: - if (CountUsablePartyMons(battlerAtk) == 0 || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) - ADJUST_SCORE(-10); - break; case EFFECT_NATURE_POWER: predictedMove = GetNaturePowerMove(battlerAtk); if (GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckBadMove(battlerAtk, battlerDef, GetNaturePowerMove(battlerAtk), score); break; case EFFECT_TAUNT: - if (gDisableStructs[battlerDef].tauntTimer > 0 + if (gBattleMons[battlerDef].volatiles.tauntTimer > 0 || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_BESTOW: if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_NONE - || !CanBattlerGetOrLoseItem(battlerAtk, gBattleMons[battlerAtk].item)) // AI knows its own item + || aiData->items[battlerDef] != ITEM_NONE + || !CanBattlerGetOrLoseItem(battlerAtk, battlerDef, gBattleMons[battlerAtk].item) // AI knows its own item + || !CanBattlerGetOrLoseItem(battlerDef, battlerAtk, gBattleMons[battlerAtk].item) + || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(-10); break; case EFFECT_WISH: - if (gWishFutureKnock.wishCounter[battlerAtk] > 0) + if (gBattleStruct->wish[battlerAtk].counter > 0) ADJUST_SCORE(-10); break; case EFFECT_ASSIST: @@ -2657,7 +2759,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_FLING: - if (!CanFling(battlerAtk)) + if (!CanFling(battlerAtk, battlerDef)) { ADJUST_SCORE(-10); } @@ -2780,32 +2882,27 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) instructedMove = aiData->lastUsedMove[battlerDef]; if (instructedMove == MOVE_NONE - || IsMoveInstructBanned(instructedMove) - || MoveHasAdditionalEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) - || IsZMove(instructedMove) - || (gLockedMoves[battlerDef] != MOVE_NONE && gLockedMoves[battlerDef] != MOVE_UNAVAILABLE) - || gBattleMons[battlerDef].volatiles.multipleTurns - || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) + || IsMoveInstructBanned(instructedMove) + || MoveHasAdditionalEffectSelf(instructedMove, MOVE_EFFECT_RECHARGE) + || IsZMove(instructedMove) + || (gLockedMoves[battlerDef] != MOVE_NONE && gLockedMoves[battlerDef] != MOVE_UNAVAILABLE) + || gBattleMons[battlerDef].volatiles.multipleTurns + || PartnerMoveIsSameAsAttacker(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) { ADJUST_SCORE(-10); } else if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) + { ADJUST_SCORE(-10); + } else if (hasPartner) { if (!IsTargetingPartner(battlerAtk, battlerDef)) ADJUST_SCORE(-10); } - else + else if (ShouldInstructPartner(battlerDef, instructedMove)) { - if (GetBattlerMoveTargetType(battlerDef, instructedMove) & (MOVE_TARGET_SELECTED - | MOVE_TARGET_DEPENDS - | MOVE_TARGET_RANDOM - | MOVE_TARGET_BOTH - | MOVE_TARGET_FOES_AND_ALLY - | MOVE_TARGET_OPPONENTS_FIELD) - && GetMoveEffect(instructedMove) != EFFECT_MAX_HP_50_RECOIL) - ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown + ADJUST_SCORE(-10); //Don't force the enemy to attack you again unless it can kill itself with Mind Blown } } break; @@ -2841,7 +2938,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_MAGNET_RISE: if (gFieldStatuses & STATUS_FIELD_GRAVITY - || gDisableStructs[battlerAtk].magnetRiseTimer > 0 + || gBattleMons[battlerAtk].volatiles.magnetRiseTimer > 0 || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_IRON_BALL || gBattleMons[battlerAtk].volatiles.smackDown || gBattleMons[battlerAtk].volatiles.root @@ -2890,6 +2987,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_CLANGOROUS_SOUL: if (gBattleMons[battlerAtk].hp <= gBattleMons[battlerAtk].maxHP / 3) ADJUST_SCORE(-10); + else if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) + ADJUST_SCORE(-10); break; case EFFECT_REVIVAL_BLESSING: if (GetFirstFaintedPartyIndex(battlerAtk) == PARTY_SIZE) @@ -2901,12 +3000,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_JUNGLE_HEALING: - if (AI_BattlerAtMaxHp(battlerAtk) - && AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk)) - && !(gBattleMons[battlerAtk].status1 & STATUS1_ANY) - && !(gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY)) + { + bool32 canCureSelf = (gBattleMons[battlerAtk].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, battlerAtk, aiData); + bool32 canCurePartner = (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, BATTLE_PARTNER(battlerAtk), aiData); + + if (AI_BattlerAtMaxHp(battlerAtk) + && AI_BattlerAtMaxHp(BATTLE_PARTNER(battlerAtk)) + && !canCureSelf + && !canCurePartner) ADJUST_SCORE(-10); break; + } case EFFECT_TAKE_HEART: if ((!(gBattleMons[battlerAtk].status1 & STATUS1_ANY) || PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_JUNGLE_HEALING) @@ -2984,7 +3088,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsHoldEffectChoice(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) { // Don't use user-target moves ie. Swords Dance, with exceptions - if ((moveTarget & MOVE_TARGET_USER) + if ((moveTarget == TARGET_USER) && moveEffect != EFFECT_DESTINY_BOND && moveEffect != EFFECT_WISH && moveEffect != EFFECT_HEALING_WISH && !(moveEffect == EFFECT_AURORA_VEIL && (AI_GetWeather() & B_WEATHER_ICY_ANY))) ADJUST_SCORE(-30); @@ -3004,21 +3108,22 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_GetWhichBattlerFasterOrTies(u32 battlerAtk, u32 battlerDef, bool32 ignoreChosenMoves) { - struct BattleContext ctx = {0}; - ctx.battlerAtk = battlerAtk; - ctx.battlerDef = battlerDef; - ctx.abilities[battlerAtk] = gAiLogicData->abilities[battlerAtk]; - ctx.abilities[battlerDef] = gAiLogicData->abilities[battlerDef]; - ctx.holdEffects[battlerAtk] = gAiLogicData->holdEffects[battlerAtk]; - ctx.holdEffects[battlerDef] = gAiLogicData->holdEffects[battlerDef]; + struct BattleCalcValues calcValues = {0}; + calcValues.battlerAtk = battlerAtk; + calcValues.battlerDef = battlerDef; + calcValues.abilities[battlerAtk] = gAiLogicData->abilities[battlerAtk]; + calcValues.abilities[battlerDef] = gAiLogicData->abilities[battlerDef]; + calcValues.holdEffects[battlerAtk] = gAiLogicData->holdEffects[battlerAtk]; + calcValues.holdEffects[battlerDef] = gAiLogicData->holdEffects[battlerDef]; - return GetWhichBattlerFasterOrTies(&ctx, ignoreChosenMoves); + return GetWhichBattlerFasterOrTies(&calcValues, ignoreChosenMoves); } -static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { u32 movesetIndex = gAiThinkingStruct->movesetIndex; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY); if (IsTargetingPartner(battlerAtk, battlerDef)) return score; @@ -3026,11 +3131,10 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsBattleMoveStatus(move)) return score; // status moves aren't accounted here - enum BattleMoveEffects effect = GetMoveEffect(move); if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING) - && effect != EFFECT_EXPLOSION && effect != EFFECT_MISTY_EXPLOSION) + && (!IsSelfSacrificeEffect(move) || ShouldConsiderSelfSacrificeDamageEffect(battlerAtk, battlerDef, move, aiIsFaster))) { - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + if (aiIsFaster) ADJUST_SCORE(FAST_KILL); else ADJUST_SCORE(SLOW_KILL); @@ -3039,7 +3143,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && AI_GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) > 0) { - if (RandomPercentage(RNG_AI_PRIORITIZE_LAST_CHANCE, PRIORITIZE_LAST_CHANCE_CHANCE)) + if (RandomPercentage(RNG_AI_PRIORITIZE_LAST_CHANCE, PRIORITIZE_LAST_CHANCE_CHANCE) && !IsDoubleBattle()) // Last Chance behaviour is too easily abused in doubles ADJUST_SCORE(SLOW_KILL + 2); // Don't outscore Fast Kill (which gets a bonus point in AI_CompareDamagingMoves), but do outscore Slow Kill getting the same else ADJUST_SCORE(LAST_CHANCE); @@ -3049,22 +3153,22 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // double battle logic -static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { // move data enum Type moveType = GetMoveType(move); enum BattleMoveEffects effect = GetMoveEffect(move); - u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); + enum MoveTarget moveTarget = AI_GetBattlerMoveTargetType(battlerAtk, move); // ally data u32 battlerAtkPartner = BATTLE_PARTNER(battlerAtk); struct AiLogicData *aiData = gAiLogicData; - u32 atkPartnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; + enum Ability atkPartnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; enum BattleMoveEffects partnerEffect = GetMoveEffect(aiData->partnerMove); bool32 partnerProtecting = IsAllyProtectingFromMove(battlerAtk, move, aiData->partnerMove) && !MoveIgnoresProtect(move); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); @@ -3072,7 +3176,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); bool32 hasPartner = HasPartner(battlerAtk); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); - u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE); bool32 wouldPartnerFaint = hasPartner && CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) && !partnerProtecting; bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); @@ -3119,7 +3223,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IsAttackBoostMoveEffect(effect)) ADJUST_SCORE(-3); // encourage moves hitting multiple opponents - if (!IsBattleMoveStatus(move) && (moveTarget & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) + if (!IsBattleMoveStatus(move) && IsSpreadMove(moveTarget)) ADJUST_SCORE(GOOD_EFFECT); } } @@ -3130,6 +3234,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HELPING_HAND: if (!hasPartner || !HasDamagingMove(battlerAtkPartner) + || aiData->abilities[battlerAtkPartner] == ABILITY_GOOD_AS_GOLD || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove))) { ADJUST_SCORE(WORST_EFFECT); @@ -3240,7 +3345,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // global move effect check // Specific logic for spread moves. - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { // Don't kill your partner for no reason. if (wouldPartnerFaint) @@ -3249,18 +3354,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) && CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { - switch (effect) + if (IsExplosionMove(move)) { - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) { RETURN_SCORE_PLUS(10); } - break; - default: + } + else + { RETURN_SCORE_PLUS(10); - break; } } // Both opponents can kill the partner @@ -3338,7 +3441,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // partner ability checks - if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) + if (!partnerProtecting && moveTarget != TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { switch (atkPartnerAbility) { @@ -3350,7 +3453,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { if (MoveAlwaysCrits(move)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3368,12 +3471,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_VOLT_ABSORB: if (moveType == TYPE_ELECTRIC) { - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) { RETURN_SCORE_MINUS(10); } - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3395,7 +3498,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_LEVITATE: if (moveType == TYPE_GROUND) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3414,12 +3517,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_STORM_DRAIN: if (moveType == TYPE_WATER) { - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) { RETURN_SCORE_MINUS(10); } - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3441,12 +3544,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (moveType == TYPE_WATER && isFriendlyFireOK && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } - if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + if (GetMoveStrikeCount(move) > 1 && moveTarget != TARGET_SMART) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3460,7 +3563,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (isFriendlyFireOK && (moveType == TYPE_WATER || moveType == TYPE_FIRE) && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3476,12 +3579,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && !IsBattleMoveStatus(move) && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } - if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + if (GetMoveStrikeCount(move) > 1 && moveTarget != TARGET_SMART) { ADJUST_SCORE(WEAK_EFFECT); } @@ -3497,7 +3600,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_WELL_BAKED_BODY: if (moveType == TYPE_FIRE) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3514,7 +3617,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_SAP_SIPPER: if (moveType == TYPE_GRASS) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3534,12 +3637,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && !IsBattleMoveStatus(move) && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(GOOD_EFFECT); } - if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + if (GetMoveStrikeCount(move) > 1 && moveTarget != TARGET_SMART) { ADJUST_SCORE(WEAK_EFFECT); } @@ -3556,7 +3659,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); } @@ -3572,7 +3675,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_COMPETITIVE: if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtk, battlerAtkPartner, atkPartnerAbility)) { - if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) { ADJUST_SCORE(GOOD_EFFECT); } @@ -3583,6 +3686,8 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) isMoveAffectedByPartnerAbility = FALSE; } break; + default: + break; } } // ability checks @@ -3674,15 +3779,13 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_INSTRUCT: { - u16 instructedMove; + enum Move instructedMove = aiData->lastUsedMove[battlerAtkPartner]; if (AI_IsFaster(battlerAtk, battlerAtkPartner, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) instructedMove = aiData->partnerMove; - else - instructedMove = aiData->lastUsedMove[battlerAtkPartner]; if (instructedMove != MOVE_NONE - && !IsBattleMoveStatus(instructedMove) - && (GetBattlerMoveTargetType(battlerAtkPartner, instructedMove) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) // Use instruct on multi-target moves + && !IsBattleMoveStatus(instructedMove) + && IsSpreadMove(AI_GetBattlerMoveTargetType(battlerAtkPartner, instructedMove))) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3695,7 +3798,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (AI_IsSlower(battlerAtkPartner, LEFT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) // Opponent mon 1 goes before partner && AI_IsSlower(battlerAtkPartner, RIGHT_FOE(battlerAtk), aiData->partnerMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Opponent mon 2 goes before partner { - if (partnerEffect == EFFECT_COUNTER || partnerEffect == EFFECT_MIRROR_COAT) + if (partnerEffect == EFFECT_REFLECT_DAMAGE) break; // These moves need to go last ADJUST_SCORE(WEAK_EFFECT); } @@ -3809,6 +3912,34 @@ static bool32 IsPinchBerryItemEffect(enum HoldEffect holdEffect) } } +static bool32 DoesAbilityBenefitFromSunOrRain(u32 battler, enum Ability ability, u32 weather) +{ + switch (ability) + { + case ABILITY_DRY_SKIN: + case ABILITY_HYDRATION: + case ABILITY_RAIN_DISH: + case ABILITY_SWIFT_SWIM: + return (weather & B_WEATHER_RAIN); + case ABILITY_HARVEST: + if (GetItemPocket(gAiLogicData->items[battler]) != POCKET_BERRIES + && GetItemPocket(gBattleStruct->changedItems[battler]) != POCKET_BERRIES + && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) != POCKET_BERRIES) + { + return FALSE; + } + case ABILITY_CHLOROPHYLL: + case ABILITY_FLOWER_GIFT: + case ABILITY_LEAF_GUARD: + case ABILITY_SOLAR_POWER: + case ABILITY_ORICHALCUM_PULSE: + return (weather & B_WEATHER_SUN); + default: + break; + } + return FALSE; +} + static enum MoveComparisonResult CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) { u32 acc1 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot1]; @@ -3821,15 +3952,11 @@ static enum MoveComparisonResult CompareMoveAccuracies(u32 battlerAtk, u32 battl return MOVE_NEUTRAL_COMPARISON; } -static enum MoveComparisonResult CompareMoveSpeeds(u32 battlerAtk, u32 battlerDef, u16 move1, u16 move2) +static enum MoveComparisonResult CompareMoveSpeeds(u32 battlerAtk, u32 battlerDef, bool32 move1Faster, bool32 move2Faster) { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - u32 speed1 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move1, predictedMoveSpeedCheck, CONSIDER_PRIORITY); - u32 speed2 = AI_WhoStrikesFirst(battlerAtk, battlerDef, move2, predictedMoveSpeedCheck, CONSIDER_PRIORITY); - - if (speed1 == AI_IS_FASTER && speed2 == AI_IS_SLOWER) + if (move1Faster && !move2Faster) return MOVE_WON_COMPARISON; - if (speed2 == AI_IS_FASTER && speed1 == AI_IS_SLOWER) + if (move2Faster && !move1Faster) return MOVE_LOST_COMPARISON; return MOVE_NEUTRAL_COMPARISON; } @@ -3855,147 +3982,219 @@ static enum MoveComparisonResult CompareGuaranteeFaintTarget(u32 battlerAtk, u32 return MOVE_NEUTRAL_COMPARISON; } -static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 moveIndex, u32 hitsToFaintOpposingBattler) +static enum MoveComparisonResult CompareResistBerryEffects(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) +{ + // Check for resist berries in OHKOs + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_RESIST_BERRY) + { + if (gAiLogicData->resistBerryAffected[battlerAtk][battlerDef][moveSlot2] && !gAiLogicData->resistBerryAffected[battlerAtk][battlerDef][moveSlot1]) + return MOVE_WON_COMPARISON; + + if (gAiLogicData->resistBerryAffected[battlerAtk][battlerDef][moveSlot1] && !gAiLogicData->resistBerryAffected[battlerAtk][battlerDef][moveSlot2]) + return MOVE_LOST_COMPARISON; + } + + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareMoveSelfSacrifice(u32 battlerAtk, u32 battlerDef, enum Move move1, enum Move move2) +{ + bool32 selfSacrifice1 = IsSelfSacrificeEffect(move1); + bool32 selfSacrifice2 = IsSelfSacrificeEffect(move2); + + if (selfSacrifice1 && !selfSacrifice2) + return MOVE_LOST_COMPARISON; + if (selfSacrifice2 && !selfSacrifice1) + return MOVE_WON_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static enum MoveComparisonResult CompareMoveTwoTurnEffect(u32 battlerAtk, enum Move move1, enum Move move2) +{ + bool32 twoTurn1 = IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move1); + bool32 twoTurn2 = IsTwoTurnNotSemiInvulnerableMove(battlerAtk, move2); + + if (twoTurn1 && !twoTurn2) + return MOVE_LOST_COMPARISON; + if (twoTurn2 && !twoTurn1) + return MOVE_WON_COMPARISON; + return MOVE_NEUTRAL_COMPARISON; +} + +static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, enum Move move, u32 moveIndex, u32 hitsToFaintOpposingBattler) { u32 partnerBattler = BATTLE_PARTNER(battlerAtk); - u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex, AI_ATTACKING); + u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex, AI_ATTACKING, CONSIDER_ENDURE); u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); return (HasPartnerIgnoreFlags(battlerAtk) && noOfHitsToFaintPartner != 0 // Immunity check - && GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY + && AI_GetBattlerMoveTargetType(battlerAtk, move) == TARGET_FOES_AND_ALLY && !(noOfHitsToFaintPartner < friendlyFireThreshold && hitsToFaintOpposingBattler == 1) && noOfHitsToFaintPartner < (friendlyFireThreshold * 2)); } -static bool32 ShouldCompareMove(u32 battlerAtk, u32 battlerDef, u32 moveIndex, u16 move) +static bool32 ShouldCompareMove(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum Move move) { if (IsTargetingPartner(battlerAtk, battlerDef)) return FALSE; if (GetMovePower(move) == 0) return FALSE; - if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, AI_ATTACKING) == 0) + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, AI_ATTACKING, DONT_CONSIDER_ENDURE) == 0) return FALSE; - if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && IsBestDmgMove(battlerAtk, battlerDef, AI_ATTACKING, move)) return FALSE; return TRUE; } static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) { - u32 i, currId; u32 tempMoveScores[MAX_MON_MOVES]; u32 moveComparisonScores[MAX_MON_MOVES]; u32 bestScore = AI_SCORE_DEFAULT; bool32 multipleBestMoves = FALSE; s32 noOfHits[MAX_MON_MOVES]; s32 leastHits = 1000; - u16 *moves = GetMovesArray(battlerAtk); - bool8 isTwoTurnNotSemiInvulnerableMove[MAX_MON_MOVES]; + enum Move *moves = GetMovesArray(battlerAtk); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 moveIsFaster[MAX_MON_MOVES]; - for (currId = 0; currId < MAX_MON_MOVES; currId++) + for (u32 currId = 0; currId < MAX_MON_MOVES; currId++) { moveComparisonScores[currId] = 0; if (!ShouldCompareMove(battlerAtk, battlerDef, currId, moves[currId])) continue; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 compareId = 0; compareId < MAX_MON_MOVES; compareId++) { - if (moves[i] != MOVE_NONE && GetMovePower(moves[i]) != 0) + if (moves[compareId] != MOVE_NONE && GetMovePower(moves[compareId]) != 0) { - noOfHits[i] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, i, AI_ATTACKING); - if (ShouldUseSpreadDamageMove(battlerAtk,moves[i], i, noOfHits[i])) + noOfHits[compareId] = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, compareId, AI_ATTACKING, CONSIDER_ENDURE); + moveIsFaster[compareId] = AI_IsFaster(battlerAtk, battlerDef, moves[compareId], predictedMoveSpeedCheck, CONSIDER_PRIORITY); + tempMoveScores[compareId] = AI_SCORE_DEFAULT; + if (ShouldUseSpreadDamageMove(battlerAtk,moves[compareId], compareId, noOfHits[compareId])) { - noOfHits[i] = -1; - tempMoveScores[i] = 0; - isTwoTurnNotSemiInvulnerableMove[i] = FALSE; + noOfHits[compareId] = -1; } - else if (noOfHits[i] < leastHits && noOfHits[i] != 0) + else if (noOfHits[compareId] < leastHits && noOfHits[compareId] != 0) { - leastHits = noOfHits[i]; + leastHits = noOfHits[compareId]; + } + // Decided against using self sacrifice effect this turn + if (IsSelfSacrificeEffect(moves[compareId]) && !ShouldConsiderSelfSacrificeDamageEffect(battlerAtk, battlerDef, moves[compareId], moveIsFaster[compareId])) + { + noOfHits[compareId] = gBattleMons[battlerDef].maxHP; + tempMoveScores[compareId] = 0; } - tempMoveScores[i] = AI_SCORE_DEFAULT; - isTwoTurnNotSemiInvulnerableMove[i] = IsTwoTurnNotSemiInvulnerableMove(battlerAtk, moves[i]); } else { - noOfHits[i] = -1; - tempMoveScores[i] = 0; - isTwoTurnNotSemiInvulnerableMove[i] = FALSE; + noOfHits[compareId] = -1; + tempMoveScores[compareId] = 0; } } // Priority list: - // 1. Less no of hits to ko - // 2. Priority if outsped and a OHKO + // 1. Lower number of hits to KO + // 2. Move not affected by resist berry (if two moves OHKO) // 3. Not charging - // 4. More accuracy - // 5. Guaranteed KO - // 6. Better effect + // 4. Priority if outsped and a OHKO (if two moves OHKO) + // 5. Not self sacrificing + // 6. Guaranteed KO (if two moves OHKO) + // 7. More accuracy + // 8. Better effect // Current move requires the least hits to KO. Compare with other moves. if (leastHits == noOfHits[currId]) { - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 compareId = 0; compareId < MAX_MON_MOVES; compareId++) { - if (i == currId) + if (compareId == currId) continue; - if (noOfHits[currId] == noOfHits[i]) + if (noOfHits[currId] == noOfHits[compareId]) { multipleBestMoves = TRUE; - // We need to make sure it's the current move which is objectively better. - if (isTwoTurnNotSemiInvulnerableMove[i] && !isTwoTurnNotSemiInvulnerableMove[currId]) - tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); - else if (!isTwoTurnNotSemiInvulnerableMove[i] && isTwoTurnNotSemiInvulnerableMove[currId]) - tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); - // Comparing KOs if (noOfHits[currId] == 1) { + // If one move is berry-resisted, use the other one + switch (CompareResistBerryEffects(battlerAtk, battlerDef, currId, compareId)) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_RESIST_BERRY); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_RESIST_BERRY); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } // Use priority to get fast KO if outsped - switch (CompareMoveSpeeds(battlerAtk, battlerDef, moves[currId], moves[i])) + switch (CompareMoveSpeeds(battlerAtk, battlerDef, moveIsFaster[currId], moveIsFaster[compareId])) { case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); break; case MOVE_LOST_COMPARISON: - tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_SPEED); break; case MOVE_NEUTRAL_COMPARISON: break; } // Min roll KOs - switch (CompareGuaranteeFaintTarget(battlerAtk, battlerDef, currId, i, moves)) + switch (CompareGuaranteeFaintTarget(battlerAtk, battlerDef, currId, compareId, moves)) { case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); break; case MOVE_LOST_COMPARISON: - tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_GUARANTEE); break; case MOVE_NEUTRAL_COMPARISON: break; } } - switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, i)) + switch (CompareMoveTwoTurnEffect(battlerAtk, moves[currId], moves[compareId])) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_NOT_CHARGING); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + switch (CompareMoveAccuracies(battlerAtk, battlerDef, currId, compareId)) { case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); break; case MOVE_LOST_COMPARISON: - tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_ACCURACY); break; case MOVE_NEUTRAL_COMPARISON: - break; + break; } - switch (AI_WhichMoveBetter(moves[currId], moves[i], battlerAtk, battlerDef, noOfHits[currId])) + switch (CompareMoveSelfSacrifice(battlerAtk, battlerDef, moves[currId], moves[compareId])) + { + case MOVE_WON_COMPARISON: + tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_AVOID_SELF_SACRIFICE); + break; + case MOVE_LOST_COMPARISON: + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_AVOID_SELF_SACRIFICE); + break; + case MOVE_NEUTRAL_COMPARISON: + break; + } + switch (CompareMoveEffects(moves[currId], moves[compareId], battlerAtk, battlerDef, noOfHits[currId])) { case MOVE_WON_COMPARISON: tempMoveScores[currId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); break; case MOVE_LOST_COMPARISON: - tempMoveScores[i] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); + tempMoveScores[compareId] += MathUtil_Exponent(MAX_MON_MOVES, PRIORITY_EFFECT); break; case MOVE_NEUTRAL_COMPARISON: - break; + break; } } } @@ -4008,20 +4207,20 @@ static void AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef) } // Find highest comparison score - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moveComparisonScores[i] > bestScore) - bestScore = moveComparisonScores[i]; + if (moveComparisonScores[moveIndex] > bestScore) + bestScore = moveComparisonScores[moveIndex]; } // Increase score for corresponding move(s), accomodating ties - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moveComparisonScores[i] == bestScore) - gAiThinkingStruct->score[i] += BEST_DAMAGE_MOVE; + if (moveComparisonScores[moveIndex] == bestScore) + gAiThinkingStruct->score[moveIndex] += BEST_DAMAGE_MOVE; } } -static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { enum HoldEffect holdEffect = aiData->holdEffects[battlerAtk]; @@ -4050,7 +4249,7 @@ static s32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move, return score; } -static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -4058,19 +4257,22 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); + enum Move predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); enum Type predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); bool32 isBattle1v1 = IsBattle1v1(); bool32 hasTwoOpponents = HasTwoOpponents(battlerAtk); bool32 hasPartner = HasPartner(battlerAtk); - bool32 moveTargetsBothOpponents = hasTwoOpponents && (gMovesInfo[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); - u32 i; + enum MoveTarget moveTarget = AI_GetBattlerMoveTargetType(battlerAtk, move); + bool32 moveTargetsBothOpponents = hasTwoOpponents && (IsSpreadMove(moveTarget) || moveTarget == TARGET_ALL_BATTLERS || moveTarget == TARGET_FIELD); // The AI should understand that while Dynamaxed, status moves function like Protect. if (GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX && GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS) + { + move = MOVE_MAX_GUARD; moveEffect = EFFECT_PROTECT; + } // check status move preference if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) @@ -4105,6 +4307,9 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (IsFlinchGuaranteed(battlerAtk, battlerDef, move)) ADJUST_SCORE(BEST_EFFECT); + if (IsExplosionMove(move) && gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] <= DEFAULT_STAT_STAGE) + ADJUST_SCORE(DECENT_EFFECT); + // Non-volatile statuses switch(GetMoveNonVolatileStatus(move)) { @@ -4129,10 +4334,10 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru IncreaseSleepScore(battlerAtk, battlerDef, move, &score); break; case EFFECT_ABSORB: - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT && effectiveness >= UQ_4_12(1.0)) + case EFFECT_DREAM_EATER: + if (ShouldAbsorb(battlerAtk, battlerDef, move)) ADJUST_SCORE(DECENT_EFFECT); break; - case EFFECT_DREAM_EATER: case EFFECT_AQUA_RING: if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_BIG_ROOT) ADJUST_SCORE(DECENT_EFFECT); @@ -4152,14 +4357,9 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru } break; } - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: case EFFECT_MEMENTO: - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) - { - if (aiData->hpPercents[battlerAtk] < 50 && AI_RandLessThan(128)) - ADJUST_SCORE(DECENT_EFFECT); - } + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] <= DEFAULT_STAT_STAGE) + ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_FINAL_GAMBIT: if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) @@ -4169,8 +4369,6 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (predictedMove && GetMoveEffect(predictedMove) != GetMoveEffect(move)) return AI_CheckViability(battlerAtk, battlerDef, predictedMove, score); break; - case EFFECT_ATTACK_UP_USER_ALLY: - ADJUST_SCORE(IncreaseStatUpScore(BATTLE_PARTNER(battlerAtk), battlerDef, STAT_CHANGE_ATK)); case EFFECT_ATTACK_UP: ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); break; @@ -4353,14 +4551,6 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru break; score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; - case EFFECT_MULTI_HIT: - case EFFECT_TRIPLE_KICK: - case EFFECT_POPULATION_BOMB: - if (AI_MoveMakesContact(aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], move) - && aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD - && aiData->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET) - ADJUST_SCORE(-2); - break; case EFFECT_CONVERSION: if (!IS_BATTLER_OF_TYPE(battlerAtk, GetMoveType(gBattleMons[battlerAtk].moves[0]))) { @@ -4372,14 +4562,14 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru } break; case EFFECT_SWALLOW: - if (gDisableStructs[battlerAtk].stockpileCounter == 0) + if (gBattleMons[battlerAtk].volatiles.stockpileCounter == 0) { break; } else { u32 healPercent = 0; - switch (gDisableStructs[battlerAtk].stockpileCounter) + switch (gBattleMons[battlerAtk].volatiles.stockpileCounter) { case 1: healPercent = 25; @@ -4432,11 +4622,10 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_SLP || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_STATUS - || HasMoveWithEffect(battlerAtk, EFFECT_SLEEP_TALK) - || HasMoveWithEffect(battlerAtk, EFFECT_SNORE) + || HasUsableWhileAsleepMove(battlerAtk) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD - || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) + || (AI_GetWeather() & B_WEATHER_RAIN && gBattleStruct->weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -4495,34 +4684,23 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (IsConsideringZMove(battlerAtk, battlerDef, move)) ADJUST_SCORE(BEST_EFFECT); break; - case EFFECT_TELEPORT: // Either remove or add better logic - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || !IsOnPlayerSide(battlerAtk)) + case EFFECT_TELEPORT: + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) break; //fallthrough case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: - case EFFECT_CHILLY_RECEPTION: - if (!hasPartner) + case EFFECT_WEATHER_AND_SWITCH: + switch (ShouldPivot(battlerAtk, battlerDef, move)) { - switch (ShouldPivot(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, movesetIndex)) - { - case DONT_PIVOT: - ADJUST_SCORE(-10); // technically should go in CheckBadMove, but this is easier/less computationally demanding - break; - case CAN_TRY_PIVOT: - break; - case SHOULD_PIVOT: - ADJUST_SCORE(BEST_EFFECT); - break; - } - } - else //Double Battle - { - if (CountUsablePartyMons(battlerAtk) == 0) - break; // Can't switch - - //if (switchAbility == ABILITY_INTIMIDATE && PartyHasMoveCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) - //ADJUST_SCORE(7); + case DONT_PIVOT: + ADJUST_SCORE(-5); // technically should go in CheckBadMove, but this is easier/less computationally demanding + break; + case CAN_TRY_PIVOT: + break; + case SHOULD_PIVOT: + ADJUST_SCORE(BEST_EFFECT); + break; } break; case EFFECT_BATON_PASS: @@ -4537,7 +4715,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_DISABLE: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (gDisableStructs[battlerDef].disableTimer == 0 + else if (gBattleMons[battlerDef].volatiles.disableTimer == 0 && (aiData->lastUsedMove[battlerDef] != MOVE_NONE) && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) @@ -4560,7 +4738,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru encourage = TRUE; break; } - if (gDisableStructs[battlerDef].encoreTimer == 0 + if (gBattleMons[battlerDef].volatiles.encoreTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) && (encourage)) ADJUST_SCORE(BEST_EFFECT); @@ -4627,24 +4805,27 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru } break; case PROTECT_WIDE_GUARD: - if (predictedMove != MOVE_NONE && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_BOTH)) + { + enum MoveTarget predictedTargetType = AI_GetBattlerMoveTargetType(battlerDef, predictedMove); + if (predictedMove != MOVE_NONE && (predictedTargetType == TARGET_BOTH || predictedTargetType == TARGET_FOES_AND_ALLY)) { ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } - else if (hasPartner && GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) & MOVE_TARGET_FOES_AND_ALLY) + else if (hasPartner && AI_GetBattlerMoveTargetType(BATTLE_PARTNER(battlerAtk), aiData->partnerMove) == TARGET_FOES_AND_ALLY) { if (aiData->abilities[battlerAtk] != ABILITY_TELEPATHY) ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); } break; + } case PROTECT_CRAFTY_SHIELD: - if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) + if (predictedMove != MOVE_NONE && IsBattleMoveStatus(predictedMove) && AI_GetBattlerMoveTargetType(battlerDef, predictedMove) != TARGET_USER) ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; case PROTECT_MAT_BLOCK: - if (gDisableStructs[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE - && !IsBattleMoveStatus(predictedMove) && !(GetBattlerMoveTargetType(battlerDef, predictedMove) & MOVE_TARGET_USER)) + if (gBattleStruct->battlerState[battlerAtk].isFirstTurn && predictedMove != MOVE_NONE + && !IsBattleMoveStatus(predictedMove) && AI_GetBattlerMoveTargetType(battlerDef, predictedMove) != TARGET_USER) ADJUST_SCORE(ProtectChecks(battlerAtk, battlerDef, move, predictedMove)); break; case PROTECT_KINGS_SHIELD: @@ -4680,7 +4861,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_TOXIC_SPIKES: if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)) { - if (gDisableStructs[battlerAtk].isFirstTurn) + if (gBattleStruct->battlerState[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); @@ -4704,87 +4885,8 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (IsBattlerTrapped(battlerAtk, battlerDef)) ADJUST_SCORE(GOOD_EFFECT); break; - case EFFECT_SANDSTORM: - if (ShouldSetWeather(battlerAtk, B_WEATHER_SANDSTORM)) - { - ADJUST_SCORE(DECENT_EFFECT); - - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) - ADJUST_SCORE(WEAK_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) - ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) - ADJUST_SCORE(WEAK_EFFECT); - } - break; - case EFFECT_HAIL: - if (ShouldSetWeather(battlerAtk, B_WEATHER_HAIL)) - { - ADJUST_SCORE(DECENT_EFFECT); - - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) - ADJUST_SCORE(GOOD_EFFECT); - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) - ADJUST_SCORE(WEAK_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) - ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) - ADJUST_SCORE(WEAK_EFFECT); - } - break; - case EFFECT_SNOWSCAPE: - if (ShouldSetWeather(battlerAtk, B_WEATHER_SNOW)) - { - ADJUST_SCORE(DECENT_EFFECT); - - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) - ADJUST_SCORE(GOOD_EFFECT); - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) - ADJUST_SCORE(WEAK_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) - ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) - ADJUST_SCORE(WEAK_EFFECT); - } - break; - case EFFECT_RAIN_DANCE: - if (ShouldSetWeather(battlerAtk, B_WEATHER_RAIN)) - { - ADJUST_SCORE(DECENT_EFFECT); - - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) - ADJUST_SCORE(WEAK_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) - ADJUST_SCORE(WEAK_EFFECT); - if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) - || HasBattlerSideMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) - ADJUST_SCORE(WEAK_EFFECT); - if (HasDamagingMoveOfType(battlerDef, TYPE_FIRE) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) - ADJUST_SCORE(WEAK_EFFECT); - } - break; - case EFFECT_SUNNY_DAY: - if (ShouldSetWeather(battlerAtk, B_WEATHER_SUN)) - { - ADJUST_SCORE(DECENT_EFFECT); - - if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL)) - ADJUST_SCORE(WEAK_EFFECT); - if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_HEAT_ROCK) - ADJUST_SCORE(WEAK_EFFECT); - if (HasDamagingMoveOfType(battlerDef, TYPE_WATER) || HasDamagingMoveOfType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) - ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) - ADJUST_SCORE(WEAK_EFFECT); - } + case EFFECT_WEATHER: + ADJUST_SCORE(CalcWeatherScore(battlerAtk, battlerDef, move, aiData)); break; case EFFECT_FELL_STINGER: if (gBattleMons[battlerAtk].statStages[STAT_ATK] < MAX_STAT_STAGE @@ -4793,11 +4895,23 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_BELLY_DRUM: - if (!CanTargetFaintAi(battlerDef, battlerAtk) - && gBattleMons[battlerAtk].statStages[STAT_ATK] < MAX_STAT_STAGE - 2 - && HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) - && aiData->abilities[battlerAtk] != ABILITY_CONTRARY) - ADJUST_SCORE(BEST_EFFECT); + if (HasHPForDamagingSetup(battlerAtk, battlerDef, 50)) + ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_MAX)); + break; + case EFFECT_FILLET_AWAY: + if (HasHPForDamagingSetup(battlerAtk, battlerDef, 50)) + { + s32 statUpScore = 0; + + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED_2); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK_2); + + if (statUpScore > BEST_EFFECT) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(statUpScore); + } break; case EFFECT_PSYCH_UP: score += AI_ShouldCopyStatChanges(battlerAtk, battlerDef); @@ -4807,9 +4921,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru { enum BattleMoveEffects predictedEffect = GetMoveEffect(predictedMove); if ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) - && (predictedEffect == EFFECT_EXPLOSION - || predictedEffect == EFFECT_MISTY_EXPLOSION - || predictedEffect == EFFECT_PROTECT)) + && (IsExplosionMove(predictedMove) || predictedEffect == EFFECT_PROTECT)) ADJUST_SCORE(GOOD_EFFECT); else if (predictedEffect == EFFECT_SEMI_INVULNERABLE && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) ADJUST_SCORE(GOOD_EFFECT); @@ -4821,7 +4933,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; case EFFECT_FIRST_TURN_ONLY: - if (gDisableStructs[battlerAtk].isFirstTurn && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + if (gBattleStruct->battlerState[battlerAtk].isFirstTurn && IsBestDmgMove(battlerAtk, battlerDef, AI_ATTACKING, move)) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_STOCKPILE: @@ -4835,7 +4947,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_SWAGGER: if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + || HasBattlerSideMoveWithAdditionalEffect(battlerAtk, MOVE_EFFECT_STEAL_STATS)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4843,7 +4955,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru break; case EFFECT_FLATTER: if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + || HasBattlerSideMoveWithAdditionalEffect(battlerAtk, MOVE_EFFECT_STEAL_STATS)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4866,7 +4978,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SAFEGUARD: - if (!IsBattlerTerrainAffected(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], STATUS_FIELD_MISTY_TERRAIN) || !AI_IsBattlerGrounded(battlerAtk)) + if (!IsMistyTerrainAffected(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk], gFieldStatuses) || !AI_IsBattlerGrounded(battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); // TODO: check if opp has status move? //if (CountUsablePartyMons(battlerDef) != 0) //ADJUST_SCORE(8); @@ -4913,12 +5025,12 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru break; case EFFECT_FOLLOW_ME: if (hasPartner - && GetMoveTarget(move) == MOVE_TARGET_USER + && AI_GetBattlerMoveTargetType(battlerAtk, move) == TARGET_USER && !IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) && (!IsPowderMove(move) || IsAffectedByPowderMove(battlerDef, aiData->abilities[battlerDef], aiData->holdEffects[battlerDef]))) // Rage Powder doesn't affect powder immunities { - u32 predictedMoveOnPartner = aiData->lastUsedMove[BATTLE_PARTNER(battlerAtk)]; + enum Move predictedMoveOnPartner = aiData->lastUsedMove[BATTLE_PARTNER(battlerAtk)]; if (predictedMoveOnPartner != MOVE_NONE && !IsBattleMoveStatus(predictedMoveOnPartner)) ADJUST_SCORE(GOOD_EFFECT); } @@ -4951,12 +5063,18 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_TOXIC_ORB: - if (!ShouldPoison(battlerAtk, battlerAtk)) + if (!ShouldPoison(battlerAtk, battlerAtk) + || (gBattleMons[battlerAtk].status1 & STATUS1_PSN_ANY)) + { ADJUST_SCORE(DECENT_EFFECT); + } break; case HOLD_EFFECT_FLAME_ORB: - if (!ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk])) + if (!ShouldBurn(battlerAtk, battlerAtk, aiData->abilities[battlerAtk]) + || (gBattleMons[battlerAtk].status1 & STATUS1_BURN)) + { ADJUST_SCORE(DECENT_EFFECT); + } break; case HOLD_EFFECT_BLACK_SLUDGE: if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_POISON) && aiData->abilities[battlerDef] != ABILITY_MAGIC_GUARD) @@ -4971,29 +5089,19 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_UTILITY_UMBRELLA: - if (aiData->abilities[battlerAtk] != ABILITY_SOLAR_POWER && aiData->abilities[battlerAtk] != ABILITY_DRY_SKIN) + if (!(AI_GetWeather() & B_WEATHER_SUN && aiData->abilities[battlerAtk] == ABILITY_DRY_SKIN) + && DoesAbilityBenefitFromSunOrRain(battlerDef, aiData->abilities[battlerDef], AI_GetWeather())) { - switch (aiData->abilities[battlerDef]) - { - case ABILITY_SWIFT_SWIM: - if (AI_GetWeather() & B_WEATHER_RAIN) - ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down - break; - case ABILITY_CHLOROPHYLL: - case ABILITY_FLOWER_GIFT: - if (AI_GetWeather() & B_WEATHER_SUN) - ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down - break; - default: - break; - } + ADJUST_SCORE(DECENT_EFFECT); // Remove their weather benefit } break; case HOLD_EFFECT_EJECT_BUTTON: //if (!IsRaidBattle() && GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX && gNewBS->dynamaxData.timer[battlerDef] > 1 && if (HasDamagingMove(battlerAtk) || (hasPartner && HasDamagingMove(BATTLE_PARTNER(battlerAtk)))) + { ADJUST_SCORE(DECENT_EFFECT); // Force 'em out next turn + } break; default: if (GetMoveEffect(move) != EFFECT_BESTOW && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE) @@ -5021,6 +5129,12 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case HOLD_EFFECT_LAGGING_TAIL: case HOLD_EFFECT_STICKY_BARB: break; + case HOLD_EFFECT_UTILITY_UMBRELLA: + if ((AI_GetWeather() & B_WEATHER_SUN) && (aiData->abilities[battlerAtk] == ABILITY_DRY_SKIN || aiData->abilities[battlerDef] == ABILITY_DRY_SKIN)) + ADJUST_SCORE(DECENT_EFFECT); + else if (!DoesAbilityBenefitFromSunOrRain(battlerAtk, aiData->abilities[battlerAtk], AI_GetWeather())) + ADJUST_SCORE(WEAK_EFFECT); + break; default: ADJUST_SCORE(WEAK_EFFECT); //other hold effects generally universally good break; @@ -5029,7 +5143,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru } break; case EFFECT_CORROSIVE_GAS: - if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) + if (CanKnockOffItem(battlerDef, battlerAtk, aiData->items[battlerDef])) { switch (aiData->holdEffects[battlerDef]) { @@ -5052,7 +5166,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGIC_COAT: - if (IsBattleMoveStatus(predictedMove) && GetBattlerMoveTargetType(battlerDef, predictedMove) & (MOVE_TARGET_SELECTED | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH)) + if (CanMoveBeBouncedBack(battlerDef, predictedMove)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_RECYCLE: @@ -5062,7 +5176,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(WEAK_EFFECT); if (aiData->abilities[battlerAtk] == ABILITY_RIPEN) { - u32 item = GetBattlerPartyState(battlerAtk)->usedHeldItem; + enum Item item = GetBattlerPartyState(battlerAtk)->usedHeldItem; u32 toHeal = (GetItemHoldEffectParam(item) == 10) ? 10 : gBattleMons[battlerAtk].maxHP / GetItemHoldEffectParam(item); if (IsStatBoostingBerry(item) && aiData->hpPercents[battlerAtk] > 60) @@ -5073,15 +5187,6 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(WEAK_EFFECT); // Recycle healing berry if we can't otherwise faint the target and the target wont kill us after we activate the berry } break; - case EFFECT_RAGING_BULL: - case EFFECT_BRICK_BREAK: - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_REFLECT) - ADJUST_SCORE(DECENT_EFFECT); - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_LIGHTSCREEN) - ADJUST_SCORE(DECENT_EFFECT); - if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) - ADJUST_SCORE(DECENT_EFFECT); - break; case EFFECT_DOODLE: case EFFECT_ENTRAINMENT: case EFFECT_GASTRO_ACID: @@ -5093,11 +5198,12 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_IMPRISON: if (predictedMove != MOVE_NONE && HasMove(battlerAtk, predictedMove)) ADJUST_SCORE(DECENT_EFFECT); - else if (gDisableStructs[battlerAtk].isFirstTurn == 0) + else if (gBattleStruct->battlerState[battlerAtk].isFirstTurn == 0) ADJUST_SCORE(WEAK_EFFECT); break; case EFFECT_REFRESH: - if (gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) + if ((gBattleMons[battlerAtk].status1 & STATUS1_CAN_MOVE) + && ShouldCureStatus(battlerAtk, battlerAtk, aiData)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_TAKE_HEART: @@ -5152,23 +5258,50 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_POWER_HERB) ADJUST_SCORE(GOOD_EFFECT); case EFFECT_QUIVER_DANCE: - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); + { + s32 statUpScore = 0; + + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF); + + if (statUpScore > BEST_EFFECT) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(statUpScore); break; + } case EFFECT_VICTORY_DANCE: - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); + { + s32 statUpScore = 0; + + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF); + + if (statUpScore > BEST_EFFECT) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(statUpScore); break; + } case EFFECT_SHELL_SMASH: + { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_WHITE_HERB) ADJUST_SCORE(WEAK_EFFECT); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK)); - ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK)); + s32 statUpScore = 0; + + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED_2); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK_2); + + if (statUpScore > BEST_EFFECT) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(statUpScore); break; + } case EFFECT_TIDY_UP: IncreaseTidyUpScore(battlerAtk, battlerDef, move, &score); case EFFECT_DRAGON_DANCE: @@ -5201,15 +5334,16 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_HEART_SWAP: { bool32 hasHigherStat = FALSE; + enum Stat statId; //Only use if all target stats are >= attacker stats to prevent infinite loop - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerDef].statStages[i] < gBattleMons[battlerAtk].statStages[i]) + if (gBattleMons[battlerDef].statStages[statId] < gBattleMons[battlerAtk].statStages[statId]) break; - if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i]) + if (gBattleMons[battlerDef].statStages[statId] > gBattleMons[battlerAtk].statStages[statId]) hasHigherStat = TRUE; } - if (hasHigherStat && i == NUM_BATTLE_STATS) + if (hasHigherStat && statId == NUM_BATTLE_STATS) ADJUST_SCORE(DECENT_EFFECT); } break; @@ -5366,7 +5500,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru case EFFECT_ION_DELUGE: if ((aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) + || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD)) && predictedType == TYPE_NORMAL) ADJUST_SCORE(DECENT_EFFECT); break; @@ -5378,7 +5512,8 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru IncreaseBurnScore(battlerAtk, battlerDef, move, &score); break; case MOVE_EFFECT_FLINCH: - score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); + if (ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move)) + score += 2; break; case MOVE_EFFECT_PARALYSIS: IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score); @@ -5426,7 +5561,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (predictedMove != MOVE_NONE && (aiData->abilities[battlerAtk] == ABILITY_VOLT_ABSORB || aiData->abilities[battlerAtk] == ABILITY_MOTOR_DRIVE - || (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) + || (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && aiData->abilities[battlerAtk] == ABILITY_LIGHTNING_ROD))) { ADJUST_SCORE(DECENT_EFFECT); } @@ -5488,7 +5623,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_MAGNET_RISE: - if (AI_IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_ELECTRIC) + if (AI_IsBattlerGrounded(battlerAtk) && HasDamagingMoveOfType(battlerDef, TYPE_GROUND) && !(effectiveness == UQ_4_12(0.0))) // Doesn't resist ground move { if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first @@ -5499,8 +5634,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru } else // Opponent Goes First { - if (HasDamagingMoveOfType(battlerDef, TYPE_GROUND)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(DECENT_EFFECT); break; } } @@ -5514,16 +5648,10 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru IncreasePoisonScore(battlerAtk, battlerDef, move, &score); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED)); break; - case EFFECT_COUNTER: + case EFFECT_REFLECT_DAMAGE: if ((!IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) && predictedMove != MOVE_NONE) - && (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot, AI_DEFENDING) >= 2) - && (GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_PHYSICAL)) - ADJUST_SCORE(GOOD_EFFECT); - break; - case EFFECT_MIRROR_COAT: - if ((!IsBattlerIncapacitated(battlerDef, aiData->abilities[battlerDef]) && predictedMove != MOVE_NONE) - && (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot, AI_DEFENDING) >= 2) - && (GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_SPECIAL)) + && (GetNoOfHitsToKOBattler(battlerDef, battlerAtk, predictedMoveSlot, AI_DEFENDING, CONSIDER_ENDURE) >= 2) + && GetMoveReflectDamage_DamageCategories(move) & (1u << GetBattleMoveCategory(predictedMove))) // Can reflect back damage ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_SHORE_UP: @@ -5548,33 +5676,50 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru break; //case EFFECT_EXTREME_EVOBOOST: // TODO //break; - //case EFFECT_CLANGOROUS_SOUL: // TODO - //break; + case EFFECT_CLANGOROUS_SOUL: + if (HasHPForDamagingSetup(battlerAtk, battlerDef, 67)) + { + s32 statUpScore = 0; + + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPEED); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_ATK); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPATK); + statUpScore += IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF); + + if (statUpScore > BEST_EFFECT) + ADJUST_SCORE(BEST_EFFECT); + else + ADJUST_SCORE(statUpScore); + } + break; //case EFFECT_NO_RETREAT: // TODO //break; //case EFFECT_SKY_DROP //break; case EFFECT_JUNGLE_HEALING: + { + bool32 canCureSelf = (gBattleMons[battlerAtk].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, battlerAtk, aiData); + bool32 canCurePartner = (gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) && ShouldCureStatus(battlerAtk, BATTLE_PARTNER(battlerAtk), aiData); + if (ShouldRecover(battlerAtk, battlerDef, move, 25) || ShouldRecover(BATTLE_PARTNER(battlerAtk), battlerDef, move, 25) - || gBattleMons[battlerAtk].status1 & STATUS1_ANY - || gBattleMons[BATTLE_PARTNER(battlerAtk)].status1 & STATUS1_ANY) + || canCureSelf + || canCurePartner) ADJUST_SCORE(GOOD_EFFECT); break; + } case EFFECT_RAPID_SPIN: if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) || (gBattleMons[battlerAtk].volatiles.leechSeed || gBattleMons[battlerAtk].volatiles.wrapped)) ADJUST_SCORE(GOOD_EFFECT); break; - case EFFECT_SPECTRAL_THIEF: - ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); - break; case EFFECT_SMACK_DOWN: if (!AI_IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_KNOCK_OFF: - if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) + if (CanKnockOffItem(battlerDef, battlerAtk, aiData->items[battlerDef])) { switch (aiData->holdEffects[battlerDef]) { @@ -5603,8 +5748,8 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru if (canSteal && aiData->items[battlerAtk] == ITEM_NONE && aiData->items[battlerDef] != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) - && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerDef, battlerAtk, aiData->items[battlerDef]) + && CanBattlerGetOrLoseItem(battlerAtk, battlerDef, aiData->items[battlerDef]) && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) { @@ -5651,26 +5796,26 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru return score; } -static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { // move data s32 score = 0; - u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); + enum Move predictedMove = GetIncomingMove(battlerAtk, battlerDef, aiData); bool32 hasPartner = HasPartner(battlerAtk); - u32 i; u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); + enum Move defBestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + + // Set battlerDef best dmg moves + GetBestDmgMovesFromBattler(battlerDef, battlerAtk, AI_DEFENDING, defBestMoves); + + if (IsSheerForceAffected(move, aiData->abilities[battlerAtk])) + return score; // check move additional effects that are likely to happen - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectId = 0; effectId < additionalEffectCount; effectId++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); - - if (aiData->abilities[battlerAtk] == ABILITY_SHEER_FORCE) - { - if ((additionalEffect->chance > 0) != additionalEffect->sheerForceOverride) - continue; - } + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectId); // Only consider effects with a guaranteed chance to happen if (!MoveEffectIsGuaranteed(battlerAtk, aiData->abilities[battlerAtk], additionalEffect)) @@ -5767,7 +5912,8 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move switch (additionalEffect->moveEffect) { case MOVE_EFFECT_FLINCH: - score += ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move); + if (ShouldTryToFlinch(battlerAtk, battlerDef, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], move)) + score += 2; break; case MOVE_EFFECT_SPD_MINUS_1: case MOVE_EFFECT_SPD_MINUS_2: @@ -5834,7 +5980,9 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move break; case MOVE_EFFECT_CLEAR_SMOG: { - bool32 moveTargetsBothOpponents = HasTwoOpponents(battlerAtk) && (gMovesInfo[move].target & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_ALL_BATTLERS)); + enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAtk, move); + bool32 moveTargetsBothOpponents = HasTwoOpponents(battlerAtk) + && (target == TARGET_FIELD || target == TARGET_ALL_BATTLERS || IsSpreadMove(target)); score += AI_TryToClearStats(battlerAtk, battlerDef, moveTargetsBothOpponents); break; @@ -5852,9 +6000,9 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move ADJUST_SCORE(DECENT_EFFECT); break; case MOVE_EFFECT_STEALTH_ROCK: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)); + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, move, aiData)) { - if (gDisableStructs[battlerAtk].isFirstTurn) + if (gBattleStruct->battlerState[battlerAtk].isFirstTurn) ADJUST_SCORE(BEST_EFFECT); else ADJUST_SCORE(DECENT_EFFECT); @@ -5865,14 +6013,30 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move ADJUST_SCORE(GOOD_EFFECT); break; case MOVE_EFFECT_THROAT_CHOP: - if (IsSoundMove(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING))) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); - - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) - ADJUST_SCORE(GOOD_EFFECT); + if (defBestMoves[moveIndex] == MOVE_NONE) + { + break; + } else - ADJUST_SCORE(DECENT_EFFECT); + { + if (IsSoundMove(defBestMoves[moveIndex])) + { + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, aiData); + + if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + { + ADJUST_SCORE(GOOD_EFFECT); + break; + } + else + { + ADJUST_SCORE(DECENT_EFFECT); + break; + } + } + } } break; case MOVE_EFFECT_WRAP: @@ -5965,6 +6129,17 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move else ADJUST_SCORE(BAD_EFFECT); } + break; + case MOVE_EFFECT_BREAK_SCREEN: + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_REFLECT) + ADJUST_SCORE(DECENT_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_LIGHTSCREEN) + ADJUST_SCORE(DECENT_EFFECT); + if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_AURORA_VEIL) + ADJUST_SCORE(DECENT_EFFECT); + break; + case MOVE_EFFECT_STEAL_STATS: + ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; default: break; @@ -5975,7 +6150,7 @@ static s32 AI_CalcAdditionalEffectScore(u32 battlerAtk, u32 battlerDef, u32 move } // AI_FLAG_CHECK_VIABILITY - Chooses best possible move to hit player -static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { struct AiLogicData *aiData = gAiLogicData; @@ -5985,12 +6160,12 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (GetMovePower(move) != 0) { - if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 0) + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) == 0) ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); // No point in checking the move further so return early else { if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) - && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + && IsBestDmgMove(battlerAtk, battlerDef, AI_ATTACKING, move)) ADJUST_SCORE(BEST_DAMAGE_MOVE); } } @@ -6003,13 +6178,13 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } // Effects that are encouraged on the first turn of battle -static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (IsTargetingPartner(battlerAtk, battlerDef) || gBattleResults.battleTurnCounter != 0) return score; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY) @@ -6023,7 +6198,6 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 switch (GetMoveEffect(move)) { case EFFECT_ATTACK_UP: - case EFFECT_ATTACK_UP_USER_ALLY: case EFFECT_DEFENSE_UP: case EFFECT_SPEED_UP: case EFFECT_SPECIAL_ATTACK_UP: @@ -6096,12 +6270,8 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 case EFFECT_DRAGON_DANCE: case EFFECT_TIDY_UP: case EFFECT_STICKY_WEB: - case EFFECT_RAIN_DANCE: - case EFFECT_SUNNY_DAY: - case EFFECT_SANDSTORM: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_CHILLY_RECEPTION: + case EFFECT_WEATHER: + case EFFECT_WEATHER_AND_SWITCH: case EFFECT_GEOMANCY: case EFFECT_VICTORY_DANCE: case EFFECT_CEASELESS_EDGE: @@ -6116,9 +6286,8 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 } // Adds score bonus to 'riskier' move effects and high crit moves -static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { - u8 i; struct AiLogicData *aiData = gAiLogicData; if (IsTargetingPartner(battlerAtk, battlerDef)) @@ -6127,21 +6296,23 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (GetMoveCriticalHitStage(move) > 0) ADJUST_SCORE(DECENT_EFFECT); + if (IsExplosionMove(move)) + { + ADJUST_SCORE(STRONG_RISKY_EFFECT); + return score; + } + // +3 Score switch (GetMoveEffect(move)) { - case EFFECT_COUNTER: - if (GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10) + case EFFECT_REFLECT_DAMAGE: + if (GetMoveReflectDamage_DamageCategories(move) & (1u << DAMAGE_CATEGORY_PHYSICAL) // Can reflect physical damage + && GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); - break; - case EFFECT_MIRROR_COAT: - if (GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10) + else if (GetMoveReflectDamage_DamageCategories(move) & (1u << DAMAGE_CATEGORY_SPECIAL) // Can reflect special damage + && GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10) ADJUST_SCORE(STRONG_RISKY_EFFECT); break; - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: - ADJUST_SCORE(STRONG_RISKY_EFFECT); - break; // +2 Score case EFFECT_MEMENTO: @@ -6170,9 +6341,9 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // TEMPORARY - should applied to all moves regardless of EFFECT // Consider move effects u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ALL_STATS_UP: @@ -6192,21 +6363,21 @@ static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Adds score bonus to OHKOs and 2HKOs -static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (IsTargetingPartner(battlerAtk, battlerDef)) return score; - if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 1) + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) == 1) ADJUST_SCORE(BEST_EFFECT); - else if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 2) + else if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) == 2) ADJUST_SCORE(DECENT_EFFECT); return score; } // Adds score bonus to targeting "partner" -static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (battlerDef == BATTLE_PARTNER(battlerAtk) // natural enemies in wild battles try to kill each other @@ -6218,10 +6389,10 @@ static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, movesetIndex, AI_ATTACKING)) ADJUST_SCORE(BEST_EFFECT); - u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE); - if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY && hitsToKO > 0 && - (GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0 || GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING) > 0)) + if (AI_GetBattlerMoveTargetType(battlerAtk, move) == TARGET_FOES_AND_ALLY && hitsToKO > 0 && + (GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) > 0 || GetNoOfHitsToKOBattler(battlerAtk, LEFT_FOE(battlerDef), gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) > 0)) ADJUST_SCORE(BEST_EFFECT); if (hitsToKO > 0) @@ -6231,7 +6402,7 @@ static s32 AI_AttacksPartner(u32 battlerAtk, u32 battlerDef, u32 move, s32 score } // Prefers moves that are good for baton pass -static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (IsTargetingPartner(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 @@ -6283,7 +6454,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor return score; } -static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { enum BattleMoveEffects effect = GetMoveEffect(move); enum Type moveType = 0; @@ -6312,13 +6483,15 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else { // Consider AI HP - if (gAiLogicData->hpPercents[battlerAtk] > 70) + if (IsExplosionMove(move) && gAiLogicData->hpPercents[battlerAtk] > 70) + { + ADJUST_SCORE(-2); + } + else if (gAiLogicData->hpPercents[battlerAtk] > 70) { // high hp switch (effect) { - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: case EFFECT_RESTORE_HP: case EFFECT_REST: case EFFECT_DESTINY_BOND: @@ -6341,13 +6514,13 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (gAiLogicData->hpPercents[battlerAtk] > 30) { // med hp - if (IsStatRaisingEffect(effect) || IsStatLoweringEffect(effect)) + if (IsStatRaisingEffect(effect) + || IsStatLoweringEffect(effect) + || IsExplosionMove(move)) ADJUST_SCORE(-2); switch (effect) { - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: case EFFECT_BIDE: case EFFECT_CONVERSION: case EFFECT_LIGHT_SCREEN: @@ -6379,19 +6552,14 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_LIGHT_SCREEN: case EFFECT_MIST: case EFFECT_FOCUS_ENERGY: - case EFFECT_RAGE: case EFFECT_CONVERSION_2: case EFFECT_LOCK_ON: case EFFECT_SAFEGUARD: case EFFECT_BELLY_DRUM: case EFFECT_PSYCH_UP: - case EFFECT_MIRROR_COAT: + case EFFECT_REFLECT_DAMAGE: case EFFECT_TICKLE: - case EFFECT_SUNNY_DAY: - case EFFECT_SANDSTORM: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_RAIN_DANCE: + case EFFECT_WEATHER: case EFFECT_FILLET_AWAY: ADJUST_SCORE(-2); break; @@ -6419,7 +6587,6 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_ATTACK_UP: - case EFFECT_ATTACK_UP_USER_ALLY: case EFFECT_DEFENSE_UP: case EFFECT_SPEED_UP: case EFFECT_SPECIAL_ATTACK_UP: @@ -6483,7 +6650,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } -static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -6549,23 +6716,27 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; - case EFFECT_SANDSTORM: - if (!(AI_GetWeather() & (B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY))) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; - case EFFECT_SUNNY_DAY: - if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; - case EFFECT_RAIN_DANCE: - if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - if (IsWeatherActive(B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) - ADJUST_SCORE(POWERFUL_STATUS_MOVE); - break; + case EFFECT_WEATHER: + switch (GetMoveWeatherType(move)) + { + case BATTLE_WEATHER_RAIN: + if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + ADJUST_SCORE(POWERFUL_STATUS_MOVE); + break; + case BATTLE_WEATHER_SUN: + if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + ADJUST_SCORE(POWERFUL_STATUS_MOVE); + break; + case BATTLE_WEATHER_SANDSTORM: + if (IsWeatherActive(B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + ADJUST_SCORE(POWERFUL_STATUS_MOVE); + break; + case BATTLE_WEATHER_HAIL: + case BATTLE_WEATHER_SNOW: + if (IsWeatherActive(B_WEATHER_ICY_ANY | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) + ADJUST_SCORE(POWERFUL_STATUS_MOVE); + break; + } default: break; } @@ -6573,9 +6744,9 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score return score; } -bool32 DoesSideHaveDamagingHazards(u32 side) +bool32 DoesSideHaveDamagingHazards(enum BattleSide side) { - for (u32 counter = 0; counter < HAZARDS_MAX_COUNT; counter++) + for (enum Hazards counter = 0; counter < HAZARDS_MAX_COUNT; counter++) { switch (gBattleStruct->hazardsQueue[side][counter]) { @@ -6591,9 +6762,8 @@ bool32 DoesSideHaveDamagingHazards(u32 side) return FALSE; } -static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { - u32 i; u32 unmodifiedScore = score; enum Ability ability = gBattleMons[battlerAtk].ability; bool32 opposingHazardFlags = DoesSideHaveDamagingHazards(GetBattlerSide(battlerDef)); @@ -6602,14 +6772,14 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // Switch benefit switch (moveEffect) { case EFFECT_PURSUIT: { - u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE); if (hitsToKO == 2) ADJUST_SCORE(GOOD_EFFECT); else if (hitsToKO == 1) @@ -6633,7 +6803,10 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; - // Free setup (U-Turn etc. handled in Check Viability by ShouldPivot) + case EFFECT_TELEPORT: + case EFFECT_HIT_ESCAPE: + case EFFECT_PARTING_SHOT: + case EFFECT_WEATHER_AND_SWITCH: case EFFECT_BOLT_BEAK: case EFFECT_LIGHT_SCREEN: case EFFECT_REFLECT: @@ -6647,11 +6820,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FUTURE_SIGHT: case EFFECT_TELEKINESIS: case EFFECT_GRAVITY: - case EFFECT_RAIN_DANCE: - case EFFECT_SANDSTORM: - case EFFECT_SNOWSCAPE: - case EFFECT_HAIL: - case EFFECT_SUNNY_DAY: + case EFFECT_WEATHER: case EFFECT_AQUA_RING: case EFFECT_ELECTRIC_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: @@ -6689,10 +6858,8 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Fails if opponent switches case EFFECT_PROTECT: - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: + case EFFECT_REFLECT_DAMAGE: case EFFECT_SHELL_TRAP: - case EFFECT_METAL_BURST: case EFFECT_SUCKER_PUNCH: case EFFECT_UPPER_HAND: case EFFECT_ENCORE: @@ -6724,9 +6891,9 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Additional effects - for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + for (u32 effectIndex = 0; effectIndex < GetMoveAdditionalEffectCount(move); effectIndex++) { - switch (GetMoveAdditionalEffectById(move, i)->moveEffect) + switch (GetMoveAdditionalEffectById(move, effectIndex)->moveEffect) { case MOVE_EFFECT_WRAP: ADJUST_SCORE(AWFUL_EFFECT); @@ -6749,7 +6916,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } -static s32 AI_CheckPpStall(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_CheckPpStall(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (!IsOnPlayerSide(battlerAtk)) score -= PpStallReduction(move, battlerAtk); @@ -6767,7 +6934,7 @@ static void AI_Watch(void) } // Roaming pokemon logic -static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { bool32 roamerCanFlee = FALSE; @@ -6786,7 +6953,7 @@ static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // Safari pokemon logic -static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { u32 safariFleeRate = gBattleStruct->safariEscapeFactor * 5; // Safari flee rate, from 0-20. @@ -6799,7 +6966,7 @@ static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // First battle logic -static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (!IS_FRLG && gAiLogicData->hpPercents[battlerDef] <= 20) AI_Flee(); @@ -6812,7 +6979,7 @@ static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // For specific battle scenarios // Example - prefer attacking opposite foe in a tag battle -s32 AI_TagBattlePreferFoe(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +s32 AI_TagBattlePreferFoe(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) { @@ -6833,7 +7000,7 @@ s32 AI_TagBattlePreferFoe(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } -static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) +static s32 AI_DynamicFunc(u32 battlerAtk, u32 battlerDef, enum Move move, s32 score) { if (sDynamicAiFunc != NULL) score = sDynamicAiFunc(battlerAtk, battlerDef, move, score); @@ -6848,7 +7015,16 @@ void ScriptSetDynamicAiFunc(struct ScriptContext *ctx) sDynamicAiFunc = func; } -void ResetDynamicAiFunc(void) +void ScriptSetDynamicAiSwitchFunc(struct ScriptContext *ctx) +{ + Script_RequestEffects(SCREFF_V1); + + AiSwitchFunc func = (AiSwitchFunc)ScriptReadWord(ctx); + gDynamicAiSwitchFunc = func; +} + +void ResetDynamicAiFunctions(void) { sDynamicAiFunc = NULL; + gDynamicAiSwitchFunc = NULL; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch.c similarity index 58% rename from src/battle_ai_switch_items.c rename to src/battle_ai_switch.c index ba78ce467..1202ee093 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch.c @@ -2,6 +2,7 @@ #include "battle.h" #include "constants/battle_ai.h" #include "battle_ai_main.h" +#include "battle_ai_switch.h" #include "battle_ai_util.h" #include "battle_util.h" #include "battle_anim.h" @@ -21,21 +22,99 @@ #include "constants/moves.h" // this file's functions +struct IncomingHealInfo +{ + u16 healAmount:16; + u16 wishCounter:8; + u16 hasHealing:1; + u16 healBeforeHazards:1; + u16 healAfterHazards:1; + u16 healEndOfTurn:1; + u16 curesStatus:1; +}; static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler); static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 moduloPercent); -static bool32 ShouldUseItem(u32 battler); -static bool32 AiExpectsToFaintPlayer(u32 battler); -static bool32 AI_ShouldHeal(u32 battler, u32 healAmount); -static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount); -static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon); -static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent); -static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); -static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon); +static u32 GetSwitchinHazardsDamage(u32 battler); +static bool32 AI_CanSwitchinAbilityTrapOpponent(enum Ability ability, u32 opponent); +static u32 GetBattlerTypeMatchup(u32 opposingBattler, u32 battler); +static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler, const struct IncomingHealInfo *healInfo, u32 originalHp); +static void GetIncomingHealInfo(u32 battler, struct IncomingHealInfo *healInfo); +static u32 GetWishHealAmountForBattler(u32 battler); -static void InitializeSwitchinCandidate(struct Pokemon *mon) +static void InitializeSwitchinCandidate(u32 switchinBattler, struct Pokemon *mon) { - PokemonToBattleMon(mon, &gAiLogicData->switchinCandidate.battleMon); - gAiLogicData->switchinCandidate.hypotheticalStatus = FALSE; + PokemonToBattleMon(mon, &gBattleMons[switchinBattler]); + // Setup switchin battler data + gAiThinkingStruct->saved[switchinBattler].saved = TRUE; + SetBattlerAiData(switchinBattler, gAiLogicData); + SetBattlerFieldStatusForSwitchin(switchinBattler); + for (u32 battlerIndex = 0; battlerIndex < gBattlersCount; battlerIndex++) + { + if (switchinBattler == battlerIndex || !IsBattlerAlive(battlerIndex)) + continue; + + CalcBattlerAiMovesData(gAiLogicData, switchinBattler, battlerIndex, AI_GetSwitchinWeather(switchinBattler), AI_GetSwitchinFieldStatus(switchinBattler)); + CalcBattlerAiMovesData(gAiLogicData, battlerIndex, switchinBattler, AI_GetSwitchinWeather(switchinBattler), AI_GetSwitchinFieldStatus(switchinBattler)); + } + + gAiThinkingStruct->saved[switchinBattler].saved = FALSE; +} + +static u32 GetWishHealAmountForBattler(u32 battler) +{ + u32 wishHeal = 0; + + if (gBattleStruct->wish[battler].counter == 0) + return wishHeal; + + if (B_WISH_HP_SOURCE >= GEN_5) + { + if (IsOnPlayerSide(battler)) + wishHeal = GetMonData(&gPlayerParty[gBattleStruct->wish[battler].partyId], MON_DATA_MAX_HP) / 2; + else + wishHeal = GetMonData(&gEnemyParty[gBattleStruct->wish[battler].partyId], MON_DATA_MAX_HP) / 2; + } + else + { + wishHeal = GetNonDynamaxMaxHP(battler) / 2; + } + + return wishHeal; +} + +static void GetIncomingHealInfo(u32 battler, struct IncomingHealInfo *healInfo) +{ + memset(healInfo, 0, sizeof(*healInfo)); + + // Healing Wish / Lunar Dance heal to full and clear status before hazards + if (gBattleStruct->battlerState[battler].storedHealingWish) + { + healInfo->hasHealing = TRUE; + healInfo->healBeforeHazards = TRUE; + healInfo->curesStatus = TRUE; + } + if (gBattleStruct->battlerState[battler].storedLunarDance) + { + healInfo->hasHealing = TRUE; + healInfo->healBeforeHazards = TRUE; + healInfo->curesStatus = TRUE; + } + + // Z-Parting Shot / Z-Memento heal after hazards on switch-in + if (gBattleStruct->zmove.healReplacement) + { + healInfo->hasHealing = TRUE; + healInfo->healAfterHazards = TRUE; + } + + // Wish heals at end of turn + if (gBattleStruct->wish[battler].counter > 0) + { + healInfo->hasHealing = TRUE; + healInfo->healEndOfTurn = TRUE; + healInfo->wishCounter = gBattleStruct->wish[battler].counter; + healInfo->healAmount = GetWishHealAmountForBattler(battler); + } } u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) @@ -103,20 +182,22 @@ u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) return SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE; case SHOULD_SWITCH_ALL_SCORES_BAD: return SHOULD_SWITCH_ALL_SCORES_BAD_PERCENTAGE; + case SHOULD_SWITCH_DYN_FUNC: + return SHOULD_SWITCH_DYN_FUNC_PERCENTAGE; default: return 100; } } -static bool32 IsAceMon(u32 battler, u32 monPartyId) +bool32 IsAceMon(u32 battler, u32 monPartyId) { if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && !gBattleStruct->battlerState[battler].forcedSwitch - && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) + && !gProtectStructs[battler].forcedSwitch + && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON - && !gBattleStruct->battlerState[battler].forcedSwitch - && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) + && !gProtectStructs[battler].forcedSwitch + && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; return FALSE; } @@ -124,48 +205,28 @@ static bool32 IsAceMon(u32 battler, u32 monPartyId) static bool32 AreStatsRaised(u32 battler) { u8 buffedStatsValue = 0; - s32 i; - for (i = 0; i < NUM_BATTLE_STATS; i++) + for (u32 statIndex = 0; statIndex < NUM_BATTLE_STATS; statIndex++) { - if (gBattleMons[battler].statStages[i] > DEFAULT_STAT_STAGE) - buffedStatsValue += gBattleMons[battler].statStages[i] - DEFAULT_STAT_STAGE; + if (gBattleMons[battler].statStages[statIndex] > DEFAULT_STAT_STAGE) + buffedStatsValue += gBattleMons[battler].statStages[statIndex] - DEFAULT_STAT_STAGE; } return (buffedStatsValue > STAY_IN_STATS_RAISED); } -void GetAIPartyIndexes(u32 battler, s32 *firstId, s32 *lastId) -{ - if (BATTLE_TWO_VS_ONE_OPPONENT && (battler & BIT_SIDE) == B_SIDE_OPPONENT) - { - *firstId = 0, *lastId = PARTY_SIZE; - } - else if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TOWER_LINK_MULTI)) - { - if ((battler & BIT_FLANK) == B_FLANK_LEFT) - *firstId = 0, *lastId = PARTY_SIZE / 2; - else - *firstId = PARTY_SIZE / 2, *lastId = PARTY_SIZE; - } - else - { - *firstId = 0, *lastId = PARTY_SIZE; - } -} - static inline bool32 SetSwitchinAndSwitch(u32 battler, u32 switchinId) { gBattleStruct->AI_monToSwitchIntoId[battler] = switchinId; return TRUE; } -static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) +static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, enum Move move) { // Choice locked into something else if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move && (IsHoldEffectChoice(GetBattlerHoldEffect(battler) && IsBattlerItemEnabled(battler)) - || gBattleMons[battler].ability == ABILITY_GORILLA_TACTICS)) + || gAiLogicData->abilities[battler] == ABILITY_GORILLA_TACTICS)) return TRUE; return FALSE; } @@ -204,13 +265,15 @@ static inline bool32 CanBattlerWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool32 static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { //Variable initialization - u8 opposingPosition; - s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0, maxDamageTakenPriority = 0; - u32 aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, bestPlayerMove = MOVE_NONE, expectedMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; - bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; + enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); + u32 opposingBattler = GetBattlerAtPosition(opposingPosition); + enum Move *playerMoves = GetMovesArray(opposingBattler); + enum Move aiMove, playerMove, bestPlayerPriorityMove = MOVE_NONE, bestPlayerMove = MOVE_NONE, expectedMove = MOVE_NONE; + enum Ability aiAbility = gAiLogicData->abilities[battler]; + bool32 hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u32 typeMatchup; enum BattleMoveEffects aiMoveEffect; - u32 hitsToKoAI = 0, hitsToKoAIPriority = 0, hitsToKoPlayer = 0; + u32 hitsToKOAI = 0, hitsToKOPlayer = 0, minHitsToKOAI = gBattleMons[battler].hp, minHitsToKOAIPriority = gBattleMons[battler].hp; bool32 canBattlerWin1v1 = FALSE, isBattlerFirst, isBattlerFirstPriority; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer @@ -221,45 +284,39 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) if (IsDoubleBattle()) return FALSE; - opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); - opposingBattler = GetBattlerAtPosition(opposingPosition); - u16 *playerMoves = GetMovesArray(opposingBattler); - // Get max damage mon could take - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[moveIndex] : playerMoves[moveIndex]; + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[moveIndex] > 0) { - damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); - if (damageTaken > maxDamageTaken && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + hitsToKOAI = GetNoOfHitsToKOBattler(opposingBattler, battler, moveIndex, AI_DEFENDING, CONSIDER_ENDURE); + if (hitsToKOAI < minHitsToKOAI && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) { - maxDamageTaken = damageTaken; bestPlayerMove = playerMove; + minHitsToKOAI = hitsToKOAI; } - if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && damageTaken > maxDamageTakenPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) + if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 && hitsToKOAI < minHitsToKOAIPriority && !AI_DoesChoiceEffectBlockMove(opposingBattler, playerMove)) { - maxDamageTakenPriority = damageTaken; bestPlayerPriorityMove = playerMove; + minHitsToKOAIPriority = hitsToKOAI; } } } - hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); - hitsToKoAIPriority = GetNoOfHitsToKOBattlerDmg(maxDamageTakenPriority, battler); expectedMove = gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE ? GetIncomingMove(battler, opposingBattler, gAiLogicData) : bestPlayerMove; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = gBattleMons[battler].moves[i]; + aiMove = gBattleMons[battler].moves[moveIndex]; aiMoveEffect = GetMoveEffect(aiMove); - if (aiMove != MOVE_NONE && gBattleMons[battler].pp[i] > 0) + if (aiMove != MOVE_NONE && gBattleMons[battler].pp[moveIndex] > 0) { u32 nonVolatileStatus = GetMoveNonVolatileStatus(aiMove); // Check if mon has an "important" status move if (aiMoveEffect == EFFECT_REFLECT || aiMoveEffect == EFFECT_LIGHT_SCREEN || aiMoveEffect == EFFECT_SPIKES || aiMoveEffect == EFFECT_TOXIC_SPIKES || aiMoveEffect == EFFECT_STEALTH_ROCK || aiMoveEffect == EFFECT_STICKY_WEB || aiMoveEffect == EFFECT_LEECH_SEED - || aiMoveEffect == EFFECT_EXPLOSION || aiMoveEffect == EFFECT_MISTY_EXPLOSION + || IsExplosionMove(aiMove) || nonVolatileStatus == MOVE_EFFECT_SLEEP || nonVolatileStatus == MOVE_EFFECT_TOXIC || nonVolatileStatus == MOVE_EFFECT_PARALYSIS @@ -275,33 +332,23 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) if (!IsBattleMoveStatus(aiMove) && !AI_DoesChoiceEffectBlockMove(battler, aiMove)) { // Check if mon has a super effective move - if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] >= UQ_4_12(2.0)) hasSuperEffectiveMove = TRUE; - // Get maximum damage mon can deal - damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData); - if (damageDealt > maxDamageDealt) - maxDamageDealt = damageDealt; + // Check if can win 1v1 + hitsToKOPlayer = GetNoOfHitsToKOBattler(battler, opposingBattler, moveIndex, AI_ATTACKING, CONSIDER_ENDURE); if (!canBattlerWin1v1 ) // Once we can win a 1v1 we don't need to track this, but want to run the rest of the function to keep the runtime the same regardless of when we find the winning move { - hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); isBattlerFirst = AI_IsFaster(battler, opposingBattler, aiMove, expectedMove, CONSIDER_PRIORITY); isBattlerFirstPriority = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); - canBattlerWin1v1 = CanBattlerWin1v1(hitsToKoAI, hitsToKoPlayer, isBattlerFirst) && CanBattlerWin1v1(hitsToKoAIPriority, hitsToKoPlayer, isBattlerFirstPriority); + canBattlerWin1v1 = CanBattlerWin1v1(minHitsToKOAI, hitsToKOPlayer, isBattlerFirst) && CanBattlerWin1v1(minHitsToKOAIPriority, hitsToKOPlayer, isBattlerFirstPriority); } } } } // Calculate type advantage - typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gBattleMons[battler]); - - // Check if mon gets one shot - if (maxDamageTaken > gBattleMons[battler].hp - && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler]) && B_STURDY >= GEN_5 && aiAbility == ABILITY_STURDY))) - { - getsOneShot = TRUE; - } + typeMatchup = GetBattlerTypeMatchup(opposingBattler, battler); // Check if current mon can 1v1 in spite of bad matchup, and don't switch out if it can if (canBattlerWin1v1) @@ -313,7 +360,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // Start assessing whether or not mon has bad odds // Jump straight to switching out in cases where mon gets OHKO'd - if ((getsOneShot && !canBattlerWin1v1) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator + if ((minHitsToKOAI == 1 && !canBattlerWin1v1) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 // And the current mon has at least 1/2 their HP, or 1/4 HP and Regenerator || (aiAbility == ABILITY_REGENERATOR && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless @@ -352,7 +399,7 @@ static bool32 ShouldSwitchIfTruant(u32 battler) // Switch if mon with truant is bodied by Protect or invulnerability spam if (gAiLogicData->abilities[battler] == ABILITY_TRUANT && IsTruantMonVulnerable(battler, gBattlerTarget) - && gDisableStructs[battler].truantCounter + && gBattleMons[battler].volatiles.truantCounter && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE) { @@ -364,7 +411,7 @@ static bool32 ShouldSwitchIfTruant(u32 battler) static u32 FindMonWithMoveOfEffectiveness(u32 battler, u32 opposingBattler, uq4_12_t effectiveness) { - u32 move, i, j; + enum Move move; s32 firstId; s32 lastId; // + 1 struct Pokemon *party = NULL; @@ -374,20 +421,20 @@ static u32 FindMonWithMoveOfEffectiveness(u32 battler, u32 opposingBattler, uq4_ party = GetBattlerParty(battler); // Find a Pokémon in the party that has a super effective move. - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battler]) + if (monIndex == gBattlerPartyIndexes[battler]) continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - move = GetMonData(&party[i], MON_DATA_MOVE1 + j); - if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= effectiveness && gMovesInfo[move].power != 0) - return SetSwitchinAndSwitch(battler, i); + move = GetMonData(&party[monIndex], MON_DATA_MOVE1 + moveIndex); + if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= effectiveness && GetMovePower(move) != 0) + return SetSwitchinAndSwitch(battler, monIndex); } } @@ -398,12 +445,12 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) { u32 moveIndex; u32 opposingBattler = GetOppositeBattler(battler); - u32 aiMove; + enum Move aiMove; // Switch if no moves affect opponents if (IsDoubleBattle()) { - u32 opposingPartner = GetBattlerAtPosition(BATTLE_PARTNER(opposingBattler)); + u32 opposingPartner = BATTLE_PARTNER(opposingBattler); for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; @@ -416,18 +463,27 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) } else { + struct BattleContext ctx = {0}; + ctx.battlerAtk = battler; + ctx.battlerDef = opposingBattler; + ctx.abilityAtk = gAiLogicData->abilities[ctx.battlerAtk]; + ctx.abilityDef = gAiLogicData->abilities[ctx.battlerDef]; + ctx.holdEffectAtk = gAiLogicData->holdEffects[ctx.battlerAtk]; + ctx.holdEffectDef = gAiLogicData->holdEffects[ctx.battlerDef]; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { aiMove = gBattleMons[battler].moves[moveIndex]; - if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) && aiMove != MOVE_NONE - && !CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], aiMove, GetBattleMoveType(aiMove), AI_CHECK) - && !CanAbilityBlockMove(battler, opposingBattler, gBattleMons[battler].ability, gAiLogicData->abilities[opposingBattler], aiMove, AI_CHECK) - && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || gMovesInfo[aiMove].power != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero + if (aiMove != MOVE_NONE + && gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] > UQ_4_12(0.0) + && !AI_CanMoveBeBlockedByTarget(&ctx) + && (!ALL_MOVES_BAD_STATUS_MOVES_BAD || GetMovePower(aiMove) != 0)) // If using ALL_MOVES_BAD_STATUS_MOVES_BAD, then need power to be non-zero return FALSE; } } - if (RandomPercentage(RNG_AI_SWITCH_ALL_MOVES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_MOVES_BAD))) + if (RandomPercentage(RNG_AI_SWITCH_ALL_MOVES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_MOVES_BAD)) + && (gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE || !ALL_MOVES_BAD_NEEDS_GOOD_SWITCHIN)) { if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) // No good candidate mons, find any one that can deal damage return FindMonWithMoveOfEffectiveness(battler, opposingBattler, UQ_4_12(1.0)); @@ -441,7 +497,6 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) static bool32 ShouldSwitchIfWonderGuard(u32 battler) { u32 opposingBattler = GetOppositeBattler(battler); - u32 i; if (IsDoubleBattle()) return FALSE; @@ -450,9 +505,9 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) return FALSE; // Check if Pokémon has a super effective move. - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gBattleMons[battler].moves[i] != MOVE_NONE && gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) + if (gBattleMons[battler].moves[moveIndex] != MOVE_NONE && gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] >= UQ_4_12(2.0)) return FALSE; } @@ -469,19 +524,18 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { - u8 battlerIn1, battlerIn2; + u32 battlerIn1, battlerIn2; u8 numAbsorbingAbilities = 0; enum Ability absorbingTypeAbilities[3]; // Array size is maximum number of absorbing abilities for a single type s32 firstId; s32 lastId; struct Pokemon *party; enum Ability monAbility; - u16 aiMove; + enum Move aiMove; u32 opposingBattler = GetOppositeBattler(battler); - u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); + enum Move incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); enum Type incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE); - bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); - s32 i, j; + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; @@ -497,34 +551,20 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) return FALSE; // Don't switch if mon could OHKO - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = gBattleMons[battler].moves[i]; + aiMove = gBattleMons[battler].moves[moveIndex]; if (aiMove != MOVE_NONE) { // Only check damage if it's a damaging move if (!IsBattleMoveStatus(aiMove)) { - if (!AI_DoesChoiceEffectBlockMove(battler, aiMove) && AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) + if (!AI_DoesChoiceEffectBlockMove(battler, aiMove) && AI_GetDamage(battler, opposingBattler, moveIndex, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) return FALSE; } } } - if (IsDoubleBattle()) - { - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) - battlerIn2 = battler; - else - battlerIn2 = GetPartnerBattler(battler); - } - else - { - battlerIn1 = battler; - battlerIn2 = battler; - } - // Create an array of possible absorb abilities so the AI considers all of them if (incomingType == TYPE_FIRE) { @@ -534,14 +574,14 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_WATER_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_DRY_SKIN; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_STORM_DRAIN; } else if (incomingType == TYPE_ELECTRIC || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_ELECTRIC)) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_VOLT_ABSORB; absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_MOTOR_DRIVE; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5) absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_LIGHTNING_ROD; } else if (incomingType == TYPE_GRASS || (isOpposingBattlerChargingOrInvulnerable && incomingType == TYPE_GRASS)) @@ -571,38 +611,39 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) } // Check current mon for all absorbing abilities - for (i = 0; i < numAbsorbingAbilities; i++) + for (u32 absorbingAbilityIndex = 0; absorbingAbilityIndex < numAbsorbingAbilities; absorbingAbilityIndex++) { - if (gBattleMons[battler].ability == absorbingTypeAbilities[i]) + if (gAiLogicData->abilities[battler] == absorbingTypeAbilities[absorbingAbilityIndex]) return FALSE; } - // Check party for mon with ability that absorbs move + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + // Check party for mon with ability that absorbs move + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battlerIn1]) + if (monIndex == gBattlerPartyIndexes[battlerIn1]) continue; - if (i == gBattlerPartyIndexes[battlerIn2]) + if (monIndex == gBattlerPartyIndexes[battlerIn2]) continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn1]) + if (monIndex == gBattleStruct->monToSwitchIntoId[battlerIn1]) continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn2]) + if (monIndex == gBattleStruct->monToSwitchIntoId[battlerIn2]) continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; - monAbility = GetMonAbility(&party[i]); + monAbility = GetMonAbility(&party[monIndex]); - for (j = 0; j < numAbsorbingAbilities; j++) + for (u32 absorbingAbilityIndex = 0; absorbingAbilityIndex < numAbsorbingAbilities; absorbingAbilityIndex++) { // Found a mon - if (absorbingTypeAbilities[j] == monAbility && RandomPercentage(RNG_AI_SWITCH_ABSORBING, GetSwitchChance(SHOULD_SWITCH_ABSORBS_MOVE))) - return SetSwitchinAndSwitch(battler, i); + if (absorbingTypeAbilities[absorbingAbilityIndex] == monAbility && RandomPercentage(RNG_AI_SWITCH_ABSORBING, GetSwitchChance(SHOULD_SWITCH_ABSORBS_MOVE))) + return SetSwitchinAndSwitch(battler, monIndex); } } return FALSE; @@ -613,7 +654,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); - bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); + bool32 isOpposingBattlerChargingOrInvulnerable = !BreaksThroughSemiInvulnerablity(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove); if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; @@ -630,7 +671,6 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 firstId; s32 lastId; struct Pokemon *party; - s32 i; enum Ability monAbility; s32 opposingBattler = GetOppositeBattler(battler); @@ -638,25 +678,25 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; - // Check if current mon has an ability that traps opponent - if (CanAbilityTrapOpponent(gBattleMons[battler].ability, opposingBattler)) + // Check if opposing battler is already trapped + if (IsBattlerTrapped(battler, opposingBattler)) return FALSE; // Check party for mon with ability that traps opponent GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) return FALSE; - monAbility = GetMonAbility(&party[i]); + monAbility = GetMonAbility(&party[monIndex]); - if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && monAbility == ABILITY_TRACE)) + if (AI_CanSwitchinAbilityTrapOpponent(monAbility, opposingBattler) || (AI_CanSwitchinAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_TRAPPER, GetSwitchChance(SHOULD_SWITCH_TRAPPER))) + if (monIndex == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_TRAPPER, GetSwitchChance(SHOULD_SWITCH_TRAPPER))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } @@ -668,13 +708,13 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) bool32 switchMon = FALSE; enum Ability monAbility = gAiLogicData->abilities[battler]; enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; - u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); + enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); - bool32 hasStatRaised = AnyStatIsRaised(battler); + bool32 hasStatRaised = AnyUsefulStatIsRaised(battler); //Perish Song if (gBattleMons[battler].volatiles.perishSong - && gDisableStructs[battler].perishSongTimer == 0 + && gBattleMons[battler].volatiles.perishSongTimer == 0 && monAbility != ABILITY_SOUNDPROOF && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -683,7 +723,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { //Yawn if (gBattleMons[battler].volatiles.yawn - && CanBeSlept(battler, battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) // TODO: ask for help from pawwkie + && CanBeSlept(battler, battler, monAbility, BLOCKED_BY_SLEEP_CLAUSE) && gBattleMons[battler].hp > gBattleMons[battler].maxHP / 3 && RandomPercentage(RNG_AI_SWITCH_YAWN, GetSwitchChance(SHOULD_SWITCH_YAWN))) { @@ -703,8 +743,8 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_SHED_SKIN || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) - || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMove(battler, MOVE_SNORE) && gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, MOVE_SNORE)] >= UQ_4_12(2.0)) + || HasMoveWithEffect(battler, EFFECT_SLEEP_TALK) + || (HasMoveWithEffect(battler, EFFECT_SNORE) && gAiLogicData->effectiveness[battler][opposingBattler][GetBattlerMoveIndexWithEffect(battler, EFFECT_SNORE)] >= UQ_4_12(1.0)) || (IsBattlerGrounded(battler, monAbility, gAiLogicData->holdEffects[battler]) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) @@ -715,7 +755,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && gAiLogicData->abilities[opposingBattler] != ABILITY_UNAWARE && gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE - && (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) + && (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) && !gBattleMons[battler].volatiles.foresight && !gBattleMons[battler].volatiles.miracleEye) switchMon = FALSE; @@ -763,9 +803,84 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) return FALSE; } +static bool32 GetHitEscapeTransformState(u32 battlerAtk, enum Move move) +{ + u32 moveIndex; + bool32 hasValidTarget = FALSE; + bool32 isFasterThanAll = TRUE; + bool32 absorberOnField = FALSE; + enum Type moveType; + + if (gBattleMons[battlerAtk].species != SPECIES_PALAFIN_ZERO + || gAiLogicData->abilities[battlerAtk] != ABILITY_ZERO_TO_HERO) + return FALSE; + + if (GetMoveEffect(move) != EFFECT_HIT_ESCAPE) + return FALSE; + + moveIndex = GetMoveIndex(battlerAtk, move); + if (moveIndex >= MAX_MON_MOVES) + return FALSE; + + moveType = GetBattleMoveType(move); + if ((moveType == TYPE_WATER && (AI_GetWeather() & B_WEATHER_SUN_PRIMAL)) + || (moveType == TYPE_FIRE && (AI_GetWeather() & B_WEATHER_RAIN_PRIMAL))) + return FALSE; + + struct BattleContext ctx = {0}; + ctx.aiCalc = TRUE; + ctx.battlerAtk = battlerAtk; + ctx.move = ctx.chosenMove = move; + ctx.moveType = moveType; + ctx.holdEffectAtk = gAiLogicData->holdEffects[battlerAtk]; + ctx.abilityAtk = gAiLogicData->abilities[battlerAtk]; + + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (!IsBattlerAlive(battlerDef) || IsBattlerAlly(battlerDef, battlerAtk)) + continue; + + enum Ability abilityDef = AI_GetMoldBreakerSanitizedAbility( + battlerAtk, + gAiLogicData->abilities[battlerAtk], + gAiLogicData->abilities[battlerDef], + gAiLogicData->holdEffects[battlerDef], + move + ); + + ctx.battlerDef = battlerDef; + ctx.holdEffectDef = gAiLogicData->holdEffects[battlerDef]; + ctx.abilityDef = abilityDef; + + if (AI_CanMoveBeBlockedByTarget(&ctx)) + { + if ((moveType == TYPE_WATER && abilityDef == ABILITY_STORM_DRAIN) + || (moveType == TYPE_ELECTRIC && abilityDef == ABILITY_LIGHTNING_ROD)) + absorberOnField = TRUE; + gAiLogicData->effectiveness[battlerAtk][battlerDef][moveIndex] = UQ_4_12(0.0); + continue; + } + + if (gAiLogicData->effectiveness[battlerAtk][battlerDef][moveIndex] > UQ_4_12(0.0)) + { + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + + hasValidTarget = TRUE; + if (!AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + isFasterThanAll = FALSE; + } + } + + if (absorberOnField || !hasValidTarget) + return FALSE; // Can't meaningfully use a hit escape move + + return isFasterThanAll; +} + static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) { - bool32 hasStatRaised = AnyStatIsRaised(battler); + bool32 hasStatRaised = AnyUsefulStatIsRaised(battler); //Check if ability is blocked if (gBattleMons[battler].volatiles.gastroAcid @@ -801,9 +916,25 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) return FALSE; case ABILITY_ZERO_TO_HERO: - // Want to activate Palafin-Zero at all costs - if (gBattleMons[battler].species == SPECIES_PALAFIN_ZERO) - break; + { + enum Move hitEscapeMove = MOVE_NONE; + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + enum Move move = gBattleMons[battler].moves[moveIndex]; + + if (move != MOVE_NONE && GetMoveEffect(move) == EFFECT_HIT_ESCAPE) + { + hitEscapeMove = move; + break; + } + } + + // Prefer to use a hit escape move if Palafin will move first and can hit + if (hitEscapeMove != MOVE_NONE && GetHitEscapeTransformState(battler, hitEscapeMove)) + return FALSE; + break; + } default: return FALSE; @@ -812,43 +943,35 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } +static bool32 CanUseSuperEffectiveMoveAgainstOpponent(u32 battler, u32 opposingBattler) +{ + enum Move move; + + if (!IsBattlerAlive(opposingBattler)) + return FALSE; + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + move = gBattleMons[battler].moves[moveIndex]; + if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) + continue; + + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] >= UQ_4_12(2.0)) + return TRUE; + } + return FALSE; +} + static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) { - s32 i; - u16 move; - u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u32 opposingBattler = GetBattlerAtPosition(opposingPosition); - if (!(gAbsentBattlerFlags & (1u << opposingBattler))) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) - continue; + if (CanUseSuperEffectiveMoveAgainstOpponent(battler, opposingBattler)) + return TRUE; - if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) - return TRUE; - } - } - if (!IsDoubleBattle()) - return FALSE; - - opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition)); - - if (!(gAbsentBattlerFlags & (1u << opposingBattler))) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE || AI_DoesChoiceEffectBlockMove(battler, move)) - continue; - - if (gAiLogicData->effectiveness[battler][opposingBattler][i] >= UQ_4_12(2.0)) - return TRUE; - } - } + if (IsDoubleBattle() && CanUseSuperEffectiveMoveAgainstOpponent(battler, BATTLE_PARTNER(opposingPosition))) + return TRUE; return FALSE; } @@ -859,8 +982,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc s32 firstId; s32 lastId; // + 1 struct Pokemon *party; - s32 i, j; - u16 move; + enum Move move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING) @@ -875,59 +997,41 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (IsBattleMoveStatus(gLastLandedMoves[battler])) return FALSE; - if (IsDoubleBattle()) - { - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) - battlerIn2 = battler; - else - battlerIn2 = GetPartnerBattler(battler); - } - else - { - battlerIn1 = battler; - battlerIn2 = battler; - } + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { u16 species; enum Ability monAbility; uq4_12_t typeMultiplier; u16 moveFlags = 0; - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battlerIn1]) + if (IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn1]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn2]) - continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; - species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); - monAbility = GetMonAbility(&party[i]); + species = GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG); + monAbility = GetMonAbility(&party[monIndex]); typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility); UpdateMoveResultFlags(typeMultiplier, &moveFlags); if (moveFlags & flags) { battlerIn1 = gLastHitBy[battler]; - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - move = GetMonData(&party[i], MON_DATA_MOVE1 + j); + move = GetMonData(&party[monIndex], MON_DATA_MOVE1 + moveIndex); if (move == MOVE_NONE) continue; if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || gAiLogicData->aiPredictionInProgress)) - return SetSwitchinAndSwitch(battler, i); + return SetSwitchinAndSwitch(battler, monIndex); } } } @@ -939,53 +1043,35 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) { u32 battlerIn1, battlerIn2; u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp; - enum Ability ability = gAiLogicData->abilities[battler], aiMove; - s32 firstId, lastId, i, j; + enum Ability ability = gAiLogicData->abilities[battler]; + enum Move aiMove; + s32 firstId, lastId; struct Pokemon *party; if (ability == ABILITY_REGENERATOR) battlerHp = (battlerHp * 133) / 100; // Account for Regenerator healing - hazardDamage = GetSwitchinHazardsDamage(battler, &gBattleMons[battler]); + hazardDamage = GetSwitchinHazardsDamage(battler); // Battler will faint to hazards, check to see if another mon can clear them if (hazardDamage > battlerHp) { - if (IsDoubleBattle()) - { - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) - battlerIn2 = battler; - else - battlerIn2 = GetPartnerBattler(battler); - } - else - { - battlerIn1 = battler; - battlerIn2 = battler; - } - + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battlerIn1]) + if (IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn1]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn2]) - continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL); + aiMove = GetMonData(&party[monIndex], MON_DATA_MOVE1 + moveIndex); if (IsHazardClearingMove(aiMove)) // Have a mon that can clear the hazards, so switching out is okay return TRUE; } @@ -998,7 +1084,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) static bool32 ShouldSwitchIfEncored(u32 battler) { - u32 encoredMove = gDisableStructs[battler].encoredMove; + enum Move encoredMove = gBattleMons[battler].volatiles.encoredMove; u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer @@ -1014,7 +1100,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); // Stay in if effective move - else if (gAiLogicData->effectiveness[battler][opposingBattler][GetIndexInMoveArray(battler, encoredMove)] >= UQ_4_12(2.0)) + else if (gAiLogicData->effectiveness[battler][opposingBattler][GetMoveIndex(battler, encoredMove)] >= UQ_4_12(2.0)) return FALSE; // Switch out 50% of the time otherwise @@ -1026,17 +1112,25 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); - u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; + enum Move lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; - if (lastUsedMove != MOVE_NONE && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) - || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, CheckDynamicMoveType(GetBattlerMon(battler), lastUsedMove, battler, MON_IN_BATTLE), AI_CHECK) - || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, AI_CHECK))) + struct BattleContext ctx = {0}; + ctx.battlerAtk = battler; + ctx.battlerDef = opposingBattler; + ctx.move = ctx.chosenMove = lastUsedMove; + ctx.moveType = GetBattleMoveType(lastUsedMove); + ctx.abilityAtk = gAiLogicData->abilities[ctx.battlerAtk]; + ctx.abilityDef = gAiLogicData->abilities[ctx.battlerDef]; + ctx.holdEffectAtk = gAiLogicData->holdEffects[ctx.battlerAtk]; + ctx.holdEffectDef = gAiLogicData->holdEffects[ctx.battlerDef]; + + if (lastUsedMove != MOVE_NONE + && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) || AI_CanMoveBeBlockedByTarget(&ctx))) moveAffectsTarget = FALSE; - if (IsHoldEffectChoice(holdEffect) && IsBattlerItemEnabled(battler)) + if (IsHoldEffectChoice(ctx.holdEffectAtk) && IsBattlerItemEnabled(battler)) { if ((GetMoveCategory(lastUsedMove) == DAMAGE_CATEGORY_STATUS || !moveAffectsTarget) && RandomPercentage(RNG_AI_SWITCH_CHOICE_LOCKED, GetSwitchChance(SHOULD_SWITCH_CHOICE_LOCKED))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -1091,15 +1185,19 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) return FALSE; } -bool32 ShouldSwitch(u32 battler) +bool32 ShouldSwitchDynFuncExample(u32 battler) { - u32 battlerIn1, battlerIn2; - s32 firstId; - s32 lastId; // + 1 - struct Pokemon *party; - s32 i; - s32 availableToSwitch; + // Chance to switch if trainer class is Guitarist, perhaps thematic for Jugglers + if (GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA) == TRAINER_CLASS_GUITARIST + && RandomPercentage(RNG_AI_SWITCH_DYN_FUNC, GetSwitchChance(SHOULD_SWITCH_DYN_FUNC))) + { + return SetSwitchinAndSwitch(battler, PARTY_SIZE); + } + return FALSE; +} +static bool32 CanBattlerConsiderSwitch(u32 battler) +{ if (gBattleMons[battler].volatiles.wrapped) return FALSE; if (gBattleMons[battler].volatiles.escapePrevention) @@ -1108,8 +1206,23 @@ bool32 ShouldSwitch(u32 battler) return FALSE; if (IsAbilityPreventingEscape(battler)) return FALSE; + if (gBattleStruct->battlerState[battler].commanderSpecies) + return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return FALSE; + return TRUE; +} + +bool32 ShouldSwitch(u32 battler) +{ + u32 battlerIn1, battlerIn2; + s32 firstId; + s32 lastId; // + 1 + struct Pokemon *party; + s32 availableToSwitch; + + if (!CanBattlerConsiderSwitch(battler)) + return FALSE; // Sequence Switching AI never switches mid-battle if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SEQUENCE_SWITCHING) @@ -1117,44 +1230,29 @@ bool32 ShouldSwitch(u32 battler) availableToSwitch = 0; - if (IsDoubleBattle()) - { - u32 partner = BATTLE_PARTNER(battler); - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << partner)) - battlerIn2 = battler; - else - battlerIn2 = partner; - } - else - { - battlerIn1 = battler; - battlerIn2 = battler; - } - + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battlerIn1]) + if (IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) continue; - if (i == gBattlerPartyIndexes[battlerIn2]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn1]) - continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn2]) - continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; availableToSwitch++; } if (availableToSwitch == 0) - return FALSE; + return FALSE; + + // custom switching logic + // NOTE: needs to always end with `return SetSwitchinAndSwitch` or `return FALSE` + if (gDynamicAiSwitchFunc != NULL && gDynamicAiSwitchFunc(battler)) // Create custom AI functions for specific battles via "setdynamicswitchaifunc" cmd + return TRUE; // NOTE: The sequence of the below functions matter! Do not change unless you have carefully considered the outcome. // Since the order is sequential, and some of these functions prompt switch to specific party members. @@ -1210,32 +1308,40 @@ bool32 ShouldSwitch(u32 battler) bool32 ShouldSwitchIfAllScoresBad(u32 battler) { - u32 i, score, opposingBattler = GetOppositeBattler(battler); + u32 score, opposingBattler = GetOppositeBattler(battler); if (!(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_SMART_SWITCHING)) return FALSE; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - score = gAiBattleData->finalScore[battler][opposingBattler][i]; + score = gAiBattleData->finalScore[battler][opposingBattler][moveIndex]; if (score > AI_BAD_SCORE_THRESHOLD) return FALSE; } - if (RandomPercentage(RNG_AI_SWITCH_ALL_SCORES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_SCORES_BAD))) + if (RandomPercentage(RNG_AI_SWITCH_ALL_SCORES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_SCORES_BAD)) + && (gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE || !ALL_SCORES_BAD_NEEDS_GOOD_SWITCHIN)) return TRUE; return FALSE; } bool32 ShouldStayInToUseMove(u32 battler) { - u32 i, aiMove, opposingBattler = GetOppositeBattler(battler); + u32 aiMove, opposingBattler = GetOppositeBattler(battler); enum BattleMoveEffects aiMoveEffect; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = gBattleMons[battler].moves[i]; + aiMove = gBattleMons[battler].moves[moveIndex]; aiMoveEffect = GetMoveEffect(aiMove); if (aiMoveEffect == EFFECT_REVIVAL_BLESSING || IsSwitchOutEffect(aiMoveEffect)) { - if (gAiBattleData->finalScore[battler][opposingBattler][i] > AI_GOOD_SCORE_THRESHOLD) + // Palafin should not stay in for a hit escape move if it can't use it effectively (slower or no target) + if (gBattleMons[battler].species == SPECIES_PALAFIN_ZERO + && gAiLogicData->abilities[battler] == ABILITY_ZERO_TO_HERO + && aiMoveEffect == EFFECT_HIT_ESCAPE + && !GetHitEscapeTransformState(battler, aiMove)) + continue; + + if (gAiBattleData->finalScore[battler][opposingBattler][moveIndex] > AI_GOOD_SCORE_THRESHOLD) return TRUE; } } @@ -1248,18 +1354,9 @@ void ModifySwitchAfterMoveScoring(u32 battler) s32 firstId; s32 lastId; // + 1 struct Pokemon *party; - s32 i; s32 availableToSwitch; - if (gBattleMons[battler].volatiles.wrapped) - return; - if (gBattleMons[battler].volatiles.escapePrevention) - return; - if (gBattleMons[battler].volatiles.root) - return; - if (IsAbilityPreventingEscape(battler)) - return; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA) + if (!CanBattlerConsiderSwitch(battler)) return; // Sequence Switching AI never switches mid-battle @@ -1268,37 +1365,23 @@ void ModifySwitchAfterMoveScoring(u32 battler) availableToSwitch = 0; - if (IsDoubleBattle()) - { - u32 partner = BATTLE_PARTNER(battler); - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << partner)) - battlerIn2 = battler; - else - battlerIn2 = partner; - } - else - { - battlerIn1 = battler; - battlerIn2 = battler; - } - + GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (!IsValidForBattle(&party[i])) + if (!IsValidForBattle(&party[monIndex])) continue; - if (i == gBattlerPartyIndexes[battlerIn1]) + if (monIndex == gBattlerPartyIndexes[battlerIn1]) continue; - if (i == gBattlerPartyIndexes[battlerIn2]) + if (monIndex == gBattlerPartyIndexes[battlerIn2]) continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn1]) + if (monIndex == gBattleStruct->monToSwitchIntoId[battlerIn1]) continue; - if (i == gBattleStruct->monToSwitchIntoId[battlerIn2]) + if (monIndex == gBattleStruct->monToSwitchIntoId[battlerIn2]) continue; - if (IsAceMon(battler, i)) + if (IsAceMon(battler, monIndex)) continue; availableToSwitch++; @@ -1337,230 +1420,15 @@ bool32 IsSwitchinValid(u32 battler) return TRUE; } -void AI_TrySwitchOrUseItem(u32 battler) -{ - struct Pokemon *party; - u8 battlerIn1, battlerIn2; - s32 firstId; - s32 lastId; // + 1 - u8 battlerPosition = GetBattlerPosition(battler); - party = GetBattlerParty(battler); - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - { - if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) - { - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); - if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) - { - s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; - if (monToSwitchId == PARTY_SIZE) - { - if (!IsDoubleBattle()) - { - battlerIn1 = GetBattlerAtPosition(battlerPosition); - battlerIn2 = battlerIn1; - } - else - { - battlerIn1 = GetBattlerAtPosition(battlerPosition); - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(battlerPosition)); - } - - GetAIPartyIndexes(battler, &firstId, &lastId); - - for (monToSwitchId = (lastId-1); monToSwitchId >= firstId; monToSwitchId--) - { - if (!IsValidForBattle(&party[monToSwitchId])) - continue; - if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) - continue; - if (monToSwitchId == gBattlerPartyIndexes[battlerIn2]) - continue; - if (monToSwitchId == gBattleStruct->monToSwitchIntoId[battlerIn1]) - continue; - if (monToSwitchId == gBattleStruct->monToSwitchIntoId[battlerIn2]) - continue; - if (IsAceMon(battler, monToSwitchId)) - continue; - - break; - } - } - - gBattleStruct->AI_monToSwitchIntoId[battler] = monToSwitchId; - } - - gBattleStruct->monToSwitchIntoId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; - gAiLogicData->monToSwitchInId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; - return; - } - else if (ShouldUseItem(battler)) - { - return; - } - } - - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(battler) << 8); -} - -// If there are two(or more) mons to choose from, always choose one that has baton pass -// as most often it can't do much on its own. -static u32 GetBestMonBatonPass(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, int aliveCount, u32 battler, u32 opposingBattler) -{ - int i, j, bits = 0; - - for (i = firstId; i < lastId; i++) - { - if (invalidMons & (1u << i)) - continue; - - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL) == MOVE_BATON_PASS) - { - bits |= 1u << i; - break; - } - } - } - - if ((aliveCount == 2 || (aliveCount > 2 && Random() % 3 == 0)) && bits) - { - do - { - i = (Random() % (lastId - firstId)) + firstId; - } while (!(bits & (1 << i))); - return i; - } - - return PARTY_SIZE; -} - -static u32 GetBestMonTypeMatchup(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 battler, u32 opposingBattler) -{ - int i, bits = 0; - while (bits != 0x3F) // All mons were checked. - { - u32 bestResist = UQ_4_12(2.0); - int bestMonId = PARTY_SIZE; - // Find the mon whose type is the most suitable defensively. - for (i = firstId; i < lastId; i++) - { - if (!((1u << i) & invalidMons) && !((1u << i) & bits)) - { - InitializeSwitchinCandidate(&party[i]); - - u32 typeEffectiveness = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); - if (typeEffectiveness < bestResist) - { - bestResist = typeEffectiveness; - bestMonId = i; - } - } - } - - // Ok, we know the mon has the right typing but does it have at least one super effective move? - if (bestMonId != PARTY_SIZE) - { - for (i = 0; i < MAX_MON_MOVES; i++) - { - u32 move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) - break; - } - - if (i != MAX_MON_MOVES) - return bestMonId; // Has both the typing and at least one super effective move. - - bits |= (1u << bestMonId); // Sorry buddy, we want something better. - } - else - { - bits = 0x3F; // No viable mon to switch. - } - } - - return PARTY_SIZE; -} - -static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 invalidMons, u32 battler, u32 opposingBattler) -{ - int i, j; - int dmg, bestDmg = 0; - int bestMonId = PARTY_SIZE; - u32 aiMove; - uq4_12_t effectiveness; - - // If we couldn't find the best mon in terms of typing, find the one that deals most damage. - for (i = firstId; i < lastId; i++) - { - if ((1 << (i)) & invalidMons) - continue; - InitializeSwitchinCandidate(&party[i]); - for (j = 0; j < MAX_MON_MOVES; j++) - { - aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; - if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) - { - aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j); - dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); - if (bestDmg < dmg) - { - bestDmg = dmg; - bestMonId = i; - } - } - } - } - - return bestMonId; -} - -static u32 GetFirstNonInvalidMon(u32 firstId, u32 lastId, u32 invalidMons, u32 battlerIn1, u32 battlerIn2) -{ - if (!IsDoubleBattle()) - return PARTY_SIZE; - - if (PARTY_SIZE != gBattleStruct->monToSwitchIntoId[battlerIn1] - && PARTY_SIZE != gBattleStruct->monToSwitchIntoId[battlerIn2]) - return PARTY_SIZE; - - for (u32 chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) - { - if ((1 << (chosenMonId)) & invalidMons) - continue; - return chosenMonId; // first non invalid mon found - } - return PARTY_SIZE; -} - -bool32 IsMonGrounded(enum HoldEffect heldItemEffect, enum Ability ability, enum Type type1, enum Type type2) -{ - // List that makes mon not grounded - if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE - || (heldItemEffect == HOLD_EFFECT_AIR_BALLOON && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)))) - { - // List that overrides being off the ground - if ((heldItemEffect == HOLD_EFFECT_IRON_BALL && !(ability == ABILITY_KLUTZ || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM))) || (gFieldStatuses & STATUS_FIELD_GRAVITY) || (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)) - return TRUE; - else - return FALSE; - } - else - return TRUE; -} - // Gets hazard damage -static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon) +static u32 GetSwitchinHazardsDamage(u32 battler) { - enum Type defType1 = battleMon->types[0], defType2 = battleMon->types[1]; u8 tSpikesLayers; - u16 heldItemEffect = GetItemHoldEffect(battleMon->item); - u32 maxHP = battleMon->maxHP; - enum Ability ability = battleMon->ability, status = battleMon->status1; + u16 heldItemEffect = gAiLogicData->holdEffects[battler]; + u32 maxHP = gBattleMons[battler].maxHP; + enum Ability ability = gAiLogicData->abilities[battler], status = gBattleMons[battler].status1; u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0; - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); // Check ways mon might avoid all hazards if (ability != ABILITY_MAGIC_GUARD || (heldItemEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && @@ -1568,12 +1436,12 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon { // Stealth Rock if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) - hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, defType1, defType2, battleMon->maxHP); + hazardDamage += GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); // G-Max Steelsurge if (IsHazardOnSide(side, HAZARDS_STEELSURGE) && heldItemEffect != HOLD_EFFECT_HEAVY_DUTY_BOOTS) - hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, defType1, defType2, battleMon->maxHP); + hazardDamage += GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); // Spikes - if (IsHazardOnSide(side, HAZARDS_TOXIC_SPIKES) && IsMonGrounded(heldItemEffect, ability, defType1, defType2)) + if (IsHazardOnSide(side, HAZARDS_SPIKES) && AI_IsBattlerGrounded(battler)) { spikesDamage = maxHP / ((5 - gSideTimers[GetBattlerSide(battler)].spikesAmount) * 2); if (spikesDamage == 0) @@ -1581,16 +1449,15 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon hazardDamage += spikesDamage; } - if (IsHazardOnSide(side, HAZARDS_SPIKES) && (defType1 != TYPE_POISON && defType2 != TYPE_POISON - && defType1 != TYPE_STEEL && defType2 != TYPE_STEEL + if (IsHazardOnSide(side, HAZARDS_TOXIC_SPIKES) && (!IS_BATTLER_ANY_TYPE(battler, TYPE_POISON, TYPE_STEEL) && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && ability != ABILITY_COMATOSE && status == 0 && !(gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) && !IsAbilityOnSide(battler, ABILITY_PASTEL_VEIL) - && !IsBattlerTerrainAffected(battler, ability, gAiLogicData->holdEffects[battler], STATUS_FIELD_MISTY_TERRAIN) + && !IsMistyTerrainAffected(battler, ability, gAiLogicData->holdEffects[battler], gFieldStatuses) && !IsAbilityStatusProtected(battler, ability) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS - && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) + && AI_IsBattlerGrounded(battler))) { tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; if (tSpikesLayers == 1) @@ -1612,11 +1479,11 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon } // Gets damage / healing from weather -static s32 GetSwitchinWeatherImpact(void) +static s32 GetSwitchinWeatherImpact(u32 battler) { - s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; - enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + s32 weatherImpact = 0, maxHP = gBattleMons[battler].maxHP; + enum Ability ability = gAiLogicData->abilities[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; if (HasWeatherEffect()) { @@ -1624,7 +1491,7 @@ static s32 GetSwitchinWeatherImpact(void) if (holdEffect != HOLD_EFFECT_SAFETY_GOGGLES && ability != ABILITY_MAGIC_GUARD && ability != ABILITY_OVERCOAT) { if ((gBattleWeather & B_WEATHER_HAIL) - && (gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_ICE || gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_ICE) + && IS_BATTLER_OF_TYPE(battler, TYPE_ICE) && ability != ABILITY_SNOW_CLOAK && ability != ABILITY_ICE_BODY) { weatherImpact = maxHP / 16; @@ -1632,10 +1499,8 @@ static s32 GetSwitchinWeatherImpact(void) weatherImpact = 1; } else if ((gBattleWeather & B_WEATHER_SANDSTORM) - && (gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_GROUND && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_GROUND - && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_ROCK && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_ROCK - && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_STEEL && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_STEEL - && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_RUSH && ability != ABILITY_SAND_FORCE)) + && IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) + && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_RUSH && ability != ABILITY_SAND_FORCE) { weatherImpact = maxHP / 16; if (weatherImpact == 0) @@ -1677,16 +1542,16 @@ static s32 GetSwitchinWeatherImpact(void) } // Gets one turn of recurring healing -static u32 GetSwitchinRecurringHealing(void) +static u32 GetSwitchinRecurringHealing(u32 battler) { - u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; - enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + u32 recurringHealing = 0, maxHP = gBattleMons[battler].maxHP; + enum Ability ability = gAiLogicData->abilities[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; // Items if (ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && (gAiLogicData->switchinCandidate.battleMon.types[0] == TYPE_POISON || gAiLogicData->switchinCandidate.battleMon.types[1] == TYPE_POISON)) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { recurringHealing = maxHP / 16; if (recurringHealing == 0) @@ -1701,7 +1566,7 @@ static u32 GetSwitchinRecurringHealing(void) } // Intentionally omitting Shell Bell for its inconsistency // Abilities - if (ability == ABILITY_POISON_HEAL && (gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_POISON)) + if (ability == ABILITY_POISON_HEAL && (gBattleMons[battler].status1 & STATUS1_POISON)) { u32 healing = maxHP / 8; if (healing == 0) @@ -1712,16 +1577,16 @@ static u32 GetSwitchinRecurringHealing(void) } // Gets one turn of recurring damage -static u32 GetSwitchinRecurringDamage(void) +static u32 GetSwitchinRecurringDamage(u32 battler) { - u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; - enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability; - enum HoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + u32 passiveDamage = 0, maxHP = gBattleMons[battler].maxHP; + enum Ability ability = gAiLogicData->abilities[battler]; + enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_POISON && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_POISON) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { passiveDamage = maxHP / 8; if (passiveDamage == 0) @@ -1746,19 +1611,19 @@ static u32 GetSwitchinRecurringDamage(void) // Gets one turn of status damage static u32 GetSwitchinStatusDamage(u32 battler) { - enum Type defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1]; u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; - u16 heldItemEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); - u32 status = gAiLogicData->switchinCandidate.battleMon.status1; - enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; + enum HoldEffect heldItemEffect = gAiLogicData->holdEffects[battler]; + u32 status = gBattleMons[battler].status1; + enum Ability ability = gAiLogicData->abilities[battler]; + u32 maxHP = gBattleMons[battler].maxHP; u32 statusDamage = 0; // Status condition damage - if ((status != 0) && gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_MAGIC_GUARD) + if ((status != 0) && ability != ABILITY_MAGIC_GUARD) { if (status & STATUS1_BURN) { - if (B_BURN_DAMAGE >= GEN_7) + if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1769,7 +1634,7 @@ static u32 GetSwitchinStatusDamage(u32 battler) } else if (status & STATUS1_FROSTBITE) { - if (B_BURN_DAMAGE >= GEN_7) + if (GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) statusDamage = maxHP / 16; else statusDamage = maxHP / 8; @@ -1785,54 +1650,70 @@ static u32 GetSwitchinStatusDamage(u32 battler) else if ((status & STATUS1_TOXIC_POISON) && ability != ABILITY_POISON_HEAL) { if ((status & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns - gAiLogicData->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); + gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); statusDamage = maxHP / 16; if (statusDamage == 0) statusDamage = 1; - statusDamage *= gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; + statusDamage *= gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER >> 8; } } // Apply hypothetical poisoning from Toxic Spikes, which means the first turn of damage already added in GetSwitchinHazardsDamage // Do this last to skip one iteration of Poison / Toxic damage, and start counting Toxic damage one turn later. - if (tSpikesLayers != 0 && (defType1 != TYPE_POISON && defType2 != TYPE_POISON + if (tSpikesLayers != 0 && (IS_BATTLER_OF_TYPE(battler, TYPE_POISON) && ability != ABILITY_IMMUNITY && ability != ABILITY_POISON_HEAL && status == 0 && !(heldItemEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && (((gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) || ability == ABILITY_KLUTZ))) && heldItemEffect != HOLD_EFFECT_CURE_PSN && heldItemEffect != HOLD_EFFECT_CURE_STATUS - && IsMonGrounded(heldItemEffect, ability, defType1, defType2))) + && AI_IsBattlerGrounded(battler))) { if (tSpikesLayers == 1) { - gAiLogicData->switchinCandidate.battleMon.status1 = STATUS1_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes - gAiLogicData->switchinCandidate.hypotheticalStatus = TRUE; + gBattleMons[battler].status1 = STATUS1_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes } if (tSpikesLayers == 2) { - gAiLogicData->switchinCandidate.battleMon.status1 = STATUS1_TOXIC_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes - gAiLogicData->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); - gAiLogicData->switchinCandidate.hypotheticalStatus = TRUE; + gBattleMons[battler].status1 = STATUS1_TOXIC_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes + gBattleMons[battler].status1 += STATUS1_TOXIC_TURN(1); } } return statusDamage; } -// Gets number of hits to KO factoring in hazards, healing held items, status, and weather -static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) +// Gets number of hits to KO factoring in hazards, healing held items, status, weather, and incoming heals +static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler, const struct IncomingHealInfo *healInfo, u32 originalHp) { - u32 startingHP = gAiLogicData->switchinCandidate.battleMon.hp - GetSwitchinHazardsDamage(battler, &gAiLogicData->switchinCandidate.battleMon); - s32 weatherImpact = GetSwitchinWeatherImpact(); // Signed to handle both damage and healing in the same value - u32 recurringDamage = GetSwitchinRecurringDamage(); - u32 recurringHealing = GetSwitchinRecurringHealing(); + u32 hazardDamage = GetSwitchinHazardsDamage(battler); + u32 hazardCheckHp = healInfo->healBeforeHazards ? gBattleMons[battler].maxHP : gBattleMons[battler].hp; + u32 startingHP; + + if (healInfo->healAfterHazards) + { + // Heal happens after entry damage + if (hazardDamage >= originalHp) + return 1; + startingHP = gBattleMons[battler].maxHP; + } + else + { + if (hazardDamage >= hazardCheckHp) + return 1; + startingHP = hazardCheckHp - hazardDamage; + } + + s32 weatherImpact = GetSwitchinWeatherImpact(battler); // Signed to handle both damage and healing in the same value + u32 recurringDamage = GetSwitchinRecurringDamage(battler); + u32 recurringHealing = GetSwitchinRecurringHealing(battler); u32 statusDamage = GetSwitchinStatusDamage(battler); u32 hitsToKO = 0; - u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item); - u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); + u16 maxHP = gBattleMons[battler].maxHP, item = gAiLogicData->items[battler], heldItemEffect = GetItemHoldEffect(item); + u8 weatherDuration = gBattleStruct->weatherDuration, holdEffectParam = GetItemHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); - enum Ability opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum Ability opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->abilities[battler]; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP, singleUseItemHeal = 0; + bool32 applyWishNow = healInfo->healEndOfTurn && healInfo->wishCounter == 1; // No damage being dealt if ((damageTaken + statusDamage + recurringDamage <= recurringHealing) || damageTaken + statusDamage + recurringDamage == 0) @@ -1853,7 +1734,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP - damageTaken; // One shot prevention effects - if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && B_STURDY >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) + if (damageTaken >= maxHP && startingHP == maxHP && (heldItemEffect == HOLD_EFFECT_FOCUS_SASH || (!opponentCanBreakMold && GetConfig(CONFIG_STURDY) >= GEN_5 && ability == ABILITY_STURDY)) && hitsToKO < 1) currentHP = 1; // If mon is still alive, apply weather impact first, as it might KO the mon before it can heal with its item (order is weather -> item -> status) @@ -1861,7 +1742,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP - weatherImpact; // Check if we're at a single use healing item threshold - if (currentHP > 0 && gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE + if (currentHP > 0 && gAiLogicData->abilities[battler] != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE && !(opposingAbility == ABILITY_UNNERVE && GetItemPocket(item) == POCKET_BERRIES)) { switch (heldItemEffect) @@ -1907,8 +1788,17 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) if (currentHP > 0) currentHP = currentHP + recurringHealing - recurringDamage - statusDamage; + // Wish healing happens at the end of the turn when it is due this turn. + if (applyWishNow && currentHP > 0) + { + currentHP += healInfo->healAmount; + if (currentHP > maxHP) + currentHP = maxHP; + applyWishNow = FALSE; + } + // Recalculate toxic damage if needed - if (gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_POISON) + if (gBattleMons[battler].status1 & STATUS1_TOXIC_POISON) statusDamage = GetSwitchinStatusDamage(battler); // Reduce weather duration @@ -1919,24 +1809,18 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Disguise will always add an extra hit to KO - if (!opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) + if (!opponentCanBreakMold && gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED) hitsToKO++; - // If mon had a hypothetical status from TSpikes, clear it - if (gAiLogicData->switchinCandidate.hypotheticalStatus == TRUE) - { - gAiLogicData->switchinCandidate.battleMon.status1 = 0; - gAiLogicData->switchinCandidate.hypotheticalStatus = FALSE; - } return hitsToKO; } -static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon) +static u32 GetBattlerTypeMatchup(u32 opposingBattler, u32 battler) { // Check type matchup u32 typeEffectiveness1 = UQ_4_12(1.0), typeEffectiveness2 = UQ_4_12(1.0); - enum Type atkType1 = opposingBattleMon.types[0], atkType2 = opposingBattleMon.types[1]; - enum Type defType1 = battleMon.types[0], defType2 = battleMon.types[1]; + enum Type atkType1 = gBattleMons[opposingBattler].types[0], atkType2 = gBattleMons[opposingBattler].types[1]; + enum Type defType1 = gBattleMons[battler].types[0], defType2 = gBattleMons[battler].types[1]; // Add each independent defensive type matchup together typeEffectiveness1 = uq4_12_multiply(typeEffectiveness1, (GetTypeModifier(atkType1, defType1))); @@ -1961,40 +1845,68 @@ static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struc return typeEffectiveness1 + typeEffectiveness2; } -static int GetRandomSwitchinWithBatonPass(int aliveCount, int bits, int firstId, int lastId, int currentMonId) +static u32 GetSwitchinCandidate(u32 switchinCategory, u32 battler, int firstId, int lastId, enum SwitchType switchType) { - // Breakout early if there aren't any Baton Pass mons to save computation time - if (bits == 0) + if (switchinCategory == 0) return PARTY_SIZE; - // GetBestMonBatonPass randomly chooses between all mons that met Baton Pass check - if ((aliveCount == 2 || (aliveCount > 2 && Random() % 3 == 0)) && bits) + // Randomize between eligible mons + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RANDOMIZE_SWITCHIN) { - do - { - return (Random() % (lastId - firstId)) + firstId; - } while (!(bits & (1 << (currentMonId)))); + // This split is necessary because the test system can't handle multiple calls with the same random tag in the same turn + if (switchType == SWITCH_AFTER_KO) + return RandomBitIndex(RNG_AI_RANDOM_SWITCHIN_POST_KO, switchinCategory); // Can't pass this anything with no set bits + else + return RandomBitIndex(RNG_AI_RANDOM_SWITCHIN_MID_BATTLE, switchinCategory); // Can't pass this anything with no set bits } - // Catch any other cases (such as only one mon alive and it has Baton Pass) - else - return PARTY_SIZE; + // Pick last eligible mon in party order + for (s32 monIndex = (lastId-1); monIndex >= firstId; monIndex--) + { + if (switchinCategory & (1 << monIndex)) + return monIndex; + } + + return PARTY_SIZE; } -static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerMove) +static u32 GetValidSwitchinCandidate(u32 validMonIds, u32 battler, u32 firstId, u32 lastId, enum SwitchType switchType) { - int i = 0; - u32 playerMove; - u16 *playerMoves = GetMovesArray(opposingBattler); - s32 damageTaken = 0, maxDamageTaken = 0; - uq4_12_t effectiveness; + if (validMonIds == 0) + return PARTY_SIZE; - for (i = 0; i < MAX_MON_MOVES; i++) + // Randomize between valid mons + if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RANDOMIZE_SWITCHIN) && RANDOMIZE_SWITCHIN_ANY_VALID) { - playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; - if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) + // This split is necessary because the test system can't handle multiple calls with the same random tag in the same turn + if (switchType == SWITCH_AFTER_KO) + return RandomBitIndex(RNG_AI_RANDOM_VALID_SWITCHIN_POST_KO, validMonIds); // Can't pass this anything with no set bits + else + return RandomBitIndex(RNG_AI_RANDOM_VALID_SWITCHIN_MID_BATTLE, validMonIds); // Can't pass this anything with no set bits + } + + // Pick last valid mon in party order + for (s32 monIndex = (lastId-1); monIndex > firstId; monIndex--) + { + if (validMonIds & (1 << monIndex)) + return monIndex; + } + + return PARTY_SIZE; +} + +static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, enum Move *bestPlayerMove) +{ + enum Move playerMove; + enum Move *playerMoves = GetMovesArray(opposingBattler); + s32 damageTaken = 0, maxDamageTaken = 0; + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[moveIndex] : playerMoves[moveIndex]; + if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[moveIndex] > 0) { - damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); + damageTaken = AI_GetDamage(opposingBattler, battler, moveIndex, AI_DEFENDING, gAiLogicData); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move { *bestPlayerMove = playerMove; @@ -2010,24 +1922,22 @@ static s32 GetMaxDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattle return maxDamageTaken; } -static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, struct BattlePokemon battleMon, u32 *bestPlayerPriorityMove) +static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposingBattler, enum Move *bestPlayerPriorityMove) { - int i = 0; - u32 playerMove; - u16 *playerMoves = GetMovesArray(opposingBattler); + enum Move playerMove; + enum Move *playerMoves = GetMovesArray(opposingBattler); s32 damageTaken = 0, maxDamageTaken = 0; - uq4_12_t effectiveness = UQ_4_12(1.0); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { // If player is choiced into a non-priority move, AI understands that it can't deal priority damage - if (gBattleStruct->choicedMove[opposingBattler] !=MOVE_NONE && GetMovePriority(gBattleStruct->choicedMove[opposingBattler]) < 1) + if (gBattleStruct->choicedMove[opposingBattler] != MOVE_NONE && GetMovePriority(gBattleStruct->choicedMove[opposingBattler]) < 1) break; - playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[i] : playerMoves[i]; + playerMove = SMART_SWITCHING_OMNISCIENT ? gBattleMons[opposingBattler].moves[moveIndex] : playerMoves[moveIndex]; if (GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], playerMove) > 0 - && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[i] > 0) + && playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH && gBattleMons[opposingBattler].pp[moveIndex] > 0) { - damageTaken = AI_CalcPartyMonDamage(playerMove, opposingBattler, battler, battleMon, &effectiveness, AI_DEFENDING); + damageTaken = AI_GetDamage(opposingBattler, battler, moveIndex, AI_DEFENDING, gAiLogicData); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move { *bestPlayerPriorityMove = playerMove; @@ -2043,20 +1953,22 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi return maxDamageTaken; } -static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent) +static bool32 AI_CanSwitchinAbilityTrapOpponent(enum Ability ability, u32 opposingBattler) { - if ((B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST))) + if (AI_CanBattlerEscape(opposingBattler)) + return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && CountUsablePartyMons(opposingBattler) == 0) return FALSE; else if (ability == ABILITY_SHADOW_TAG) { - if (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[opponent] == ABILITY_SHADOW_TAG) // Check if ability exists in species + if (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[opposingBattler] == ABILITY_SHADOW_TAG) return FALSE; else return TRUE; } - else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opponent, gAiLogicData->abilities[opponent], gAiLogicData->holdEffects[opponent])) + else if (ability == ABILITY_ARENA_TRAP && IsBattlerGrounded(opposingBattler, gAiLogicData->abilities[opposingBattler], gAiLogicData->holdEffects[opposingBattler])) return TRUE; - else if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(opponent, TYPE_STEEL)) + else if (ability == ABILITY_MAGNET_PULL && IS_BATTLER_OF_TYPE(opposingBattler, TYPE_STEEL)) return TRUE; else return FALSE; @@ -2121,73 +2033,89 @@ static inline bool32 CanSwitchinWin1v1(u32 hitsToKOAI, u32 hitsToKOPlayer, bool3 // Everything runs in the same loop to minimize computation time. This makes it harder to read, but hopefully the comments can guide you! static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, enum SwitchType switchType) { - int revengeKillerId = PARTY_SIZE, slowRevengeKillerId = PARTY_SIZE, fastThreatenId = PARTY_SIZE, slowThreatenId = PARTY_SIZE, damageMonId = PARTY_SIZE, generic1v1MonId = PARTY_SIZE; - int batonPassId = PARTY_SIZE, typeMatchupId = PARTY_SIZE, typeMatchupEffectiveId = PARTY_SIZE, defensiveMonId = PARTY_SIZE, aceMonId = PARTY_SIZE, trapperId = PARTY_SIZE; - int i, j, aliveCount = 0, bits = 0, aceMonCount = 0; + struct IncomingHealInfo healInfoData; + const struct IncomingHealInfo *healInfo = &healInfoData; + u32 revengeKillerIds = 0, slowRevengeKillerIds = 0, fastThreatenIds = 0, slowThreatenIds = 0, damageMonIds = 0, generic1v1MonIds = 0; + u32 batonPassIds = 0, typeMatchupIds = 0, typeMatchupEffectiveIds = 0, defensiveMonIds = 0, trapperIds = 0, healingCandidateIds = 0; + u32 aceMonId = PARTY_SIZE, aceMonCount = 0; s32 defensiveMonHitKOThreshold = 3; // 3HKO threshold that candidate defensive mons must exceed - s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0; - u32 aiMove, hitsToKOAI, hitsToKOPlayer, hitsToKOAIPriority, bestPlayerMove = MOVE_NONE, bestPlayerPriorityMove = MOVE_NONE, maxHitsToKO = 0; - u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattleMonTypeMatchup + s32 playerMonHP = gBattleMons[opposingBattler].hp, maxDamageDealt = 0, damageDealt = 0, bestHealGain = 0; + enum Move aiMove, bestPlayerMove = MOVE_NONE, bestPlayerPriorityMove = MOVE_NONE; + u32 hitsToKOAI, hitsToKOPlayer, hitsToKOAIPriority, maxHitsToKO = 0; + u32 bestResist = UQ_4_12(2.0), bestResistEffective = UQ_4_12(2.0), typeMatchup; // 2.0 is the default "Neutral" matchup from GetBattlerTypeMatchup bool32 isFreeSwitch = IsFreeSwitch(switchType, battlerIn1, opposingBattler), isSwitchinFirst, isSwitchinFirstPriority, canSwitchinWin1v1; - u32 invalidMons = 0; - uq4_12_t effectiveness = UQ_4_12(1.0); + u32 validMonIds = 0; + + GetIncomingHealInfo(battler, &healInfoData); + + // Save existing battler data + struct AiLogicData *savedAiLogicData = AllocSaveAiLogicData(); + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); // Iterate through mons - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { // Check mon validity - if (!IsValidForBattle(&party[i]) - || gBattlerPartyIndexes[battlerIn1] == i - || gBattlerPartyIndexes[battlerIn2] == i - || i == gBattleStruct->monToSwitchIntoId[battlerIn1] - || i == gBattleStruct->monToSwitchIntoId[battlerIn2]) + if (!IsValidForBattle(&party[monIndex]) || IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) { - invalidMons |= 1u << i; continue; } // Save Ace Pokemon for last - else if (IsAceMon(battler, i)) + else if (IsAceMon(battler, monIndex)) { - aceMonId = i; + aceMonId = monIndex; aceMonCount++; - invalidMons |= 1u << i; continue; } else - aliveCount++; + { + validMonIds |= (1u << monIndex); + } - InitializeSwitchinCandidate(&party[i]); + InitializeSwitchinCandidate(battler, &party[monIndex]); + + u32 originalHp = gBattleMons[battler].hp; + + if (healInfo->healBeforeHazards) + { + gBattleMons[battler].hp = gBattleMons[battler].maxHP; + if (healInfo->curesStatus) + gBattleMons[battler].status1 = 0; + } // While not really invalid per se, not really wise to switch into this mon - if (gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) + if (gAiLogicData->abilities[battler] == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) continue; // Get max number of hits for player to KO AI mon and type matchup for defensive switching - hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerMove), battler); - hitsToKOAIPriority = GetSwitchinHitsToKO(GetMaxPriorityDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &bestPlayerPriorityMove), battler); - typeMatchup = GetBattleMonTypeMatchup(gBattleMons[opposingBattler], gAiLogicData->switchinCandidate.battleMon); + hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, &bestPlayerMove), battler, healInfo, originalHp); + hitsToKOAIPriority = GetSwitchinHitsToKO(GetMaxPriorityDamagePlayerCouldDealToSwitchin(battler, opposingBattler, &bestPlayerPriorityMove), battler, healInfo, originalHp); + typeMatchup = GetBattlerTypeMatchup(opposingBattler, battler); + canSwitchinWin1v1 = FALSE; + bool32 anyMoveCanWin1v1 = FALSE; // Check through current mon's moves - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { // Check that move has PP remaining before running calcs - if (gAiLogicData->switchinCandidate.battleMon.pp[j] < 1) + if (gBattleMons[battler].pp[moveIndex] < 1) continue; - aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; - damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, &effectiveness, AI_ATTACKING); - hitsToKOPlayer = GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler); + aiMove = gBattleMons[battler].moves[moveIndex]; + damageDealt = AI_GetDamage(battler, opposingBattler, moveIndex, AI_ATTACKING, gAiLogicData); + hitsToKOPlayer = GetNoOfHitsToKOBattler(battler, opposingBattler, moveIndex, AI_ATTACKING, CONSIDER_ENDURE); // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 - isSwitchinFirst = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerMove, CONSIDER_PRIORITY); - isSwitchinFirstPriority = AI_IsPartyMonFaster(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); + isSwitchinFirst = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerMove, CONSIDER_PRIORITY); + isSwitchinFirstPriority = AI_IsFaster(battler, opposingBattler, aiMove, bestPlayerPriorityMove, CONSIDER_PRIORITY); canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, hitsToKOPlayer, isSwitchinFirst, isFreeSwitch) && CanSwitchinWin1v1(hitsToKOAIPriority, hitsToKOPlayer, isSwitchinFirstPriority, isFreeSwitch); // AI must successfully 1v1 with and without priority to be considered a good option + anyMoveCanWin1v1 |= canSwitchinWin1v1; // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not if (GetMoveEffect(aiMove) == EFFECT_BATON_PASS) { if ((isSwitchinFirst && hitsToKOAI > 1) || hitsToKOAI > 2) // Need to take an extra hit if slower - bits |= 1u << i; + batonPassIds |= (1u << monIndex); } // Check that good type matchups get at least two turns and set best type matchup mon @@ -2196,7 +2124,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, if (canSwitchinWin1v1) { bestResist = typeMatchup; - typeMatchupId = i; + typeMatchupIds |= (1u << monIndex); } } @@ -2205,31 +2133,29 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, { maxHitsToKO = hitsToKOAI; if (maxHitsToKO > defensiveMonHitKOThreshold) - defensiveMonId = i; + defensiveMonIds |= (1u << monIndex); } if (canSwitchinWin1v1) - generic1v1MonId = i; + generic1v1MonIds |= (1u << monIndex); // Check for mon with resistance and super effective move for best type matchup mon with effective move if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { if (typeMatchup < bestResistEffective) { - if (effectiveness >= UQ_4_12(2.0)) + if (gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] >= UQ_4_12(2.0)) { if (canSwitchinWin1v1) { bestResistEffective = typeMatchup; - typeMatchupEffectiveId = i; + typeMatchupEffectiveIds |= (1u << monIndex); } } } // If a self destruction move doesn't OHKO, don't factor it into revenge killing - enum BattleMoveEffects aiEffect = GetMoveEffect(aiMove); - if ((aiEffect == EFFECT_EXPLOSION || aiEffect == EFFECT_MISTY_EXPLOSION) - && damageDealt < playerMonHP) + if (IsExplosionMove(aiMove) && damageDealt < playerMonHP) continue; // Check that mon isn't one shot and set best damage mon @@ -2238,101 +2164,220 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, if ((isFreeSwitch && hitsToKOAI > 1) || hitsToKOAI > 2) // This is a "default", we have uniquely low standards { maxDamageDealt = damageDealt; - damageMonId = i; + damageMonIds |= (1u << monIndex); } } // Check if current mon can revenge kill in some capacity // If AI mon can one shot - if (damageDealt > playerMonHP) + if (damageDealt >= playerMonHP) { if (canSwitchinWin1v1) { if (isSwitchinFirst) - revengeKillerId = i; + revengeKillerIds |= (1u << monIndex); else - slowRevengeKillerId = i; + slowRevengeKillerIds |= (1u << monIndex); } } // If AI mon can two shot - if (damageDealt > playerMonHP / 2) + if (damageDealt >= (playerMonHP / 2 + playerMonHP % 2)) // Modulo to handle odd numbers in non-decimal division { if (canSwitchinWin1v1) { if (isSwitchinFirst) - fastThreatenId = i; + fastThreatenIds |= (1u << monIndex); else - slowThreatenId = i; + slowThreatenIds |= (1u << monIndex); } } // If mon can trap - if ((CanAbilityTrapOpponent(gAiLogicData->switchinCandidate.battleMon.ability, opposingBattler) - || (CanAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) - && CountUsablePartyMons(opposingBattler) > 0 + if ((AI_CanSwitchinAbilityTrapOpponent(gAiLogicData->abilities[battler], opposingBattler) + || (AI_CanSwitchinAbilityTrapOpponent(gAiLogicData->abilities[opposingBattler], opposingBattler) && gAiLogicData->abilities[battler] == ABILITY_TRACE)) && canSwitchinWin1v1) - trapperId = i; + trapperIds |= (1u << monIndex); + } + } + + // Check for healing candidate - mon that benefits significantly from incoming heal + if (healInfo->hasHealing) + { + u32 maxHP = gBattleMons[battler].maxHP; + s32 healGain = (s32)maxHP - (s32)originalHp; + + // For Wish, heal gain is the wish amount (capped at what can actually be gained) + if (healInfo->healEndOfTurn && !healInfo->healBeforeHazards && !healInfo->healAfterHazards) + { + healGain = healInfo->healAmount; + if (healGain > (s32)(maxHP - originalHp)) + healGain = (s32)(maxHP - originalHp); + } + + // Require significant heal gain (at least 25% of max HP), must win 1v1 with at least one move, and pick the best + if (anyMoveCanWin1v1 && healGain > (s32)(maxHP / 4) && healGain > bestHealGain) + { + bestHealGain = healGain; + healingCandidateIds |= (1u << monIndex); } } } - batonPassId = GetRandomSwitchinWithBatonPass(aliveCount, bits, firstId, lastId, i); + // Restore battler data + FreeRestoreAiLogicData(savedAiLogicData); + FreeRestoreBattleMons(savedBattleMons); + SetBattlerAiData(battler, gAiLogicData); // Different switching priorities depending on switching mid battle vs switching after a KO or slow switch if (isFreeSwitch) { - // Return Trapper > Revenge Killer > Type Matchup > Baton Pass > Best Damage - if (trapperId != PARTY_SIZE) return trapperId; - else if (revengeKillerId != PARTY_SIZE) return revengeKillerId; - else if (slowRevengeKillerId != PARTY_SIZE) return slowRevengeKillerId; - else if (fastThreatenId != PARTY_SIZE) return fastThreatenId; - else if (slowThreatenId != PARTY_SIZE) return slowThreatenId; - else if (typeMatchupEffectiveId != PARTY_SIZE) return typeMatchupEffectiveId; - else if (typeMatchupId != PARTY_SIZE) return typeMatchupId; - else if (batonPassId != PARTY_SIZE) return batonPassId; - else if (generic1v1MonId != PARTY_SIZE) return generic1v1MonId; - else if (damageMonId != PARTY_SIZE) return damageMonId; + // Return Trapper > Revenge Killer > Type Matchup > Healing Candidate > Baton Pass > Best Damage + if (trapperIds != 0) return GetSwitchinCandidate(trapperIds, battler, firstId, lastId, switchType); + else if (revengeKillerIds != 0) return GetSwitchinCandidate(revengeKillerIds, battler, firstId, lastId, switchType); + else if (slowRevengeKillerIds != 0) return GetSwitchinCandidate(slowRevengeKillerIds, battler, firstId, lastId, switchType); + else if (fastThreatenIds != 0) return GetSwitchinCandidate(fastThreatenIds, battler, firstId, lastId, switchType); + else if (slowThreatenIds != 0) return GetSwitchinCandidate(slowThreatenIds, battler, firstId, lastId, switchType); + else if (typeMatchupEffectiveIds != 0) return GetSwitchinCandidate(typeMatchupEffectiveIds, battler, firstId, lastId, switchType); + else if (typeMatchupIds != 0) return GetSwitchinCandidate(typeMatchupIds, battler, firstId, lastId, switchType); + else if (healingCandidateIds != 0) return GetSwitchinCandidate(healingCandidateIds, battler, firstId, lastId, switchType); + else if (batonPassIds != 0) return GetSwitchinCandidate(batonPassIds, battler, firstId, lastId, switchType); + else if (generic1v1MonIds != 0) return GetSwitchinCandidate(generic1v1MonIds, battler, firstId, lastId, switchType); + else if (damageMonIds != 0) return GetSwitchinCandidate(damageMonIds, battler, firstId, lastId, switchType); } else { - // Return Trapper > Type Matchup > Best Defensive > Baton Pass - if (trapperId != PARTY_SIZE) return trapperId; - else if (typeMatchupEffectiveId != PARTY_SIZE) return typeMatchupEffectiveId; - else if (typeMatchupId != PARTY_SIZE) return typeMatchupId; - else if (defensiveMonId != PARTY_SIZE) return defensiveMonId; - else if (batonPassId != PARTY_SIZE) return batonPassId; - else if (generic1v1MonId != PARTY_SIZE) return generic1v1MonId; + // Return Trapper > Type Matchup > Best Defensive > Healing Candidate > Baton Pass + if (trapperIds != 0) return GetSwitchinCandidate(trapperIds, battler, firstId, lastId, switchType); + else if (typeMatchupEffectiveIds != 0) return GetSwitchinCandidate(typeMatchupEffectiveIds, battler, firstId, lastId, switchType); + else if (typeMatchupIds != 0) return GetSwitchinCandidate(typeMatchupIds, battler, firstId, lastId, switchType); + else if (defensiveMonIds != 0) return GetSwitchinCandidate(defensiveMonIds, battler, firstId, lastId, switchType); + else if (healingCandidateIds != 0) return GetSwitchinCandidate(healingCandidateIds, battler, firstId, lastId, switchType); + else if (batonPassIds != 0) return GetSwitchinCandidate(batonPassIds, battler, firstId, lastId, switchType); + else if (generic1v1MonIds != 0) return GetSwitchinCandidate(generic1v1MonIds, battler, firstId, lastId, switchType); } - // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) - return aceMonId; + + // Not required to switch here and no good candidates, bail + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; // Fallback - u32 bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons, battlerIn1, battlerIn2); - if (bestMonId != PARTY_SIZE) - return bestMonId; + if (validMonIds != 0) + return GetValidSwitchinCandidate(validMonIds, battler, firstId, lastId, switchType); + + // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) + return aceMonId; + + return PARTY_SIZE; +} + +static u32 GetBestMonVanilla(struct Pokemon *party, int firstId, int lastId, u32 battler, u32 opposingBattler, u32 battlerIn1, u32 battlerIn2, enum SwitchType switchType) +{ + s32 aceMonCount = 0; + u32 validMonIds = 0, batonPassIds = 0, typeMatchupIds = 0, bestDamageId = PARTY_SIZE, aceMonId = PARTY_SIZE; + u32 bestResist = UQ_4_12(2.0), typeMatchup, bestDamage = 0; + + // Save existing battler data + struct AiLogicData *savedAiLogicData = AllocSaveAiLogicData(); + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); + + // Iterate through mons + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) + { + // Check mon validity + if (!IsValidForBattle(&party[monIndex]) || IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) + { + continue; + } + // Save Ace Pokemon for last + else if (IsAceMon(battler, monIndex)) + { + aceMonId = monIndex; + aceMonCount++; + continue; + } + else + { + validMonIds |= (1u << monIndex); + } + InitializeSwitchinCandidate(battler, &party[monIndex]); + + // While not really invalid per se, not really wise to switch into this mon + if (gAiLogicData->abilities[battler] == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) + continue; + + typeMatchup = GetBattlerTypeMatchup(opposingBattler, battler); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + // Check that move has PP remaining before running calcs + if (gBattleMons[battler].pp[moveIndex] < 1) + continue; + + u32 aiMove = gBattleMons[battler].moves[moveIndex]; + + // Baton Pass + if (GetMoveEffect(aiMove) == EFFECT_BATON_PASS) + { + batonPassIds |= (1u << monIndex); + } + + // Type Matchup + if (typeMatchup < bestResist && gAiLogicData->effectiveness[battler][opposingBattler][moveIndex] >= UQ_4_12(2.0)) + { + bestResist = typeMatchup; + typeMatchupIds |= (1u << monIndex); + } + + // Best damage + if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) + { + u32 aiDmg = AI_GetDamage(battler, opposingBattler, moveIndex, AI_ATTACKING, gAiLogicData); + if (aiDmg > bestDamage) + { + bestDamage = aiDmg; + bestDamageId = monIndex; + } + } + } + } + + // Restore battler data + FreeRestoreAiLogicData(savedAiLogicData); + FreeRestoreBattleMons(savedBattleMons); + SetBattlerAiData(battler, gAiLogicData); + + // Baton Pass > Type Matchup > Best Damage + if (batonPassIds != 0) return GetSwitchinCandidate(batonPassIds, battler, firstId, lastId, switchType); + else if (typeMatchupIds != 0) return GetSwitchinCandidate(typeMatchupIds, battler, firstId, lastId, switchType); + else if (bestDamageId != PARTY_SIZE) return bestDamageId; + + // Not required to switch here and no good candidates, bail + if (switchType == SWITCH_MID_BATTLE_OPTIONAL) + return PARTY_SIZE; + + // Fallback + if (validMonIds != 0) + return GetValidSwitchinCandidate(validMonIds, battler, firstId, lastId, switchType); + + if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount) + return aceMonId; return PARTY_SIZE; } static u32 GetNextMonInParty(struct Pokemon *party, int firstId, int lastId, u32 battlerIn1, u32 battlerIn2) { - u32 i; // Iterate through mons - for (i = firstId; i < lastId; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { // Check mon validity - if (!IsValidForBattle(&party[i]) - || gBattlerPartyIndexes[battlerIn1] == i - || gBattlerPartyIndexes[battlerIn2] == i - || i == gBattleStruct->monToSwitchIntoId[battlerIn1] - || i == gBattleStruct->monToSwitchIntoId[battlerIn2]) + if (!IsValidForBattle(&party[monIndex]) || IsPartyMonOnFieldOrChosenToSwitch(monIndex, battlerIn1, battlerIn2)) { continue; } - return i; + return monIndex; } return PARTY_SIZE; } @@ -2351,25 +2396,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return gBattlerPartyIndexes[battler] + 1; - if (IsDoubleBattle()) - { - battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) - battlerIn2 = battler; - else - battlerIn2 = GetPartnerBattler(battler); - - opposingBattler = BATTLE_OPPOSITE(battlerIn1); - if (gAbsentBattlerFlags & (1u << opposingBattler)) - opposingBattler ^= BIT_FLANK; - } - else - { - opposingBattler = GetOppositeBattler(battler); - battlerIn1 = battler; - battlerIn2 = battler; - } - + opposingBattler = GetActiveBattlerIds(battler, &battlerIn1, &battlerIn2); GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); @@ -2389,264 +2416,90 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) // This all handled by the GetBestMonIntegrated function if the AI_FLAG_SMART_MON_CHOICES flag is set else { - s32 i, aliveCount = 0, aceMonCount = 0; - u32 invalidMons = 0, aceMonId = PARTY_SIZE; - // Get invalid slots ids. - for (i = firstId; i < lastId; i++) - { - if (!IsValidForBattle(&party[i]) - || gBattlerPartyIndexes[battlerIn1] == i - || gBattlerPartyIndexes[battlerIn2] == i - || i == gBattleStruct->monToSwitchIntoId[battlerIn1] - || i == gBattleStruct->monToSwitchIntoId[battlerIn2] - || (GetMonAbility(&party[i]) == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler))) // While not really invalid per se, not really wise to switch into this mon. - { - invalidMons |= 1u << i; - } - else if (IsAceMon(battler, i)) // Save Ace Pokemon for last. - { - aceMonId = i; - aceMonCount++; - invalidMons |= 1u << i; - } - else - { - aliveCount++; - } - } - bestMonId = GetBestMonBatonPass(party, firstId, lastId, invalidMons, aliveCount, battler, opposingBattler); - if (bestMonId != PARTY_SIZE) - return bestMonId; - - bestMonId = GetBestMonTypeMatchup(party, firstId, lastId, invalidMons, battler, opposingBattler); - if (bestMonId != PARTY_SIZE) - return bestMonId; - - bestMonId = GetBestMonDmg(party, firstId, lastId, invalidMons, battler, opposingBattler); - if (bestMonId != PARTY_SIZE) - return bestMonId; - - // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. - if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) - return aceMonId; - - // Fallback - bestMonId = GetFirstNonInvalidMon(firstId, lastId, invalidMons, battlerIn1, battlerIn2); - if (bestMonId != PARTY_SIZE) - return bestMonId; - - return PARTY_SIZE; + bestMonId = GetBestMonVanilla(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); + return bestMonId; } } -static bool32 AiExpectsToFaintPlayer(u32 battler) +u32 AI_SelectRevivalBlessingMon(u32 battler) { - u8 target = gAiBattleData->chosenTarget[battler]; + s32 firstId = 0, lastId = 0; + u32 opposingBattler = 0; + struct Pokemon *party = GetBattlerParty(battler); + u32 bestMonId = PARTY_SIZE; + s32 bestScore = -1; - if (gAiBattleData->actionFlee || gAiBattleData->choiceWatch) - return FALSE; // AI not planning to use move - - if (!IsBattlerAlly(target, battler) - && CanIndexMoveFaintTarget(battler, target, gAiBattleData->chosenMoveIndex[battler], AI_ATTACKING) - && AI_IsFaster(battler, target, GetAIChosenMove(battler), GetIncomingMove(battler, target, gAiLogicData), CONSIDER_PRIORITY)) + if (IsDoubleBattle()) { - // We expect to faint the target and move first -> dont use an item - return TRUE; + opposingBattler = BATTLE_OPPOSITE(battler); + if (gAbsentBattlerFlags & (1u << opposingBattler)) + opposingBattler ^= BIT_FLANK; + } + else + { + opposingBattler = GetOppositeBattler(battler); } - return FALSE; -} + // Save existing battler data + struct AiLogicData *savedAiLogicData = AllocSaveAiLogicData(); + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); -static bool32 ShouldUseItem(u32 battler) -{ - struct Pokemon *party; - s32 i; - u8 validMons = 0; - bool32 shouldUse = FALSE; - u32 healAmount = 0; + GetAIPartyIndexes(battler, &firstId, &lastId); - if (IsAiVsAiBattle()) - return FALSE; - - // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop - if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) - || gBattleMons[battler].volatiles.semiInvulnerable == STATE_SKY_DROP) - return FALSE; - - if (gBattleMons[battler].volatiles.embargo) - return FALSE; - - if (AiExpectsToFaintPlayer(battler)) - return FALSE; - - party = GetBattlerParty(battler); - - for (i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (IsValidForBattle(&party[i])) - { - validMons++; - } - } + if (GetMonData(&party[monIndex], MON_DATA_HP) != 0) + continue; // Only consider fainted mons - for (i = 0; i < MAX_TRAINER_ITEMS; i++) - { - u16 item; - const u8 *itemEffects; - u8 battlerSide; + bool32 isAceMon = IsAceMon(battler, monIndex); - item = gBattleHistory->trainerItems[i]; - if (item == ITEM_NONE) - continue; - itemEffects = GetItemEffect(item); - if (itemEffects == NULL) + InitializeSwitchinCandidate(battler, &party[monIndex]); + gBattleMons[battler].hp = gBattleMons[battler].maxHP / 2; // Revival Blessing restores half HP + gBattleMons[battler].status1 = 0; + + // Avoid reviving something that will immediately faint to hazards + if (GetSwitchinHazardsDamage(battler) >= gBattleMons[battler].hp) continue; - switch (GetItemBattleUsage(item)) + s32 bestDamage = 0; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - case EFFECT_ITEM_HEAL_AND_CURE_STATUS: - healAmount = GetHPHealAmount(itemEffects[GetItemEffectParamOffset(battler, item, 4, ITEM4_HEAL_HP)], GetBattlerMon(battler)); - shouldUse = AI_ShouldHeal(battler, healAmount); - break; - case EFFECT_ITEM_RESTORE_HP: - healAmount = GetHPHealAmount(itemEffects[GetItemEffectParamOffset(battler, item, 4, ITEM4_HEAL_HP)], GetBattlerMon(battler)); - shouldUse = AI_ShouldHeal(battler, healAmount); - break; - case EFFECT_ITEM_CURE_STATUS: - if ((itemEffects[3] & ITEM3_SLEEP && gBattleMons[battler].status1 & STATUS1_SLEEP) - || (itemEffects[3] & ITEM3_POISON && gBattleMons[battler].status1 & STATUS1_PSN_ANY) - || (itemEffects[3] & ITEM3_BURN && gBattleMons[battler].status1 & STATUS1_BURN) - || (itemEffects[3] & ITEM3_FREEZE && gBattleMons[battler].status1 & STATUS1_ICY_ANY) - || (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[battler].status1 & STATUS1_PARALYSIS) - || (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[battler].volatiles.confusionTurns > 0)) - shouldUse = ShouldCureStatusWithItem(battler, battler, gAiLogicData); - break; - case EFFECT_ITEM_INCREASE_STAT: - case EFFECT_ITEM_INCREASE_ALL_STATS: - if (!gDisableStructs[battler].isFirstTurn - || AI_OpponentCanFaintAiWithMod(battler, 0)) - break; - shouldUse = TRUE; - break; - case EFFECT_ITEM_SET_FOCUS_ENERGY: - if (!gDisableStructs[battler].isFirstTurn - || gBattleMons[battler].volatiles.dragonCheer - || gBattleMons[battler].volatiles.focusEnergy - || AI_OpponentCanFaintAiWithMod(battler, 0)) - break; - shouldUse = TRUE; - break; - case EFFECT_ITEM_SET_MIST: - battlerSide = GetBattlerSide(battler); - if (gDisableStructs[battler].isFirstTurn && !(gSideStatuses[battlerSide] & SIDE_STATUS_MIST)) - shouldUse = TRUE; - break; - case EFFECT_ITEM_REVIVE: - gBattleStruct->itemPartyIndex[battler] = GetFirstFaintedPartyIndex(battler); - if (gBattleStruct->itemPartyIndex[battler] != PARTY_SIZE) // Revive if possible. - shouldUse = TRUE; - break; - case EFFECT_ITEM_USE_POKE_FLUTE: - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - shouldUse = TRUE; - break; - default: - return FALSE; + enum Move aiMove = gBattleMons[battler].moves[moveIndex]; + if (aiMove == MOVE_NONE || gBattleMons[battler].pp[moveIndex] == 0) + continue; + + s32 damage = AI_GetDamage(battler, opposingBattler, moveIndex, AI_ATTACKING, gAiLogicData); + if (damage > bestDamage) + bestDamage = damage; } - if (shouldUse) + + u32 typeMatchup = GetBattlerTypeMatchup(opposingBattler, battler); + s32 score = bestDamage + gBattleMons[battler].maxHP; + + // Reviving the ace is usually high value. give it a small bonus but still let matchup/coverage decide + if (isAceMon) + score += gBattleMons[battler].maxHP / 3; + + // Prefer mons that don't face a terrible defensive matchup on entry + if (typeMatchup < UQ_4_12(1.0)) + score += gBattleMons[battler].maxHP / 4; + else if (typeMatchup > UQ_4_12(4.0)) + score -= gBattleMons[battler].maxHP / 4; + + if (score > bestScore) { - // Set selected party ID to current battler if none chosen. - if (gBattleStruct->itemPartyIndex[battler] == PARTY_SIZE) - gBattleStruct->itemPartyIndex[battler] = gBattlerPartyIndexes[battler]; - BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); - gBattleStruct->chosenItem[battler] = item; - gBattleHistory->trainerItems[i] = 0; - return shouldUse; + bestScore = score; + bestMonId = monIndex; } } - return FALSE; -} - -static bool32 AI_ShouldHeal(u32 battler, u32 healAmount) -{ - bool32 shouldHeal = FALSE; - u8 opponent; - u32 maxDamage = 0; - u32 dmg = 0; - - if (gBattleMons[battler].hp < gBattleMons[battler].maxHP / 4 - || gBattleMons[battler].hp == 0 - || (healAmount != 0 && gBattleMons[battler].maxHP - gBattleMons[battler].hp > healAmount)) - { - // We have low enough HP to consider healing - shouldHeal = !AI_OpponentCanFaintAiWithMod(battler, healAmount); // if target can kill us even after we heal, why bother - } - - //calculate max expected damage from the opponent - for (opponent = 0; opponent < gBattlersCount; opponent++) - { - if (IsOnPlayerSide(opponent)) - { - dmg = GetBestDmgFromBattler(opponent, battler, AI_DEFENDING); - - if (dmg > maxDamage) - maxDamage = dmg; - } - } - - // also heal if a 2HKO is outhealed - if (AI_OpponentCanFaintAiWithMod(battler, 0) - && !AI_OpponentCanFaintAiWithMod(battler, healAmount) - && healAmount > 2*maxDamage) - return TRUE; - - // also heal, if the expected damage is outhealed and it's the last remaining mon - if (AI_OpponentCanFaintAiWithMod(battler, 0) - && !AI_OpponentCanFaintAiWithMod(battler, healAmount) - && CountUsablePartyMons(battler) == 0) - return TRUE; - - return shouldHeal; -} - -static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount) -{ - u32 i; - // Check special cases to NOT heal - for (i = 0; i < gBattlersCount; i++) - { - if (IsOnPlayerSide(i) && CanTargetFaintAiWithMod(i, battler, healAmount, 0)) - { - // Target is expected to faint us - return TRUE; - } - } - return FALSE; -} - -static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon) -{ - switch (itemEffectParam) - { - case ITEM6_HEAL_HP_FULL: - itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL); - break; - case ITEM6_HEAL_HP_HALF: - itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2; - if (itemEffectParam == 0) - itemEffectParam = 1; - break; - case ITEM6_HEAL_HP_LVL_UP: - itemEffectParam = gBattleScripting.levelUpHP; - break; - case ITEM6_HEAL_HP_QUARTER: - itemEffectParam = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 4; - if (itemEffectParam == 0) - itemEffectParam = 1; - break; - } - - return itemEffectParam; + // Restore battler data + FreeRestoreAiLogicData(savedAiLogicData); + FreeRestoreBattleMons(savedBattleMons); + SetBattlerAiData(battler, gAiLogicData); + + if (bestMonId == PARTY_SIZE) + bestMonId = GetFirstFaintedPartyIndex(battler); + + return bestMonId; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d0b849618..4530ebe79 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -6,7 +6,7 @@ #include "battle_ai_field_statuses.h" #include "battle_ai_util.h" #include "battle_ai_main.h" -#include "battle_ai_switch_items.h" +#include "battle_controllers.h" // #include "battle_factory.h" #include "battle_setup.h" #include "event_data.h" @@ -24,10 +24,10 @@ #include "constants/items.h" static u32 GetAIEffectGroup(enum BattleMoveEffects effect); -static u32 GetAIEffectGroupFromMove(u32 battler, u32 move); +static u32 GetAIEffectGroupFromMove(u32 battler, enum Move move); // Functions -static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, u32 holdEffectDef, u32 move) +enum Ability AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectDef, enum Move move) { if (MoveIgnoresTargetAbility(move)) return ABILITY_NONE; @@ -38,10 +38,10 @@ static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilit return abilityDef; } -static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) +static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, enum Move move) { u32 numOfTargets = 0; - u32 moveTargetType = GetBattlerMoveTargetType(battlerAtk, move); + enum MoveTarget moveTargetType = AI_GetBattlerMoveTargetType(battlerAtk, move); if (!IsSpreadMove(moveTargetType)) return FALSE; @@ -51,10 +51,10 @@ static bool32 AI_IsDoubleSpreadMove(u32 battlerAtk, u32 move) if (battlerAtk == battlerDef) continue; - if (moveTargetType == MOVE_TARGET_BOTH && battlerAtk == BATTLE_PARTNER(battlerDef)) + if (moveTargetType == TARGET_BOTH && battlerAtk == BATTLE_PARTNER(battlerDef)) continue; - if (IsBattlerAlive(battlerDef) && !IsSemiInvulnerable(battlerDef, move)) + if (IsBattlerAlive(battlerDef) && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) numOfTargets++; } @@ -69,6 +69,26 @@ bool32 AI_IsBattlerGrounded(u32 battler) return IsBattlerGrounded(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler]); } +static u32 AI_CanBattlerHitBothFoesInTerrain(u32 battler, enum Move move, enum BattleMoveEffects effect) +{ + return effect == EFFECT_TERRAIN_BOOST + && GetMoveTerrainBoost_HitsBothFoes(move) + && IsBattlerTerrainAffected(battler, gAiLogicData->abilities[battler], gAiLogicData->holdEffects[battler], gFieldStatuses, GetMoveTerrainBoost_Terrain(move)); +} + +enum MoveTarget AI_GetBattlerMoveTargetType(u32 battler, enum Move move) +{ + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + return TARGET_USER; + if (AI_CanBattlerHitBothFoesInTerrain(battler, move, effect)) + return TARGET_BOTH; + if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) + return TARGET_BOTH; + + return GetMoveTarget(move); +} + u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, struct AiLogicData *aiData) { if (calcContext == AI_ATTACKING && BattlerHasAi(battlerAtk)) @@ -94,27 +114,17 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC } } -bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, enum Move aiMove, enum Move playerMove, enum ConsiderPriority considerPriority) { return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_FASTER); } -bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) +bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, enum Move aiMove, enum Move playerMove, enum ConsiderPriority considerPriority) { return (AI_WhoStrikesFirst(battlerAi, battlerDef, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); } -bool32 AI_IsPartyMonFaster(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) -{ - return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_FASTER); -} - -bool32 AI_IsPartyMonSlower(u32 battlerAi, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMove, u32 playerMove, enum ConsiderPriority considerPriority) -{ - return (AI_WhoStrikesFirstPartyMon(battlerAi, battlerDef, switchinCandidate, aiMove, playerMove, considerPriority) == AI_IS_SLOWER); -} - -u32 GetAIChosenMove(u32 battlerId) +enum Move GetAIChosenMove(u32 battlerId) { return (gBattleMons[battlerId].moves[gAiBattleData->chosenMoveIndex[battlerId]]); } @@ -126,54 +136,36 @@ bool32 AI_RandLessThan(u32 val) return FALSE; } -bool32 IsAiVsAiBattle(void) +bool32 IsAiFlagPresent(u64 flag) { - return (B_FLAG_AI_VS_AI_BATTLE && FlagGet(B_FLAG_AI_VS_AI_BATTLE)); -} - -bool32 BattlerHasAi(u32 battlerId) -{ - switch (GetBattlerPosition(battlerId)) + for (u32 battlerIndex = 0; battlerIndex < MAX_BATTLERS_COUNT; battlerIndex++) { - case B_POSITION_PLAYER_LEFT: - if (IsAiVsAiBattle()) + if (gAiThinkingStruct->aiFlags[battlerIndex] & flag) return TRUE; - default: - return FALSE; - case B_POSITION_OPPONENT_LEFT: - return TRUE; - case B_POSITION_PLAYER_RIGHT: - if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || IsAiVsAiBattle()) - return TRUE; - else - return FALSE; - case B_POSITION_OPPONENT_RIGHT: - return TRUE; } + + return FALSE; } bool32 IsAiBattlerAware(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT) + if (IsAiFlagPresent(AI_FLAG_OMNISCIENT)) return TRUE; return BattlerHasAi(battlerId); } -bool32 IsAiBattlerAssumingStab() +bool32 IsAiBattlerAssumingStab(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STAB - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STAB) + if (IsAiFlagPresent(AI_FLAG_ASSUME_STAB)) return TRUE; return FALSE; } -bool32 IsAiBattlerAssumingStatusMoves() +bool32 IsAiBattlerAssumingStatusMoves(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_ASSUME_STATUS_MOVES - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_ASSUME_STATUS_MOVES) + if (IsAiFlagPresent(AI_FLAG_ASSUME_STATUS_MOVES)) return TRUE; return FALSE; @@ -181,44 +173,52 @@ bool32 IsAiBattlerAssumingStatusMoves() bool32 IsAiBattlerPredictingAbility(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) + if (IsAiFlagPresent(AI_FLAG_WEIGH_ABILITY_PREDICTION)) return TRUE; - return BattlerHasAi(battlerId); + return FALSE; } -bool32 CanAiPredictMove(void) +bool32 CanAiPredictMove(u32 battlerId) { - return gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_MOVE - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_MOVE; + if (IsAiFlagPresent(AI_FLAG_PREDICT_MOVE)) + return TRUE; + + return FALSE; } bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_PREDICT_SWITCH - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_PREDICT_SWITCH) + for (u32 battlerIndex = 0; battlerIndex < MAX_BATTLERS_COUNT; battlerIndex++) { - if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) - return TRUE; + if (gAiThinkingStruct->aiFlags[battlerIndex] & AI_FLAG_PREDICT_SWITCH) + { + if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) + return TRUE; + } } return FALSE; } // Either a predicted move or the last used move from an opposing battler -u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) +enum Move GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) { - if (aiData->predictingMove && CanAiPredictMove()) + if (aiData->predictingMove && CanAiPredictMove(battler)) return aiData->predictedMove[opposingBattler]; return aiData->lastUsedMove[opposingBattler]; } // When not predicting, don't want to reference player's previous move; leads to weird behaviour for cases like Fake Out or Protect, especially in doubles -u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) +enum Move GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) { - if (aiData->predictingMove && CanAiPredictMove()) - return aiData->predictedMove[opposingBattler]; + if (aiData->predictingMove && CanAiPredictMove(battler)) + { + // Ignore moves that don't do damage or only have priority one time + if (GetMovePower(aiData->predictedMove[opposingBattler]) != 0 && GetMoveEffect(aiData->predictedMove[opposingBattler]) != EFFECT_FIRST_TURN_ONLY) + return aiData->predictedMove[opposingBattler]; + } + return MOVE_NONE; } @@ -229,7 +229,7 @@ void ClearBattlerMoveHistory(u32 battlerId) gBattleHistory->moveHistoryIndex[battlerId] = 0; } -void RecordLastUsedMoveBy(u32 battlerId, u32 move) +void RecordLastUsedMoveBy(u32 battlerId, enum Move move) { u8 *index = &gBattleHistory->moveHistoryIndex[battlerId]; @@ -238,7 +238,7 @@ void RecordLastUsedMoveBy(u32 battlerId, u32 move) gBattleHistory->moveHistory[battlerId][*index] = move; } -void RecordKnownMove(u32 battler, u32 move) +void RecordKnownMove(u32 battler, enum Move move) { s32 moveIndex; @@ -286,21 +286,19 @@ void SaveBattlerData(u32 battlerId) { if (!BattlerHasAi(battlerId) && !gAiThinkingStruct->saved[battlerId].saved) { - u32 i; - gAiThinkingStruct->saved[battlerId].saved = TRUE; gAiThinkingStruct->saved[battlerId].ability = gBattleMons[battlerId].ability; gAiThinkingStruct->saved[battlerId].heldItem = gBattleMons[battlerId].item; gAiThinkingStruct->saved[battlerId].species = gBattleMons[battlerId].species; - for (i = 0; i < 4; i++) - gAiThinkingStruct->saved[battlerId].moves[i] = gBattleMons[battlerId].moves[i]; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + gAiThinkingStruct->saved[battlerId].moves[moveIndex] = gBattleMons[battlerId].moves[moveIndex]; } // Save and restore types even for AI controlled battlers in case it gets changed during move evaluation process. gAiThinkingStruct->saved[battlerId].types[0] = gBattleMons[battlerId].types[0]; gAiThinkingStruct->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; } -bool32 ShouldRecordStatusMove(u32 move) +bool32 ShouldRecordStatusMove(enum Move move) { if (ASSUME_STATUS_MOVES_HAS_TUNING) { @@ -315,7 +313,7 @@ bool32 ShouldRecordStatusMove(u32 move) break; // High odds case EFFECT_AURORA_VEIL: - case EFFECT_CHILLY_RECEPTION: + case EFFECT_WEATHER_AND_SWITCH: case EFFECT_FIRST_TURN_ONLY: case EFFECT_FOLLOW_ME: case EFFECT_INSTRUCT: @@ -362,27 +360,27 @@ bool32 ShouldRecordStatusMove(u32 move) static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) { - u32 i, j; + u32 learnsetMoveIndex; const struct LevelUpMove *learnset; if (gBattleHistory->abilities[battlerId] == ABILITY_ILLUSION) return FALSE; // Don't fall for Illusion if the mon used a move it cannot know. - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 move = gBattleHistory->usedMoves[battlerId][i]; + enum Move move = gBattleHistory->usedMoves[battlerId][moveIndex]; if (move == MOVE_NONE) continue; learnset = GetSpeciesLevelUpLearnset(illusionSpecies); - for (j = 0; learnset[j].move != MOVE_UNAVAILABLE; j++) + for (learnsetMoveIndex = 0; learnset[learnsetMoveIndex].move != MOVE_UNAVAILABLE; learnsetMoveIndex++) { - if (learnset[j].move == move) + if (learnset[learnsetMoveIndex].move == move) break; } // The used move is in the learnsets of the fake species. - if (learnset[j].move != MOVE_UNAVAILABLE) + if (learnset[learnsetMoveIndex].move != MOVE_UNAVAILABLE) continue; // The used move can be learned from Tm/Hm or Move Tutors. @@ -400,7 +398,7 @@ void SetBattlerData(u32 battlerId) { if (!BattlerHasAi(battlerId) && gAiThinkingStruct->saved[battlerId].saved) { - u32 i, species, illusionSpecies, side; + u32 species, illusionSpecies, side; side = GetBattlerSide(battlerId); // Simulate Illusion @@ -432,10 +430,10 @@ void SetBattlerData(u32 battlerId) if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].heldEffect == 0) gBattleMons[battlerId].item = 0; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].moves[i] == 0) - gBattleMons[battlerId].moves[i] = 0; + if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].moves[moveIndex] == 0) + gBattleMons[battlerId].moves[moveIndex] = 0; } } } @@ -444,14 +442,12 @@ void RestoreBattlerData(u32 battlerId) { if (!BattlerHasAi(battlerId) && gAiThinkingStruct->saved[battlerId].saved) { - u32 i; - gAiThinkingStruct->saved[battlerId].saved = FALSE; gBattleMons[battlerId].ability = gAiThinkingStruct->saved[battlerId].ability; gBattleMons[battlerId].item = gAiThinkingStruct->saved[battlerId].heldItem; gBattleMons[battlerId].species = gAiThinkingStruct->saved[battlerId].species; - for (i = 0; i < 4; i++) - gBattleMons[battlerId].moves[i] = gAiThinkingStruct->saved[battlerId].moves[i]; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + gBattleMons[battlerId].moves[moveIndex] = gAiThinkingStruct->saved[battlerId].moves[moveIndex]; } gBattleMons[battlerId].types[0] = gAiThinkingStruct->saved[battlerId].types[0]; gBattleMons[battlerId].types[1] = gAiThinkingStruct->saved[battlerId].types[1]; @@ -474,7 +470,7 @@ bool32 AI_CanBattlerEscape(u32 battler) { enum HoldEffect holdEffect = gAiLogicData->holdEffects[battler]; - if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; if (holdEffect == HOLD_EFFECT_SHED_SHELL) return TRUE; @@ -525,12 +521,11 @@ u32 GetTotalBaseStat(u32 species) bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) { - int i; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAI, opposingBattler, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAI, opposingBattler, gAiLogicData); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 move = gBattleHistory->usedMoves[opposingBattler][i]; + enum Move move = gBattleHistory->usedMoves[opposingBattler][moveIndex]; enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; @@ -540,7 +535,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) return FALSE; } -bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { s32 atkPriority = GetBattleMovePriority(battlerAtk, aiData->abilities[battlerAtk], move); @@ -559,36 +554,41 @@ bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiL return FALSE; } +bool32 AI_CanMoveBeBlockedByTarget(struct BattleContext *ctx) +{ + return CanMoveBeBlockedByTarget(ctx, GetBattleMovePriority(ctx->battlerAtk, ctx->abilityAtk, ctx->move)); +} + // This function checks if all physical/special moves are either unusable or unreasonable to use. // Consider a pokemon boosting their attack against a ghost pokemon having only normal-type physical attacks. bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category) { u32 usable = 0; - u16 *moves = GetMovesArray(attacker); + enum Move *moves = GetMovesArray(attacker); u32 moveLimitations = gAiLogicData->moveLimitations[attacker]; - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.battlerAtk = attacker; ctx.battlerDef = target; ctx.updateFlags = FALSE; ctx.abilityAtk = gAiLogicData->abilities[attacker]; ctx.abilityDef = gAiLogicData->abilities[target]; - ctx.holdEffectAtk = gAiLogicData->items[attacker]; - ctx.holdEffectDef = gAiLogicData->items[target]; + ctx.holdEffectAtk = gAiLogicData->holdEffects[attacker]; + ctx.holdEffectDef = gAiLogicData->holdEffects[target]; - for (u32 i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (IsMoveUnusable(i, moves[i], moveLimitations)) + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; - if (GetBattleMoveCategory(moves[i]) == category) + if (GetBattleMoveCategory(moves[moveIndex]) == category) { - SetTypeBeforeUsingMove(moves[i], attacker); - ctx.move = ctx.chosenMove = moves[i]; - ctx.moveType = GetBattleMoveType(moves[i]); + SetTypeBeforeUsingMove(moves[moveIndex], attacker); + ctx.move = ctx.chosenMove = moves[moveIndex]; + ctx.moveType = GetBattleMoveType(moves[moveIndex]); if (CalcTypeEffectivenessMultiplier(&ctx)) - usable |= 1u << i; + usable |= 1u << moveIndex; } } @@ -596,7 +596,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory c } // To save computation time this function has 2 variants. One saves, sets and restores battlers, while the other doesn't. -struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef) +struct SimulatedDamage AI_CalcDamageSaveBattlers(enum Move move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef) { struct SimulatedDamage dmg; @@ -604,7 +604,7 @@ struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 b SaveBattlerData(battlerDef); SetBattlerData(battlerAtk); SetBattlerData(battlerDef); - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerGimmickAtk, considerGimmickDef, AI_GetWeather()); + dmg = AI_CalcDamage(move, battlerAtk, battlerDef, typeEffectiveness, considerGimmickAtk, considerGimmickDef, AI_GetWeather(), gFieldStatuses); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); return dmg; @@ -631,7 +631,7 @@ static inline s32 DmgRoll(s32 dmg) return dmg; } -bool32 IsDamageMoveUnusable(struct DamageContext *ctx) +bool32 IsDamageMoveUnusable(struct BattleContext *ctx) { enum Ability battlerDefAbility; enum Ability partnerDefAbility; @@ -657,16 +657,17 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) if (Ai_IsPriorityBlocked(ctx->battlerAtk, ctx->battlerDef, ctx->move, aiData)) return TRUE; - if (CanAbilityBlockMove(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, battlerDefAbility, ctx->move, AI_CHECK)) - return TRUE; - - if (CanAbilityAbsorbMove(ctx->battlerAtk, ctx->battlerDef, battlerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) + if (AI_CanMoveBeBlockedByTarget(ctx)) return TRUE; // Limited to Lighning Rod and Storm Drain because otherwise the AI would consider Water Absorb, etc... if (partnerDefAbility == ABILITY_LIGHTNING_ROD || partnerDefAbility == ABILITY_STORM_DRAIN) { - if (CanAbilityAbsorbMove(ctx->battlerAtk, BATTLE_PARTNER(ctx->battlerDef), partnerDefAbility, ctx->move, ctx->moveType, AI_CHECK)) + u32 originalTarget = ctx->battlerDef; // Need to preserve origin target; + ctx->battlerDef = BATTLE_PARTNER(ctx->battlerDef); + bool32 canAbilityAbsorbMove = CanAbilityAbsorbMove(ctx); + ctx->battlerDef = originalTarget; + if (canAbilityAbsorbMove) return TRUE; } @@ -713,7 +714,7 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: - if (!gDisableStructs[ctx->battlerAtk].isFirstTurn) + if (!gBattleStruct->battlerState[ctx->battlerAtk].isFirstTurn) return TRUE; break; default: @@ -723,7 +724,7 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return FALSE; } -bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, u32 abilityDef) +bool32 IsAdditionalEffectBlocked(u32 battlerAtk, u32 abilityAtk, u32 battlerDef, enum Ability abilityDef) { if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK) return TRUE; @@ -744,25 +745,6 @@ static inline s32 GetDamageByRollType(s32 dmg, enum DamageRollType rollType) return DmgRoll(dmg); } -static inline s32 SetFixedMoveBasePower(u32 battlerAtk, u32 move) -{ - s32 fixedBasePower = 0, n = 0; - switch (GetMoveEffect(move)) - { - case EFFECT_ROLLOUT: - n = gDisableStructs[battlerAtk].rolloutTimer - 1; - fixedBasePower = CalcRolloutBasePower(battlerAtk, GetMovePower(move), n < 0 ? 5 : n); - break; - case EFFECT_FURY_CUTTER: - fixedBasePower = CalcFuryCutterBasePower(GetMovePower(move), min(gDisableStructs[battlerAtk].furyCutterCounter + 1, 5)); - break; - default: - fixedBasePower = 0; - break; - } - return fixedBasePower; -} - static inline void AI_StoreBattlerTypes(u32 battlerAtk, enum Type *types) { types[0] = gBattleMons[battlerAtk].types[0]; @@ -777,21 +759,41 @@ static inline void AI_RestoreBattlerTypes(u32 battlerAtk, enum Type *types) gBattleMons[battlerAtk].types[2] = types[2]; } -static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage) +static inline void CalcDynamicMoveDamage(struct BattleContext *ctx, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage) { enum BattleMoveEffects effect = GetMoveEffect(ctx->move); u16 median = *medianDamage; u16 minimum = *minimumDamage; u16 maximum = *maximumDamage; - switch (effect) + u32 strikeCount = GetMoveStrikeCount(ctx->move); + + if (effect == EFFECT_BEAT_UP && GetConfig(CONFIG_BEAT_UP) >= GEN_5) { - case EFFECT_MULTI_HIT: - if (ctx->move == MOVE_WATER_SHURIKEN && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) + u32 partyCount = CalculatePartyCount(GetBattlerParty(ctx->battlerAtk)); + u32 i; + gBattleStruct->beatUpSlot = 0; + ctx->isCrit = FALSE; + ctx->fixedBasePower = 0; + median = 0; + for (i = 0; i < partyCount; i++) + median += CalculateMoveDamage(ctx); + maximum = minimum = median; + gBattleStruct->beatUpSlot = 0; + } + else if (strikeCount > 1 && effect != EFFECT_TRIPLE_KICK) + { + median *= strikeCount; + minimum *= strikeCount; + maximum *= strikeCount; + } + else if (IsMultiHitMove(ctx->move)) + { + if (GetMoveEffect(ctx->move) == EFFECT_SPECIES_POWER_OVERRIDE && gBattleMons[ctx->battlerAtk].species == GetMoveSpeciesPowerOverride_Species(ctx->move)) { - median *= 3; - minimum *= 3; - maximum *= 3; + median *= GetMoveSpeciesPowerOverride_NumOfHits(ctx->move); + minimum *= GetMoveSpeciesPowerOverride_NumOfHits(ctx->move); + maximum *= GetMoveSpeciesPowerOverride_NumOfHits(ctx->move); } else if (ctx->abilityAtk == ABILITY_SKILL_LINK) { @@ -812,44 +814,10 @@ static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianD minimum *= 2; maximum *= 5; } - break; - case EFFECT_ENDEAVOR: - // If target has less HP than user, Endeavor does no damage - median = maximum = minimum = max(0, gBattleMons[ctx->battlerDef].hp - gBattleMons[ctx->battlerAtk].hp); - break; - case EFFECT_BEAT_UP: - if (B_BEAT_UP >= GEN_5) - { - u32 partyCount = CalculatePartyCount(GetBattlerParty(ctx->battlerAtk)); - u32 i; - gBattleStruct->beatUpSlot = 0; - ctx->isCrit = FALSE; - ctx->fixedBasePower = 0; - median = 0; - for (i = 0; i < partyCount; i++) - median += CalculateMoveDamage(ctx); - maximum = minimum = median; - gBattleStruct->beatUpSlot = 0; - } - break; - default: - break; } - - // Handle other multi-strike moves - u32 strikeCount = GetMoveStrikeCount(ctx->move); - if (strikeCount > 1 && effect != EFFECT_TRIPLE_KICK) - { - median *= strikeCount; - minimum *= strikeCount; - maximum *= strikeCount; - } - - if (ctx->abilityAtk == ABILITY_PARENTAL_BOND - && !strikeCount - && effect != EFFECT_TRIPLE_KICK - && effect != EFFECT_MULTI_HIT - && !AI_IsDoubleSpreadMove(ctx->battlerAtk, ctx->move)) + else if (ctx->abilityAtk == ABILITY_PARENTAL_BOND + && strikeCount == 0 + && !AI_IsDoubleSpreadMove(ctx->battlerAtk, ctx->move)) { median += median / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); minimum += minimum / (B_PARENTAL_BOND_DMG >= GEN_7 ? 4 : 2); @@ -868,39 +836,76 @@ static inline void CalcDynamicMoveDamage(struct DamageContext *ctx, u16 *medianD *maximumDamage = maximum; } -static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +static inline bool32 ShouldCalcCritDamage(struct BattleContext *ctx) { s32 critChanceIndex = 0; // Get crit chance - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) - critChanceIndex = CalcCritChanceStageGen1(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + critChanceIndex = CalcCritChanceStageGen1(ctx); else - critChanceIndex = CalcCritChanceStage(battlerAtk, battlerDef, move, FALSE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk]); + critChanceIndex = CalcCritChanceStage(ctx); if (critChanceIndex == CRITICAL_HIT_ALWAYS) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_STAGE_THRESHOLD // Not guaranteed but above Risky threshold - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) != GEN_1) + && (gAiThinkingStruct->aiFlags[ctx->battlerAtk] & AI_FLAG_RISKY) + && GetConfig(CONFIG_CRIT_CHANCE) != GEN_1) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_THRESHOLD_GEN_1 // Not guaranteed but above Risky threshold - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) - && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + && (gAiThinkingStruct->aiFlags[ctx->battlerAtk] & AI_FLAG_RISKY) + && GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) return TRUE; + return FALSE; } -struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather) +static s32 HandleKOThroughBerryReduction(struct BattleContext *ctx, s32 dmg) +{ + if (ctx->aiCheckBerryModifier) // Only set if AI running calcs + { + // Only indicate move is ignoring berry resist if it doesn't already OHKO even if resisted + if (dmg < gBattleMons[ctx->battlerDef].hp) + gAiLogicData->resistBerryAffected[ctx->battlerAtk][ctx->battlerDef][GetMoveIndex(ctx->battlerAtk, ctx->move)] = TRUE; + + // Ignore resist berry if appropriate + u32 berryModifier = gAiLogicData->abilities[ctx->battlerDef] == ABILITY_RIPEN ? 4 : 2; + u32 unmitigatedDamage = dmg * berryModifier; + u32 totalDamage = dmg; + + // Add unmitigated hits up to the set KO threshold, - 1 because the first hit is dmg + for (u32 hitsToKO = 0; hitsToKO < AI_IGNORE_BERRY_KO_THRESHOLD - 1; hitsToKO++) + totalDamage += unmitigatedDamage; + + // If the total damage from reduced hit and non-reduced hit(s) are a KO, we can see our target KO threshold through berry damage + if (totalDamage >= gBattleMons[ctx->battlerDef].hp) + return unmitigatedDamage; // Pretend the berry isn't there so the AI can see the KO threshold + else + return dmg; + } + return dmg; +} + +static s32 AI_ApplyModifiersAfterDmgRoll(struct BattleContext *ctx, s32 dmg) +{ + dmg = ApplyModifiersAfterDmgRoll(ctx, dmg); + dmg = HandleKOThroughBerryReduction(ctx, dmg); + return dmg; +} + +struct SimulatedDamage AI_CalcDamage(enum Move move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef, u32 weather, u32 fieldStatuses) { struct SimulatedDamage simDamage = {0}; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - bool32 isDamageMoveUnusable = FALSE; bool32 toggledGimmickAtk = FALSE; bool32 toggledGimmickDef = FALSE; struct AiLogicData *aiData = gAiLogicData; gAiLogicData->aiCalcInProgress = TRUE; + if (moveEffect == EFFECT_HIT_ENEMY_HEAL_ALLY + && battlerDef == BATTLE_PARTNER(battlerAtk)) + return simDamage; + if (moveEffect == EFFECT_NATURE_POWER) move = GetNaturePowerMove(battlerAtk); @@ -926,27 +931,28 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u gBattleStruct->magnitudeBasePower = 70; gBattleStruct->presentBasePower = 80; - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; + ctx.aiCalc = TRUE; + ctx.aiCheckBerryModifier = FALSE; ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; ctx.move = ctx.chosenMove = move; ctx.moveType = GetBattleMoveType(move); - ctx.isCrit = ShouldCalcCritDamage(battlerAtk, battlerDef, move, aiData); + ctx.fieldStatuses = fieldStatuses; ctx.randomFactor = FALSE; ctx.updateFlags = FALSE; ctx.weather = weather; - ctx.fixedBasePower = SetFixedMoveBasePower(battlerAtk, move); + ctx.fixedBasePower = 0; ctx.holdEffectAtk = aiData->holdEffects[battlerAtk]; ctx.holdEffectDef = aiData->holdEffects[battlerDef]; ctx.abilityAtk = aiData->abilities[battlerAtk]; ctx.abilityDef = AI_GetMoldBreakerSanitizedAbility(battlerAtk, ctx.abilityAtk, aiData->abilities[battlerDef], ctx.holdEffectDef, move); + ctx.isCrit = ShouldCalcCritDamage(&ctx); ctx.typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(&ctx); u32 movePower = GetMovePower(move); - if (movePower) - isDamageMoveUnusable = IsDamageMoveUnusable(&ctx); - if (movePower && !isDamageMoveUnusable) + if (movePower && !IsDamageMoveUnusable(&ctx)) { enum Type types[3]; AI_StoreBattlerTypes(battlerAtk, types); @@ -966,13 +972,13 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u s32 oneTripleKickHit = CalculateMoveDamageVars(&ctx); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_LOWEST); - simDamage.minimum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); + simDamage.minimum += AI_ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_DEFAULT); - simDamage.median += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); + simDamage.median += AI_ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); damageByRollType = GetDamageByRollType(oneTripleKickHit, DMG_ROLL_HIGHEST); - simDamage.maximum += ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); + simDamage.maximum += AI_ApplyModifiersAfterDmgRoll(&ctx, damageByRollType); } } else @@ -980,13 +986,13 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u u32 damage = CalculateMoveDamageVars(&ctx); simDamage.minimum = GetDamageByRollType(damage, DMG_ROLL_LOWEST); - simDamage.minimum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.minimum); + simDamage.minimum = AI_ApplyModifiersAfterDmgRoll(&ctx, simDamage.minimum); simDamage.median = GetDamageByRollType(damage, DMG_ROLL_DEFAULT); - simDamage.median = ApplyModifiersAfterDmgRoll(&ctx, simDamage.median); + simDamage.median = AI_ApplyModifiersAfterDmgRoll(&ctx, simDamage.median); simDamage.maximum = GetDamageByRollType(damage, DMG_ROLL_HIGHEST); - simDamage.maximum = ApplyModifiersAfterDmgRoll(&ctx, simDamage.maximum); + simDamage.maximum = AI_ApplyModifiersAfterDmgRoll(&ctx, simDamage.maximum); } if (GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE) @@ -1024,16 +1030,21 @@ bool32 AI_IsDamagedByRecoil(u32 battler) } // Decide whether move having an additional effect for . -static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) +static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, enum Move move, s32 noOfHitsToKo) { - u32 i; enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + + if (IsSheerForceAffected(move, abilityAtk)) + return FALSE; switch (GetMoveEffect(move)) { - case EFFECT_HIT_ESCAPE: - if (CountUsablePartyMons(battlerAtk) != 0 && ShouldPivot(battlerAtk, battlerDef, abilityDef, move, gAiThinkingStruct->movesetIndex)) + case EFFECT_ABSORB: + case EFFECT_DREAM_EATER: + if (!IsBattlerAtMaxHp(battlerAtk) || (!aiIsFaster && GetMoveCategory(GetIncomingMove(battlerAtk, battlerDef, gAiLogicData)) != DAMAGE_CATEGORY_STATUS)) return TRUE; break; case EFFECT_FELL_STINGER: @@ -1050,9 +1061,9 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 // check ADDITIONAL_EFFECTS u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); // Consider move effects that target self if (additionalEffect->self) { @@ -1132,9 +1143,9 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 return TRUE; break; case MOVE_EFFECT_ALL_STATS_UP: - for (i = STAT_ATK; i <= NUM_STATS; i++) + for (enum Stat statId = STAT_ATK; statId <= NUM_STATS; statId++) { - if (BattlerStatCanRise(battlerAtk, abilityAtk, i)) + if (BattlerStatCanRise(battlerAtk, abilityAtk, statId)) return TRUE; } break; @@ -1203,18 +1214,28 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 return FALSE; } -static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) +static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, enum Move move, s32 noOfHitsToKo) { enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk]; enum Ability abilityDef = gAiLogicData->abilities[battlerDef]; - u8 i; + + if (GetMoveStrikeCount(move) > 1 || IsMultiHitMove(move)) + { + if (AI_MoveMakesContact(battlerAtk, battlerDef, abilityAtk, gAiLogicData->holdEffects[battlerAtk], move) + && abilityAtk != ABILITY_MAGIC_GUARD + && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET || abilityDef == ABILITY_IRON_BARBS)) + { + return TRUE; + } + } + + if (IsExplosionMove(move)) + return TRUE; switch (GetMoveEffect(move)) { case EFFECT_MAX_HP_50_RECOIL: case EFFECT_CHLOROBLAST: - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: case EFFECT_FINAL_GAMBIT: return TRUE; case EFFECT_RECOIL: @@ -1222,12 +1243,20 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s if (AI_IsDamagedByRecoil(battlerAtk)) return TRUE; break; + case EFFECT_ABSORB: + if (abilityDef == ABILITY_LIQUID_OOZE) + return TRUE; + break; + case EFFECT_DREAM_EATER: + if (abilityDef == ABILITY_LIQUID_OOZE && GetConfig(CONFIG_DREAM_EATER_LIQUID_OOZE) >= GEN_5) + return TRUE; + break; default: { u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); switch (additionalEffect->moveEffect) { case MOVE_EFFECT_ATK_MINUS_1: @@ -1283,7 +1312,7 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s } // Checks if one of the moves has side effects or perks, assuming equal dmg or equal no of hits to KO -enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) +enum MoveComparisonResult CompareMoveEffects(enum Move move1, enum Move move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; enum Ability defAbility = gAiLogicData->abilities[battlerDef]; @@ -1324,7 +1353,7 @@ u32 GetNoOfHitsToKO(u32 dmg, s32 hp) { if (dmg == 0) return 0; - return hp / (dmg + 1) + 1; + return (hp + dmg - 1) / dmg; } u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef) @@ -1332,9 +1361,15 @@ u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef) return GetNoOfHitsToKO(dmg, gBattleMons[battlerDef].hp); } -u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext) +u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext, enum AiConsiderEndure considerEndure) { - return GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData), battlerDef); + u32 hitsToKO = GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData), battlerDef); + enum Move *moves = GetMovesArray(battlerAtk); + + if (CanEndureHit(battlerAtk, battlerDef, moves[moveIndex]) && hitsToKO == 1 && considerEndure == CONSIDER_ENDURE) + hitsToKO += 1; + + return hitsToKO; } u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) @@ -1343,16 +1378,15 @@ u32 GetBestNoOfHitsToKO(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext c u32 tempResult = 0; struct AiLogicData *aiData = gAiLogicData; - s32 moveIndex; - u16 *moves = GetMovesArray(battlerAtk); + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = aiData->moveLimitations[battlerAtk]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; - tempResult = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, calcContext); + tempResult = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, moveIndex, calcContext, CONSIDER_ENDURE); if (tempResult != 0 && tempResult < result) result = tempResult; } @@ -1367,7 +1401,7 @@ u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContex return (bestDmg * 100) / gBattleMons[battlerDef].maxHP; } -uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) +uq4_12_t AI_GetMoveEffectiveness(enum Move move, u32 battlerAtk, u32 battlerDef) { uq4_12_t typeEffectiveness; @@ -1379,7 +1413,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; ctx.move = ctx.chosenMove = move; @@ -1387,8 +1421,8 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) ctx.updateFlags = FALSE; ctx.abilityAtk = gAiLogicData->abilities[battlerAtk]; ctx.abilityDef = gAiLogicData->abilities[battlerDef]; - ctx.holdEffectAtk = gAiLogicData->items[battlerAtk]; - ctx.holdEffectDef = gAiLogicData->items[battlerDef]; + ctx.holdEffectAtk = gAiLogicData->holdEffects[battlerAtk]; + ctx.holdEffectDef = gAiLogicData->holdEffects[battlerDef]; typeEffectiveness = CalcTypeEffectivenessMultiplier(&ctx); RestoreBattlerData(battlerAtk); @@ -1403,7 +1437,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) * AI_IS_FASTER: is user(ai) faster * AI_IS_SLOWER: is target faster */ -s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) +s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, enum Move aiMoveConsidered, enum Move playerMoveConsidered, enum ConsiderPriority considerPriority) { u32 speedBattlerAI, speedBattler; enum HoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; @@ -1457,22 +1491,24 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 pla return AI_IS_SLOWER; } -bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) +bool32 CanEndureHit(u32 battler, u32 battlerTarget, enum Move move) { - enum BattleMoveEffects effect = GetMoveEffect(move); - if (!AI_BattlerAtMaxHp(battlerTarget) || effect == EFFECT_MULTI_HIT || gAiLogicData->abilities[battler] == ABILITY_PARENTAL_BOND) + if (!AI_BattlerAtMaxHp(battlerTarget) || IsMultiHitMove(move) || gAiLogicData->abilities[battler] == ABILITY_PARENTAL_BOND) return FALSE; - if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && !HasTwoOpponents(battler))) + if (GetMoveStrikeCount(move) > 1 && !(AI_GetBattlerMoveTargetType(battler, move) == TARGET_SMART && !HasTwoOpponents(battler))) return FALSE; if (gAiLogicData->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; if (!DoesBattlerIgnoreAbilityChecks(battler, gAiLogicData->abilities[battler], move)) { - if (B_STURDY >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) + if (GetConfig(CONFIG_STURDY) >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; if (IsMimikyuDisguised(battlerTarget)) return TRUE; + if (gAiLogicData->abilities[battlerTarget] == ABILITY_ICE_FACE + && gBattleMons[battlerTarget].species == SPECIES_EISCUE_ICE && GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) + return TRUE; } return FALSE; @@ -1482,11 +1518,10 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) { struct AiLogicData *aiData = gAiLogicData; - s32 moveIndex; - u16 *moves = GetMovesArray(battlerDef); + enum Move *moves = GetMovesArray(battlerDef); u32 moveLimitations = aiData->moveLimitations[battlerDef]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -1499,15 +1534,14 @@ bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) return FALSE; } -u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk) +u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk, enum AiConsiderEndure considerEndure) { - u32 i; u32 currNumberOfHits; u32 leastNumberOfHits = UNKNOWN_NO_OF_HITS; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - currNumberOfHits = GetNoOfHitsToKOBattler(battlerDef, battlerAtk, i, AI_DEFENDING); + currNumberOfHits = GetNoOfHitsToKOBattler(battlerDef, battlerAtk, moveIndex, AI_DEFENDING, considerEndure); if (currNumberOfHits != 0) { if (currNumberOfHits < leastNumberOfHits) @@ -1519,7 +1553,6 @@ u32 NoOfHitsForTargetToFaintBattler(u32 battlerDef, u32 battlerAtk) u32 NoOfHitsForTargetToFaintBattlerWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod) { - u32 i; u32 currNumberOfHits; u32 leastNumberOfHits = UNKNOWN_NO_OF_HITS; u32 hpCheck = gBattleMons[battlerAtk].hp + hpMod; @@ -1528,9 +1561,9 @@ u32 NoOfHitsForTargetToFaintBattlerWithMod(u32 battlerDef, u32 battlerAtk, s32 h if (hpCheck > gBattleMons[battlerAtk].maxHP) hpCheck = gBattleMons[battlerAtk].maxHP; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - damageDealt = AI_GetDamage(battlerDef, battlerAtk, i, AI_DEFENDING, gAiLogicData); + damageDealt = AI_GetDamage(battlerDef, battlerAtk, moveIndex, AI_DEFENDING, gAiLogicData); if (damageDealt == 0) continue; currNumberOfHits = hpCheck / (damageDealt + 1) + 1; @@ -1543,38 +1576,104 @@ u32 NoOfHitsForTargetToFaintBattlerWithMod(u32 battlerDef, u32 battlerAtk, s32 h return leastNumberOfHits; } -u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) +void GetBestDmgMovesFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum Move *bestMoves) { struct AiLogicData *aiData = gAiLogicData; - u32 moveIndex; - u32 move = 0; u32 bestDmg = 0; - u16 *moves = GetMovesArray(battlerAtk); + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = aiData->moveLimitations[battlerAtk]; + u32 countBestMoves = 0; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + if (CanAIFaintTarget(battlerAtk, battlerDef, 1)) { - if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) - continue; - - if (bestDmg < AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData)) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - bestDmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData); - move = moves[moveIndex]; + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, moveIndex, AI_ATTACKING)) + bestMoves[countBestMoves++] = moves[moveIndex]; } } - return move; + else + { + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations) + || (GetMovePower(moves[moveIndex]) == 0) + || (AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData) == 0)) + continue; + + if (bestDmg < AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData)) + { + countBestMoves = 0; + bestDmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData); + *bestMoves = 0; + bestMoves[countBestMoves++] = moves[moveIndex]; + } + else if (bestDmg == AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, aiData)) + { + bestMoves[countBestMoves++] = moves[moveIndex]; + } + } + } +} + +u32 GetMoveIndex(u32 battler, enum Move move) +{ + enum Move *moves = GetMovesArray(battler); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (moves[moveIndex] == move) + return moveIndex; + } + + return MAX_MON_MOVES; +} + +bool32 IsBestDmgMove(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum Move move) +{ + enum Move bestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + u32 index = GetMoveIndex(battlerAtk, move); + + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, index, AI_ATTACKING)) + return TRUE; + + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, calcContext, bestMoves); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (bestMoves[moveIndex] == move) + return TRUE; + } + + return FALSE; +} + +bool32 BestDmgMoveHasEffect(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext, enum BattleMoveEffects moveEffect) +{ + enum Move bestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, calcContext, bestMoves); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (bestMoves[moveIndex] == MOVE_NONE) + break; + + if (GetMoveEffect(bestMoves[moveIndex]) == moveEffect) + return TRUE; + } + + return FALSE; } u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext) { struct AiLogicData *aiData = gAiLogicData; - u32 moveIndex; u32 bestDmg = 0; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); u32 moveLimitations = aiData->moveLimitations[battler]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -1592,11 +1691,11 @@ u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) { struct AiLogicData *aiData = gAiLogicData; - s32 moveIndex, dmg; + s32 dmg; u16 *moves = gBattleMons[battlerAtk].moves; u32 moveLimitations = aiData->moveLimitations[battlerAtk]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -1623,11 +1722,11 @@ bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) bool32 CanBattlerKOTargetIgnoringSturdy(u32 battlerAtk, u32 battlerDef) { struct AiLogicData *aiData = gAiLogicData; - s32 moveIndex, dmg; - u16 *moves = GetMovesArray(battlerAtk); + s32 dmg; + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = aiData->moveLimitations[battlerAtk]; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -1639,7 +1738,7 @@ bool32 CanBattlerKOTargetIgnoringSturdy(u32 battlerAtk, u32 battlerDef) return FALSE; } -bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) +bool32 CanTargetMoveFaintAi(enum Move move, u32 battlerDef, u32 battlerAtk, u32 nHits) { u32 indexSlot = GetMoveSlot(GetMovesArray(battlerDef), move); if (indexSlot < MAX_MON_MOVES) @@ -1655,16 +1754,15 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod) { struct AiLogicData *aiData = gAiLogicData; - u32 moveIndex; s32 dmg; - u16 *moves = GetMovesArray(battlerDef); + enum Move *moves = GetMovesArray(battlerDef); u32 hpCheck = gBattleMons[battlerAtk].hp + hpMod; u32 moveLimitations = aiData->moveLimitations[battlerAtk]; if (hpCheck > gBattleMons[battlerAtk].maxHP) hpCheck = gBattleMons[battlerAtk].maxHP; - for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -1702,17 +1800,17 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability) enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId) { u32 validAbilities[NUM_ABILITY_SLOTS]; - u8 i, numValidAbilities = 0; + u8 numValidAbilities = 0; enum Ability knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); enum Ability indexAbility; enum Ability abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; // We've had ability overwritten by e.g. Worry Seed. It is not part of gAiPartyData in case of switching - if (gDisableStructs[battlerId].overwrittenAbility) - return gDisableStructs[battlerId].overwrittenAbility; + if (gBattleMons[battlerId].volatiles.overwrittenAbility) + return gBattleMons[battlerId].volatiles.overwrittenAbility; // The AI knows its own ability, and omniscience handling - if (IsAiBattlerAware(battlerId) || (IsAiBattlerAssumingStab() && ASSUME_STAB_SEES_ABILITY)) + if (IsAiBattlerAware(battlerId) || (IsAiBattlerAssumingStab(battlerId) && ASSUME_STAB_SEES_ABILITY)) return knownAbility; // Check neutralizing gas, gastro acid @@ -1726,9 +1824,9 @@ enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId) if (knownAbility == ABILITY_SHADOW_TAG || knownAbility == ABILITY_MAGNET_PULL || knownAbility == ABILITY_ARENA_TRAP) return knownAbility; - for (i = 0; i < NUM_ABILITY_SLOTS; i++) + for (u32 abilityIndex = 0; abilityIndex < NUM_ABILITY_SLOTS; abilityIndex++) { - indexAbility = GetSpeciesAbility(gBattleMons[battlerId].species, i); + indexAbility = GetSpeciesAbility(gBattleMons[battlerId].species, abilityIndex); if (indexAbility != ABILITY_NONE) { abilityAiRatings[numValidAbilities] = gAbilitiesInfo[indexAbility].aiRating; @@ -1770,7 +1868,7 @@ enum HoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) return holdEffect; } -bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move) +bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, enum Move move) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept @@ -1802,9 +1900,9 @@ u32 AI_GetWeather(void) return gBattleWeather; } -u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) +u32 AI_GetSwitchinWeather(u32 battler) { - enum Ability ability = battleMon.ability; + enum Ability ability = gBattleMons[battler].ability; // Forced weather behaviour if (!AI_WeatherHasEffect()) return B_WEATHER_NONE; @@ -1823,12 +1921,48 @@ u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon) case ABILITY_SAND_STREAM: return B_WEATHER_SANDSTORM; case ABILITY_SNOW_WARNING: - return B_SNOW_WARNING >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; + return GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 ? B_WEATHER_SNOW : B_WEATHER_HAIL; default: return gBattleWeather; } } +u32 SwitchinChangeBattleTerrain(u32 newTerrain, u32 fieldStatus) +{ + if (gBattleStruct->isSkyBattle) + return fieldStatus; + + if (!(fieldStatus & newTerrain)) + { + fieldStatus &= ~STATUS_FIELD_TERRAIN_ANY; + fieldStatus |= newTerrain; + return fieldStatus; + } + + return fieldStatus; +} + +u32 AI_GetSwitchinFieldStatus(u32 battler) +{ + enum Ability ability = gBattleMons[battler].ability; + u32 startingFieldStatus = gFieldStatuses; + // Switchin will introduce new terrain + switch(ability) + { + case ABILITY_ELECTRIC_SURGE: + case ABILITY_HADRON_ENGINE: + return SwitchinChangeBattleTerrain(STATUS_FIELD_ELECTRIC_TERRAIN, startingFieldStatus); + case ABILITY_GRASSY_SURGE: + return SwitchinChangeBattleTerrain(STATUS_FIELD_GRASSY_TERRAIN, startingFieldStatus); + case ABILITY_MISTY_SURGE: + return SwitchinChangeBattleTerrain(STATUS_FIELD_MISTY_TERRAIN, startingFieldStatus); + case ABILITY_PSYCHIC_SURGE: + return SwitchinChangeBattleTerrain(STATUS_FIELD_PSYCHIC_TERRAIN, startingFieldStatus); + default: + return startingFieldStatus; + } +} + enum WeatherState IsWeatherActive(u32 flags) { enum WeatherState state = WEATHER_INACTIVE; @@ -1865,7 +1999,7 @@ bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect) } } -bool32 IsNonVolatileStatusMove(u32 move) +bool32 IsNonVolatileStatusMove(enum Move move) { return GetMoveNonVolatileStatus(move) != MOVE_EFFECT_NONE; } @@ -1883,10 +2017,10 @@ bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect) } } -bool32 IsHazardMove(u32 move) +bool32 IsHazardMove(enum Move move) { // Hazard setting moves like Stealth Rock, Spikes, etc. - u32 i, moveEffect = GetMoveEffect(move); + enum BattleMoveEffects moveEffect = GetMoveEffect(move); switch (moveEffect) { case EFFECT_CEASELESS_EDGE: @@ -1896,12 +2030,14 @@ bool32 IsHazardMove(u32 move) case EFFECT_STONE_AXE: case EFFECT_TOXIC_SPIKES: return TRUE; + default: + break; } u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); switch (additionalEffect->moveEffect) { case MOVE_EFFECT_STEALTH_ROCK: @@ -1914,25 +2050,25 @@ bool32 IsHazardMove(u32 move) return FALSE; } -bool32 IsHazardClearingMove(u32 move) +bool32 IsHazardClearingMove(enum Move move) { // Hazard clearing effects like Rapid Spin, Tidy Up, etc. - u32 i, moveEffect = GetMoveEffect(move); + u32 moveEffect = GetMoveEffect(move); switch (moveEffect) { case EFFECT_RAPID_SPIN: case EFFECT_TIDY_UP: return TRUE; case EFFECT_DEFOG: - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) return TRUE; break; } u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); switch (additionalEffect->moveEffect) { case MOVE_EFFECT_DEFOG: @@ -1945,7 +2081,7 @@ bool32 IsHazardClearingMove(u32 move) return FALSE; } -bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) +bool32 IsAllyProtectingFromMove(u32 battlerAtk, enum Move attackerMove, enum Move allyMove) { enum BattleMoveEffects effect = GetMoveEffect(allyMove); @@ -1990,7 +2126,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) } } -bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility) +bool32 IsMoveRedirectionPrevented(u32 battlerAtk, enum Move move, enum Ability atkAbility) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; @@ -2004,7 +2140,7 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbil return FALSE; } -bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) +bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, enum Move move) { enum HoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; @@ -2019,7 +2155,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, en return FALSE; if (((gBattleMons[battlerDef].volatiles.lockOn - && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) + && gBattleMons[battlerDef].volatiles.battlerWithSureHit == battlerAtk) || atkAbility == ABILITY_NO_GUARD || defAbility == ABILITY_NO_GUARD) && gBattleMons[battlerAtk].level >= gBattleMons[battlerDef].level) { @@ -2045,6 +2181,10 @@ bool32 ShouldRaiseAnyStat(u32 battlerAtk, u32 battlerDef) if (AI_IsAbilityOnSide(battlerDef, ABILITY_UNAWARE)) return FALSE; + // Don't increase stats if Yawn'd + if (gBattleMons[battlerAtk].volatiles.yawn && CanBeSlept(battlerDef, battlerDef, gAiLogicData->abilities[battlerDef], BLOCKED_BY_SLEEP_CLAUSE)) + return FALSE; + // Don't set up if AI is dead to residual damage from weather if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp) return FALSE; @@ -2113,12 +2253,24 @@ bool32 IsBattlerDamagedByStatus(u32 battler) || gSideStatuses[GetBattlerSide(battler)] & (SIDE_STATUS_SEA_OF_FIRE | SIDE_STATUS_DAMAGE_NON_TYPES); } -s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) +s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, enum Move move, enum Move predictedMove) { s32 score = 0; // TODO more sophisticated logic - u32 uses = gDisableStructs[battlerAtk].protectUses; + u32 uses = gBattleMons[battlerAtk].volatiles.consecutiveMoveUses; + + if (predictedMove != MOVE_NONE && predictedMove != MOVE_UNAVAILABLE) + { + if (MoveIgnoresProtect(predictedMove)) + return WORST_EFFECT; + } + + if (GetMoveProtectMethod(move) != PROTECT_MAX_GUARD + && IsUnseenFistContactMove(battlerDef, battlerAtk, predictedMove)) + { + return WORST_EFFECT; + } /*if (GetMoveResultFlags(predictedMove) & (MOVE_RESULT_NO_EFFECT | MOVE_RESULT_MISSED)) { @@ -2128,7 +2280,7 @@ s32 ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove) if (uses == 0) { - if (predictedMove != MOVE_NONE && predictedMove != 0xFFFF && !IsBattleMoveStatus(predictedMove)) + if (predictedMove != MOVE_NONE && predictedMove != MOVE_UNAVAILABLE && !IsBattleMoveStatus(predictedMove)) score += DECENT_EFFECT; else if (Random() % 256 < 100) score += WEAK_EFFECT; @@ -2163,7 +2315,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, if (aiData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) return FALSE; - u32 move = gAiThinkingStruct->moveConsidered; + enum Move move = gAiThinkingStruct->moveConsidered; enum Ability abilityAtk = aiData->abilities[battlerAtk]; if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MIST && abilityAtk != ABILITY_INFILTRATOR) @@ -2186,7 +2338,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, if (stat == STAT_DEF) return FALSE; case ABILITY_ILLUMINATE: - if (GetGenConfig(GEN_ILLUMINATE_EFFECT) < GEN_9) + if (GetConfig(CONFIG_ILLUMINATE_EFFECT) < GEN_9) break; case ABILITY_KEEN_EYE: case ABILITY_MINDS_EYE: @@ -2208,7 +2360,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, if (stat == STAT_SPEED) { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); // If AI is faster and doesn't have any mons left, lowering speed doesn't give any return !(AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) && CountUsablePartyMons(battlerAtk) == 0 @@ -2218,9 +2370,9 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, return TRUE; } -u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat) +enum AIScore IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat) { - u32 tempScore = NO_INCREASE; + enum AIScore tempScore = NO_INCREASE; // Don't increase score if target is already -3 stat stage if (stat != STAT_SPEED && gBattleMons[battlerDef].statStages[stat] <= DEFAULT_STAT_STAGE - 3) @@ -2250,7 +2402,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, enum Stat stat) break; case STAT_SPEED: { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (AI_IsSlower(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY) || AI_IsSlower(BATTLE_PARTNER(battlerAtk), battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) tempScore += DECENT_EFFECT; @@ -2301,10 +2453,9 @@ bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, enum Stat st bool32 AreBattlersStatsMaxed(u32 battlerId) { - enum Stat i; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerId].statStages[i] < MAX_STAT_STAGE) + if (gBattleMons[battlerId].statStages[statId] < MAX_STAT_STAGE) return FALSE; } return TRUE; @@ -2312,11 +2463,9 @@ bool32 AreBattlersStatsMaxed(u32 battlerId) bool32 AnyStatIsRaised(u32 battlerId) { - enum Stat i; - - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerId].statStages[i] > DEFAULT_STAT_STAGE) + if (gBattleMons[battlerId].statStages[statId] > DEFAULT_STAT_STAGE) return TRUE; } return FALSE; @@ -2325,10 +2474,9 @@ bool32 AnyStatIsRaised(u32 battlerId) u32 CountPositiveStatStages(u32 battlerId) { u32 count = 0; - enum Stat i; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerId].statStages[i] > DEFAULT_STAT_STAGE) + if (gBattleMons[battlerId].statStages[statId] > DEFAULT_STAT_STAGE) count++; } return count; @@ -2337,10 +2485,9 @@ u32 CountPositiveStatStages(u32 battlerId) u32 CountNegativeStatStages(u32 battlerId) { u32 count = 0; - enum Stat i; - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battlerId].statStages[statId] < DEFAULT_STAT_STAGE) count++; } return count; @@ -2361,7 +2508,7 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, en return FALSE; } -u16 *GetMovesArray(u32 battler) +enum Move *GetMovesArray(u32 battler) { if (IsAiBattlerAware(battler) || IsAiBattlerAware(BATTLE_PARTNER(battler))) return gBattleMons[battler].moves; @@ -2369,28 +2516,49 @@ u16 *GetMovesArray(u32 battler) return gBattleHistory->usedMoves[battler]; } -u32 GetIndexInMoveArray(u32 battler, u32 move) +u32 GetBattlerMoveIndexWithEffect(u32 battler, enum BattleMoveEffects effect) { - u16 *moves = GetMovesArray(battler); - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + enum Move *moves = GetMovesArray(battler); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] == move) - return i; + if (GetMoveEffect(moves[moveIndex]) == effect) + return moveIndex; } return MAX_MON_MOVES; } +bool32 HasPhysicalBestMove(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) +{ + enum Move atkBestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, calcContext, atkBestMoves); + bool32 bestMoveIsPhysical = TRUE; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (atkBestMoves[moveIndex] == MOVE_NONE) + { + break; + } + else + { + if (GetBattleMoveCategory(atkBestMoves[moveIndex]) == DAMAGE_CATEGORY_SPECIAL) + { + bestMoveIsPhysical = FALSE; + break; + } + } + } + return bestMoveIsPhysical; +} + bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, bool32 onlyOffensive) { - u32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (onlyOffensive && IsBattleMoveStatus(moves[i])) + if (onlyOffensive && IsBattleMoveStatus(moves[moveIndex])) continue; - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) != category) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[moveIndex]) != category) return FALSE; } @@ -2399,12 +2567,11 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, enum DamageCategory category, boo bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category) { - u32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[i]) == category) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetBattleMoveCategory(moves[moveIndex]) == category) return TRUE; } return FALSE; @@ -2412,12 +2579,11 @@ bool32 HasMoveWithCategory(u32 battler, enum DamageCategory category) bool32 HasMoveWithType(u32 battler, enum Type type) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveType(moves[i]) == type) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetMoveType(moves[moveIndex]) == type) return TRUE; } @@ -2426,12 +2592,11 @@ bool32 HasMoveWithType(u32 battler, enum Type type) bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects effect) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveEffect(moves[i]) == effect) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetMoveEffect(moves[moveIndex]) == effect) return TRUE; } @@ -2440,14 +2605,13 @@ bool32 HasMoveWithEffect(u32 battler, enum BattleMoveEffects effect) bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE) { - if (GetAIEffectGroupFromMove(battler, moves[i]) & aiEffect) + if (GetAIEffectGroupFromMove(battler, moves[moveIndex]) & aiEffect) return TRUE; } } @@ -2455,7 +2619,7 @@ bool32 HasMoveWithAIEffect(u32 battler, u32 aiEffect) return FALSE; } -bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) +bool32 HasBattlerSideMoveWithEffect(u32 battler, enum BattleMoveEffects effect) { if (HasMoveWithEffect(battler, effect)) return TRUE; @@ -2476,29 +2640,28 @@ bool32 HasBattlerSideMoveWithAIEffect(u32 battler, u32 aiEffect) // HasBattlerSideMoveWithEffect checks if the AI knows a side has a move effect, // while HasBattlerSideUsedMoveWithEffect checks if the side has actively USED the move effect. // It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. -bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) +bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, enum BattleMoveEffects effect) { u32 aiEffect = GetAIEffectGroup(effect); - u32 i; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (GetMoveEffect(gBattleHistory->usedMoves[battler][i]) == effect) + if (GetMoveEffect(gBattleHistory->usedMoves[battler][moveIndex]) == effect) return TRUE; if (aiEffect != AI_EFFECT_NONE) { - if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[battler][i]) & aiEffect) + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[battler][moveIndex]) & aiEffect) return TRUE; } if (HasPartnerIgnoreFlags(battler)) { - if (GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) == effect) + if (GetMoveEffect(gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][moveIndex]) == effect) return TRUE; if (aiEffect != AI_EFFECT_NONE) { - if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][i]) & aiEffect) + if (GetAIEffectGroupFromMove(battler, gBattleHistory->usedMoves[BATTLE_PARTNER(battler)][moveIndex]) & aiEffect) return TRUE; } } @@ -2506,14 +2669,13 @@ bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) return FALSE; } -bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect) +bool32 HasNonVolatileMoveEffect(u32 battlerId, enum MoveEffect effect) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (GetMoveNonVolatileStatus(moves[i]) == effect) + if (GetMoveNonVolatileStatus(moves[moveIndex]) == effect) return TRUE; } @@ -2522,36 +2684,34 @@ bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect) bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveEffect(moves[i]) == effect - && (GetMoveEffectArg_Status(moves[i]) & argument)) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE + && GetMoveEffect(moves[moveIndex]) == effect + && (GetMoveEffectArg_Status(moves[moveIndex]) & argument)) return TRUE; } return FALSE; } -bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect) +bool32 HasMoveWithAdditionalEffect(u32 battlerId, enum MoveEffect moveEffect) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && MoveHasAdditionalEffect(moves[i], moveEffect)) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE + && MoveHasAdditionalEffect(moves[moveIndex], moveEffect)) return TRUE; } return FALSE; } -bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) +bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, enum MoveEffect moveEffect) { if (HasMoveWithAdditionalEffect(battler, moveEffect)) return TRUE; @@ -2562,43 +2722,40 @@ bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) bool32 HasMoveWithCriticalHitChance(u32 battlerId) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveCriticalHitStage(moves[i]) > 0) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE + && GetMoveCriticalHitStage(moves[moveIndex]) > 0) return TRUE; } return FALSE; } -bool32 HasMoveWithMoveEffectExcept(u32 battlerId, u32 moveEffect, enum BattleMoveEffects exception) +bool32 HasMoveWithMoveEffectExcept(u32 battlerId, enum MoveEffect moveEffect, enum BattleMoveEffects exception) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE - && GetMoveEffect(moves[i]) != exception - && MoveHasAdditionalEffect(moves[i], moveEffect)) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE + && GetMoveEffect(moves[moveIndex]) != exception + && MoveHasAdditionalEffect(moves[moveIndex], moveEffect)) return TRUE; } return FALSE; } -bool32 HasMove(u32 battlerId, u32 move) +bool32 HasMove(u32 battlerId, enum Move move) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && moves[i] == move) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && moves[moveIndex] == move) return TRUE; } @@ -2607,12 +2764,11 @@ bool32 HasMove(u32 battlerId, u32 move) bool32 HasAnyKnownMove(u32 battlerId) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE) + if (moves[moveIndex] != MOVE_NONE) return TRUE; } @@ -2621,18 +2777,17 @@ bool32 HasAnyKnownMove(u32 battlerId) bool32 HasMoveThatLowersOwnStats(u32 battlerId) { - s32 i, j; - u32 aiMove; - u16 *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + enum Move aiMove; + enum Move *moves = GetMovesArray(battlerId); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = moves[i]; + aiMove = moves[moveIndex]; if (aiMove != MOVE_NONE && aiMove != MOVE_UNAVAILABLE) { u32 additionalEffectCount = GetMoveAdditionalEffectCount(aiMove); - for (j = 0; j < additionalEffectCount; j++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, j); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, effectIndex); if (IsSelfStatLoweringEffect(additionalEffect->moveEffect) && additionalEffect->self) return TRUE; } @@ -2643,18 +2798,17 @@ bool32 HasMoveThatLowersOwnStats(u32 battlerId) bool32 HasMoveThatRaisesOwnStats(u32 battlerId) { - s32 i, j; - u32 aiMove; - u16 *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + enum Move aiMove; + enum Move *moves = GetMovesArray(battlerId); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - aiMove = moves[i]; + aiMove = moves[moveIndex]; if (aiMove != MOVE_NONE && aiMove != MOVE_UNAVAILABLE) { u32 additionalEffectCount = GetMoveAdditionalEffectCount(aiMove); - for (j = 0; j < additionalEffectCount; j++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, j); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(aiMove, effectIndex); if (IsSelfStatRaisingEffect(additionalEffect->moveEffect) && additionalEffect->self) return TRUE; } @@ -2665,22 +2819,25 @@ bool32 HasMoveThatRaisesOwnStats(u32 battlerId) bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus) { - s32 i; - u16 *moves = GetMovesArray(battlerAtk); + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (IsMoveUnusable(i, moves[i], moveLimitations)) + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; - if (ignoreStatus && IsBattleMoveStatus(moves[i])) - continue; - else if ((!IsBattleMoveStatus(moves[i]) && GetMoveAccuracy(moves[i]) == 0) - || GetBattlerMoveTargetType(battlerAtk, moves[i]) & (MOVE_TARGET_USER | MOVE_TARGET_OPPONENTS_FIELD)) + if (ignoreStatus && IsBattleMoveStatus(moves[moveIndex])) continue; - if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= accCheck) + if (!IsBattleMoveStatus(moves[moveIndex]) && GetMoveAccuracy(moves[moveIndex]) == 0) + continue; + + enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAtk, moves[moveIndex]); + if (target == TARGET_USER || target == TARGET_OPPONENTS_FIELD) + continue; + + if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveIndex] <= accCheck) return TRUE; } @@ -2689,17 +2846,16 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) { - u32 i; - u16 *moves = GetMovesArray(battlerAtk); + enum Move *moves = GetMovesArray(battlerAtk); u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (IsMoveUnusable(i, moves[i], moveLimitations)) + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; - if (GetMoveNonVolatileStatus(moves[i]) == MOVE_EFFECT_SLEEP - && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] < 85) + if (GetMoveNonVolatileStatus(moves[moveIndex]) == MOVE_EFFECT_SLEEP + && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveIndex] < 85) return TRUE; } return FALSE; @@ -2707,19 +2863,18 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) bool32 HasHealingEffect(u32 battlerId) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsHealingMove(moves[i])) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && IsHealingMove(moves[moveIndex])) return TRUE; } return FALSE; } -bool32 IsTrappingMove(u32 move) +bool32 IsTrappingMove(enum Move move) { switch (GetMoveEffect(move)) { @@ -2735,12 +2890,11 @@ bool32 IsTrappingMove(u32 move) bool32 HasTrappingMoveEffect(u32 battler) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && IsTrappingMove(moves[i])) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && IsTrappingMove(moves[moveIndex])) return TRUE; } @@ -2749,11 +2903,21 @@ bool32 HasTrappingMoveEffect(u32 battler) bool32 HasThawingMove(u32 battler) { - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + enum Move *moves = GetMovesArray(battler); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveThawsUser(moves[i])) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && MoveThawsUser(moves[moveIndex])) + return TRUE; + } + return FALSE; +} + +bool32 HasUsableWhileAsleepMove(u32 battler) +{ + enum Move *moves = GetMovesArray(battler); + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && IsUsableWhileAsleepEffect(GetMoveEffect(moves[moveIndex]))) return TRUE; } return FALSE; @@ -2795,7 +2959,6 @@ bool32 IsStatRaisingEffect(enum BattleMoveEffects effect) { switch (effect) { - case EFFECT_ATTACK_UP_USER_ALLY: case EFFECT_ATTACK_UP: case EFFECT_ATTACK_UP_2: case EFFECT_DEFENSE_UP: @@ -2926,12 +3089,12 @@ bool32 IsSwitchOutEffect(enum BattleMoveEffects effect) switch (effect) { case EFFECT_TELEPORT: - if (GetGenConfig(GEN_CONFIG_TELEPORT_BEHAVIOR) >= GEN_8) + if (GetConfig(CONFIG_TELEPORT_BEHAVIOR) >= GEN_8) return TRUE; case EFFECT_HIT_ESCAPE: case EFFECT_PARTING_SHOT: case EFFECT_BATON_PASS: - case EFFECT_CHILLY_RECEPTION: + case EFFECT_WEATHER_AND_SWITCH: case EFFECT_SHED_TAIL: return TRUE; default: @@ -2939,6 +3102,24 @@ bool32 IsSwitchOutEffect(enum BattleMoveEffects effect) } } +bool32 IsSelfSacrificeEffect(enum Move move) +{ + // All self sacrificing effects like Explosion, Final Gambit, Memento, etc. + if (IsExplosionMove(move)) + return TRUE; + + switch (GetMoveEffect(move)) + { + case EFFECT_FINAL_GAMBIT: + case EFFECT_MEMENTO: + case EFFECT_HEALING_WISH: + case EFFECT_REVIVAL_BLESSING: + return TRUE; + default: + return FALSE; + } +} + bool32 IsSubstituteEffect(enum BattleMoveEffects effect) { // Substitute effects like Substitute, Shed Tail, etc. @@ -2964,9 +3145,8 @@ bool32 IsChaseEffect(enum BattleMoveEffects effect) } } -static inline bool32 IsMoveSleepClauseTrigger(u32 move) +static inline bool32 IsMoveSleepClauseTrigger(enum Move move) { - u32 i; enum BattleMoveEffects effect = GetMoveEffect(move); // Sleeping effects like Sleep Powder, Yawn, Dark Void, etc. @@ -2986,9 +3166,9 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) // Sleeping effects like G-Max Befuddle, G-Max Snooze, etc. u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); switch (additionalEffect->moveEffect) { // Skip MOVE_EFFECT_SLEEP as moves with a secondary chance of applying sleep are allowed by Smogon's rules (ie. Relic Song) @@ -3004,12 +3184,11 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) bool32 HasDamagingMove(u32 battler) { - u32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetMovePower(moves[moveIndex]) > 0) return TRUE; } @@ -3018,20 +3197,19 @@ bool32 HasDamagingMove(u32 battler) bool32 HasDamagingMoveOfType(u32 battler, enum Type type) { - s32 i; - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMovePower(moves[i]) > 0) + if (moves[moveIndex] != MOVE_NONE && moves[moveIndex] != MOVE_UNAVAILABLE && GetMovePower(moves[moveIndex]) > 0) { - enum Type moveType = GetDynamicMoveType(GetBattlerMon(battler), moves[i], battler, MON_IN_BATTLE); + enum Type moveType = GetDynamicMoveType(GetBattlerMon(battler), moves[moveIndex], battler, MON_IN_BATTLE); if (moveType != TYPE_NONE && type == moveType) return TRUE; - if (GetMoveType(moves[i]) == type) + if (GetMoveType(moves[moveIndex]) == type) return TRUE; - if (GetMoveEffect(moves[i]) == EFFECT_NATURE_POWER && GetMoveType(GetNaturePowerMove(moves[i])) == type) + if (GetMoveEffect(moves[moveIndex]) == EFFECT_NATURE_POWER && GetMoveType(GetNaturePowerMove(moves[moveIndex])) == type) return TRUE; } } @@ -3041,10 +3219,10 @@ bool32 HasDamagingMoveOfType(u32 battler, enum Type type) bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag) { - u16 *moves = GetMovesArray(battler); + enum Move *moves = GetMovesArray(battler); u32 moveLimitations = gAiLogicData->moveLimitations[battler]; - for (s32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) continue; @@ -3055,7 +3233,7 @@ bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag) return FALSE; } -bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) +bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, enum Move move) { switch (GetMoveEffect(move)) { @@ -3084,7 +3262,9 @@ static u32 GetLeechSeedDamage(u32 battler) static u32 GetNightmareDamage(u32 battlerId) { u32 damage = 0; - if (gBattleMons[battlerId].volatiles.nightmare && gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battlerId].volatiles.nightmare + && ((gBattleMons[battlerId].status1 & STATUS1_SLEEP) + || gAiLogicData->abilities[battlerId] == ABILITY_COMATOSE)) { damage = GetNonDynamaxMaxHP(battlerId) / 4; if (damage == 0) @@ -3239,11 +3419,9 @@ bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability) return FALSE; } -static bool32 AnyUsefulStatIsRaised(u32 battler) +bool32 AnyUsefulStatIsRaised(u32 battler) { - enum Stat statId; - - for (statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { if (gBattleMons[battler].statStages[statId] > DEFAULT_STAT_STAGE) { @@ -3268,250 +3446,72 @@ static bool32 AnyUsefulStatIsRaised(u32 battler) return FALSE; } -static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) +bool32 BattlerHasMaxHPProtection(u32 battler) { - struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; - enum Ability ability = GetMonAbility(mon); // we know our own party data - enum HoldEffect holdEffect; - u32 species = GetMonData(mon, MON_DATA_SPECIES); - s32 hazardDamage = 0; - enum Type type1 = GetSpeciesType(species, 0); - enum Type type2 = GetSpeciesType(species, 1); - u32 maxHp = GetMonData(mon, MON_DATA_MAX_HP); - u32 side = GetBattlerSide(currBattler); - - if (!AreAnyHazardsOnSide(side)) + u32 ability = gAiLogicData->abilities[battler]; + if (!AI_BattlerAtMaxHp(battler)) return FALSE; - - if (ability == ABILITY_MAGIC_GUARD) - return FALSE; - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM || ability == ABILITY_KLUTZ) - holdEffect = HOLD_EFFECT_NONE; - else - holdEffect = gItemsInfo[GetMonData(mon, MON_DATA_HELD_ITEM)].holdEffect; - if (holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS) - return FALSE; - - if (IsHazardOnSide(side, HAZARDS_STEALTH_ROCK)) - hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_POINTED_STONES, type1, type2, maxHp); - if (IsHazardOnSide(side, HAZARDS_STEELSURGE)) - hazardDamage += GetStealthHazardDamageByTypesAndHP(TYPE_SIDE_HAZARD_SHARP_STEEL, type1, type2, maxHp); - - if (IsHazardOnSide(side, HAZARDS_SPIKES) && ((type1 != TYPE_FLYING && type2 != TYPE_FLYING - && ability != ABILITY_LEVITATE && holdEffect != HOLD_EFFECT_AIR_BALLOON) - || holdEffect == HOLD_EFFECT_IRON_BALL || gFieldStatuses & STATUS_FIELD_GRAVITY)) - { - s32 spikesDmg = maxHp / ((5 - gSideTimers[GetBattlerSide(currBattler)].spikesAmount) * 2); - if (spikesDmg == 0) - spikesDmg = 1; - hazardDamage += spikesDmg; - } - - if (hazardDamage >= GetMonData(mon, MON_DATA_HP)) + if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_FOCUS_SASH) + return TRUE; + if (B_STURDY >= GEN_5 && ability == ABILITY_STURDY) + return TRUE; + if (ability == ABILITY_MULTISCALE || ability == ABILITY_SHADOW_SHIELD) return TRUE; return FALSE; } -enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex) +enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Move move) { - bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class - u32 battlerToSwitch; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - - // Palafin always wants to activate Zero to Hero - if (gBattleMons[battlerAtk].species == SPECIES_PALAFIN_ZERO - && gBattleMons[battlerAtk].ability == ABILITY_ZERO_TO_HERO - && CountUsablePartyMons(battlerAtk) != 0) - return SHOULD_PIVOT; - - battlerToSwitch = gAiLogicData->mostSuitableMonId[battlerAtk]; - // This shouldn't ever happen, but it's there to make sure we don't accidentally read past the gParty array. - if (battlerToSwitch >= PARTY_SIZE) - battlerToSwitch = 0; - if (PartyBattlerShouldAvoidHazards(battlerAtk, battlerToSwitch)) - return DONT_PIVOT; - - if (IsBattle1v1()) + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + bool32 hasGoodSwitchin = gAiLogicData->mostSuitableMonId[battlerAtk] >= PARTY_SIZE ? FALSE : TRUE; + // If AI should switch, it should pivot + if (aiIsFaster) { - if (CountUsablePartyMons(battlerAtk) == 0) - return CAN_TRY_PIVOT; // can't switch, but attack might still be useful - - if (IsBattlerPredictedToSwitch(battlerDef)) - return SHOULD_PIVOT; // Try pivoting so you can switch to a better matchup to counter your new opponent - - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) // Attacker goes first - { - if (!CanAIFaintTarget(battlerAtk, battlerDef, 0)) // Can't KO foe otherwise - { - if (CanAIFaintTarget(battlerAtk, battlerDef, 2)) - { - // attacker can kill target in two hits (theoretically) - if (CanTargetFaintAi(battlerDef, battlerAtk)) - return SHOULD_PIVOT; // Won't get the two turns, pivot - - if (!IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) - || (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) - || defAbility == ABILITY_MULTISCALE - || defAbility == ABILITY_SHADOW_SHIELD)))) - return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale - } - else if (!hasStatBoost) - { - if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH - || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) - || defAbility == ABILITY_MULTISCALE - || defAbility == ABILITY_SHADOW_SHIELD))) - return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale - - if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) - return SHOULD_PIVOT; - - /* TODO - check if switchable mon unafffected by/will remove hazards - if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) - return SHOULD_PIVOT;*/ - - /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) - return SHOULD_PIVOT;*/ - - /*if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) - { - bool32 physMoveInMoveset = PhysicalMoveInMoveset(battlerAtk); - bool32 specMoveInMoveset = SpecialMoveInMoveset(battlerAtk); - - //Pivot if attacking stats are bad - if (physMoveInMoveset && !specMoveInMoveset) - { - if (STAT_STAGE_ATK < 6) - return SHOULD_PIVOT; - } - else if (!physMoveInMoveset && specMoveInMoveset) - { - if (STAT_STAGE_SPATK < 6) - return SHOULD_PIVOT; - } - else if (physMoveInMoveset && specMoveInMoveset) - { - if (STAT_STAGE_ATK < 6 && STAT_STAGE_SPATK < 6) - return SHOULD_PIVOT; - } - - return SHOULD_PIVOT; - }*/ - } - } - } - else // Opponent Goes First - { - if (CanTargetFaintAi(battlerDef, battlerAtk)) - { - if (GetMoveEffect(move) == EFFECT_TELEPORT) - return DONT_PIVOT; // If you're going to faint because you'll go second, use a different move - else - return CAN_TRY_PIVOT; // You're probably going to faint anyways so if for some reason you don't, better switch - } - else if (CanTargetFaintAiWithMod(battlerDef, battlerAtk, 0, 2)) // Foe can 2HKO AI - { - if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) - { - if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk])) - return CAN_TRY_PIVOT; // Use this move to KO if you must - } - else // Can't KO the foe - { - return SHOULD_PIVOT; - } - } - else // Foe can 3HKO+ AI - { - if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) - { - if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) // This is the only move that can KO - && !hasStatBoost) //You're not wasting a valuable stat boost - { - return CAN_TRY_PIVOT; - } - } - else if (CanAIFaintTarget(battlerAtk, battlerDef, 2)) - { - // can knock out foe in 2 hits - if (IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) //Damaging move - //&& (switchScore >= SWITCHING_INCREASE_RESIST_ALL_MOVES + SWITCHING_INCREASE_KO_FOE //remove hazards - || (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)))) - return DONT_PIVOT; // Pivot to break the sash - else - return CAN_TRY_PIVOT; - } - else - { - //if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_KO_FOE) - //return SHOULD_PIVOT; //Only switch if way better matchup - - if (!hasStatBoost) - { - // TODO - check if switching prevents/removes hazards - //if (IsHazardOnSide(GetBattlerSide(battlerAtk, HAZARDS_SPIKES) && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) - //return SHOULD_PIVOT; - - // TODO - not always a good idea - //if (BattlerWillFaintFromSecondaryDamage(battlerAtk) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) - //return SHOULD_PIVOT; - - /*if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) - { - bool32 physMoveInMoveset = PhysicalMoveInMoveset(battlerAtk); - bool32 specMoveInMoveset = SpecialMoveInMoveset(battlerAtk); - - //Pivot if attacking stats are bad - if (physMoveInMoveset && !specMoveInMoveset) - { - if (STAT_STAGE_ATK < 6) - return SHOULD_PIVOT; - } - else if (!physMoveInMoveset && specMoveInMoveset) - { - if (STAT_STAGE_SPATK < 6) - return SHOULD_PIVOT; - } - else if (physMoveInMoveset && specMoveInMoveset) - { - if (STAT_STAGE_ATK < 6 && STAT_STAGE_SPATK < 6) - return SHOULD_PIVOT; - } - }*/ - - return CAN_TRY_PIVOT; - } - } - } - } + if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) + return SHOULD_PIVOT; } - - return DONT_PIVOT; + else + { + if (gAiLogicData->shouldSwitch & (1u << battlerAtk) && !CanTargetFaintAi(battlerDef, battlerAtk)) + return SHOULD_PIVOT; + } + // Break Focus Sash / Multiscale effects if a good switchin exists + if (!IsBattleMoveStatus(move) && BattlerHasMaxHPProtection(battlerDef) && hasGoodSwitchin && RandomPercentage(RNG_AI_SHOULD_PIVOT_BREAK_SASH, SHOULD_PIVOT_BREAK_SASH_CHANCE)) + return SHOULD_PIVOT; + // Would benefit from Regenerator and have a good switchin + if (gAiLogicData->abilities[battlerAtk] == ABILITY_REGENERATOR && ShouldRecover(battlerAtk, battlerDef, move, 33) && hasGoodSwitchin) + return SHOULD_PIVOT; + // Palafin always wants to activate Zero to Hero via pivoting when able + if (gAiLogicData->abilities[battlerAtk] == ABILITY_ZERO_TO_HERO && gBattleMons[battlerAtk].species == SPECIES_PALAFIN_ZERO && CountUsablePartyMons(battlerAtk) != 0) + return SHOULD_PIVOT; + // If no good switchin candidate and can't KO to change the situation, not good to pivot + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, CONSIDER_ENDURE) && !hasGoodSwitchin) + return DONT_PIVOT; + // Otherwise, neutral effect + return CAN_TRY_PIVOT; } -bool32 CanKnockOffItem(u32 battler, u32 item) +#define BATTLE_TYPE_CANT_KNOCK_OFF (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK \ + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_SECRET_BASE \ + | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0)) +bool32 CanKnockOffItem(u32 fromBattler, u32 battler, enum Item item) { if (item == ITEM_NONE) return FALSE; - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_SECRET_BASE - | (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE ? BATTLE_TYPE_TRAINER : 0) - )) && IsOnPlayerSide(battler)) + if (!(gBattleTypeFlags & BATTLE_TYPE_CANT_KNOCK_OFF) && IsOnPlayerSide(fromBattler)) return FALSE; - if (gAiLogicData->abilities[battler] == ABILITY_STICKY_HOLD) + if (gAiLogicData->abilities[fromBattler] == ABILITY_STICKY_HOLD) return FALSE; - if (!CanBattlerGetOrLoseItem(battler, item)) + if (!CanBattlerGetOrLoseItem(fromBattler, battler, item)) return FALSE; return TRUE; } +#undef BATTLE_TYPE_CANT_KNOCK_OFF // status checks bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability) @@ -3522,13 +3522,13 @@ bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability) if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveWithEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; - if (gDisableStructs[battler].rechargeTimer > 0 || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) + if (gBattleMons[battler].volatiles.rechargeTimer > 0 || (ability == ABILITY_TRUANT && gBattleMons[battler].volatiles.truantCounter != 0)) return TRUE; return FALSE; } -bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove) { if (!CanBeSlept(battlerAtk, battlerDef, defAbility, BLOCKED_BY_SLEEP_CLAUSE) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) @@ -3638,7 +3638,7 @@ bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) return TRUE; } -bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) +bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove) { if (!CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3649,7 +3649,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 return TRUE; } -bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove) +bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, enum Move move, enum Move partnerMove) { if (!CanBeParalyzed(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3659,20 +3659,20 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u return TRUE; } -bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability abilityDef) +bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, enum Move move, enum Ability abilityDef) { if (gBattleMons[battlerDef].volatiles.confusionTurns > 0 || (abilityDef == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) - || IsBattlerTerrainAffected(battlerDef, abilityDef, gAiLogicData->holdEffects[battlerDef], STATUS_FIELD_MISTY_TERRAIN) + || IsMistyTerrainAffected(battlerDef, abilityDef, gAiLogicData->holdEffects[battlerDef], gFieldStatuses) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) return FALSE; return TRUE; } -bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove) { - if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY + if (AI_GetBattlerMoveTargetType(battlerAtk, move) == TARGET_FOES_AND_ALLY && AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) && !AI_CanBeConfused(battlerAtk, BATTLE_PARTNER(battlerDef), move, gAiLogicData->abilities[BATTLE_PARTNER(battlerDef)])) return FALSE; @@ -3684,7 +3684,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u3 return TRUE; } -bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove) { if (!CanBeBurned(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3696,7 +3696,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 b return TRUE; } -bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, enum Move move, enum Move partnerMove) { if (!CanBeFrozen(battlerAtk, battlerDef, defAbility) || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) @@ -3719,15 +3719,15 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbilit return TRUE; } -u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move) +bool32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, enum Move move) { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY))) // Opponent goes first { - return 0; + return FALSE; } else if ((atkAbility == ABILITY_SERENE_GRACE || gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS @@ -3735,13 +3735,13 @@ u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, e || gBattleMons[battlerDef].volatiles.confusionTurns > 0) || ((AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) && CanTargetFaintAi(battlerDef, battlerAtk))) { - return 2; // good idea to flinch + return TRUE; // good idea to flinch } - return 0; // don't try to flinch + return FALSE; // don't try to flinch } -bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, enum Move move) { if (AI_CanBattlerEscape(battlerDef)) return FALSE; @@ -3761,21 +3761,20 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) return FALSE; } -bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, enum Move move) { if (!MoveHasAdditionalEffect(move, MOVE_EFFECT_FLINCH)) return FALSE; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (AI_IsSlower(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) return FALSE; - u32 i; u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); // check move additional effects that are likely to happen - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, effectIndex); // Only consider effects with a guaranteed chance to happen if (!MoveEffectIsGuaranteed(battlerAtk, gAiLogicData->abilities[battlerAtk], additionalEffect)) continue; @@ -3817,8 +3816,8 @@ bool32 HasChoiceEffect(u32 battler) static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) { - s32 i, index = gBattleHistory->moveHistoryIndex[battlerId]; - for (i = 0; i < x; i++) + s32 index = gBattleHistory->moveHistoryIndex[battlerId]; + for (u32 turnsAgo = 0; turnsAgo < x; turnsAgo++) { if (--index < 0) index = AI_MOVE_HISTORY_COUNT - 1; @@ -3838,7 +3837,8 @@ bool32 IsWakeupTurn(u32 battler) bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) { struct Pokemon *party; - u32 i, battlerOnField1, battlerOnField2; + u32 battlerOnField1, battlerOnField2; + bool32 hasStatusToCure = FALSE; party = GetBattlerParty(battlerId); @@ -3847,11 +3847,12 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status - if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || gAiLogicData->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) - && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE) - return TRUE; + && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE + && ShouldCureStatus(battlerId, BATTLE_PARTNER(battlerId), gAiLogicData)) + hasStatusToCure = TRUE; } else // In singles there's only one battlerId by side. { @@ -3860,26 +3861,27 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) } // Check attacker's status - if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + if ((GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 || gAiLogicData->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) - && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE) - return TRUE; + && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE + && ShouldCureStatus(battlerId, battlerId, gAiLogicData)) + hasStatusToCure = TRUE; // Check inactive party mons' status - for (i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - if (i == battlerOnField1 || i == battlerOnField2) + if (monIndex == battlerOnField1 || monIndex == battlerOnField2) continue; - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) < GEN_5 && checkSoundproof - && GetMonAbility(&party[i]) == ABILITY_SOUNDPROOF) + && GetMonAbility(&party[monIndex]) == ABILITY_SOUNDPROOF) continue; - if (GetMonData(&party[i], MON_DATA_STATUS) != STATUS1_NONE) + if (GetMonData(&party[monIndex], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; } - return FALSE; + return hasStatusToCure; } bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex) @@ -3896,43 +3898,9 @@ bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 mo return TRUE; } -bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) +static inline bool32 RecoveryEnablesWinning1v1(u32 battlerAtk, u32 battlerDef, enum Move move, u32 aiIsFaster, u32 healAmount) { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) - { - // using item or user goes first - s32 healDmg = (GetMoveAbsorbPercentage(move) * damage) / 100; - - if (gBattleMons[battlerAtk].volatiles.healBlock) - healDmg = 0; - - if (CanTargetFaintAi(battlerDef, battlerAtk) - && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healDmg, 0)) - return TRUE; // target can faint attacker unless they heal - else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < 60 && (Random() % 3)) - return TRUE; // target can't faint attacker at all, attacker health is about half, 2/3rds rate of encouraging healing - } - else - { - // opponent goes first - if (!CanTargetFaintAi(battlerDef, battlerAtk)) - return TRUE; - } - - return FALSE; -} - -bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) -{ - u32 maxHP = gBattleMons[battlerAtk].maxHP; - u32 healAmount = (healPercent * maxHP) / 100; - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); - if (healAmount > maxHP) - healAmount = maxHP; - if (gBattleMons[battlerAtk].volatiles.healBlock) - healAmount = 0; - if (AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY)) + if (aiIsFaster) { if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) @@ -3944,7 +3912,7 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) { if (!CanTargetFaintAi(battlerDef, battlerAtk) && GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < healAmount - && NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk) < NoOfHitsForTargetToFaintBattlerWithMod(battlerDef, battlerAtk, healAmount)) + && NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk, CONSIDER_ENDURE) < NoOfHitsForTargetToFaintBattlerWithMod(battlerDef, battlerAtk, healAmount)) return TRUE; // target can't faint attacker and is dealing less damage than we're healing else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < ENABLE_RECOVERY_THRESHOLD && RandomPercentage(RNG_AI_SHOULD_RECOVER, SHOULD_RECOVER_CHANCE)) return TRUE; // target can't faint attacker at all, generally safe @@ -3952,6 +3920,65 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent) return FALSE; } +static inline bool32 ShouldDrainHPToWithstandHit(u32 battlerAtk, u32 battlerDef, u32 currHP, u32 healAmount) +{ + s32 bestDamageFromPlayer = GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING); + + if (bestDamageFromPlayer >= GetNonDynamaxMaxHP(battlerAtk) + healAmount) + return FALSE; + + if (bestDamageFromPlayer >= currHP && currHP + healAmount > bestDamageFromPlayer) + return TRUE; + + return FALSE; +} + +bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, enum Move move) +{ + u32 maxHP = gBattleMons[battlerAtk].maxHP; + u32 currHP = gBattleMons[battlerAtk].hp; + u32 healAmount = (AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING, gAiLogicData) * GetMoveAbsorbPercentage(move) / 100); + healAmount = GetDrainedBigRootHp(battlerAtk, healAmount); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + if (healAmount == 0) + healAmount = 1; + if (healAmount + currHP > maxHP) + healAmount = maxHP - currHP; + if (gBattleMons[battlerAtk].volatiles.healBlock) + healAmount = 0; + + if (gAiLogicData->abilities[battlerDef] == ABILITY_LIQUID_OOZE) + return FALSE; + if (IsBattlerAtMaxHp(battlerAtk) && (aiIsFaster || GetMoveCategory(GetIncomingMove(battlerAtk, battlerDef, gAiLogicData)) == DAMAGE_CATEGORY_STATUS)) + return FALSE; + if (RecoveryEnablesWinning1v1(battlerAtk, battlerDef, move, aiIsFaster, healAmount)) + return TRUE; + if (ShouldDrainHPToWithstandHit(battlerAtk, battlerDef, currHP, healAmount)) + return TRUE; + + return FALSE; +} + +bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, enum Move move, u32 healPercent) +{ + u32 maxHP = gBattleMons[battlerAtk].maxHP; + u32 currHP = gBattleMons[battlerAtk].hp; + u32 healAmount = (healPercent * maxHP) / 100; + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + bool32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, CONSIDER_PRIORITY); + if (healAmount + currHP > maxHP) + healAmount = maxHP - currHP; + if (gBattleMons[battlerAtk].volatiles.healBlock) + healAmount = 0; + + if (IsBattlerAtMaxHp(battlerAtk)) + return FALSE; + if (RecoveryEnablesWinning1v1(battlerAtk, battlerDef, move, aiIsFaster, healAmount)) + return TRUE; + return FALSE; +} + bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { u32 atkSide = GetBattlerSide(battlerAtk); @@ -3997,7 +4024,7 @@ static bool32 ShouldCureStatusInternal(u32 battlerAtk, u32 battlerDef, bool32 us { if (targetingAlly || targetingSelf) { - if (HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK) || HasMoveWithEffect(battlerDef, EFFECT_SNORE)) + if (HasUsableWhileAsleepMove(battlerDef)) return FALSE; else return usingItem || targetingAlly; @@ -4129,7 +4156,7 @@ bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef) return ((battlerAtk) == (battlerDef ^ BIT_FLANK)); } -u32 GetAllyChosenMove(u32 battlerId) +enum Move GetAllyChosenMove(u32 battlerId) { u32 partnerBattler = BATTLE_PARTNER(battlerId); @@ -4141,7 +4168,7 @@ u32 GetAllyChosenMove(u32 battlerId) return GetChosenMoveFromPosition(partnerBattler); } -bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, enum Move move, enum Move partnerMove) { if (!IsBattlerAlive(battlerAtkPartner) || partnerMove == MOVE_NONE) return FALSE; @@ -4149,7 +4176,7 @@ bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 p u32 battlerDef = gBattleStruct->moveTarget[battlerAtk]; // We don't care the effect is basically the same; we would use this move anyway. - if (GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) + if (IsBestDmgMove(battlerAtk, battlerDef, AI_ATTACKING, move)) return FALSE; u32 atkEffect = GetAIEffectGroupFromMove(battlerAtk, move); @@ -4158,7 +4185,7 @@ bool32 AreMovesEquivalent(u32 battlerAtk, u32 battlerAtkPartner, u32 move, u32 p // shared bits indicate they're meaningfully the same in some way if (atkEffect & partnerEffect) { - if (gMovesInfo[move].target == MOVE_TARGET_SELECTED && gMovesInfo[partnerMove].target == MOVE_TARGET_SELECTED) + if (GetMoveTarget(move) == TARGET_SELECTED && GetMoveTarget(partnerMove) == TARGET_SELECTED) { if (battlerDef == gBattleStruct->moveTarget[battlerAtkPartner]) return TRUE; @@ -4176,12 +4203,8 @@ static u32 GetAIEffectGroup(enum BattleMoveEffects effect) switch (effect) { - case EFFECT_SUNNY_DAY: - case EFFECT_RAIN_DANCE: - case EFFECT_SANDSTORM: - case EFFECT_HAIL: - case EFFECT_SNOWSCAPE: - case EFFECT_CHILLY_RECEPTION: + case EFFECT_WEATHER: + case EFFECT_WEATHER_AND_SWITCH: aiEffect |= AI_EFFECT_WEATHER; break; case EFFECT_ELECTRIC_TERRAIN: @@ -4202,10 +4225,6 @@ static u32 GetAIEffectGroup(enum BattleMoveEffects effect) case EFFECT_TIDY_UP: aiEffect |= AI_EFFECT_CLEAR_HAZARDS; break; - case EFFECT_BRICK_BREAK: - case EFFECT_RAGING_BULL: - aiEffect |= AI_EFFECT_BREAK_SCREENS; - break; case EFFECT_HAZE: aiEffect |= AI_EFFECT_RESET_STATS; break; @@ -4239,18 +4258,18 @@ static u32 GetAIEffectGroup(enum BattleMoveEffects effect) default: break; } + return aiEffect; } -static u32 GetAIEffectGroupFromMove(u32 battler, u32 move) +static u32 GetAIEffectGroupFromMove(u32 battler, enum Move move) { u32 aiEffect = GetAIEffectGroup(GetMoveEffect(move)); - u32 i; u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); - for (i = 0; i < additionalEffectCount; i++) + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - switch (GetMoveAdditionalEffectById(move, i)->moveEffect) + switch (GetMoveAdditionalEffectById(move, effectIndex)->moveEffect) { case MOVE_EFFECT_SUN: case MOVE_EFFECT_RAIN: @@ -4285,6 +4304,9 @@ static u32 GetAIEffectGroupFromMove(u32 battler, u32 move) break; case MOVE_EFFECT_GRAVITY: aiEffect |= AI_EFFECT_GRAVITY; + break; + case MOVE_EFFECT_BREAK_SCREEN: + aiEffect |= AI_EFFECT_BREAK_SCREENS; break; default: break; @@ -4295,7 +4317,7 @@ static u32 GetAIEffectGroupFromMove(u32 battler, u32 move) } // It matches both on move effect and on AI move effect; eg, EFFECT_HAZE will also bring up Freezy Frost or Clear Smog, anything with AI_EFFECT_RESET_STATS. -bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) +bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, enum Move move, enum Move partnerMove) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4303,7 +4325,7 @@ bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 if (GetMoveEffect(move) == GetMoveEffect(partnerMove) && partnerMove != MOVE_NONE) { - if (gMovesInfo[move].target == MOVE_TARGET_SELECTED && gMovesInfo[partnerMove].target == MOVE_TARGET_SELECTED) + if (GetMoveTarget(move) == TARGET_SELECTED && GetMoveTarget(partnerMove) == TARGET_SELECTED) { return gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef; } @@ -4313,7 +4335,7 @@ bool32 DoesPartnerHaveSameMoveEffect(u32 battlerAtkPartner, u32 battlerDef, u32 } //PARTNER_MOVE_EFFECT_IS_STATUS_SAME_TARGET -bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, u32 partnerMove) +bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef, enum Move partnerMove) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4333,7 +4355,7 @@ bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef } //PARTNER_MOVE_EFFECT_IS -bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMoveEffects effectCheck) +bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, enum Move partnerMove, enum BattleMoveEffects effectCheck) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4345,7 +4367,7 @@ bool32 PartnerMoveEffectIs(u32 battlerAtkPartner, u32 partnerMove, enum BattleMo } //PARTNER_MOVE_IS_TAILWIND_TRICKROOM -bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) +bool32 PartnerMoveIs(u32 battlerAtkPartner, enum Move partnerMove, enum Move moveCheck) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4356,7 +4378,7 @@ bool32 PartnerMoveIs(u32 battlerAtkPartner, u32 partnerMove, u32 moveCheck) } //PARTNER_MOVE_IS_SAME -bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 move, u32 partnerMove) +bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, enum Move move, enum Move partnerMove) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4367,7 +4389,7 @@ bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 mo } //PARTNER_MOVE_IS_SAME_NO_TARGET -bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove) +bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, enum Move move, enum Move partnerMove) { if (!HasPartner(battlerAtkPartner)) return FALSE; @@ -4376,16 +4398,15 @@ bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMov return FALSE; } -bool32 PartnerMoveActivatesSleepClause(u32 partnerMove) +bool32 PartnerMoveActivatesSleepClause(enum Move partnerMove) { if (IsBattle1v1() || !IsSleepClauseEnabled()) return FALSE; return IsMoveSleepClauseTrigger(partnerMove); } -bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, enum Move move) { - u32 i; s32 firstId, lastId; struct Pokemon* party; bool32 hasStatus = AnyPartyMemberStatused(battlerAtk, IsSoundMove(move)); @@ -4398,15 +4419,15 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) && (CanTargetFaintAi(battlerDef, battlerAtk) || BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]))) return FALSE; // Don't heal if last mon and will faint - for (i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - u32 currHp = GetMonData(&party[i], MON_DATA_HP); - u32 maxHp = GetMonData(&party[i], MON_DATA_MAX_HP); + u32 currHp = GetMonData(&party[monIndex], MON_DATA_HP); + u32 maxHp = GetMonData(&party[monIndex], MON_DATA_MAX_HP); - if (!GetMonData(&party[i], MON_DATA_IS_EGG, NULL) && currHp > 0) + if (!GetMonData(&party[monIndex], MON_DATA_IS_EGG) && currHp > 0) { if ((currHp * 100) / maxHp < 65 // Less than 65% health remaining - && i >= firstId && i < lastId) // Can only switch to mon on your team + && monIndex >= firstId && monIndex < lastId) // Can only switch to mon on your team { needHealing = TRUE; } @@ -4462,8 +4483,23 @@ void FreeRestoreBattleMons(struct BattlePokemon *savedBattleMons) Free(savedBattleMons); } +#define SIZE_G_AI_LOGIC_DATA (sizeof(struct AiLogicData)) + +struct AiLogicData *AllocSaveAiLogicData(void) +{ + struct AiLogicData *savedAiLogicData = Alloc(SIZE_G_AI_LOGIC_DATA); + memcpy(savedAiLogicData, gAiLogicData, SIZE_G_AI_LOGIC_DATA); + return savedAiLogicData; +} + +void FreeRestoreAiLogicData(struct AiLogicData *savedAiLogicData) +{ + memcpy(gAiLogicData, savedAiLogicData, SIZE_G_AI_LOGIC_DATA); + Free(savedAiLogicData); +} + // Set potential field effect from ability for switch in -static void SetBattlerFieldStatusForSwitchin(u32 battler) +void SetBattlerFieldStatusForSwitchin(u32 battler) { switch (gAiLogicData->abilities[battler]) { @@ -4485,73 +4521,9 @@ static void SetBattlerFieldStatusForSwitchin(u32 battler) } // party logic -s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, uq4_12_t *effectiveness, enum DamageCalcContext calcContext) -{ - struct SimulatedDamage dmg; - struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); - - if (calcContext == AI_ATTACKING) - { - gBattleMons[battlerAtk] = switchinCandidate; - gAiThinkingStruct->saved[battlerDef].saved = TRUE; - SetBattlerAiData(battlerAtk, gAiLogicData); // set known opposing battler data - SetBattlerFieldStatusForSwitchin(battlerAtk); - gAiThinkingStruct->saved[battlerDef].saved = FALSE; - } - else if (calcContext == AI_DEFENDING) - { - gBattleMons[battlerDef] = switchinCandidate; - gAiThinkingStruct->saved[battlerAtk].saved = TRUE; - SetBattlerAiData(battlerDef, gAiLogicData); // set known opposing battler data - SetBattlerFieldStatusForSwitchin(battlerDef); - gAiThinkingStruct->saved[battlerAtk].saved = FALSE; - } - - dmg = AI_CalcDamage(move, battlerAtk, battlerDef, effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetSwitchinWeather(switchinCandidate)); - // restores original gBattleMon struct - FreeRestoreBattleMons(savedBattleMons); - - if (calcContext == AI_ATTACKING) - { - SetBattlerAiData(battlerAtk, gAiLogicData); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) - return dmg.maximum; - else if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) - return dmg.minimum; - else - return dmg.median; - } - - else if (calcContext == AI_DEFENDING) - { - SetBattlerAiData(battlerDef, gAiLogicData); - if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) - return dmg.minimum; - else if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) - return dmg.maximum; - else - return dmg.median; - } - - return dmg.median; -} - -u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePokemon switchinCandidate, u32 aiMoveConsidered, u32 playerMoveConsidered, enum ConsiderPriority considerPriority) -{ - struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); - gBattleMons[battlerAtk] = switchinCandidate; - - SetBattlerAiData(battlerAtk, gAiLogicData); - u32 aiWhoStrikesFirst = AI_WhoStrikesFirst(battlerAtk, battlerDef, aiMoveConsidered, playerMoveConsidered, considerPriority); - FreeRestoreBattleMons(savedBattleMons); - SetBattlerAiData(battlerAtk, gAiLogicData); - - return aiWhoStrikesFirst; -} - s32 CountUsablePartyMons(u32 battlerId) { - s32 battlerOnField1, battlerOnField2, i, ret; + s32 battlerOnField1, battlerOnField2, ret; struct Pokemon *party; party = GetBattlerParty(battlerId); @@ -4567,12 +4539,14 @@ s32 CountUsablePartyMons(u32 battlerId) } ret = 0; - for (i = 0; i < PARTY_SIZE; i++) + s32 firstId, lastId; + GetAIPartyIndexes(battlerId, &firstId, &lastId); + for (u32 monIndex = firstId; monIndex < lastId; monIndex++) { - if (i != battlerOnField1 && i != battlerOnField2 - && GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) + if (monIndex != battlerOnField1 && monIndex != battlerOnField2 + && GetMonData(&party[monIndex], MON_DATA_HP) != 0 + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) { ret++; } @@ -4584,16 +4558,15 @@ s32 CountUsablePartyMons(u32 battlerId) bool32 IsPartyFullyHealedExceptBattler(u32 battlerId) { struct Pokemon *party; - u32 i; party = GetBattlerParty(battlerId); - for (i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - if (i != gBattlerPartyIndexes[battlerId] - && GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG - && GetMonData(&party[i], MON_DATA_HP) < GetMonData(&party[i], MON_DATA_MAX_HP)) + if (monIndex != gBattlerPartyIndexes[battlerId] + && GetMonData(&party[monIndex], MON_DATA_HP) != 0 + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + && GetMonData(&party[monIndex], MON_DATA_HP) < GetMonData(&party[monIndex], MON_DATA_MAX_HP)) return FALSE; } return TRUE; @@ -4602,17 +4575,16 @@ bool32 IsPartyFullyHealedExceptBattler(u32 battlerId) bool32 PartyHasMoveCategory(u32 battlerId, enum DamageCategory category) { struct Pokemon *party = GetBattlerParty(battlerId); - u32 i, j; - for (i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - if (GetMonData(&party[i], MON_DATA_HP, NULL) == 0) + if (GetMonData(&party[monIndex], MON_DATA_HP) == 0) continue; - for (j = 0; j < MAX_MON_MOVES; j++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 move = GetMonData(&party[i], MON_DATA_MOVE1 + j, NULL); - u32 pp = GetMonData(&party[i], MON_DATA_PP1 + j, NULL); + enum Move move = GetMonData(&party[monIndex], MON_DATA_MOVE1 + moveIndex); + u32 pp = GetMonData(&party[monIndex], MON_DATA_PP1 + moveIndex); if (pp > 0 && move != MOVE_NONE) { @@ -4641,7 +4613,7 @@ bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category) return FALSE; } -bool32 IsAbilityOfRating(enum Ability ability, s8 rating) +bool32 IsAbilityOfRating(enum Ability ability, s32 rating) { if (gAbilitiesInfo[ability].aiRating >= rating) return TRUE; @@ -4676,7 +4648,7 @@ static const u16 sRecycleEncouragedItems[] = }; // Its assumed that the berry is strategically given, so no need to check benefits of the berry -bool32 IsStatBoostingBerry(u32 item) +bool32 IsStatBoostingBerry(enum Item item) { switch (item) { @@ -4694,7 +4666,7 @@ bool32 IsStatBoostingBerry(u32 item) } } -bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item) +bool32 ShouldRestoreHpBerry(u32 battlerAtk, enum Item item) { switch (item) { @@ -4714,12 +4686,11 @@ bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item) } } -bool32 IsRecycleEncouragedItem(u32 item) +bool32 IsRecycleEncouragedItem(enum Item item) { - u32 i; - for (i = 0; i < ARRAY_COUNT(sRecycleEncouragedItems); i++) + for (u32 recycleIndex = 0; recycleIndex < ARRAY_COUNT(sRecycleEncouragedItems); recycleIndex++) { - if (item == sRecycleEncouragedItems[i]) + if (item == sRecycleEncouragedItems[recycleIndex]) return TRUE; } return FALSE; @@ -4727,28 +4698,32 @@ bool32 IsRecycleEncouragedItem(u32 item) static bool32 HasMoveThatChangesKOThreshold(u32 battlerId, u32 noOfHitsToFaint, u32 aiIsFaster) { - s32 i; - u16 *moves = GetMovesArray(battlerId); + enum Move *moves = GetMovesArray(battlerId); - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] == MOVE_NONE || moves[i] == MOVE_UNAVAILABLE) + if (moves[moveIndex] == MOVE_NONE || moves[moveIndex] == MOVE_UNAVAILABLE) continue; if (noOfHitsToFaint <= 2) { - if (GetMovePriority(moves[i]) > 0) + if (GetMovePriority(moves[moveIndex]) > 0) return TRUE; - switch (gMovesInfo[moves[i]].additionalEffects[i].moveEffect) + u32 additionalEffectCount = GetMoveAdditionalEffectCount(moves[moveIndex]); + for (u32 effectIndex = 0; effectIndex < additionalEffectCount; effectIndex++) { - case MOVE_EFFECT_SPD_MINUS_1: - case MOVE_EFFECT_SPD_MINUS_2: - { - if(aiIsFaster) - return TRUE; - } - default: - break; + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(moves[moveIndex], effectIndex); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_SPD_MINUS_1: + case MOVE_EFFECT_SPD_MINUS_2: + { + if (aiIsFaster && !additionalEffect->self) + return TRUE; + } + default: + break; + } } } } @@ -4763,6 +4738,7 @@ static enum Stat GetStatBeingChanged(enum StatChange statChange) case STAT_CHANGE_ATK: case STAT_CHANGE_ATK_2: case STAT_CHANGE_ATK_3: + case STAT_CHANGE_ATK_MAX: return STAT_ATK; case STAT_CHANGE_DEF: case STAT_CHANGE_DEF_2: @@ -4812,6 +4788,8 @@ static u32 GetStagesOfStatChange(enum StatChange statChange) case STAT_CHANGE_SPATK_3: case STAT_CHANGE_SPDEF_3: return 3; + case STAT_CHANGE_ATK_MAX: + return 6; } return 0; // STAT_HP, should never be getting changed } @@ -4819,11 +4797,10 @@ static u32 GetStagesOfStatChange(enum StatChange statChange) static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statChange, bool32 considerContrary) { enum AIScore tempScore = NO_INCREASE; - u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + u32 noOfHitsToFaint = NoOfHitsForTargetToFaintBattler(battlerDef, battlerAtk, DONT_CONSIDER_ENDURE); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, MOVE_NONE, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY); // Don't care about the priority of our setup move, care about outspeeding otherwise u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); - u32 i; enum Stat statId = GetStatBeingChanged(statChange); u32 stages = GetStagesOfStatChange(statChange); @@ -4854,12 +4831,12 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, { struct Pokemon *playerParty = GetBattlerParty(battlerDef); // If expected switchin outspeeds and has Encore, don't increase - for (i = 0; i < MAX_MON_MOVES; i++) + for (u32 monIndex = 0; monIndex < MAX_MON_MOVES; monIndex++) { - if (GetMoveEffect(GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_MOVE1 + i, NULL)) == EFFECT_ENCORE - && GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_PP1 + i, NULL) > 0); + if (GetMoveEffect(GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_MOVE1 + monIndex)) == EFFECT_ENCORE + && GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_PP1 + monIndex) > 0); { - if (GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_SPEED, NULL) > gBattleMons[battlerAtk].speed) + if (GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_SPEED) > gBattleMons[battlerAtk].speed) return NO_INCREASE; } } @@ -4874,6 +4851,8 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, { if (stages == 1) tempScore += DECENT_EFFECT; + else if (stages == 6) + tempScore += BEST_EFFECT; else tempScore += GOOD_EFFECT; } @@ -4919,7 +4898,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, } break; case STAT_ACC: - if (gBattleMons[battlerAtk].statStages[statId] <= 3) // Increase only if necessary + if (gBattleMons[battlerAtk].statStages[statId] <= DEFAULT_STAT_STAGE - 3) // Increase only if necessary tempScore += DECENT_EFFECT; break; case STAT_EVASION: @@ -4939,17 +4918,38 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return tempScore; } -u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) +bool32 HasHPForDamagingSetup(u32 battlerAtk, u32 battlerDef, u32 hpThreshold) +{ + bool32 bestMoveIsPhysical = HasPhysicalBestMove(battlerDef, battlerAtk, AI_DEFENDING); + + if (GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < ((hpThreshold * gBattleMons[battlerAtk].maxHP) / 100)) + return TRUE; + + if (bestMoveIsPhysical + && gAiLogicData->abilities[battlerAtk] == ABILITY_ICE_FACE + && gBattleMons[battlerAtk].species == SPECIES_EISCUE_ICE + && !IsMoldBreakerTypeAbility(battlerDef, gAiLogicData->abilities[battlerDef])) // ice face will absorb the hit, safe to use setup + return TRUE; + + if (gAiLogicData->abilities[battlerAtk] == ABILITY_DISGUISE + && IsMimikyuDisguised(battlerAtk) + && !IsMoldBreakerTypeAbility(battlerDef, gAiLogicData->abilities[battlerDef])) // disguise will absorb the hit, safe to use setup + return TRUE; + + return FALSE; +} + +enum AIScore IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) { return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, TRUE); } -u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) +enum AIScore IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statChange) { return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, FALSE); } -void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PSN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) @@ -4972,7 +4972,7 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) } } -void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_BRN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) @@ -4984,7 +4984,24 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker && GetSpeciesBaseAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) + 10)) { - if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL) + enum Move defBestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + bool8 hasPhysical = FALSE; + + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, AI_DEFENDING, defBestMoves); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (defBestMoves[moveIndex] == MOVE_NONE) + break; + + if (GetMoveCategory(defBestMoves[moveIndex]) == DAMAGE_CATEGORY_PHYSICAL) + { + hasPhysical = TRUE; + break; + } + } + + if (hasPhysical) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -4996,7 +5013,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) } } -void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PAR || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) @@ -5018,19 +5035,31 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) } } -void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING)) != EFFECT_FOCUS_PUNCH) - || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0))) + { + enum Move bestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, AI_ATTACKING, bestMoves); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if ((GetMoveEffect(bestMoves[moveIndex]) != EFFECT_FOCUS_PUNCH) && (bestMoves[moveIndex] != MOVE_NONE)) + return; + } + } + if (AI_CanPutToSleep(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiLogicData->partnerMove)) ADJUST_SCORE_PTR(DECENT_EFFECT); else return; if ((HasMoveWithEffect(battlerAtk, EFFECT_DREAM_EATER) || HasMoveWithEffect(battlerAtk, EFFECT_NIGHTMARE)) - && !(HasMoveWithEffect(battlerDef, EFFECT_SNORE) || HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK))) + && !HasUsableWhileAsleepMove(battlerDef)) ADJUST_SCORE_PTR(WEAK_EFFECT); if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) @@ -5038,7 +5067,7 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) ADJUST_SCORE_PTR(WEAK_EFFECT); } -void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_CONFUSION || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) @@ -5057,7 +5086,7 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return; @@ -5068,7 +5097,24 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker && GetSpeciesBaseSpAttack(gBattleMons[battlerDef].species) >= GetSpeciesBaseAttack(gBattleMons[battlerDef].species) + 10)) { - if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL) + enum Move defBestMoves[MAX_MON_MOVES] = {MOVE_NONE}; + bool8 hasSpecial = FALSE; + + GetBestDmgMovesFromBattler(battlerAtk, battlerDef, AI_DEFENDING, defBestMoves); + + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + { + if (defBestMoves[moveIndex] == MOVE_NONE) + break; + + if (GetMoveCategory(defBestMoves[moveIndex]) == DAMAGE_CATEGORY_SPECIAL) + { + hasSpecial = TRUE; + break; + } + } + + if (hasSpecial) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -5080,17 +5126,48 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -bool32 AI_MoveMakesContact(enum Ability ability, enum HoldEffect holdEffect, u32 move) +bool32 AI_MoveMakesContact(u32 battlerAtk, u32 battlerDef, enum Ability ability, enum HoldEffect holdEffect, enum Move move) { - if (MoveMakesContact(move) - && ability != ABILITY_LONG_REACH - && holdEffect != HOLD_EFFECT_PROTECTIVE_PADS) - return TRUE; - return FALSE; + if (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM) + { + if (gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] != DAMAGE_CATEGORY_PHYSICAL) + return FALSE; + } + else if (!MoveMakesContact(move)) + { + return FALSE; + } + if (ability == ABILITY_LONG_REACH) + return FALSE; + if (holdEffect == HOLD_EFFECT_PROTECTIVE_PADS) + return FALSE; + if (holdEffect == HOLD_EFFECT_PUNCHING_GLOVE && IsPunchingMove(move)) + return FALSE; + return TRUE; +} + +bool32 IsUnseenFistContactMove(u32 battlerAtk, u32 battlerDef, enum Move move) +{ + if (move == MOVE_NONE || move == MOVE_UNAVAILABLE) + return FALSE; + if (gAiLogicData->abilities[battlerAtk] != ABILITY_UNSEEN_FIST) + return FALSE; + if (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM) + { + if (gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] != DAMAGE_CATEGORY_PHYSICAL) + return FALSE; + } + else if (!MoveMakesContact(move)) + { + return FALSE; + } + if (gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_PUNCHING_GLOVE && IsPunchingMove(move)) + return FALSE; + return TRUE; } -bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, enum Move move) { if (GetMovePower(move) == 0 && GetMoveZEffect(move) == Z_EFFECT_NONE) return FALSE; @@ -5099,11 +5176,11 @@ bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move) } //TODO - this could use some more sophisticated logic -bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) +bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, enum Move chosenMove) { - // simple logic. just upgrades chosen move to z move if possible, unless regular move would kill opponent - if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk) && !(GetBattlerMoveTargetType(battlerAtk, chosenMove) & MOVE_TARGET_ALLY)) + enum MoveTarget target = AI_GetBattlerMoveTargetType(battlerAtk, chosenMove); + if ((IsDoubleBattle()) && battlerDef == BATTLE_PARTNER(battlerAtk) && target != TARGET_ALLY && target != TARGET_USER_OR_ALLY) return FALSE; // don't use z move on partner if (HasTrainerUsedGimmick(battlerAtk, GIMMICK_Z_MOVE)) return FALSE; // can't use z move twice @@ -5113,7 +5190,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) enum BattleMoveEffects baseEffect = GetMoveEffect(chosenMove); bool32 isEager = FALSE; // more likely to use a z move than typical - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); bool32 isSlower = AI_IsSlower(battlerAtk, battlerDef, chosenMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY); switch (baseEffect) @@ -5125,7 +5202,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) isEager = TRUE; break; case EFFECT_PROTECT: - if (HasDamagingMoveOfType(battlerAtk, GetMoveType(gMovesInfo[chosenMove].type))) + if (HasDamagingMoveOfType(battlerAtk, GetMoveType(chosenMove))) return FALSE; else isEager = TRUE; @@ -5134,7 +5211,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) isEager = TRUE; break; case EFFECT_TRANSFORM: - if (IsBattlerTrapped(battlerDef, battlerAtk) && !HasDamagingMoveOfType(battlerDef, GetMoveType(gMovesInfo[chosenMove].type))) + if (IsBattlerTrapped(battlerDef, battlerAtk) && !HasDamagingMoveOfType(battlerDef, GetMoveType(chosenMove))) return TRUE; if (isSlower) isEager = TRUE; @@ -5218,19 +5295,22 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) return FALSE; } - if (statChange != 0 && (isEager || IncreaseStatUpScore(battlerAtk, battlerDef, statChange) > 0)) + if (statChange != 0 && (isEager || IncreaseStatUpScoreContrary(battlerAtk, battlerDef, statChange) > 0)) return TRUE; } else if (GetMoveEffect(zMove) == EFFECT_EXTREME_EVOBOOST) { - return ShouldRaiseAnyStat(battlerAtk, battlerDef); + return gAiLogicData->abilities[battlerAtk] != ABILITY_CONTRARY && ShouldRaiseAnyStat(battlerAtk, battlerDef); } else if (!IsBattleMoveStatus(chosenMove) && IsBattleMoveStatus(zMove)) { return FALSE; } + if (GetMoveEffect(chosenMove) == EFFECT_LAST_RESORT && !CanUseLastResort(battlerAtk)) + return TRUE; + uq4_12_t effectiveness; struct SimulatedDamage dmg; @@ -5245,8 +5325,20 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) dmg = AI_CalcDamageSaveBattlers(chosenMove, battlerAtk, battlerDef, &effectiveness, NO_GIMMICK, NO_GIMMICK); + // don't waste a damaging z move if the normal move will KO if (!IsBattleMoveStatus(chosenMove) && dmg.minimum >= gBattleMons[battlerDef].hp) - return FALSE; // don't waste damaging z move if can otherwise faint target + { + // Risky AI skips accuracy check. + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) + return FALSE; + + u32 acc = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; + + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) + return (acc < 100); + + return acc < LOW_ACCURACY_THRESHOLD; + } return TRUE; } @@ -5299,28 +5391,28 @@ void DecideTerastal(u32 battler) uq4_12_t effectivenessTakenWithTera[MAX_MON_MOVES]; - u16* aiMoves = GetMovesArray(battler); - u16* oppMoves = GetMovesArray(opposingBattler); + enum Move *aiMoves = GetMovesArray(battler); + enum Move *oppMoves = GetMovesArray(opposingBattler); uq4_12_t effectiveness; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (!IsMoveUnusable(i, aiMoves[i], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[i])) - altCalcs.dealtWithoutTera[i] = AI_CalcDamage(aiMoves[i], battler, opposingBattler, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather()); + if (!IsMoveUnusable(moveIndex, aiMoves[moveIndex], gAiLogicData->moveLimitations[battler]) && !IsBattleMoveStatus(aiMoves[moveIndex])) + altCalcs.dealtWithoutTera[moveIndex] = AI_CalcDamage(aiMoves[moveIndex], battler, opposingBattler, &effectiveness, NO_GIMMICK, NO_GIMMICK, AI_GetWeather(), gFieldStatuses); else - altCalcs.dealtWithoutTera[i] = noDmg; + altCalcs.dealtWithoutTera[moveIndex] = noDmg; - if (!IsMoveUnusable(i, oppMoves[i], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[i])) + if (!IsMoveUnusable(moveIndex, oppMoves[moveIndex], gAiLogicData->moveLimitations[opposingBattler]) && !IsBattleMoveStatus(oppMoves[moveIndex])) { - altCalcs.takenWithTera[i] = AI_CalcDamage(oppMoves[i], opposingBattler, battler, &effectiveness, USE_GIMMICK, USE_GIMMICK, AI_GetWeather()); - effectivenessTakenWithTera[i] = effectiveness; + altCalcs.takenWithTera[moveIndex] = AI_CalcDamage(oppMoves[moveIndex], opposingBattler, battler, &effectiveness, USE_GIMMICK, USE_GIMMICK, AI_GetWeather(), gFieldStatuses); + effectivenessTakenWithTera[moveIndex] = effectiveness; } else { - altCalcs.takenWithTera[i] = noDmg; - effectivenessTakenWithTera[i] = Q_4_12(0.0); + altCalcs.takenWithTera[moveIndex] = noDmg; + effectivenessTakenWithTera[moveIndex] = Q_4_12(0.0); } } @@ -5331,17 +5423,17 @@ void DecideTerastal(u32 battler) if (res == USE_GIMMICK) { // Damage calcs for damage received assumed we wouldn't tera. Adjust that so that further AI decisions are more accurate. - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gAiLogicData->simulatedDmg[opposingBattler][battler][i] = altCalcs.takenWithTera[i]; - gAiLogicData->effectiveness[opposingBattler][battler][i] = effectivenessTakenWithTera[i]; + gAiLogicData->simulatedDmg[opposingBattler][battler][moveIndex] = altCalcs.takenWithTera[moveIndex]; + gAiLogicData->effectiveness[opposingBattler][battler][moveIndex] = effectivenessTakenWithTera[moveIndex]; } } else { // Damage calcs for damage dealt assumed we would tera. Adjust that so that further AI decisions are more accurate. - for (int i = 0; i < MAX_MON_MOVES; i++) - gAiLogicData->simulatedDmg[battler][opposingBattler][i] = altCalcs.dealtWithoutTera[i]; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + gAiLogicData->simulatedDmg[battler][opposingBattler][moveIndex] = altCalcs.dealtWithoutTera[moveIndex]; } SetAIUsingGimmick(battler, res); @@ -5356,38 +5448,38 @@ void DecideTerastal(u32 battler) enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, struct AltTeraCalcs *altCalcs) { - struct Pokemon* party = GetBattlerParty(battler); + struct Pokemon *party = GetBattlerParty(battler); // Check how many pokemon we have that could tera int numPossibleTera = 0; - for (int i = 0; i < PARTY_SIZE; i++) + for (u32 monIndex = 0; monIndex < PARTY_SIZE; monIndex++) { - if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG - && GetMonData(&party[i], MON_DATA_TERA_TYPE) > 0) + if (GetMonData(&party[monIndex], MON_DATA_HP) != 0 + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE + && GetMonData(&party[monIndex], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + && GetMonData(&party[monIndex], MON_DATA_TERA_TYPE) > 0) numPossibleTera++; } u16 aiHp = gBattleMons[battler].hp; u16 oppHp = gBattleMons[opposingBattler].hp; - u16* aiMoves = GetMovesArray(battler); - u16* oppMoves = GetMovesArray(opposingBattler); + enum Move *aiMoves = GetMovesArray(battler); + enum Move *oppMoves = GetMovesArray(opposingBattler); // Check whether tera enables a KO bool32 hasKoWithout = FALSE; - u16 killingMove = MOVE_NONE; + enum Move killingMove = MOVE_NONE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (dealtWithTera[i].median >= oppHp) + if (dealtWithTera[moveIndex].median >= oppHp) { - u16 move = aiMoves[i]; + enum Move move = aiMoves[moveIndex]; if (killingMove == MOVE_NONE || GetBattleMovePriority(battler, gAiLogicData->abilities[battler], move) > GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove)) killingMove = move; } - if (dealtWithoutTera[i].median >= oppHp) + if (dealtWithoutTera[moveIndex].median >= oppHp) hasKoWithout = TRUE; } @@ -5397,12 +5489,12 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str bool32 savedFromKo = FALSE; bool32 getsKodRegardlessBySingleMove = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum >= aiHp) + if (takenWithoutTera[moveIndex].maximum >= aiHp && takenWithTera[moveIndex].maximum >= aiHp) getsKodRegardlessBySingleMove = TRUE; - if (takenWithoutTera[i].maximum >= aiHp && takenWithTera[i].maximum < aiHp) + if (takenWithoutTera[moveIndex].maximum >= aiHp && takenWithTera[moveIndex].maximum < aiHp) savedFromKo = TRUE; } @@ -5410,12 +5502,12 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str savedFromKo = FALSE; // Check whether opponent can punish tera by ko'ing - u16 hardPunishingMove = MOVE_NONE; - for (int i = 0; i < MAX_MON_MOVES; i++) + enum Move hardPunishingMove = MOVE_NONE; + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (takenWithTera[i].maximum >= aiHp) + if (takenWithTera[moveIndex].maximum >= aiHp) { - u16 move = oppMoves[i]; + enum Move move = oppMoves[moveIndex]; if (hardPunishingMove == MOVE_NONE || GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], move) > GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) hardPunishingMove = move; } @@ -5425,32 +5517,32 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str // (e.g. a weakness becomes a resistance, a 4x weakness becomes neutral, etc) bool32 takesBigHit = FALSE; bool32 savedFromAllBigHits = TRUE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (takenWithoutTera[i].median > aiHp/2) + if (takenWithoutTera[moveIndex].median > aiHp/2) { takesBigHit = TRUE; - if (takenWithTera[i].median > aiHp/4) + if (takenWithTera[moveIndex].median > aiHp/4) savedFromAllBigHits = FALSE; } } // Check for any benefit whatsoever. Only used for the last possible mon that could tera. bool32 anyOffensiveBenefit = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (dealtWithTera[i].median > dealtWithoutTera[i].median) + if (dealtWithTera[moveIndex].median > dealtWithoutTera[moveIndex].median) anyOffensiveBenefit = TRUE; } bool32 anyDefensiveBenefit = FALSE; bool32 anyDefensiveDrawback = FALSE; - for (int i = 0; i < MAX_MON_MOVES; i++) + for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (takenWithTera[i].median < takenWithoutTera[i].median) + if (takenWithTera[moveIndex].median < takenWithoutTera[moveIndex].median) anyDefensiveBenefit = TRUE; - if (takenWithTera[i].median > takenWithoutTera[i].median) + if (takenWithTera[moveIndex].median > takenWithoutTera[moveIndex].median) anyDefensiveDrawback = TRUE; } @@ -5466,7 +5558,7 @@ enum AIConsiderGimmick ShouldTeraFromCalcs(u32 battler, u32 opposingBattler, str } else { - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battler, opposingBattler, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battler, opposingBattler, gAiLogicData); // will we go first? if (AI_WhoStrikesFirst(battler, opposingBattler, killingMove, predictedMoveSpeedCheck, CONSIDER_PRIORITY) == AI_IS_FASTER && GetBattleMovePriority(battler, gAiLogicData->abilities[battler], killingMove) >= GetBattleMovePriority(opposingBattler, gAiLogicData->abilities[opposingBattler], hardPunishingMove)) return USE_GIMMICK; @@ -5532,13 +5624,12 @@ s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle) bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) { - enum Stat i; // Want to copy positive stat changes - for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++) + for (enum Stat statId = STAT_ATK; statId < NUM_BATTLE_STATS; statId++) { - if (gBattleMons[battlerDef].statStages[i] > gBattleMons[battlerAtk].statStages[i]) + if (gBattleMons[battlerDef].statStages[statId] > gBattleMons[battlerAtk].statStages[statId]) { - switch (i) + switch (statId) { case STAT_ATK: return (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL)); @@ -5562,7 +5653,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) } //TODO - track entire opponent party data to determine hazard effectiveness -bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { if (CountUsablePartyMons(battlerDef) == 0 || HasBattlerSideMoveWithAIEffect(battlerDef, AI_EFFECT_CLEAR_HAZARDS)) @@ -5587,13 +5678,13 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, u32 move, struct Ai return TRUE; } -void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) +void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score) { if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0) ADJUST_SCORE_PTR(GOOD_EFFECT); if (AreAnyHazardsOnSide(GetBattlerSide(battlerDef)) && CountUsablePartyMons(battlerDef) != 0) ADJUST_SCORE_PTR(-2); - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData); if (gBattleMons[battlerAtk].volatiles.substitute && AI_IsFaster(battlerAtk, battlerDef, move, predictedMoveSpeedCheck, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE_PTR(-10); if (gBattleMons[battlerDef].volatiles.substitute) @@ -5605,11 +5696,11 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) ADJUST_SCORE_PTR(-2); } -bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData) +bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, enum Move move, struct AiLogicData *aiData) { u32 preventsStatLoss; enum Ability partnerAbility = aiData->abilities[battlerAtkPartner]; - u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); + enum BattlerPosition opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk)); u32 opposingBattler = GetBattlerAtPosition(opposingPosition); if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE @@ -5632,13 +5723,13 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st default: break; } - u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, opposingBattler, gAiLogicData); + enum Move predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, opposingBattler, gAiLogicData); return (preventsStatLoss && AI_IsFaster(battlerAtk, battlerAtkPartner, MOVE_NONE, predictedMoveSpeedCheck, CONSIDER_PRIORITY) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL)); } -u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) +u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, enum Move move) { enum BattleMoveEffects effect = GetMoveEffect(move); u32 scoreIncrease = 0; @@ -5649,7 +5740,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } else if (effect == EFFECT_SHED_TAIL) // Shed Tail specific { - if ((ShouldPivot(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiThinkingStruct->movesetIndex)) + if ((ShouldPivot(battlerAtk, battlerDef, move)) && (HasAnyKnownMove(battlerDef) && (GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < gBattleMons[battlerAtk].maxHP / 2))) scoreIncrease += BEST_EFFECT; } @@ -5756,7 +5847,7 @@ bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability { case ABILITY_LIGHTNING_ROD: case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) < GEN_5) return FALSE; else return (BattlerStatCanRise(battlerDef, ability, STAT_SPATK) && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)); @@ -5785,7 +5876,7 @@ bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability return BattlerStatCanRise(battlerDef, ability, STAT_SPEED); case ABILITY_FLASH_FIRE: - return (HasMoveWithType(battlerDef, TYPE_FIRE) && !gDisableStructs[battlerDef].flashFireBoosted); + return (HasMoveWithType(battlerDef, TYPE_FIRE) && !gBattleMons[battlerDef].volatiles.flashFireBoosted); case ABILITY_WATER_COMPACTION: case ABILITY_WELL_BAKED_BODY: @@ -5803,7 +5894,7 @@ bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability // Used by CheckBadMove; this is determining purely if the effect CAN change an ability, not if it SHOULD. // At the moment, the parts about Mummy and Wandering Spirit are not actually used. -bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData) +bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, enum Move move, struct AiLogicData *aiData) { u32 effect = GetMoveEffect(move); @@ -5936,7 +6027,7 @@ bool32 DoesEffectReplaceTargetAbility(u32 effect) } } -void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score, struct AiLogicData *aiData) +void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, enum Move move, s32 *score, struct AiLogicData *aiData) { u32 effect = GetMoveEffect(move); bool32 isTargetingPartner = IsTargetingPartner(battlerAtk, battlerDef); @@ -6076,8 +6167,8 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct Ai } else { - s32 score1 = IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); - s32 score2 = IncreaseStatDownScore(battler, RIGHT_FOE(battler), STAT_ATK); + enum AIScore score1 = IncreaseStatDownScore(battler, LEFT_FOE(battler), STAT_ATK); + enum AIScore score2 = IncreaseStatDownScore(battler, RIGHT_FOE(battler), STAT_ATK); if (score1 > score2) return score1; else @@ -6152,3 +6243,176 @@ bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget) } return FALSE; } + +u32 GetAIExplosionChanceFromHP(u32 hpPercent) +{ + if (hpPercent >= EXPLOSION_HIGHER_HP_THRESHOLD) + return EXPLOSION_MINIMUM_CHANCE; + if (hpPercent <= EXPLOSION_LOWER_HP_THRESHOLD) + return EXPLOSION_MAXIMUM_CHANCE; + return (EXPLOSION_HIGHER_HP_THRESHOLD - hpPercent); +} + +bool32 ShouldFinalGambit(u32 battlerAtk, u32 battlerDef, bool32 aiIsFaster) +{ + if (!gAiLogicData->shouldConsiderFinalGambit) + return FALSE; + // Note to use GetScaledHPFraction + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) + { + if (gBattleMons[battlerAtk].hp >= gBattleMons[battlerDef].hp && aiIsFaster) + { + return TRUE; + } + } + else if (gAiLogicData->hpPercents[battlerAtk] >= gAiLogicData->hpPercents[battlerDef] // Consider using GetScaledHPFraction and moving B_HEALTHBAR_PIXELS define + && GetSpeciesBaseHP(gBattleMons[battlerAtk].species) >= GetSpeciesBaseHP(gBattleMons[battlerDef].species) + && aiIsFaster) + { + return TRUE; + } + return FALSE; +} + +bool32 ShouldConsiderSelfSacrificeDamageEffect(u32 battlerAtk, u32 battlerDef, enum Move move, bool32 aiIsFaster) +{ + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + return TRUE; + if (!IsDoubleBattle() && IsExplosionMove(move) && gAiLogicData->shouldConsiderExplosion) + return TRUE; + if (GetMoveEffect(move) == EFFECT_FINAL_GAMBIT) + return ShouldFinalGambit(battlerAtk, battlerDef, aiIsFaster); + return FALSE; +} + +bool32 AiExpectsToFaintPlayer(u32 battler) +{ + u8 target = gAiBattleData->chosenTarget[battler]; + + if (gAiBattleData->actionFlee || gAiBattleData->choiceWatch) + return FALSE; // AI not planning to use move + + if (!IsBattlerAlly(target, battler) + && CanIndexMoveFaintTarget(battler, target, gAiBattleData->chosenMoveIndex[battler], AI_ATTACKING) + && AI_IsFaster(battler, target, GetAIChosenMove(battler), GetIncomingMove(battler, target, gAiLogicData), CONSIDER_PRIORITY)) + { + // We expect to faint the target and move first -> dont use an item or switch + return TRUE; + } + + return FALSE; +} + +bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount) +{ + // Check special cases to NOT heal + for (u32 battlerIndex = 0; battlerIndex < gBattlersCount; battlerIndex++) + { + if (IsOnPlayerSide(battlerIndex) && CanTargetFaintAiWithMod(battlerIndex, battler, healAmount, 0)) + { + // Target is expected to faint us + return TRUE; + } + } + return FALSE; +} + +void GetAIPartyIndexes(u32 battler, s32 *firstId, s32 *lastId) +{ + if (BATTLE_TWO_VS_ONE_OPPONENT && (battler & BIT_SIDE) == B_SIDE_OPPONENT) + { + *firstId = 0, *lastId = PARTY_SIZE; + } + else if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TOWER_LINK_MULTI)) + { + if ((battler & BIT_FLANK) == B_FLANK_LEFT) + *firstId = 0, *lastId = PARTY_SIZE / 2; + else + *firstId = PARTY_SIZE / 2, *lastId = PARTY_SIZE; + } + else + { + *firstId = 0, *lastId = PARTY_SIZE; + } +} + +bool32 ShouldInstructPartner(u32 partner, enum Move move) +{ + if (GetMoveEffect(move) == EFFECT_MAX_HP_50_RECOIL && gAiLogicData->abilities[partner] != ABILITY_MAGIC_GUARD) + return FALSE; + + enum MoveTarget type = AI_GetBattlerMoveTargetType(partner, move); + switch (type) + { + case TARGET_SELECTED: + case TARGET_SMART: + case TARGET_DEPENDS: + case TARGET_RANDOM: + case TARGET_BOTH: + case TARGET_FOES_AND_ALLY: + case TARGET_USER_AND_ALLY: + case TARGET_OPPONENTS_FIELD: + return TRUE; + default: + return FALSE; + } + + return FALSE; +} + +bool32 CanMoveBeBouncedBack(u32 battler, enum Move move) +{ + if (!MoveCanBeBouncedBack(move) || !IsBattleMoveStatus(move)) + return FALSE; + + enum MoveTarget type = AI_GetBattlerMoveTargetType(battler, move); + switch (type) + { + case TARGET_SELECTED: + case TARGET_SMART: + case TARGET_OPPONENTS_FIELD: + case TARGET_BOTH: + return TRUE; + default: + return FALSE; + } + + return FALSE; +} + +u32 GetActiveBattlerIds(u32 battler, u32 *battlerIn1, u32 *battlerIn2) +{ + u32 opposingBattler = 0; + enum BattlerPosition battlerPosition = GetBattlerPosition(battler); + if (IsDoubleBattle()) + { + *battlerIn1 = battler; + if (gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battler))) + *battlerIn2 = battler; + else + *battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(battlerPosition)); + + opposingBattler = BATTLE_OPPOSITE(*battlerIn1); + if (gAbsentBattlerFlags & (1u << opposingBattler)) + opposingBattler ^= BIT_FLANK; + } + else + { + opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(battlerPosition)); + *battlerIn1 = battler; + *battlerIn2 = battler; + } + + return opposingBattler; +} + +bool32 IsPartyMonOnFieldOrChosenToSwitch(u32 partyIndex, u32 battlerIn1, u32 battlerIn2) +{ + if (partyIndex == gBattlerPartyIndexes[battlerIn1] + || partyIndex == gBattlerPartyIndexes[battlerIn2]) + return TRUE; + if (partyIndex == gBattleStruct->monToSwitchIntoId[battlerIn1] + || partyIndex == gBattleStruct->monToSwitchIntoId[battlerIn2]) + return TRUE; + return FALSE; +} diff --git a/src/battle_anim.c b/src/battle_anim.c index 6bc6438e5..7e02a6b0a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -102,7 +102,7 @@ EWRAM_DATA static s8 sAnimFramesToWait = 0; EWRAM_DATA bool8 gAnimScriptActive = FALSE; EWRAM_DATA u8 gAnimVisualTaskCount = 0; EWRAM_DATA u8 gAnimSoundTaskCount = 0; -EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; +EWRAM_DATA struct LinkBattleAnim *gAnimDisableStructPtr = NULL; EWRAM_DATA s32 gAnimMoveDmg = 0; EWRAM_DATA u16 gAnimMovePower = 0; EWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; @@ -254,6 +254,8 @@ static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = [B_ANIM_TERA_ACTIVATE] = gBattleAnimGeneral_TeraActivate, [B_ANIM_SIMPLE_HEAL] = gBattleAnimGeneral_SimpleHeal, [B_ANIM_POWER_CONSTRUCT] = gBattleAnimGeneral_PowerConstruct, + [B_ANIM_SWAP_TO_SUBSTITUTE] = gBattleAnimGeneral_SwapToSubstitute, + [B_ANIM_SWAP_FROM_SUBSTITUTE] = gBattleAnimGeneral_SwapFromSubstitute, [B_ANIM_MON_SCARED] = gBattleAnimGeneral_MonScared, [B_ANIM_GHOST_GET_OUT] = gBattleAnimGeneral_GhostGetOut, [B_ANIM_SILPH_SCOPED] = gBattleAnimGeneral_SilphScoped, @@ -304,12 +306,12 @@ void ClearBattleAnimationVars(void) gAnimCustomPanning = 0; } -void DoMoveAnim(u16 move) +void DoMoveAnim(enum Move move) { gBattleAnimAttacker = gBattlerAttacker; gBattleAnimTarget = gBattlerTarget; // Make sure the anim target of moves hitting everyone is at the opposite side. - if (GetBattlerMoveTargetType(gBattlerAttacker, move) & MOVE_TARGET_FOES_AND_ALLY && IsDoubleBattle()) + if (GetBattlerMoveTargetType(gBattleAnimAttacker, move) == TARGET_FOES_AND_ALLY && IsDoubleBattle()) { while (IsBattlerAlly(gBattleAnimAttacker, gBattleAnimTarget)) { @@ -554,7 +556,7 @@ static u8 GetBattleAnimMoveTargets(u8 battlerArgIndex, u8 *targets) switch (target) { - case MOVE_TARGET_FOES_AND_ALLY: + case TARGET_FOES_AND_ALLY: if (battlerAnimId == ANIM_ATTACKER) { targets[numTargets++] = gBattleAnimAttacker; @@ -568,7 +570,7 @@ static u8 GetBattleAnimMoveTargets(u8 battlerArgIndex, u8 *targets) } } break; - case MOVE_TARGET_BOTH: // all opponents + case TARGET_BOTH: // all opponents for (i = 0; i < gBattlersCount; i++) { if (i != ignoredTgt && !IsBattlerAlly(i, ignoredTgt) && IS_ALIVE_AND_PRESENT(i)) diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 35cd31f33..861b6f074 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -5189,7 +5189,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) + if (GetMoveTarget(gAnimMoveIndex) == TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimAttacker, TRUE, &a, &b); } @@ -5201,7 +5201,7 @@ void AnimNeedleArmSpike(struct Sprite *sprite) } else { - if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) + if (GetMoveTarget(gAnimMoveIndex) == TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &a, &b); } @@ -6833,34 +6833,34 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner) u32 i, temp; // if used future sight on opposing side, properly track who used it - if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0 - || gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0) + if (gBattleStruct->futureSight[LEFT_FOE(battlerAtk)].counter > 0 + || gBattleStruct->futureSight[RIGHT_FOE(battlerAtk)].counter > 0) { for (i = 0; i < gBattlersCount; i++) { if (IsBattlerAlly(i, battlerAtk)) continue; // only on opposing side - if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerAtk) + if (gBattleStruct->futureSight[i].battlerIndex == battlerAtk) { // if target was attacked with future sight from us, now they'll be the partner slot - gWishFutureKnock.futureSightBattlerIndex[i] = battlerPartner; - gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerPartner]; + gBattleStruct->futureSight[i].battlerIndex = battlerPartner; + gBattleStruct->futureSight[i].partyIndex = gBattlerPartyIndexes[battlerPartner]; break; } - else if (gWishFutureKnock.futureSightBattlerIndex[i] == battlerPartner) + else if (gBattleStruct->futureSight[i].battlerIndex == battlerPartner) { - gWishFutureKnock.futureSightBattlerIndex[i] = battlerAtk; - gWishFutureKnock.futureSightPartyIndex[i] = gBattlerPartyIndexes[battlerAtk]; + gBattleStruct->futureSight[i].battlerIndex = battlerAtk; + gBattleStruct->futureSight[i].partyIndex = gBattlerPartyIndexes[battlerAtk]; break; } } } // swap wish party indices - if (gWishFutureKnock.wishCounter[battlerAtk] > 0 - || gWishFutureKnock.wishCounter[battlerPartner] > 0) - SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp); + if (gBattleStruct->wish[battlerAtk].counter > 0 + || gBattleStruct->wish[battlerPartner].counter > 0) + SWAP(gBattleStruct->wish[battlerAtk].partyId, gBattleStruct->wish[battlerPartner].partyId, temp); } static void TrySwapAttractBattlerIds(u32 battlerAtk, u32 battlerPartner) @@ -6923,11 +6923,11 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) } SwapStructData(&gBattleMons[battlerAtk], &gBattleMons[battlerPartner], data, sizeof(struct BattlePokemon)); - SwapStructData(&gDisableStructs[battlerAtk], &gDisableStructs[battlerPartner], data, sizeof(struct DisableStruct)); SwapStructData(&gSpecialStatuses[battlerAtk], &gSpecialStatuses[battlerPartner], data, sizeof(struct SpecialStatus)); SwapStructData(&gProtectStructs[battlerAtk], &gProtectStructs[battlerPartner], data, sizeof(struct ProtectStruct)); SwapStructData(&gBattleSpritesDataPtr->battlerData[battlerAtk], &gBattleSpritesDataPtr->battlerData[battlerPartner], data, sizeof(struct BattleSpriteInfo)); SwapStructData(&gBattleStruct->illusion[battlerAtk], &gBattleStruct->illusion[battlerPartner], data, sizeof(struct Illusion)); + SwapStructData(&gBattleStruct->battlerState[battlerAtk], &gBattleStruct->battlerState[battlerPartner], data, sizeof(struct BattlerState)); SWAP(gBattleSpritesDataPtr->battlerData[battlerAtk].invisible, gBattleSpritesDataPtr->battlerData[battlerPartner].invisible, temp); SWAP(gTransformedPersonalities[battlerAtk], gTransformedPersonalities[battlerPartner], temp); diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 5b8c599c8..30e0b580b 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -1599,8 +1599,8 @@ static void AnimHailBegin(struct Sprite *sprite) sprite->data[0] = spriteId; if (spriteId != MAX_SPRITES) { - // The sprite template we're using is shared amongst a few other - // places, which make the sprite flicker. That's not what we want + // The sprite template we're using is shared amongst a few other + // places, which make the sprite flicker. That's not what we want // here, though. Override the callback. gSprites[sprite->data[0]].callback = AnimHailContinue; gSprites[sprite->data[0]].sOwnerTaskId = sprite->sOwnerTaskId; @@ -1649,7 +1649,7 @@ static void AnimHailContinue(struct Sprite *sprite) // arg 5: arc height (negative) static void InitIceBallAnim(struct Sprite *sprite) { - u8 animNum = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; + u32 animNum = gAnimDisableStructPtr->rolloutTimer + 1; if (animNum > 4) animNum = 4; @@ -1721,8 +1721,7 @@ static void AnimIceBallParticle(struct Sprite *sprite) void AnimTask_GetIceBallCounter(u8 taskId) { u8 arg = gBattleAnimArgs[0]; - - gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1; + gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimer + 1; DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 9ac694e47..744cd51b8 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -817,11 +817,15 @@ bool8 IsBattlerSpritePresent(u8 battler) } else { - if (GetBattlerPosition(battler) == 0xff) + if (GetBattlerPosition(battler) == B_POSITION_ABSENT) return FALSE; - if (!gBattleStruct->spriteIgnore0Hp && GetMonData(GetBattlerMon(battler), MON_DATA_HP) == 0) + if (gBattleStruct->battlerState[battler].fainted) return FALSE; + + if (gAbsentBattlerFlags & 1u << battler) + return FALSE; + return TRUE; } } diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 58e6a17dc..78481b4d1 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9058,7 +9058,7 @@ void AnimTask_ShellSideArm(u8 taskId) void AnimTask_TerrainPulse(u8 taskId) { - if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker), STATUS_FIELD_TERRAIN_ANY)) + if (IsAnyTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker), gFieldStatuses)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; @@ -9431,7 +9431,7 @@ static void SpriteCB_MaxFlutterby(struct Sprite* sprite) { s16 target_x; s16 target_y; - if (gMovesInfo[gAnimMoveIndex].target == MOVE_TARGET_BOTH) + if (GetMoveTarget(gAnimMoveIndex) == TARGET_BOTH) { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &target_x, &target_y); } diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index f825c717a..79d867c50 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -417,13 +417,13 @@ u32 UnpackSelectedBattlePalettes(s16 selector) switch (moveTarget) { - case MOVE_TARGET_BOTH: + case TARGET_BOTH: if (target) { targetPartner |= 1; } break; - case MOVE_TARGET_FOES_AND_ALLY: + case TARGET_FOES_AND_ALLY: if (target) { targetPartner |= 1; diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 23b244957..5f779a0fa 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -484,7 +484,7 @@ void AnimRockFragment(struct Sprite *sprite) // args[6] - attacker or target void AnimParticleInVortex(struct Sprite *sprite) { - if (IsDoubleBattle() && GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) + if (IsDoubleBattle() && GetMoveTarget(gAnimMoveIndex) == TARGET_BOTH) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimBattler(gBattleAnimArgs[6], sprite, FALSE); @@ -626,10 +626,10 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId) #define sFractionalY data[4] // 256ths of a pixel #define sMirroredX data[5] // init'd from gBattleAnimArgs[3] -// The fields named "velocity" are arguably more like "acceleration," +// The fields named "velocity" are arguably more like "acceleration," // and the fields named "fractional" are arguably more like "velocity." // -// ...is what I WOULD say if the "fractional" fields weren't AND'd with +// ...is what I WOULD say if the "fractional" fields weren't AND'd with // 0xFF after every frame. void AnimFlyingSandCrescent(struct Sprite *sprite) @@ -926,12 +926,7 @@ static void AnimRolloutParticle(struct Sprite *sprite) static u8 GetRolloutCounter(void) { - u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer; - u8 var0 = retVal - 1; - if (var0 > 4) - retVal = 1; - - return retVal; + return gAnimDisableStructPtr->rolloutTimer + 1; } void AnimRockTomb(struct Sprite *sprite) diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index 68db12d94..8fa89dbe4 100644 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -14,6 +14,7 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "test_runner.h" #include "trig.h" #include "util.h" #include "data.h" @@ -348,252 +349,168 @@ static const struct SpriteTemplate sBallParticleSpriteTemplates[POKEBALL_COUNT] .paletteTag = TAG_PARTICLES_STRANGEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_POKE] = { .tileTag = TAG_PARTICLES_POKEBALL, .paletteTag = TAG_PARTICLES_POKEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_GREAT] = { .tileTag = TAG_PARTICLES_GREATBALL, .paletteTag = TAG_PARTICLES_GREATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_ULTRA] = { .tileTag = TAG_PARTICLES_ULTRABALL, .paletteTag = TAG_PARTICLES_ULTRABALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_MASTER] = { .tileTag = TAG_PARTICLES_MASTERBALL, .paletteTag = TAG_PARTICLES_MASTERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_PREMIER] = { .tileTag = TAG_PARTICLES_PREMIERBALL, .paletteTag = TAG_PARTICLES_PREMIERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_HEAL] = { .tileTag = TAG_PARTICLES_HEALBALL, .paletteTag = TAG_PARTICLES_HEALBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_NET] = { .tileTag = TAG_PARTICLES_NETBALL, .paletteTag = TAG_PARTICLES_NETBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_NEST] = { .tileTag = TAG_PARTICLES_NESTBALL, .paletteTag = TAG_PARTICLES_NESTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_DIVE] = { .tileTag = TAG_PARTICLES_DIVEBALL, .paletteTag = TAG_PARTICLES_DIVEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_DUSK] = { .tileTag = TAG_PARTICLES_DUSKBALL, .paletteTag = TAG_PARTICLES_DUSKBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_TIMER] = { .tileTag = TAG_PARTICLES_TIMERBALL, .paletteTag = TAG_PARTICLES_TIMERBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_QUICK] = { .tileTag = TAG_PARTICLES_QUICKBALL, .paletteTag = TAG_PARTICLES_QUICKBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_REPEAT] = { .tileTag = TAG_PARTICLES_REPEATBALL, .paletteTag = TAG_PARTICLES_REPEATBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_LUXURY] = { .tileTag = TAG_PARTICLES_LUXURYBALL, .paletteTag = TAG_PARTICLES_LUXURYBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_LEVEL] = { .tileTag = TAG_PARTICLES_LEVELBALL, .paletteTag = TAG_PARTICLES_LEVELBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_LURE] = { .tileTag = TAG_PARTICLES_LUREBALL, .paletteTag = TAG_PARTICLES_LUREBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_MOON] = { .tileTag = TAG_PARTICLES_MOONBALL, .paletteTag = TAG_PARTICLES_MOONBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_FRIEND] = { .tileTag = TAG_PARTICLES_FRIENDBALL, .paletteTag = TAG_PARTICLES_FRIENDBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_LOVE] = { .tileTag = TAG_PARTICLES_LOVEBALL, .paletteTag = TAG_PARTICLES_LOVEBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_FAST] = { .tileTag = TAG_PARTICLES_FASTBALL, .paletteTag = TAG_PARTICLES_FASTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_HEAVY] = { .tileTag = TAG_PARTICLES_HEAVYBALL, .paletteTag = TAG_PARTICLES_HEAVYBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_DREAM] = { .tileTag = TAG_PARTICLES_DREAMBALL, .paletteTag = TAG_PARTICLES_DREAMBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_SAFARI] = { .tileTag = TAG_PARTICLES_SAFARIBALL, .paletteTag = TAG_PARTICLES_SAFARIBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_SPORT] = { .tileTag = TAG_PARTICLES_SPORTBALL, .paletteTag = TAG_PARTICLES_SPORTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_PARK] = { .tileTag = TAG_PARTICLES_PARKBALL, .paletteTag = TAG_PARTICLES_PARKBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_BEAST] = { .tileTag = TAG_PARTICLES_BEASTBALL, .paletteTag = TAG_PARTICLES_BEASTBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, [BALL_CHERISH] = { .tileTag = TAG_PARTICLES_CHERISHBALL, .paletteTag = TAG_PARTICLES_CHERISHBALL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sAnims_BallParticles, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, }, }; @@ -635,9 +552,6 @@ const struct SpriteTemplate gSafariBaitSpriteTemplate = .tileTag = ANIM_TAG_SAFARI_BAIT, .paletteTag = ANIM_TAG_SAFARI_BAIT, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SafariBaitOrRock_Init, }; @@ -651,15 +565,12 @@ static const union AnimCmd *const sAnims_SafariRock[] = { sAnim_SafariRock, }; -// Unused, leftover from FRLG const struct SpriteTemplate sSafariRockSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SafariRock, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SafariBaitOrRock_Init, }; @@ -1000,7 +911,7 @@ void AnimTask_ThrowBall_StandingTrainer(u8 taskId) u8 subpriority; u8 spriteId; - if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) + if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL) { x = 28; y = 11; @@ -2079,7 +1990,7 @@ static void RepeatBallOpenParticleAnimation(u8 taskId) priority = gTasks[taskId].data[3]; subpriority = gTasks[taskId].data[4]; - for (i = 0; i < POKEBALL_COUNT; i++) + for (i = 0; i < 12; i++) { spriteId = CreateSprite(&sBallParticleSpriteTemplates[ballId], x, y, subpriority); if (spriteId != MAX_SPRITES) @@ -2329,7 +2240,7 @@ void AnimTask_SwapMonSpriteToFromSubstitute(u8 taskId) { u8 spriteId; u32 x; - u32 done = FALSE; + bool32 done = FALSE; spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; switch (gTasks[taskId].data[10]) @@ -2452,7 +2363,7 @@ void TryShinyAnimation(u8 battler, struct Pokemon *mon) if (illusionMon != NULL) mon = illusionMon; - if (IsBattlerSpriteVisible(battler) && IsValidForBattle(mon)) + if (IsBattlerSpriteVisible(battler) && IsValidForBattle(mon) && !gTestRunnerHeadless) { if (isShiny) { @@ -2700,7 +2611,7 @@ void AnimTask_SafariGetReaction(u8 taskId) gBattleAnimArgs[7] = 0; else gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER]; - + DestroyAnimVisualTask(taskId); } @@ -2820,7 +2731,7 @@ static void GhostBallDodge2(struct Sprite *sprite) if ((sprite->y + sprite->y2) < 65) return; } - + sprite->data[0] = 0; sprite->callback = DestroySpriteAfterOneFrame; gDoingBattleAnim = FALSE; diff --git a/src/battle_bg.c b/src/battle_bg.c index d770f8d65..0ef23c656 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -20,6 +20,7 @@ #include "sound.h" #include "sprite.h" #include "task.h" +#include "test_runner.h" #include "text_window.h" #include "trig.h" #include "window.h" @@ -651,7 +652,7 @@ static u8 GetBattleTerrainByMapScene(u8 mapBattleScene) static const void* const sSeasonBattleBackgrounds[BATTLE_ENVIRONMENT_COUNT][SEASON_WINTER + 1] = { - [BATTLE_ENVIRONMENT_GRASS] = + [BATTLE_ENVIRONMENT_GRASS] = { [SEASON_SPRING] = &gBattleEnvironmentPalette_Grass, [SEASON_SUMMER] = &gBattleEnvironmentPalette_GrassSummer, @@ -1043,22 +1044,28 @@ void DrawBattleEntryBackground(void) } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { - // if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) - // { - // DecompressDataWithHeaderVram(gBattleEnvironmentAnimTiles_Building, (void *)(BG_CHAR_ADDR(1))); - // DecompressDataWithHeaderVram(gBattleEnvironmentAnimTilemap_Building, (void *)(BG_SCREEN_ADDR(28))); - // } - // else - // { - // // Set up bg for the multi battle intro where both teams slide in facing the screen. - // // Note Steven's multi battle (which has a dedicated back pic) is excluded above. - // SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2); - // SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 2); - // CopyToBgTilemapBuffer(1, gMultiBattleIntroBg_Opponent_Tilemap, 0, 0); - // CopyToBgTilemapBuffer(2, gMultiBattleIntroBg_Player_Tilemap, 0, 0); - // CopyBgTilemapBufferToVram(1); - // CopyBgTilemapBufferToVram(2); - // } + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) + { + LoadBattleTerrainEntryGfx(gBattleEnvironment); + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId > TRAINER_PARTNER(PARTNER_NONE)) + { + LoadBattleTerrainEntryGfx(BATTLE_ENVIRONMENT_BUILDING); + } + else + { + // Set up bg for the multi battle intro where both teams slide in facing the screen. + // Note Steven's multi battle (which has a dedicated back pic) is excluded above. + // SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 2); + // SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 2); + // CopyToBgTilemapBuffer(1, gMultiBattleIntroBg_Opponent_Tilemap, 0, 0); + // CopyToBgTilemapBuffer(2, gMultiBattleIntroBg_Player_Tilemap, 0, 0); + // CopyBgTilemapBufferToVram(1); + // CopyBgTilemapBufferToVram(2); + LoadBattleTerrainEntryGfx(BATTLE_ENVIRONMENT_BUILDING); + } } else if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { @@ -1109,6 +1116,14 @@ void DrawBattleEntryBackground(void) static u8 GetBattleTerrainOverride(void) { u8 battleScene; + + if (TestRunner_Battle_GetForcedEnvironment() + && gBattleEnvironmentInfo[gBattleEnvironment].background.tilemap + && gBattleEnvironmentInfo[gBattleEnvironment].background.tileset) + { + return gBattleEnvironment; + } + if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) { return BATTLE_ENVIRONMENT_LINK; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 2cb9d36cf..3195c26d5 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -54,7 +54,6 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt [CONTROLLER_TRAINERSLIDEBACK] = LinkOpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 79792c6a3..d906cfd05 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -53,7 +53,6 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl [CONTROLLER_TRAINERSLIDEBACK] = LinkPartnerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index ba6bffc43..ae401ac60 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -21,8 +21,6 @@ static void OakOldManHandleDrawTrainerPic(u32 battler); static void OakOldManHandleTrainerSlide(u32 battler); -static void OakOldManHandleSuccessBallThrowAnim(u32 battler); -static void OakOldManHandleBallThrowAnim(u32 battler); static void OakOldManHandlePrintString(u32 battler); static void OakOldManHandlePrintSelectionString(u32 battler); static void OakOldManHandleChooseAction(u32 battler); @@ -71,8 +69,7 @@ static void (*const sOakOldManBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler [CONTROLLER_TRAINERSLIDEBACK] = BtlController_Empty, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = OakOldManHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = OakOldManHandleBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = BtlController_HandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, [CONTROLLER_PRINTSTRING] = OakOldManHandlePrintString, @@ -680,16 +677,6 @@ static void OakOldManHandleTrainerSlide(u32 battler) BtlController_HandleTrainerSlide(battler, trainerPicId); } -static void OakOldManHandleSuccessBallThrowAnim(u32 battler) -{ - BtlController_HandleSuccessBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); -} - -static void OakOldManHandleBallThrowAnim(u32 battler) -{ - BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); -} - static void OakOldManHandlePrintString(u32 battler) { u16 *stringId; @@ -697,7 +684,7 @@ static void OakOldManHandlePrintString(u32 battler) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; stringId = (u16 *)(&gBattleResources->bufferA[battler][2]); - if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && *stringId == STRINGID_INTROSENDOUT) + if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL&& *stringId == STRINGID_INTROSENDOUT) { OakOldManBufferExecCompleted(battler); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 59ffa5542..90c35d5fa 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_ai_main.h" +#include "battle_ai_switch.h" #include "battle_ai_util.h" #include "constants/battle_ai.h" #include "battle_anim.h" @@ -10,6 +11,7 @@ #include "battle_interface.h" #include "battle_setup.h" #include "battle_tower.h" +// #include "battle_special.h" // #include "battle_tv.h" #include "battle_z_move.h" #include "bg.h" @@ -53,8 +55,6 @@ static void OpponentHandleChoosePokemon(u32 battler); static void OpponentHandleIntroTrainerBallThrow(u32 battler); static void OpponentHandleDrawPartyStatusSummary(u32 battler); static void OpponentHandleEndLinkBattle(u32 battler); -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore); - static void OpponentBufferRunCommand(u32 battler); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = @@ -71,7 +71,6 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_TRAINERSLIDEBACK] = OpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, @@ -117,6 +116,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) void SetControllerToOpponent(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_OPPONENT; gBattlerControllerEndFuncs[battler] = OpponentBufferExecCompleted; gBattlerControllerFuncs[battler] = OpponentBufferRunCommand; } @@ -172,7 +172,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) { - if (GetBattlerPosition(battler) == 3) + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT) { if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(battler)].finishedShinyMonAnim) @@ -243,7 +243,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) { - if (GetBattlerPosition(battler) == 1) + if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_LEFT) m4aMPlayContinue(&gMPlayInfo_BGM); } else @@ -313,7 +313,7 @@ void OpponentBufferExecCompleted(u32 battler) static u32 OpponentGetTrainerPicId(u32 battlerId) { - u32 trainerPicId; + enum TrainerPicID trainerPicId; if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { @@ -355,8 +355,8 @@ static u32 OpponentGetTrainerPicId(u32 battlerId) static void OpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; - u32 trainerPicId; - + enum TrainerPicID trainerPicId; + // Sets Multibattle test opponent sprites to not be Hiker if (IsMultibattleTest()) { @@ -377,7 +377,7 @@ static void OpponentHandleDrawTrainerPic(u32 battler) else { trainerPicId = OpponentGetTrainerPicId(battler); - + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) { if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon @@ -391,12 +391,12 @@ static void OpponentHandleDrawTrainerPic(u32 battler) } } - BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, (8 - gTrainerSprites[trainerPicId].frontPicCoords.size) * 4 + 40, -1); + BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, 40, -1); } void OpponentHandleTrainerSlide(u32 battler) { - u32 trainerPicId = OpponentGetTrainerPicId(battler); + enum TrainerPicID trainerPicId = OpponentGetTrainerPicId(battler); BtlController_HandleTrainerSlide(battler, trainerPicId); } @@ -439,21 +439,27 @@ static void OpponentHandleChooseMove(u32 battler) gBattlerTarget = gAiBattleData->chosenTarget[battler]; u32 chosenMove = moveInfo->moves[chosenMoveIndex]; - if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_USER) + enum MoveTarget target = GetBattlerMoveTargetType(battler, chosenMove); + + if (target == TARGET_USER || target == TARGET_USER_OR_ALLY) gBattlerTarget = battler; - if (GetBattlerMoveTargetType(battler, chosenMove) & MOVE_TARGET_BOTH) + + if (target == TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } // If opponent can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { + gBattleStruct->gimmick.toActivate |= 1u << battler; BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { + SetAIUsingGimmick(battler, NO_GIMMICK); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } } @@ -461,15 +467,15 @@ static void OpponentHandleChooseMove(u32 battler) } else // Wild pokemon - use random move { - u32 move; - u32 target; + enum Move move; do { chosenMoveIndex = Random() & (MAX_MON_MOVES - 1); move = moveInfo->moves[chosenMoveIndex]; } while (move == MOVE_NONE); - if (GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_USER) + enum MoveTarget target = GetBattlerMoveTargetType(battler, move); + if (target == TARGET_USER || target == TARGET_USER_OR_ALLY) { BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (battler << 8)); } @@ -480,7 +486,7 @@ static void OpponentHandleChooseMove(u32 battler) } while (!CanTargetBattler(battler, target, move)); // Don't bother to check if they're enemies if the move can't attack ally - if (B_WILD_NATURAL_ENEMIES == TRUE && !(GetBattlerMoveTargetType(battler, move) & MOVE_TARGET_BOTH)) + if (B_WILD_NATURAL_ENEMIES == TRUE && GetBattlerMoveTargetType(battler, move) != TARGET_BOTH) { u32 speciesAttacker, speciesTarget; speciesAttacker = gBattleMons[battler].species; @@ -511,38 +517,24 @@ static void OpponentHandleChooseItem(u32 battler) BtlController_Complete(battler); } -static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) - && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; -} - -static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) -{ - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) - && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2) - && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle - && CountAIAliveNonEggMonsExcept(PARTY_SIZE-1) != pokemonInBattle; -} - static void OpponentHandleChoosePokemon(u32 battler) { s32 chosenMonId; - s32 pokemonInBattle = 1; enum SwitchType switchType = SWITCH_AFTER_KO; // Choosing Revival Blessing target if (gBattleResources->bufferA[battler][1] == PARTY_ACTION_CHOOSE_FAINTED_MON) { - chosenMonId = gSelectedMonPartyId = GetFirstFaintedPartyIndex(battler); + chosenMonId = AI_SelectRevivalBlessingMon(battler); + if (chosenMonId == PARTY_SIZE) + chosenMonId = GetFirstFaintedPartyIndex(battler); + gSelectedMonPartyId = chosenMonId; } // Switching out else if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { if (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch) - switchType = SWITCH_MID_BATTLE; + switchType = SWITCH_MID_BATTLE_FORCED; // reset the AI data to consider the correct on-field state at time of switch SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), gAiLogicData); @@ -550,7 +542,7 @@ static void OpponentHandleChoosePokemon(u32 battler) SetBattlerAiData(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT), gAiLogicData); chosenMonId = GetMostSuitableMonToSwitchInto(battler, switchType); - if (chosenMonId == PARTY_SIZE) + if (chosenMonId == PARTY_SIZE) // Advanced logic failed so we pick the next available battler { s32 battler1, battler2, firstId, lastId; @@ -562,19 +554,14 @@ static void OpponentHandleChoosePokemon(u32 battler) { battler1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - pokemonInBattle = 2; } GetAIPartyIndexes(battler, &firstId, &lastId); - for (chosenMonId = (lastId-1); chosenMonId >= firstId; chosenMonId--) + for (chosenMonId = firstId; chosenMonId < lastId; chosenMonId++) { - if (!IsValidForBattle(&gEnemyParty[chosenMonId]) - || chosenMonId == gBattlerPartyIndexes[battler1] - || chosenMonId == gBattlerPartyIndexes[battler2]) - continue; - - if (!IsAcePokemon(chosenMonId, pokemonInBattle, battler) - && !IsDoubleAcePokemon(chosenMonId, pokemonInBattle, battler)) + if (IsValidForBattle(&gEnemyParty[chosenMonId]) + && chosenMonId != gBattlerPartyIndexes[battler1] + && chosenMonId != gBattlerPartyIndexes[battler2]) break; } } @@ -593,22 +580,6 @@ static void OpponentHandleChoosePokemon(u32 battler) BtlController_Complete(battler); } -static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore) -{ - u16 i, count; - - for (i = 0, count = 0; i < PARTY_SIZE; i++) - { - if (i != slotToIgnore - && IsValidForBattle(&gEnemyParty[i])) - { - count++; - } - } - - return count; -} - static void OpponentHandleIntroTrainerBallThrow(u32 battler) { BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index cc42ddb40..891a9f71f 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -56,7 +56,6 @@ static void PlayerHandleDrawTrainerPic(u32 battler); static void PlayerHandleTrainerSlide(u32 battler); static void PlayerHandleTrainerSlideBack(u32 battler); static void PlayerHandlePaletteFade(u32 battler); -static void PlayerHandleSuccessBallThrowAnim(u32 battler); static void PlayerHandlePause(u32 battler); static void PlayerHandleChooseAction(u32 battler); static void PlayerHandleYesNoBox(u32 battler); @@ -114,8 +113,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_TRAINERSLIDEBACK] = PlayerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade, - [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = BtlController_HandleBallThrowAnim, [CONTROLLER_PAUSE] = PlayerHandlePause, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, @@ -160,6 +158,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = void SetControllerToPlayer(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_PLAYER; gBattlerControllerEndFuncs[battler] = PlayerBufferExecCompleted; gBattlerControllerFuncs[battler] = PlayerBufferRunCommand; gDoingBattleAnim = FALSE; @@ -201,51 +200,41 @@ static void CompleteOnBattlerSpritePosX_0(u32 battler) static u16 GetPrevBall(u16 ballId) { - u16 ballPrev; - s32 i, j; - CompactItemsInBagPocket(POCKET_POKE_BALLS); - for (i = 0; i < gBagPockets[POCKET_POKE_BALLS].capacity; i++) + s32 i; + s32 index = ItemIdToBallId(ballId); + u32 newBall = 0; + for (i = 0; i < POKEBALL_COUNT; i++) { - if (ballId == GetBagItemId(POCKET_POKE_BALLS, i)) - { - if (i <= 0) - { - for (j = gBagPockets[POCKET_POKE_BALLS].capacity - 1; j >= 0; j--) - { - ballPrev = GetBagItemId(POCKET_POKE_BALLS, j); - if (ballPrev != ITEM_NONE) - return ballPrev; - } - } - i--; - break; - } + index--; + if (index == -1) + index = POKEBALL_COUNT - 1; + newBall = gBallItemIds[index]; + if (CheckBagHasItem(newBall, 1)) + return newBall; } - return GetBagItemId(POCKET_POKE_BALLS, i); + return ballId; } static u32 GetNextBall(u32 ballId) { - u32 ballNext = ITEM_NONE; s32 i; - CompactItemsInBagPocket(POCKET_POKE_BALLS); - for (i = 1; i < gBagPockets[POCKET_POKE_BALLS].capacity; i++) + s32 index = ItemIdToBallId(ballId); + u32 newBall = 0; + for (i = 0; i < POKEBALL_COUNT; i++) { - if (ballId == GetBagItemId(POCKET_POKE_BALLS, i-1)) - { - ballNext = GetBagItemId(POCKET_POKE_BALLS, i); - break; - } + index++; + if (index == POKEBALL_COUNT) + index = 0; + newBall = gBallItemIds[index]; + if (CheckBagHasItem(newBall, 1)) + return newBall; } - if (ballNext == ITEM_NONE) - return GetBagItemId(POCKET_POKE_BALLS, 0); // Zeroth slot - else - return ballNext; + return ballId; } static void HandleInputChooseAction(u32 battler) { - u16 itemId = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8); + enum Item itemId = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8); DoBounceEffect(battler, BOUNCE_HEALTHBOX, 7, 1); DoBounceEffect(battler, BOUNCE_MON, 7, 1); @@ -255,7 +244,8 @@ static void HandleInputChooseAction(u32 battler) else gPlayerDpadHoldFrames = 0; - if (B_LAST_USED_BALL == TRUE && B_LAST_USED_BALL_CYCLE == TRUE) + if (B_LAST_USED_BALL == TRUE && B_LAST_USED_BALL_CYCLE == TRUE + && !(B_LAST_USED_BALL_BUTTON == L_BUTTON && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)) { if (!gLastUsedBallMenuPresent) { @@ -425,7 +415,7 @@ void HandleInputChooseTarget(u32 battler) { s32 i; static const u8 identities[MAX_BATTLERS_COUNT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; - u16 move = GetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + gMoveSelectionCursor[battler]); + enum Move move = GetMonData(GetBattlerMon(battler), MON_DATA_MOVE1 + gMoveSelectionCursor[battler]); u16 moveTarget = GetBattlerMoveTargetType(battler, move); DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); @@ -474,7 +464,7 @@ void HandleInputChooseTarget(u32 battler) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY)) + if (moveTarget == TARGET_USER_OR_ALLY) { gMultiUsePlayerCursor ^= BIT_FLANK; } @@ -482,7 +472,7 @@ void HandleInputChooseTarget(u32 battler) { do { - u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); + enum BattlerPosition currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -508,13 +498,15 @@ void HandleInputChooseTarget(u32 battler) case B_POSITION_OPPONENT_RIGHT: i++; break; + default: + break; } if (B_SHOW_EFFECTIVENESS) MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) - || (moveTarget & MOVE_TARGET_OPPONENT && IsOnPlayerSide(gMultiUsePlayerCursor))) + || (moveTarget == TARGET_OPPONENT && IsOnPlayerSide(gMultiUsePlayerCursor))) i = 0; } while (i == 0); } @@ -525,7 +517,7 @@ void HandleInputChooseTarget(u32 battler) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY)) + if (moveTarget == TARGET_USER_OR_ALLY) { gMultiUsePlayerCursor ^= BIT_FLANK; } @@ -533,7 +525,7 @@ void HandleInputChooseTarget(u32 battler) { do { - u8 currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); + enum BattlerPosition currSelIdentity = GetBattlerPosition(gMultiUsePlayerCursor); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -559,13 +551,15 @@ void HandleInputChooseTarget(u32 battler) case B_POSITION_OPPONENT_RIGHT: i++; break; + default: + break; } if (B_SHOW_EFFECTIVENESS) MoveSelectionDisplayMoveEffectiveness(CheckTypeEffectiveness(battler, GetBattlerPosition(gMultiUsePlayerCursor)), battler); if (gAbsentBattlerFlags & (1u << gMultiUsePlayerCursor) || !CanTargetBattler(battler, gMultiUsePlayerCursor, move) - || (moveTarget & MOVE_TARGET_OPPONENT && IsOnPlayerSide(gMultiUsePlayerCursor))) + || (moveTarget == TARGET_OPPONENT && IsOnPlayerSide(gMultiUsePlayerCursor))) i = 0; } while (i == 0); } @@ -666,9 +660,29 @@ static void TryShowAsTarget(u32 battler) } } +static bool32 CanSelectBattler(enum MoveTarget target) +{ + switch (target) + { + case TARGET_RANDOM: + case TARGET_BOTH: + case TARGET_DEPENDS: + case TARGET_FOES_AND_ALLY: + case TARGET_OPPONENTS_FIELD: + case TARGET_USER: + case TARGET_ALLY: + case TARGET_USER_OR_ALLY: + case TARGET_USER_AND_ALLY: + return TRUE; + default: + break; + } + + return FALSE; +} + void HandleInputChooseMove(u32 battler) { - u16 moveTarget; u32 canSelectTarget = 0; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); @@ -682,36 +696,37 @@ void HandleInputChooseMove(u32 battler) TryToHideMoveInfoWindow(); PlaySE(SE_SELECT); - moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[gMoveSelectionCursor[battler]]); + enum MoveTarget moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[gMoveSelectionCursor[battler]]); + bool32 isUserOrAlly = moveTarget == TARGET_USER || moveTarget == TARGET_USER_OR_ALLY || moveTarget == TARGET_USER_AND_ALLY; if (gBattleStruct->zmove.viewing) { gBattleStruct->zmove.viewing = FALSE; if (GetMoveCategory(moveInfo->moves[gMoveSelectionCursor[battler]]) != DAMAGE_CATEGORY_STATUS) - moveTarget = MOVE_TARGET_SELECTED; //damaging z moves always have selected target + moveTarget = TARGET_SELECTED; //damaging z moves always have selected target } // Status moves turn into Max Guard when Dynamaxed, targets user. if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX || IsGimmickSelected(battler, GIMMICK_DYNAMAX)) moveTarget = GetMoveTarget(GetMaxMove(battler, moveInfo->moves[gMoveSelectionCursor[battler]])); - if (moveTarget & MOVE_TARGET_USER) + if (isUserOrAlly) gMultiUsePlayerCursor = battler; else gMultiUsePlayerCursor = GetOpposingSideBattler(battler); if (gBattleResources->bufferA[battler][1]) // a double battle { - if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER | MOVE_TARGET_ALLY))) + if (!CanSelectBattler(moveTarget)) canSelectTarget = 1; // either selected or user - if (moveTarget == (MOVE_TARGET_USER | MOVE_TARGET_ALLY) && IsBattlerAlive(BATTLE_PARTNER(battler))) + if (moveTarget == TARGET_USER_OR_ALLY && IsBattlerAlive(BATTLE_PARTNER(battler))) canSelectTarget = 1; if (moveInfo->currentPp[gMoveSelectionCursor[battler]] == 0) { canSelectTarget = 0; } - else if (!(moveTarget & MOVE_TARGET_USER) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1) + else if (isUserOrAlly && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, battler) <= 1) { gMultiUsePlayerCursor = GetDefaultMoveTarget(battler); canSelectTarget = 0; @@ -720,7 +735,7 @@ void HandleInputChooseMove(u32 battler) if (B_SHOW_TARGETS == TRUE) { // Show all available targets for multi-target moves - if ((moveTarget & MOVE_TARGET_ALL_BATTLERS) == MOVE_TARGET_ALL_BATTLERS) + if (moveTarget == TARGET_ALL_BATTLERS || moveTarget == TARGET_FIELD) { u32 i = 0; for (i = 0; i < gBattlersCount; i++) @@ -728,11 +743,11 @@ void HandleInputChooseMove(u32 battler) canSelectTarget = 3; } - else if (moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY)) + else if (IsSpreadMove(moveTarget) || moveTarget == TARGET_OPPONENTS_FIELD || moveTarget == TARGET_USER_AND_ALLY) { TryShowAsTarget(gMultiUsePlayerCursor); TryShowAsTarget(BATTLE_PARTNER(gMultiUsePlayerCursor)); - if (moveTarget & MOVE_TARGET_FOES_AND_ALLY) + if (moveTarget == TARGET_FOES_AND_ALLY) TryShowAsTarget(BATTLE_PARTNER(battler)); canSelectTarget = 2; } @@ -754,7 +769,7 @@ void HandleInputChooseMove(u32 battler) case 1: gBattlerControllerFuncs[battler] = HandleInputChooseTarget; - if (moveTarget & MOVE_TARGET_USER) + if (moveTarget == TARGET_USER || moveTarget == TARGET_USER_OR_ALLY) gMultiUsePlayerCursor = battler; else if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); @@ -893,7 +908,8 @@ void HandleInputChooseMove(u32 battler) MoveSelectionDisplayMoveType(battler); } } - else if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON)) + else if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON) && + !(B_MOVE_DESCRIPTION_BUTTON == L_BUTTON && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)) { gBattleStruct->descriptionSubmenu = TRUE; TryMoveSelectionDisplayMoveDescription(battler); @@ -1012,10 +1028,10 @@ void HandleMoveSwitching(u32 battler) moveInfo->maxPp[gMoveSelectionCursor[battler]] = moveInfo->maxPp[gMultiUsePlayerCursor]; moveInfo->maxPp[gMultiUsePlayerCursor] = i; - if (gDisableStructs[battler].mimickedMoves & (1u << gMoveSelectionCursor[battler])) + if (gBattleMons[battler].volatiles.mimickedMoves & (1u << gMoveSelectionCursor[battler])) { - gDisableStructs[battler].mimickedMoves &= ~(1u << gMoveSelectionCursor[battler]); - gDisableStructs[battler].mimickedMoves |= 1u << gMultiUsePlayerCursor; + gBattleMons[battler].volatiles.mimickedMoves &= ~(1u << gMoveSelectionCursor[battler]); + gBattleMons[battler].volatiles.mimickedMoves |= 1u << gMultiUsePlayerCursor; } MoveSelectionDisplayMoveNames(battler); @@ -1096,7 +1112,7 @@ void HandleMoveSwitching(u32 battler) PlaySE(SE_SELECT); MoveSelectionDestroyCursorAt(gMultiUsePlayerCursor); MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); - + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) gBattlerControllerFuncs[battler] = OakOldManHandleInputChooseMove; else @@ -1780,7 +1796,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) u32 speciesId = gBattleMons[battler].species; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battler][4]); txtPtr = StringCopy(gDisplayedStringBattle, gText_MoveInterfaceType); - u32 move = moveInfo->moves[gMoveSelectionCursor[battler]]; + enum Move move = moveInfo->moves[gMoveSelectionCursor[battler]]; enum Type type = GetMoveType(move); enum BattleMoveEffects effect = GetMoveEffect(move); @@ -1830,7 +1846,7 @@ static void TryMoveSelectionDisplayMoveDescription(u32 battler) static void MoveSelectionDisplayMoveDescription(u32 battler) { struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[battler][4]); - u16 move = moveInfo->moves[gMoveSelectionCursor[battler]]; + enum Move move = moveInfo->moves[gMoveSelectionCursor[battler]]; u16 pwr = GetMovePower(move); u16 acc = GetMoveAccuracy(move); enum DamageCategory cat = GetBattleMoveCategory(move); @@ -1848,7 +1864,7 @@ static void MoveSelectionDisplayMoveDescription(u32 battler) u8 acc_desc[7] = _("ACC: "); u8 cat_start[] = _("{CLEAR_TO 0x03}"); u8 pwr_start[] = _("{CLEAR_TO 0x38}"); - u8 acc_start[] = _("{CLEAR_TO 0x6D}"); + u8 acc_start[] = _("{CLEAR_TO 0x6C}"); LoadMessageBoxAndBorderGfx(); DrawStdWindowFrame(B_WIN_MOVE_DESCRIPTION, FALSE); if (pwr < 2) @@ -1946,9 +1962,9 @@ static void PlayerHandleLoadMonSprite(u32 battler) gBattlerControllerFuncs[battler] = CompleteOnBattlerSpritePosX_0; } -u32 LinkPlayerGetTrainerPicId(u32 multiplayerId) +enum TrainerPicID LinkPlayerGetTrainerPicId(u32 multiplayerId) { - u32 trainerPicId; + enum TrainerPicID trainerPicId; u8 gender = gLinkPlayers[multiplayerId].gender; u8 version = gLinkPlayers[multiplayerId].version & 0xFF; @@ -1961,9 +1977,9 @@ u32 LinkPlayerGetTrainerPicId(u32 multiplayerId) return trainerPicId; } -static u32 PlayerGetTrainerBackPicId(void) +static enum TrainerPicID PlayerGetTrainerBackPicId(void) { - u32 trainerPicId; + enum TrainerPicID trainerPicId; if (gBattleTypeFlags & BATTLE_TYPE_LINK) trainerPicId = LinkPlayerGetTrainerPicId(GetMultiplayerId()); @@ -1980,7 +1996,8 @@ static void PlayerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; s16 xPos, yPos; - u32 trainerPicId; + enum TrainerPicID trainerPicId; + if (IsMultibattleTest()) { trainerPicId = TRAINER_BACK_PIC_RED; @@ -1993,6 +2010,7 @@ static void PlayerHandleDrawTrainerPic(u32 battler) else { trainerPicId = PlayerGetTrainerBackPicId(); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(battler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. @@ -2033,7 +2051,7 @@ static void PlayerHandleDrawTrainerPic(u32 battler) static void PlayerHandleTrainerSlide(u32 battler) { - u32 trainerPicId = PlayerGetTrainerBackPicId(); + enum TrainerPicID trainerPicId = PlayerGetTrainerBackPicId(); BtlController_HandleTrainerSlide(battler, trainerPicId); } @@ -2048,16 +2066,6 @@ static void PlayerHandlePaletteFade(u32 battler) BtlController_Complete(battler); } -static void PlayerHandleSuccessBallThrowAnim(u32 battler) -{ - BtlController_HandleSuccessBallThrowAnim(battler, gBattlerTarget, B_ANIM_BALL_THROW, TRUE); -} - -void PlayerHandleBallThrowAnim(u32 battler) -{ - BtlController_HandleBallThrowAnim(battler, gBattlerTarget, B_ANIM_BALL_THROW, TRUE); -} - static void PlayerHandlePause(u32 battler) { u8 timer = gBattleResources->bufferA[battler][1]; @@ -2114,10 +2122,10 @@ static void PlayerHandleChooseAction(u32 battler) if (B_SHOW_PARTNER_TARGET && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && IsBattlerAlive(B_POSITION_PLAYER_RIGHT)) { StringCopy(gStringVar1, COMPOUND_STRING("Partner will use:\n")); - u32 move = GetChosenMoveFromPosition(B_POSITION_PLAYER_RIGHT); + enum Move move = GetChosenMoveFromPosition(B_POSITION_PLAYER_RIGHT); StringAppend(gStringVar1, GetMoveName(move)); - u32 moveTarget = GetBattlerMoveTargetType(B_POSITION_PLAYER_RIGHT, move); - if (moveTarget == MOVE_TARGET_SELECTED) + enum MoveTarget moveTarget = GetBattlerMoveTargetType(B_POSITION_PLAYER_RIGHT, move); + if (moveTarget == TARGET_SELECTED || moveTarget == TARGET_SMART) { if (gAiBattleData->chosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_OPPONENT_LEFT) StringAppend(gStringVar1, COMPOUND_STRING(" -{UP_ARROW}")); @@ -2128,15 +2136,19 @@ static void PlayerHandleChooseAction(u32 battler) else if (gAiBattleData->chosenTarget[B_POSITION_PLAYER_RIGHT] == B_POSITION_PLAYER_RIGHT) StringAppend(gStringVar1, COMPOUND_STRING(" -{DOWN_ARROW}")); } - else if (moveTarget == MOVE_TARGET_BOTH) + else if (moveTarget == TARGET_USER_AND_ALLY) + { + StringAppend(gStringVar1, COMPOUND_STRING(" {DOWN_ARROW}{DOWN_ARROW}")); + } + else if (moveTarget == TARGET_BOTH) { StringAppend(gStringVar1, COMPOUND_STRING(" {UP_ARROW}{UP_ARROW}")); } - else if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + else if (moveTarget == TARGET_FOES_AND_ALLY) { StringAppend(gStringVar1, COMPOUND_STRING(" {V_D_ARROW}{UP_ARROW}")); } - else if (moveTarget == MOVE_TARGET_ALL_BATTLERS) + else if (moveTarget == TARGET_ALL_BATTLERS || moveTarget == TARGET_FIELD) { StringAppend(gStringVar1, COMPOUND_STRING(" {V_D_ARROW}{V_D_ARROW}")); } @@ -2370,7 +2382,7 @@ static void PlayerHandleOneReturnValue_Duplicate(u32 battler) static void PlayerHandleIntroTrainerBallThrow(u32 battler) { - const u32 paletteIndex = PlayerGetTrainerBackPicId(); + const u32 paletteIndex = PlayerGetTrainerBackPicId(); // - TRAINER_PIC_FRONT_COUNT; const u16 *trainerPal = gTrainerBacksprites[paletteIndex].palette.data; BtlController_HandleIntroTrainerBallThrow(battler, 0xD6F8, trainerPal, 31, Intro_TryShinyAnimShowHealthbox); } @@ -2477,7 +2489,7 @@ static bool32 ShouldShowTypeEffectiveness(u32 targetId) static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) { struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct *)(&gBattleResources->bufferA[battlerAtk][4]); - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; ctx.move = moveInfo->moves[gMoveSelectionCursor[battlerAtk]]; @@ -2504,7 +2516,7 @@ static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) static u32 CheckTargetTypeEffectiveness(u32 battler) { - u32 battlerFoe = BATTLE_OPPOSITE(GetBattlerPosition(battler)); + u32 battlerFoe = BATTLE_OPPOSITE(battler); u32 foeEffectiveness = CheckTypeEffectiveness(battler, battlerFoe); if (IsDoubleBattle()) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 872a9b1b8..93fd7e709 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_ai_main.h" +#include "battle_ai_switch.h" #include "battle_ai_util.h" #include "battle_anim.h" #include "battle_controllers.h" @@ -11,6 +12,7 @@ #include "battle_z_move.h" #include "bg.h" #include "data.h" +// #include "frontier_util.h" #include "item_use.h" #include "link.h" #include "main.h" @@ -35,6 +37,7 @@ #include "test/test_runner_battle.h" static void PlayerPartnerHandleDrawTrainerPic(u32 battler); +static void PlayerPartnerHandleTrainerSlide(u32 battler); static void PlayerPartnerHandleTrainerSlideBack(u32 battler); static void PlayerPartnerHandleChooseAction(u32 battler); static void PlayerPartnerHandleChooseMove(u32 battler); @@ -55,11 +58,10 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = PlayerPartnerHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, + [CONTROLLER_TRAINERSLIDE] = PlayerPartnerHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = PlayerPartnerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, @@ -105,6 +107,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat void SetControllerToPlayerPartner(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_PLAYER_PARTNER; gBattlerControllerEndFuncs[battler] = PlayerPartnerBufferExecCompleted; gBattlerControllerFuncs[battler] = PlayerPartnerBufferRunCommand; } @@ -195,6 +198,18 @@ void PlayerPartnerBufferExecCompleted(u32 battler) } } +static enum TrainerPicID PlayerPartnerGetTrainerBackPicId(enum DifficultyLevel difficulty) +{ + enum TrainerPicID trainerPicId; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; + else + trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_RED; + + return trainerPicId; +} + // some explanation here // in emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it @@ -202,7 +217,7 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; s16 xPos, yPos; - u32 trainerPicId; + enum TrainerPicID trainerPicId; enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); @@ -240,6 +255,13 @@ static void PlayerPartnerHandleDrawTrainerPic(u32 battler) BtlController_HandleDrawTrainerPic(battler, trainerPicId, isFrontPic, xPos, yPos, -1); } +static void PlayerPartnerHandleTrainerSlide(u32 battler) +{ + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); + enum TrainerPicID trainerPicId = PlayerPartnerGetTrainerBackPicId(difficulty); + BtlController_HandleTrainerSlide(battler, trainerPicId); +} + static void PlayerPartnerHandleTrainerSlideBack(u32 battler) { BtlController_HandleTrainerSlideBack(battler, 35, FALSE); @@ -260,21 +282,26 @@ static void PlayerPartnerHandleChooseMove(u32 battler) gBattlerTarget = gAiBattleData->chosenTarget[battler]; u32 moveTarget = GetBattlerMoveTargetType(battler, moveInfo->moves[chosenMoveIndex]); - if (moveTarget & MOVE_TARGET_USER) + if (moveTarget == TARGET_USER || moveTarget == TARGET_USER_OR_ALLY) + { gBattlerTarget = battler; - else if (moveTarget & MOVE_TARGET_BOTH) + } + else if (moveTarget == TARGET_BOTH) { gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); if (gAbsentBattlerFlags & (1u << gBattlerTarget)) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } // If partner can and should use a gimmick (considering trainer data), do it - if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE && IsAIUsingGimmick(battler)) + enum Gimmick usableGimmick = gBattleStruct->gimmick.usableGimmick[battler]; + if (usableGimmick != GIMMICK_NONE && IsAIUsingGimmick(battler) && !HasTrainerUsedGimmick(battler, usableGimmick)) { + gBattleStruct->gimmick.toActivate |= 1u << battler; BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (RET_GIMMICK) | (gBattlerTarget << 8)); } else { + SetAIUsingGimmick(battler, NO_GIMMICK); BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8)); } diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c index b74712d33..472ff17e4 100644 --- a/src/battle_controller_pokedude.c +++ b/src/battle_controller_pokedude.c @@ -42,8 +42,6 @@ struct PokedudeBattlePartyInfo static void PokedudeHandleDrawTrainerPic(u32 battler); static void PokedudeHandleTrainerSlide(u32 battler); -static void PokedudeHandleSuccessBallThrowAnim(u32 battler); -static void PokedudeHandleBallThrowAnim(u32 battler); static void PokedudeHandlePrintSelectionString(u32 battler); static void PokedudeHandleChooseAction(u32 battler); static void PokedudeHandleChooseMove(u32 battler); @@ -82,8 +80,7 @@ static void (*const sPokedudeBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_TRAINERSLIDEBACK] = BtlController_Empty, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = PokedudeHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = PokedudeHandleBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = BtlController_HandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, @@ -337,16 +334,6 @@ static void PokedudeHandleTrainerSlide(u32 battler) BtlController_HandleTrainerSlide(battler, TRAINER_BACK_PIC_POKEDUDE); } -static void PokedudeHandleSuccessBallThrowAnim(u32 battler) -{ - BtlController_HandleSuccessBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW, FALSE); -} - -static void PokedudeHandleBallThrowAnim(u32 battler) -{ - BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW, FALSE); -} - static void PokedudeHandlePrintSelectionString(u32 battler) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) @@ -1210,11 +1197,15 @@ void InitPokedudePartyAndOpponent(void) i = 0; do { + u32 personality; if (data[i].side == B_SIDE_PLAYER) mon = &gPlayerParty[myIdx++]; else mon = &gEnemyParty[opIdx++]; - CreateMonWithGenderNatureLetter(mon, data[i].species, data[i].level, 0, data[i].gender, data[i].nature, 0); + + personality = GetMonPersonality(data[i].species, data[i].gender, data[i].nature, RANDOM_UNOWN_LETTER); + CreateMonWithIVsPersonality(mon, data[i].species, data[i].level, 0, personality); + for (j = 0; j < 4; ++j) SetMonMoveSlot(mon, data[i].moves[j], j); } while (data[++i].side != 0xFF); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index adc55d634..9ef031752 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -10,6 +10,7 @@ // #include "battle_tv.h" #include "bg.h" #include "data.h" +// #include "frontier_util.h" #include "item_menu.h" #include "item_use.h" #include "link.h" @@ -40,7 +41,6 @@ static void RecordedOpponentHandleChooseAction(u32 battler); static void RecordedOpponentHandleChooseMove(u32 battler); static void RecordedOpponentHandleChooseItem(u32 battler); static void RecordedOpponentHandleChoosePokemon(u32 battler); -static void RecordedOpponentHandleStatusIconUpdate(u32 battler); static void RecordedOpponentHandleStatusAnimation(u32 battler); static void RecordedOpponentHandleIntroTrainerBallThrow(u32 battler); static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler); @@ -62,7 +62,6 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_TRAINERSLIDEBACK] = RecordedOpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, @@ -76,7 +75,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 [CONTROLLER_23] = BtlController_Empty, [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = BtlController_Empty, - [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, [CONTROLLER_STATUSXOR] = BtlController_Empty, [CONTROLLER_DATATRANSFER] = BtlController_Empty, @@ -108,6 +107,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 void SetControllerToRecordedOpponent(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_RECORDED_OPPONENT; gBattlerControllerEndFuncs[battler] = RecordedOpponentBufferExecCompleted; gBattlerControllerFuncs[battler] = RecordedOpponentBufferRunCommand; } @@ -273,7 +273,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) static void RecordedOpponentHandleDrawTrainerPic(u32 battler) { s16 xPos; - u32 trainerPicId; + enum TrainerPicID trainerPicId; // Sets Multibattle test opponent sprites to not be Hiker if (IsMultibattleTest()) @@ -373,16 +373,6 @@ static void RecordedOpponentHandleChoosePokemon(u32 battler) BtlController_Complete(battler); } -static void RecordedOpponentHandleStatusIconUpdate(u32 battler) -{ - if (!IsBattleSEPlaying(battler)) - { - DoStatusIconUpdate(battler); - if (gTestRunnerEnabled) - TestRunner_Battle_RecordStatus1(battler, GetMonData(GetBattlerMon(battler), MON_DATA_STATUS)); - } -} - static void RecordedOpponentHandleStatusAnimation(u32 battler) { BtlController_HandleStatusAnimation(battler); diff --git a/src/battle_controller_recorded_partner.c b/src/battle_controller_recorded_partner.c index c1b5f6e14..ba81a2ffc 100644 --- a/src/battle_controller_recorded_partner.c +++ b/src/battle_controller_recorded_partner.c @@ -11,6 +11,7 @@ #include "battle_z_move.h" #include "bg.h" #include "data.h" +// #include "frontier_util.h" #include "item_use.h" #include "link.h" #include "main.h" @@ -35,6 +36,7 @@ #include "constants/trainers.h" static void RecordedPartnerHandleDrawTrainerPic(u32 battler); +static void RecordedPartnerHandleTrainerSlide(u32 battler); static void RecordedPartnerHandleTrainerSlideBack(u32 battler); static void RecordedPartnerHandleChooseAction(u32 battler); static void RecordedPartnerHandleChooseMove(u32 battler); @@ -54,11 +56,10 @@ static void (*const sRecordedPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 b [CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim, [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, [CONTROLLER_DRAWTRAINERPIC] = RecordedPartnerHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = BtlController_Empty, + [CONTROLLER_TRAINERSLIDE] = RecordedPartnerHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = RecordedPartnerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, [CONTROLLER_BALLTHROWANIM] = BtlController_Empty, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, @@ -104,6 +105,7 @@ static void (*const sRecordedPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 b void SetControllerToRecordedPartner(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_RECORDED_PARTNER; gBattlerControllerEndFuncs[battler] = RecordedPartnerBufferExecCompleted; gBattlerControllerFuncs[battler] = RecordedPartnerBufferRunCommand; } @@ -193,6 +195,18 @@ void RecordedPartnerBufferExecCompleted(u32 battler) } } +static enum TrainerPicID RecordedPartnerGetTrainerBackPicId(enum DifficultyLevel difficulty) +{ + enum TrainerPicID trainerPicId; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + trainerPicId = gBattlePartners[difficulty][gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerBackPic; + else + trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_RED; + + return trainerPicId; +} + // some explanation here // in emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it @@ -200,7 +214,7 @@ static void RecordedPartnerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; s16 xPos, yPos; - u32 trainerPicId; + enum TrainerPicID trainerPicId; trainerPicId = TRAINER_BACK_PIC_STEVEN; xPos = 90; @@ -211,6 +225,13 @@ static void RecordedPartnerHandleDrawTrainerPic(u32 battler) BtlController_HandleDrawTrainerPic(battler, trainerPicId, isFrontPic, xPos, yPos, -1); } +static void RecordedPartnerHandleTrainerSlide(u32 battler) +{ + enum DifficultyLevel difficulty = GetBattlePartnerDifficultyLevel(gPartnerTrainerId); + enum TrainerPicID trainerPicId = RecordedPartnerGetTrainerBackPicId(difficulty); + BtlController_HandleTrainerSlide(battler, trainerPicId); +} + static void RecordedPartnerHandleTrainerSlideBack(u32 battler) { BtlController_HandleTrainerSlideBack(battler, 35, FALSE); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 17de15f97..c9663ac6b 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -37,7 +37,6 @@ static void RecordedPlayerHandleChooseAction(u32 battler); static void RecordedPlayerHandleChooseMove(u32 battler); static void RecordedPlayerHandleChooseItem(u32 battler); static void RecordedPlayerHandleChoosePokemon(u32 battler); -static void RecordedPlayerHandleStatusIconUpdate(u32 battler); static void RecordedPlayerHandleStatusAnimation(u32 battler); static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler); static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler); @@ -58,8 +57,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_TRAINERSLIDEBACK] = RecordedPlayerHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = BtlController_HandleFaintAnimation, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty, - [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = BtlController_HandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation, [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, @@ -72,7 +70,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba [CONTROLLER_23] = BtlController_Empty, [CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate, [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, - [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, + [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, [CONTROLLER_STATUSXOR] = BtlController_Empty, [CONTROLLER_DATATRANSFER] = BtlController_Empty, @@ -104,6 +102,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba void SetControllerToRecordedPlayer(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_RECORDED_PLAYER; gBattlerControllerEndFuncs[battler] = RecordedPlayerBufferExecCompleted; gBattlerControllerFuncs[battler] = RecordedPlayerBufferRunCommand; } @@ -274,7 +273,7 @@ static void RecordedPlayerHandleDrawTrainerPic(u32 battler) { bool32 isFrontPic; s16 xPos, yPos; - u32 trainerPicId; + enum TrainerPicID trainerPicId; // Sets Multibattle test player sprites to not be Hiker if (IsMultibattleTest()) @@ -286,7 +285,7 @@ static void RecordedPlayerHandleDrawTrainerPic(u32 battler) xPos = 80; yPos = (8 - gTrainerBacksprites[trainerPicId].coordinates.size) * 4 + 80; } - else + else { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { @@ -393,16 +392,6 @@ static void RecordedPlayerHandleChoosePokemon(u32 battler) BtlController_Complete(battler); } -static void RecordedPlayerHandleStatusIconUpdate(u32 battler) -{ - if (!IsBattleSEPlaying(battler)) - { - DoStatusIconUpdate(battler); - if (gTestRunnerEnabled) - TestRunner_Battle_RecordStatus1(battler, GetMonData(GetBattlerMon(battler), MON_DATA_STATUS)); - } -} - static void RecordedPlayerHandleStatusAnimation(u32 battler) { BtlController_HandleStatusAnimation(battler); @@ -410,7 +399,7 @@ static void RecordedPlayerHandleStatusAnimation(u32 battler) static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler) { - u32 trainerPicId; + enum TrainerPicID trainerPicId; const u16 *trainerPal; if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index b8cf37c6b..c698e4ec4 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -24,13 +24,12 @@ #include "window.h" #include "line_break.h" #include "constants/battle_anim.h" +#include "constants/party_menu.h" #include "constants/songs.h" #include "constants/trainers.h" #include "constants/rgb.h" static void SafariHandleDrawTrainerPic(u32 battler); -static void SafariHandleSuccessBallThrowAnim(u32 battler); -static void SafariHandleBallThrowAnim(u32 battler); static void SafariHandleChooseAction(u32 battler); static void SafariHandleChooseItem(u32 battler); static void SafariHandleStatusIconUpdate(u32 battler); @@ -55,8 +54,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_TRAINERSLIDEBACK] = BtlController_Empty, [CONTROLLER_FAINTANIMATION] = BtlController_Empty, [CONTROLLER_PALETTEFADE] = BtlController_Empty, - [CONTROLLER_SUCCESSBALLTHROWANIM] = SafariHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = BtlController_HandleBallThrowAnim, [CONTROLLER_PAUSE] = BtlController_Empty, [CONTROLLER_MOVEANIMATION] = BtlController_Empty, [CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString, @@ -104,6 +102,7 @@ static const u8 sText_SafariZoneMenu[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW 1 void SetControllerToSafari(u32 battler) { + gBattlerBattleController[battler] = BATTLE_CONTROLLER_SAFARI; gBattlerControllerEndFuncs[battler] = SafariBufferExecCompleted; gBattlerControllerFuncs[battler] = SafariBufferRunCommand; } @@ -242,23 +241,13 @@ void SafariBufferExecCompleted(u32 battler) static void SafariHandleDrawTrainerPic(u32 battler) { - u32 trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_RED; + enum TrainerPicID trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_RED; BtlController_HandleDrawTrainerPic(battler, trainerPicId, FALSE, 80, 80 + 4 * (8 - gTrainerBacksprites[trainerPicId].coordinates.size), 30); } -static void SafariHandleSuccessBallThrowAnim(u32 battler) -{ - BtlController_HandleSuccessBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); -} - -static void SafariHandleBallThrowAnim(u32 battler) -{ - BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE); -} - static void HandleChooseActionAfterDma3(u32 battler) { if (!IsDma3ManagerBusyWithBgCopy()) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 51bc97149..32243a1dd 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -11,6 +11,7 @@ #include "battle_setup.h" // #include "battle_tv.h" #include "cable_club.h" +#include "event_data.h" #include "event_object_movement.h" #include "item.h" #include "link.h" @@ -19,22 +20,21 @@ #include "overworld.h" #include "palette.h" #include "party_menu.h" +#include "pokemon_animation.h" #include "recorded_battle.h" #include "string_util.h" #include "sound.h" #include "task.h" #include "test_runner.h" -#include "util.h" #include "text.h" +#include "util.h" +#include "wild_encounter.h" #include "constants/abilities.h" -#include "constants/battle_string_ids.h" #include "constants/item_effects.h" #include "constants/songs.h" -#include "constants/sound.h" #include "test/battle.h" #include "test/test.h" #include "test/test_runner_battle.h" -#include "pokemon_animation.h" static EWRAM_DATA u8 sLinkSendTaskId = 0; static EWRAM_DATA u8 sLinkReceiveTaskId = 0; @@ -42,6 +42,7 @@ static EWRAM_DATA u8 sLinkReceiveTaskId = 0; COMMON_DATA void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; COMMON_DATA u8 gBattleControllerData[MAX_BATTLERS_COUNT] = {0}; // Used by the battle controllers to store misc sprite/task IDs for each battler COMMON_DATA void (*gBattlerControllerEndFuncs[MAX_BATTLERS_COUNT])(u32 battler) = {0}; // Controller's buffer complete function for each battler +u8 gBattlerBattleController[MAX_BATTLERS_COUNT] = {0}; // Battle controller for each battler static void CreateTasksForSendRecvLinkBuffers(void); static void InitBtlControllersInternal(void); @@ -55,6 +56,69 @@ static u32 ReturnAnimIdForBattler(bool32 isPlayerSide, u32 specificBattler); static void LaunchKOAnimation(u32 battlerId, u16 animId, bool32 isFront); static void AnimateMonAfterKnockout(u32 battler); + +bool32 IsAiVsAiBattle(void) +{ + return (B_FLAG_AI_VS_AI_BATTLE && FlagGet(B_FLAG_AI_VS_AI_BATTLE)); +} + +bool32 BattlerIsPlayer(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_PLAYER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_PLAYER); +} + +bool32 BattlerIsPartner(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_PLAYER_PARTNER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_PARTNER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_LINK_PARTNER); +} + +bool32 BattlerIsOpponent(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_OPPONENT + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_OPPONENT + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_LINK_OPPONENT); +} + +bool32 BattlerIsRecorded(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_PLAYER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_PARTNER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_RECORDED_OPPONENT); +} + +bool32 BattlerIsLink(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_LINK_PARTNER + || gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_LINK_OPPONENT); +} + +bool32 BattlerIsWally(u32 battlerId) +{ + return (gBattlerBattleController[battlerId] == BATTLE_CONTROLLER_WALLY); +} + +bool32 BattlerHasAi(u32 battlerId) +{ + switch (gBattlerBattleController[battlerId]) + { + case BATTLE_CONTROLLER_OPPONENT: + case BATTLE_CONTROLLER_PLAYER_PARTNER: + case BATTLE_CONTROLLER_SAFARI: + case BATTLE_CONTROLLER_WALLY: + return TRUE; + default: + break; + } + + if (IsAiVsAiBattle()) + return TRUE; + + return FALSE; +} + void HandleLinkBattleSetup(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -77,7 +141,7 @@ void SetUpBattleVars(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gBattlerControllerFuncs[i] = BattleControllerDummy; - gBattlerPositions[i] = 0xFF; + gBattlerPositions[i] = B_POSITION_ABSENT; gActionSelectionCursor[i] = 0; gMoveSelectionCursor[i] = 0; } @@ -91,8 +155,9 @@ void SetUpBattleVars(void) if (!IS_FRLG && gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); - i = 0; + CreateMonWithIVs(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 0, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[0]); + i = ITEM_NONE; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i); } } @@ -217,8 +282,10 @@ static void InitBtlControllersInternal(void) gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToRecordedPlayer; else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToSafari; - else if (gBattleTypeFlags & (BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE)) - gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToOakOrOldMan; + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL) + gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToOakOrOldMan; + else if (IS_FRLG && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)) + gBattlerControllerFuncs[gBattlerPositions[B_BATTLER_0]] = SetControllerToOakOrOldMan; else if (isAIvsAI) gBattlerControllerFuncs[GetBattlerPosition(B_BATTLER_0)] = SetControllerToPlayerPartner; else @@ -300,7 +367,7 @@ static void InitBtlControllersInternal(void) for (i = 0; i < MAX_LINK_PLAYERS; i++) { - u32 linkPositionLeft, linkPositionRight; + enum BattlerPosition linkPositionLeft, linkPositionRight; BattleControllerFunc linkBtlControllerFunc; if (i == multiplayerId) @@ -351,6 +418,14 @@ bool32 IsValidForBattle(struct Pokemon *mon) && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); } +bool32 IsValidForBattleButDead(struct Pokemon *mon) +{ + u32 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG); + return (species != SPECIES_NONE + && species != SPECIES_EGG + && GetMonData(mon, MON_DATA_IS_EGG) == FALSE); +} + static inline bool32 IsControllerPlayer(u32 battler) { return (gBattlerControllerEndFuncs[battler] == PlayerBufferExecCompleted); @@ -376,16 +451,16 @@ static inline bool32 IsControllerPlayerPartner(u32 battler) return (gBattlerControllerEndFuncs[battler] == PlayerPartnerBufferExecCompleted); } -static inline bool32 IsControllerOakOldMan(u32 battler) -{ - return (gBattlerControllerEndFuncs[battler] == OakOldManBufferExecCompleted); -} - static inline bool32 IsControllerPokedude(u32 battler) { return (gBattlerControllerEndFuncs[battler] == PokedudeBufferExecCompleted); } +static inline bool32 IsControllerOakOldMan(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == OakOldManBufferExecCompleted); +} + static inline bool32 IsControllerRecordedOpponent(u32 battler) { return (gBattlerControllerEndFuncs[battler] == RecordedOpponentBufferExecCompleted); @@ -401,6 +476,11 @@ static inline bool32 IsControllerLinkPartner(u32 battler) return (gBattlerControllerEndFuncs[battler] == LinkPartnerBufferExecCompleted); } +static inline bool32 IsControllerSafari(u32 battler) +{ + return (gBattlerControllerEndFuncs[battler] == SafariBufferExecCompleted); +} + static void SetBattlePartyIds(void) { s32 i, j; @@ -413,42 +493,31 @@ static void SetBattlePartyIds(void) { if (i < 2) { - if (IsOnPlayerSide(i)) + if (IsValidForBattle(&GetBattlerParty(i)[j])) { - if (IsValidForBattle(&gPlayerParty[j])) - { - gBattlerPartyIndexes[i] = j; - break; - } - } - else - { - if (IsValidForBattle(&gEnemyParty[j])) - { - gBattlerPartyIndexes[i] = j; - break; - } + gBattlerPartyIndexes[i] = j; + break; } } else { - if (IsOnPlayerSide(i)) + if (gBattlerPartyIndexes[i - 2] == j) { - if (IsValidForBattle(&gPlayerParty[j]) && gBattlerPartyIndexes[i - 2] != j) - { - gBattlerPartyIndexes[i] = j; - break; - } + // Exclude already assigned pokemon; } - else + else if (IsValidForBattle(&GetBattlerParty(i)[j])) { - if (IsValidForBattle(&gEnemyParty[j]) && gBattlerPartyIndexes[i - 2] != j) - { - gBattlerPartyIndexes[i] = j; - break; - } + gBattlerPartyIndexes[i] = j; + break; + } + else if (IsValidForBattleButDead(&GetBattlerParty(i)[j]) && gBattlerPartyIndexes[i] < PARTY_SIZE) + { + // Put an "option" on a dead mon that can be revived; + gBattlerPartyIndexes[i] = j + PARTY_SIZE; } + if (gBattlerPartyIndexes[i] >= PARTY_SIZE) + continue; // No valid mons were found. Add the empty slot. if (gBattlerPartyIndexes[i - 2] == 0) gBattlerPartyIndexes[i] = 1; @@ -456,6 +525,8 @@ static void SetBattlePartyIds(void) gBattlerPartyIndexes[i] = 0; } } + if (gBattlerPartyIndexes[i] >= PARTY_SIZE) + gBattlerPartyIndexes[i] -= PARTY_SIZE; } if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) @@ -880,15 +951,6 @@ static void UNUSED BtlController_EmitPaletteFade(u32 battler, u32 bufferId) PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -static void UNUSED BtlController_EmitSuccessBallThrowAnim(u32 battler, u32 bufferId) -{ - gBattleResources->transferBuffer[0] = CONTROLLER_SUCCESSBALLTHROWANIM; - gBattleResources->transferBuffer[1] = CONTROLLER_SUCCESSBALLTHROWANIM; - gBattleResources->transferBuffer[2] = CONTROLLER_SUCCESSBALLTHROWANIM; - gBattleResources->transferBuffer[3] = CONTROLLER_SUCCESSBALLTHROWANIM; - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); -} - void BtlController_EmitBallThrowAnim(u32 battler, u32 bufferId, u8 caseId) { gBattleResources->transferBuffer[0] = CONTROLLER_BALLTHROWANIM; @@ -907,7 +969,7 @@ static void UNUSED BtlController_EmitPause(u32 battler, u32 bufferId, u8 toWait, PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, toWait * 3 + 2); } -void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit) +void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, enum Move move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, u8 multihit) { gBattleResources->transferBuffer[0] = CONTROLLER_MOVEANIMATION; gBattleResources->transferBuffer[1] = move; @@ -933,8 +995,17 @@ void BtlController_EmitMoveAnimation(u32 battler, u32 bufferId, u16 move, u8 tur } gBattleResources->transferBuffer[14] = 0; gBattleResources->transferBuffer[15] = 0; - memcpy(&gBattleResources->transferBuffer[16], disableStructPtr, sizeof(struct DisableStruct)); - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 16 + sizeof(struct DisableStruct)); + + struct LinkBattleAnim anim = {0}; + anim.isTransformedMonShiny = gBattleMons[battler].volatiles.isTransformedMonShiny; + anim.transformedMonPID = gBattleMons[battler].volatiles.transformedMonPID; + anim.rolloutTimer = gBattleMons[battler].volatiles.rolloutTimer; + anim.furyCutterCounter = gBattleMons[battler].volatiles.furyCutterCounter; + anim.syrupBombIsShiny = gBattleMons[battler].volatiles.syrupBombIsShiny; + anim.isTransformedMonShiny = gBattleMons[battler].volatiles.isTransformedMonShiny; + memcpy(&gBattleResources->transferBuffer[16], &anim, sizeof(struct LinkBattleAnim)); + + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 16 + sizeof(struct LinkBattleAnim)); } void BtlController_EmitPrintString(u32 battler, u32 bufferId, enum StringID stringID) @@ -999,7 +1070,7 @@ void BtlController_EmitPrintSelectionString(u32 battler, u32 bufferId, enum Stri } // itemId only relevant for B_ACTION_USE_ITEM -void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, u16 itemId) +void BtlController_EmitChooseAction(u32 battler, u32 bufferId, u8 action, enum Item itemId) { gBattleResources->transferBuffer[0] = CONTROLLER_CHOOSEACTION; gBattleResources->transferBuffer[1] = action; @@ -1315,14 +1386,23 @@ void BtlController_EmitSpriteInvisibility(u32 battler, u32 bufferId, bool8 isInv PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4); } -void BtlController_EmitBattleAnimation(u32 battler, u32 bufferId, u8 animationId, struct DisableStruct *disableStructPtr, u16 argument) +void BtlController_EmitBattleAnimation(u32 battler, u32 bufferId, u8 animationId, u16 argument) { gBattleResources->transferBuffer[0] = CONTROLLER_BATTLEANIMATION; gBattleResources->transferBuffer[1] = animationId; gBattleResources->transferBuffer[2] = argument; gBattleResources->transferBuffer[3] = (argument & 0xFF00) >> 8; - memcpy(&gBattleResources->transferBuffer[4], disableStructPtr, sizeof(struct DisableStruct)); - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4 + sizeof(struct DisableStruct)); + + struct LinkBattleAnim anim = {0}; + anim.isTransformedMonShiny = gBattleMons[battler].volatiles.isTransformedMonShiny; + anim.transformedMonPID = gBattleMons[battler].volatiles.transformedMonPID; + anim.rolloutTimer = gBattleMons[battler].volatiles.rolloutTimer; + anim.furyCutterCounter = gBattleMons[battler].volatiles.furyCutterCounter; + anim.syrupBombIsShiny = gBattleMons[battler].volatiles.syrupBombIsShiny; + anim.isTransformedMonShiny = gBattleMons[battler].volatiles.isTransformedMonShiny; + memcpy(&gBattleResources->transferBuffer[4], &anim, sizeof(struct LinkBattleAnim)); + + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 4 + sizeof(struct LinkBattleAnim)); } // mode is a LINK_STANDBY_* constant @@ -1353,7 +1433,7 @@ void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome // gBattleResources->transferBuffer[2] = gSaveBlock2Ptr->frontier.disableRecordBattle; // gBattleResources->transferBuffer[3] = gSaveBlock2Ptr->frontier.disableRecordBattle; // gBattleResources->transferBuffer[5] = gBattleResources->transferBuffer[4] = RecordedBattle_BufferNewBattlerData(&gBattleResources->transferBuffer[6]); - PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, 2); + PrepareBufferDataTransfer(battler, bufferId, gBattleResources->transferBuffer, gBattleResources->transferBuffer[4] + 6); } void BtlController_EmitDebugMenu(u32 battler, u32 bufferId) @@ -1422,10 +1502,10 @@ static u32 GetBattlerMonData(u32 battler, struct Pokemon *party, u32 monId, u8 * #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + enum BattleTrainer trainer = GetBattlerTrainer(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(trainer, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(trainer, partyIndex); } #endif break; @@ -1914,7 +1994,7 @@ static bool8 ShouldDoSlideInAnim(u32 battler) if (gBattleTypeFlags & ( BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_FIRST_BATTLE | - BATTLE_TYPE_SAFARI | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TWO_OPPONENTS | + BATTLE_TYPE_SAFARI | BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_POKEDUDE) ) return FALSE; @@ -2032,7 +2112,7 @@ static void Controller_FaintOpponentMon(u32 battler) static void Controller_DoMoveAnimation(u32 battler) { - u16 move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8); + enum Move move = gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8); switch (gBattleSpritesDataPtr->healthBoxesData[battler].animationState) { @@ -2105,7 +2185,7 @@ void Controller_WaitForHealthBar(u32 battler) { if (IsOnPlayerSide(battler)) HandleLowHpMusicChange(GetBattlerMon(battler), battler); - + if (GetBattlerSide(battler) == B_SIDE_OPPONENT && !BtlCtrl_OakOldMan_TestState2Flag(1) && (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)) { BtlCtrl_OakOldMan_SetState2Flag(1); @@ -2377,7 +2457,7 @@ void BtlController_HandleReturnMonToBall(u32 battler) #define sSpeedX data[0] -void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority) +void BtlController_HandleDrawTrainerPic(u32 battler, enum TrainerPicID trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority) { if (!IsOnPlayerSide(battler)) // Always the front sprite for the opponent. { @@ -2426,7 +2506,11 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + + // Sets sprite priority to 1 so mons don't remain in foreground + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.priority = 1; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = DISPLAY_WIDTH; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = -2; @@ -2439,7 +2523,7 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is gBattlerControllerFuncs[battler] = Controller_WaitForTrainerPic; } -void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) +void BtlController_HandleTrainerSlide(u32 battler, enum TrainerPicID trainerPicId) { if (IsOnPlayerSide(battler)) { @@ -2451,7 +2535,10 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) 30); if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT) gBattlerSpriteIds[battler] = gBattleStruct->trainerSlideSpriteIds[battler]; - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = battler; + // Sets sprite priority to 1 so mons don't remain in foreground + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.priority = 1; + // Aiming for palette slots 8 and 9 for Player and PlayerPartner to prevent Trainer Slides causing mons to change colour + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = -96; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].sSpeedX = 2; } @@ -2459,7 +2546,7 @@ void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId) { DecompressTrainerFrontPic(trainerPicId, battler); SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(battler)); - gBattleStruct->trainerSlideSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerSprites[trainerPicId].frontPicCoords.size) * 4 + 40, 0); + gBattleStruct->trainerSlideSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 176, 40, 0); gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.affineParam = trainerPicId; gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerSprites[trainerPicId].palette.tag); gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].x2 = 96; @@ -2538,14 +2625,22 @@ static void HandleBallThrow(u32 battler, u32 target, u32 animId, bool32 allowCri gBattlerControllerFuncs[battler] = Controller_WaitForBallThrow; } -void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture) +void BtlController_HandleBallThrowAnim(u32 battler) { - gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; - HandleBallThrow(battler, target, animId, allowCriticalCapture); -} + bool32 allowCriticalCapture = FALSE; + u32 animId = B_ANIM_BALL_THROW; + u32 target = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + + if (BattlerIsPlayer(battler)) + { + allowCriticalCapture = TRUE; + target = gBattlerTarget; + } + else if (IsControllerSafari(battler) || IsControllerOakOldMan(battler)) + { + animId = B_ANIM_BALL_THROW_WITH_TRAINER; + } -void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture) -{ gBattleSpritesDataPtr->animationData->ballThrowCaseId = gBattleResources->bufferA[battler][1]; HandleBallThrow(battler, target, animId, allowCriticalCapture); } @@ -2559,9 +2654,9 @@ void BtlController_HandleMoveAnimation(u32 battler) gAnimMoveDmg = gBattleResources->bufferA[battler][6] | (gBattleResources->bufferA[battler][7] << 8) | (gBattleResources->bufferA[battler][8] << 16) | (gBattleResources->bufferA[battler][9] << 24); gAnimFriendship = gBattleResources->bufferA[battler][10]; gWeatherMoveAnim = gBattleResources->bufferA[battler][12] | (gBattleResources->bufferA[battler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][16]; - gTransformedPersonalities[battler] = gAnimDisableStructPtr->transformedMonPersonality; - gTransformedShininess[battler] = gAnimDisableStructPtr->transformedMonShininess; + gAnimDisableStructPtr = (struct LinkBattleAnim *)&gBattleResources->bufferA[battler][16]; + gTransformedPersonalities[battler] = gAnimDisableStructPtr->transformedMonPID; + gTransformedShininess[battler] = gAnimDisableStructPtr->isTransformedMonShiny; gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; gBattlerControllerFuncs[battler] = Controller_DoMoveAnimation; } @@ -2595,7 +2690,7 @@ void BtlController_HandlePrintString(u32 battler) { switch (*stringId) { - case STRINGID_TRAINER1WINTEXT: + case STRINGID_TRAINER1WINTEXT: gBattlerControllerFuncs[battler] = PrintOakText_HowDisappointing; return; case STRINGID_DONTLEAVEBIRCH: @@ -2646,20 +2741,25 @@ void BtlController_HandleHealthBarUpdate(u32 battler) gBattlerControllerFuncs[battler] = Controller_WaitForHealthBar; } -void DoStatusIconUpdate(u32 battler) -{ - struct Pokemon *mon = GetBattlerMon(battler); - - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_STATUS_ICON); - gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; - gBattlerControllerFuncs[battler] = Controller_WaitForStatusAnimation; -} - void BtlController_HandleStatusIconUpdate(u32 battler) { if (!IsBattleSEPlaying(battler)) { - DoStatusIconUpdate(battler); + struct Pokemon *mon = GetBattlerMon(battler); + + if (IsControllerSafari(battler)) + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_SAFARI_BALLS_TEXT); + BtlController_Complete(battler); + } + else + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], mon, HEALTHBOX_STATUS_ICON); + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; + gBattlerControllerFuncs[battler] = Controller_WaitForStatusAnimation; + if (gTestRunnerEnabled && BattlerIsRecorded(battler)) + TestRunner_Battle_RecordStatus1(battler, GetMonData(GetBattlerMon(battler), MON_DATA_STATUS)); + } } } @@ -2675,7 +2775,7 @@ void BtlController_HandleStatusAnimation(u32 battler) void BtlController_HandleHitAnimation(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) + if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE || (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim)) { BtlController_Complete(battler); } @@ -2690,6 +2790,11 @@ void BtlController_HandleHitAnimation(u32 battler) void BtlController_HandlePlaySE(u32 battler) { + if (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim) + { + BtlController_Complete(battler); + return; + } s32 pan = IsOnPlayerSide(battler) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan); @@ -2698,6 +2803,11 @@ void BtlController_HandlePlaySE(u32 battler) void BtlController_HandlePlayFanfareOrBGM(u32 battler) { + if (gTestRunnerHeadless && !gBattleTestRunnerState->forceMoveAnim) + { + BtlController_Complete(battler); + return; + } if (gBattleResources->bufferA[battler][3]) { BattleStopLowHpSound(); @@ -2713,19 +2823,13 @@ void BtlController_HandlePlayFanfareOrBGM(u32 battler) void BtlController_HandleFaintingCry(u32 battler) { - struct Pokemon *party; + struct Pokemon *party = GetBattlerParty(battler); s8 pan; if (IsOnPlayerSide(battler)) - { - party = gPlayerParty; pan = -25; - } else - { - party = gEnemyParty; pan = 25; - } PlayCry_ByMode(GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), pan, CRY_MODE_FAINT); BtlController_Complete(battler); @@ -2801,7 +2905,7 @@ void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, c paletteNum = AllocSpritePalette(tagTrainerPal); LoadPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = paletteNum; + gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.paletteNum = (8 + battler/2); } else { @@ -2945,15 +3049,15 @@ void BtlController_HandleHidePartyStatusSummary(u32 battler) void BtlController_HandleBattleAnimation(u32 battler) { - if (((gBattleTypeFlags & (BATTLE_TYPE_SAFARI)) + if ((gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_CATCH_TUTORIAL)) || IsControllerOakOldMan(battler) - || IsControllerPokedude(battler)) + || IsControllerPokedude(battler) || !IsBattleSEPlaying(battler)) { u8 animationId = gBattleResources->bufferA[battler][1]; u16 argument = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][4]; + gAnimDisableStructPtr = (struct LinkBattleAnim *)&gBattleResources->bufferA[battler][4]; if (TryHandleLaunchBattleTableAnimation(battler, battler, battler, animationId, argument)) BtlController_Complete(battler); @@ -2966,7 +3070,7 @@ void AnimateMonAfterPokeBallFail(u32 battler) { if (B_ANIMATE_MON_AFTER_FAILED_POKEBALL == FALSE) return; - + LaunchKOAnimation(battler, ReturnAnimIdForBattler(TRUE, battler), TRUE); TryShinyAnimation(gBattlerTarget, GetBattlerMon(gBattlerTarget)); } @@ -3192,24 +3296,7 @@ void UpdateFriendshipFromXItem(u32 battler) if (friendship < X_ITEM_MAX_FRIENDSHIP) { - if (GetItemHoldEffect(heldItem) == HOLD_EFFECT_FRIENDSHIP_UP) - friendship += 150 * X_ITEM_FRIENDSHIP_INCREASE / 100; - else - friendship += X_ITEM_FRIENDSHIP_INCREASE; - - u8 pokeball; - gBattleResources->bufferA[battler][1] = REQUEST_POKEBALL_BATTLE; - GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &pokeball); - - if (pokeball == BALL_LUXURY) - friendship++; - - u8 metLocation; - gBattleResources->bufferA[battler][1] = REQUEST_MET_LOCATION_BATTLE; - GetBattlerMonData(battler, party, gBattlerPartyIndexes[battler], &metLocation); - - if (metLocation == GetCurrentRegionMapSectionId()) - friendship++; + friendship += CalculateFriendshipBonuses(GetBattlerMon(battler), X_ITEM_FRIENDSHIP_INCREASE, GetItemHoldEffect(heldItem)); if (friendship > MAX_FRIENDSHIP) friendship = MAX_FRIENDSHIP; @@ -3236,3 +3323,26 @@ void FreeShinyStars(void) FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } + +enum BattleTrainer GetBattlerTrainer(enum BattlerId battler) +{ + switch (battler) + { + case B_BATTLER_0: + return B_TRAINER_0; + case B_BATTLER_1: + return B_TRAINER_1; + case B_BATTLER_2: + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + return B_TRAINER_2; + else + return B_TRAINER_0; + case B_BATTLER_3: + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + return B_TRAINER_3; + else + return B_TRAINER_1; + default: + return B_TRAINER_1; + } +} diff --git a/src/battle_debug.c b/src/battle_debug.c index 23e8a74ff..cd6e67f5d 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_controllers.h" #include "battle_message.h" #include "main.h" #include "menu.h" @@ -378,7 +379,7 @@ static const struct ListMenuItem sVolatileStatusListItems[] = {COMPOUND_STRING("Lock On"), VOLATILE_LOCK_ON}, {COMPOUND_STRING("Perish Song"), VOLATILE_PERISH_SONG}, {COMPOUND_STRING("Minimize"), VOLATILE_MINIMIZE}, - {COMPOUND_STRING("Charge"), VOLATILE_CHARGE}, + {COMPOUND_STRING("Charge"), VOLATILE_CHARGE_TIMER}, {COMPOUND_STRING("Root"), VOLATILE_ROOT}, {COMPOUND_STRING("Yawn"), VOLATILE_YAWN}, {COMPOUND_STRING("Imprison"), VOLATILE_IMPRISON}, @@ -684,8 +685,8 @@ void CB2_BattleDebugMenu(void) gMain.state++; break; case 3: - LoadPalette(sBgColor, 0, 2); - LoadPalette(GetOverworldTextboxPalettePtr(), 0xf0, 16); + LoadPalette(sBgColor, BG_PLTT_ID(0), 2); + LoadPalette(GetOverworldTextboxPalettePtr(), BG_PLTT_ID(15), PLTT_SIZEOF(8)); gMain.state++; break; case 4: @@ -920,7 +921,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data) { enum Ability ability = gAiLogicData->abilities[i]; enum HoldEffect holdEffect = gAiLogicData->holdEffects[i]; - u16 item = gAiLogicData->items[i]; + enum Item item = gAiLogicData->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilitiesInfo[ability].name, x, 0, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, GetItemName(item), x, 15, 0, NULL); @@ -1684,7 +1685,7 @@ static void ValueToCharDigits(u8 *charDigits, u32 newValue, u8 maxDigits) static void ChangeHazardsValue(struct BattleDebugMenu *data) { - u32 side = GetBattlerSide(data->battlerId); + enum BattleSide side = GetBattlerSide(data->battlerId); switch (data->currentSecondaryListItemId) { @@ -1980,12 +1981,14 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) } else if (data->currentSecondaryListItemId == VARIOUS_SUBSTITUTE_HP) { + u32 subHp = gBattleMons[data->battlerId].volatiles.substituteHP; data->modifyArrows.minValue = 0; data->modifyArrows.maxValue = 255; data->modifyArrows.maxDigits = 3; - data->modifyArrows.modifiedValPtr = &gDisableStructs[data->battlerId].substituteHP; + data->modifyArrows.modifiedValPtr = &subHp; + gBattleMons[data->battlerId].volatiles.substituteHP = subHp; data->modifyArrows.typeOfVal = VAR_SUBSTITUTE; - data->modifyArrows.currValue = gDisableStructs[data->battlerId].substituteHP; + data->modifyArrows.currValue = gBattleMons[data->battlerId].volatiles.substituteHP; } else if (data->currentSecondaryListItemId == VARIOUS_IN_LOVE) { @@ -2199,10 +2202,8 @@ static const u8 *const sHoldEffectNames[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_LUCKY_EGG] = COMPOUND_STRING("Lucky Egg"), [HOLD_EFFECT_SCOPE_LENS] = COMPOUND_STRING("Scope Lens"), [HOLD_EFFECT_LEFTOVERS] = COMPOUND_STRING("Leftovers"), - [HOLD_EFFECT_DRAGON_SCALE] = COMPOUND_STRING("Dragon Scale"), [HOLD_EFFECT_LIGHT_BALL] = COMPOUND_STRING("Light Ball"), [HOLD_EFFECT_TYPE_POWER] = COMPOUND_STRING("Type Power"), - [HOLD_EFFECT_UPGRADE] = COMPOUND_STRING("Upgrade"), [HOLD_EFFECT_SHELL_BELL] = COMPOUND_STRING("Shell Bell"), [HOLD_EFFECT_LUCKY_PUNCH] = COMPOUND_STRING("Lucky Punch"), [HOLD_EFFECT_METAL_POWDER] = COMPOUND_STRING("Metal Powder"), diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index d5edbc0e6..2481cce63 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -22,7 +22,7 @@ #include "constants/items.h" #include "constants/moves.h" -static u32 GetMaxPowerTier(u32 move); +static enum MaxPowerTier GetMaxPowerTier(enum Move move); struct GMaxMove { @@ -144,7 +144,7 @@ void ApplyDynamaxHPMultiplier(struct Pokemon* mon) } // Returns the non-Dynamax HP of a Pokemon. -u16 GetNonDynamaxHP(u32 battler) +u32 GetNonDynamaxHP(u32 battler) { if (GetActiveGimmick(battler) != GIMMICK_DYNAMAX || gBattleMons[battler].species == SPECIES_SHEDINJA) return gBattleMons[battler].hp; @@ -158,7 +158,7 @@ u16 GetNonDynamaxHP(u32 battler) } // Returns the non-Dynamax Max HP of a Pokemon. -u16 GetNonDynamaxMaxHP(u32 battler) +u32 GetNonDynamaxMaxHP(u32 battler) { if (GetActiveGimmick(battler) != GIMMICK_DYNAMAX || gBattleMons[battler].species == SPECIES_SHEDINJA) return gBattleMons[battler].maxHP; @@ -190,7 +190,7 @@ void ActivateDynamax(u32 battler) if (!gBattleMons[battler].volatiles.transformed) // Ditto cannot Gigantamax. TryBattleFormChange(battler, FORM_CHANGE_BATTLE_GIGANTAMAX); - BattleScriptExecute(BattleScript_DynamaxBegins); + BattleScriptPushCursorAndCallback(BattleScript_DynamaxBegins); } // Unsets the flags used for Dynamaxing and reverts max HP if needed. @@ -215,7 +215,7 @@ void UndoDynamax(u32 battler) } // Certain moves are blocked by Max Guard that normally ignore protection. -bool32 IsMoveBlockedByMaxGuard(u32 move) +bool32 IsMoveBlockedByMaxGuard(enum Move move) { switch (move) { @@ -229,11 +229,12 @@ bool32 IsMoveBlockedByMaxGuard(u32 move) case MOVE_TEATIME: case MOVE_TRANSFORM: return TRUE; + default: + return FALSE; } - return FALSE; } -static u16 GetTypeBasedMaxMove(u32 battler, enum Type type) +static enum Move GetTypeBasedMaxMove(u32 battler, enum Type type) { // Gigantamax check u32 i; @@ -262,7 +263,7 @@ static u16 GetTypeBasedMaxMove(u32 battler, enum Type type) } // Returns the appropriate Max Move or G-Max Move for a battler to use. -u16 GetMaxMove(u32 battler, u32 baseMove) +enum Move GetMaxMove(u32 battler, enum Move baseMove) { enum Type moveType; SetTypeBeforeUsingMove(baseMove, battler); @@ -287,9 +288,9 @@ u16 GetMaxMove(u32 battler, u32 baseMove) } // First value is for Fighting, Poison and Multi-Attack. The second is for everything else. -enum +enum MaxPowerTier { - MAX_POWER_TIER_1, // 70 or 90 damage + MAX_POWER_TIER_1, // 70 or 90 damage MAX_POWER_TIER_2, // 75 or 100 damage MAX_POWER_TIER_3, // 80 or 110 damage MAX_POWER_TIER_4, // 85 or 120 damage @@ -300,9 +301,8 @@ enum }; // Gets the base power of a Max Move. -u32 GetMaxMovePower(u32 move) +u32 GetMaxMovePower(enum Move move) { - u32 tier; // G-Max Drum Solo, G-Max Hydrosnipe, and G-Max Fireball always have 160 base power. if (MoveHasAdditionalEffect(move, MOVE_EFFECT_FIXED_POWER)) return 160; @@ -314,9 +314,10 @@ u32 GetMaxMovePower(u32 move) case MOVE_GEAR_GRIND: return 100; case MOVE_DUAL_WINGBEAT: return 100; case MOVE_TRIPLE_AXEL: return 140; + default: break; } - tier = GetMaxPowerTier(move); + enum MaxPowerTier tier = GetMaxPowerTier(move); enum Type moveType = GetMoveType(move); if (moveType == TYPE_FIGHTING || moveType == TYPE_POISON @@ -352,7 +353,7 @@ u32 GetMaxMovePower(u32 move) } } -static u32 GetMaxPowerTier(u32 move) +static enum MaxPowerTier GetMaxPowerTier(enum Move move) { u32 strikeCount = GetMoveStrikeCount(move); if (strikeCount >= 2 && strikeCount <= 5) @@ -368,26 +369,36 @@ static u32 GetMaxPowerTier(u32 move) } } + if (IsMultiHitMove(move)) + { + switch(GetMovePower(move)) + { + case 0 ... 15: return MAX_POWER_TIER_1; + case 16 ... 18: return MAX_POWER_TIER_2; + case 19 ... 20: return MAX_POWER_TIER_4; + default: + case 21 ... 25: return MAX_POWER_TIER_5; + } + } + switch (GetMoveEffect(move)) { case EFFECT_BIDE: case EFFECT_FIXED_PERCENT_DAMAGE: case EFFECT_LEVEL_DAMAGE: case EFFECT_PSYWAVE: - case EFFECT_COUNTER: + case EFFECT_REFLECT_DAMAGE: case EFFECT_PRESENT: case EFFECT_BEAT_UP: case EFFECT_WEATHER_BALL: case EFFECT_FLING: case EFFECT_ELECTRO_BALL: - case EFFECT_METAL_BURST: case EFFECT_TERRAIN_PULSE: case EFFECT_PUNISHMENT: case EFFECT_TRUMP_CARD: case EFFECT_FIXED_HP_DAMAGE: case EFFECT_SPIT_UP: case EFFECT_NATURAL_GIFT: - case EFFECT_MIRROR_COAT: case EFFECT_FINAL_GAMBIT: return MAX_POWER_TIER_2; case EFFECT_OHKO: @@ -404,15 +415,6 @@ static u32 GetMaxPowerTier(u32 move) case EFFECT_FLAIL: case EFFECT_LOW_KICK: return MAX_POWER_TIER_7; - case EFFECT_MULTI_HIT: - switch(GetMovePower(move)) - { - case 0 ... 15: return MAX_POWER_TIER_1; - case 16 ... 18: return MAX_POWER_TIER_2; - case 19 ... 20: return MAX_POWER_TIER_4; - default: - case 21 ... 25: return MAX_POWER_TIER_5; - } default: break; } @@ -431,7 +433,7 @@ static u32 GetMaxPowerTier(u32 move) } // Returns whether a move is a Max Move or not. -bool32 IsMaxMove(u32 move) +bool32 IsMaxMove(enum Move move) { return move >= FIRST_MAX_MOVE && move <= LAST_MAX_MOVE; } diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 991393de9..341ab90dc 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_hold_effects.h" +#include "battle_setup.h" #include "battle_util.h" #include "battle_controllers.h" #include "battle_ai_util.h" @@ -12,7 +13,7 @@ #include "constants/items.h" #include "constants/moves.h" -static u32 GetBattlerSideForMessage(u32 side) +static u32 GetBattlerSideForMessage(enum BattleSide side) { u32 battler = 0; @@ -32,25 +33,9 @@ static bool32 HandleEndTurnOrder(u32 battler) gBattleTurnCounter++; gBattleStruct->eventState.endTurn++; - u32 i, j; - struct BattleContext ctx = {0}; - for (i = 0; i < gBattlersCount; i++) - { + for (u32 i = 0; i < gBattlersCount; i++) gBattlerByTurnOrder[i] = i; - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); - } - for (i = 0; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; - - if (GetWhichBattlerFaster(&ctx, FALSE) == -1) - SwapTurnOrder(i, j); - } - } + SortBattlersBySpeed(gBattlerByTurnOrder, FALSE); return effect; } @@ -73,16 +58,16 @@ static bool32 HandleEndTurnVarious(u32 battler) for (i = 0; i < gBattlersCount; i++) { - if (gDisableStructs[i].throatChopTimer > 0) - gDisableStructs[i].throatChopTimer--; + if (gBattleMons[i].volatiles.throatChopTimer > 0) + gBattleMons[i].volatiles.throatChopTimer--; if (gBattleMons[i].volatiles.lockOn > 0) gBattleMons[i].volatiles.lockOn--; - if (gDisableStructs[i].chargeTimer > 0 && --gDisableStructs[i].chargeTimer == 0) - gBattleMons[i].volatiles.charge = FALSE; + if (B_CHARGE < GEN_9 && gBattleMons[i].volatiles.chargeTimer > 0) + gBattleMons[i].volatiles.chargeTimer--; - if (gDisableStructs[i].laserFocusTimer > 0 && --gDisableStructs[i].laserFocusTimer == 0) + if (gBattleMons[i].volatiles.laserFocusTimer > 0 && --gBattleMons[i].volatiles.laserFocusTimer == 0) gBattleMons[i].volatiles.laserFocus = FALSE; gBattleStruct->battlerState[i].wasAboveHalfHp = gBattleMons[i].hp > gBattleMons[i].maxHP / 2; @@ -139,7 +124,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) case BATTLE_WEATHER_RAIN_DOWNPOUR: if (ability == ABILITY_DRY_SKIN || ability == ABILITY_RAIN_DISH) { - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; } break; @@ -147,7 +132,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) case BATTLE_WEATHER_SUN_PRIMAL: if (ability == ABILITY_DRY_SKIN || ability == ABILITY_SOLAR_POWER) { - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; } break; @@ -172,7 +157,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) case BATTLE_WEATHER_SNOW: if (ability == ABILITY_ICE_BODY) { - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; } else if (currBattleWeather == BATTLE_WEATHER_HAIL) @@ -208,12 +193,8 @@ static bool32 HandleEndTurnEmergencyExit(u32 battler) { gBattlerAbility = battler; gLastUsedAbility = ability; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - BattleScriptExecute(BattleScript_EmergencyExitEnd2); - else - BattleScriptExecute(BattleScript_EmergencyExitWildEnd2); - + gBattleScripting.battler = battler; + BattleScriptExecute(BattleScript_EmergencyExitEnd2); effect = TRUE; } @@ -249,21 +230,23 @@ static bool32 HandleEndTurnFutureSight(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gWishFutureKnock.futureSightCounter[battler] > 0 && --gWishFutureKnock.futureSightCounter[battler] == 0) + if (gBattleStruct->futureSight[battler].counter > 0 + && --gBattleStruct->futureSight[battler].counter == 0) { if (!IsBattlerAlive(battler)) return effect; - if (gWishFutureKnock.futureSightMove[battler] == MOVE_FUTURE_SIGHT) + if (gBattleStruct->futureSight[battler].move == MOVE_FUTURE_SIGHT) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[battler]); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->futureSight[battler].move); gBattlerTarget = battler; - gBattlerAttacker = gWishFutureKnock.futureSightBattlerIndex[battler]; - gCurrentMove = gWishFutureKnock.futureSightMove[battler]; + gBattlerAttacker = gBattleStruct->futureSight[battler].battlerIndex; + gCurrentMove = gBattleStruct->futureSight[battler].move; + gBattleStruct->eventState.atkCanceler = CANCELER_TARGET_FAILURE; if (!IsFutureSightAttackerInParty(gBattlerAttacker, gBattlerTarget, gCurrentMove)) SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); @@ -281,22 +264,15 @@ static bool32 HandleEndTurnWish(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gWishFutureKnock.wishCounter[battler] > 0 && --gWishFutureKnock.wishCounter[battler] == 0 && IsBattlerAlive(battler)) + if (gBattleStruct->wish[battler].counter > 0 && --gBattleStruct->wish[battler].counter == 0 && IsBattlerAlive(battler)) { s32 wishHeal = 0; gBattlerTarget = battler; - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gWishFutureKnock.wishPartyId[battler]) - if (B_WISH_HP_SOURCE >= GEN_5) - { - if (IsOnPlayerSide(battler)) - wishHeal = GetMonData(&gPlayerParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; - else - wishHeal = GetMonData(&gEnemyParty[gWishFutureKnock.wishPartyId[battler]], MON_DATA_MAX_HP) / 2; - } + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, battler, gBattleStruct->wish[battler].partyId) + if (GetConfig(CONFIG_WISH_HP_SOURCE) >= GEN_5) + wishHeal = GetMonData(&GetBattlerParty(battler)[gBattleStruct->wish[battler].partyId], MON_DATA_MAX_HP) / 2; else - { wishHeal = GetNonDynamaxMaxHP(battler) / 2; - } SetHealAmount(battler, wishHeal); if (gBattleMons[battler].volatiles.healBlock) @@ -315,7 +291,7 @@ static bool32 HandleEndTurnWish(u32 battler) static bool32 HandleEndTurnFirstEventBlock(u32 battler) { bool32 effect = FALSE; - u32 side; + enum BattleSide side; if (!IsBattlerAlive(battler)) { @@ -354,14 +330,14 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) gBattleStruct->eventState.endTurnBlock++; break; case FIRST_EVENT_BLOCK_THRASH: - if (gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) + if (gBattleMons[battler].volatiles.rampageTurns && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) { - gBattleMons[battler].volatiles.lockConfusionTurns--; - if (WasUnableToUseMove(battler)) + gBattleMons[battler].volatiles.rampageTurns--; + if (gBattleMons[battler].volatiles.unableToUseMove) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); } - else if (!gBattleMons[battler].volatiles.lockConfusionTurns && gBattleMons[battler].volatiles.multipleTurns) + else if (!gBattleMons[battler].volatiles.rampageTurns && gBattleMons[battler].volatiles.multipleTurns) { gBattleMons[battler].volatiles.multipleTurns = FALSE; if (!gBattleMons[battler].volatiles.confusionTurns) @@ -396,7 +372,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) case ABILITY_HEALER: case ABILITY_HYDRATION: case ABILITY_SHED_SKIN: - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; break; default: @@ -547,7 +523,7 @@ static bool32 HandleEndTurnBurn(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { - s32 burnDamage = GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); + s32 burnDamage = GetNonDynamaxMaxHP(battler) / ((GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) ? 16 : 8); if (ability == ABILITY_HEATPROOF) { if (burnDamage > (burnDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would. @@ -572,7 +548,7 @@ static bool32 HandleEndTurnFrostbite(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8)); + SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / ((GetConfig(CONFIG_BURN_DAMAGE) >= GEN_7 || GetConfig(CONFIG_BURN_DAMAGE) == GEN_1) ? 16 : 8)); BattleScriptExecute(BattleScript_FrostbiteTurnDmg); effect = TRUE; } @@ -590,7 +566,7 @@ static bool32 HandleEndTurnNightmare(u32 battler) && IsBattlerAlive(battler) && !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) { - if (gBattleMons[battler].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP || GetBattlerAbility(battler) == ABILITY_COMATOSE) { SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 4); BattleScriptExecute(BattleScript_NightmareTurnDmg); @@ -631,9 +607,9 @@ static bool32 HandleEndTurnWrap(u32 battler) if (gBattleMons[battler].volatiles.wrapped && IsBattlerAlive(battler)) { - if (gDisableStructs[battler].wrapTurns != 0) + if (gBattleMons[battler].volatiles.wrapTurns != 0) { - gDisableStructs[battler].wrapTurns--; + gBattleMons[battler].volatiles.wrapTurns--; if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MAGIC_GUARD)) return effect; @@ -690,10 +666,10 @@ static bool32 HandleEndTurnOctolock(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].octolock) + if (gBattleMons[battler].volatiles.octolock) { gBattlerTarget = battler; - gBattlerAttacker = gDisableStructs[battler].battlerPreventingEscape; + gBattlerAttacker = gBattleMons[battler].volatiles.battlerPreventingEscape; BattleScriptExecute(BattleScript_OctolockEndTurn); effect = TRUE; } @@ -709,7 +685,7 @@ static bool32 HandleEndTurnSyrupBomb(u32 battler) if (gBattleMons[battler].volatiles.syrupBomb && (IsBattlerAlive(battler))) { - if (gDisableStructs[battler].syrupBombTimer > 0 && --gDisableStructs[battler].syrupBombTimer == 0) + if (gBattleMons[battler].volatiles.syrupBombTimer > 0 && --gBattleMons[battler].volatiles.syrupBombTimer == 0) gBattleMons[battler].volatiles.syrupBomb = FALSE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SYRUP_BOMB); gBattlescriptCurrInstr = BattleScript_SyrupBombEndTurn; @@ -726,7 +702,7 @@ static bool32 HandleEndTurnTaunt(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].tauntTimer && --gDisableStructs[battler].tauntTimer == 0) + if (gBattleMons[battler].volatiles.tauntTimer && --gBattleMons[battler].volatiles.tauntTimer == 0) { gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_BufferEndTurn); @@ -743,7 +719,7 @@ static bool32 HandleEndTurnTorment(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].tormentTimer > 0 && --gDisableStructs[battler].tormentTimer == 0) + if (gBattleMons[battler].volatiles.tormentTimer > 0 && --gBattleMons[battler].volatiles.tormentTimer == 0) { gBattleMons[battler].volatiles.torment = FALSE; gBattleScripting.battler = battler; @@ -760,18 +736,18 @@ static bool32 HandleEndTurnEncore(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].encoreTimer != 0) + if (gBattleMons[battler].volatiles.encoreTimer != 0) { - if (gBattleMons[battler].moves[gDisableStructs[battler].encoredMovePos] != gDisableStructs[battler].encoredMove) // Pokémon does not have the encored move anymore + if (gBattleMons[battler].moves[gBattleMons[battler].volatiles.encoredMovePos] != gBattleMons[battler].volatiles.encoredMove) // Pokémon does not have the encored move anymore { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; + gBattleMons[battler].volatiles.encoredMove = 0; + gBattleMons[battler].volatiles.encoreTimer = 0; } - else if (--gDisableStructs[battler].encoreTimer == 0 - || gBattleMons[battler].pp[gDisableStructs[battler].encoredMovePos] == 0) + else if (--gBattleMons[battler].volatiles.encoreTimer == 0 + || gBattleMons[battler].pp[gBattleMons[battler].volatiles.encoredMovePos] == 0) { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; + gBattleMons[battler].volatiles.encoredMove = 0; + gBattleMons[battler].volatiles.encoreTimer = 0; gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_EncoredNoMore); effect = TRUE; @@ -788,21 +764,21 @@ static bool32 HandleEndTurnDisable(u32 battler) u32 moveIndex = 0; gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].disableTimer != 0) + if (gBattleMons[battler].volatiles.disableTimer != 0) { for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (gDisableStructs[battler].disabledMove == gBattleMons[battler].moves[moveIndex]) + if (gBattleMons[battler].volatiles.disabledMove == gBattleMons[battler].moves[moveIndex]) break; } if (moveIndex == MAX_MON_MOVES) // Pokémon does not have the disabled move anymore { - gDisableStructs[battler].disabledMove = 0; - gDisableStructs[battler].disableTimer = 0; + gBattleMons[battler].volatiles.disabledMove = 0; + gBattleMons[battler].volatiles.disableTimer = 0; } - else if (--gDisableStructs[battler].disableTimer == 0) // disable ends + else if (--gBattleMons[battler].volatiles.disableTimer == 0) // disable ends { - gDisableStructs[battler].disabledMove = 0; + gBattleMons[battler].volatiles.disabledMove = 0; gBattleScripting.battler = battler; BattleScriptExecute(BattleScript_DisabledNoMore); effect = TRUE; @@ -818,7 +794,7 @@ static bool32 HandleEndTurnMagnetRise(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].magnetRiseTimer > 0 && --gDisableStructs[battler].magnetRiseTimer == 0) + if (gBattleMons[battler].volatiles.magnetRiseTimer > 0 && --gBattleMons[battler].volatiles.magnetRiseTimer == 0) { gBattleMons[battler].volatiles.magnetRise = FALSE; BattleScriptExecute(BattleScript_BufferEndTurn); @@ -835,7 +811,7 @@ static bool32 HandleEndTurnTelekinesis(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].telekinesisTimer > 0 && --gDisableStructs[battler].telekinesisTimer == 0) + if (gBattleMons[battler].volatiles.telekinesisTimer > 0 && --gBattleMons[battler].volatiles.telekinesisTimer == 0) { gBattleMons[battler].volatiles.telekinesis = FALSE; BattleScriptExecute(BattleScript_TelekinesisEndTurn); @@ -851,7 +827,7 @@ static bool32 HandleEndTurnHealBlock(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].healBlockTimer > 0 && --gDisableStructs[battler].healBlockTimer == 0) + if (gBattleMons[battler].volatiles.healBlockTimer > 0 && --gBattleMons[battler].volatiles.healBlockTimer == 0) { gBattleMons[battler].volatiles.healBlock = FALSE; gBattleScripting.battler = battler; @@ -869,7 +845,7 @@ static bool32 HandleEndTurnEmbargo(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].embargoTimer > 0 && --gDisableStructs[battler].embargoTimer == 0) + if (gBattleMons[battler].volatiles.embargoTimer > 0 && --gBattleMons[battler].volatiles.embargoTimer == 0) { gBattleMons[battler].volatiles.embargo = FALSE; BattleScriptExecute(BattleScript_EmbargoEndTurn); @@ -899,12 +875,12 @@ static bool32 HandleEndTurnYawn(u32 battler) { gEffectBattler = gBattlerTarget = battler; enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); - if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsElectricTerrainAffected(battler, ability, holdEffect, gFieldStatuses)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); } - else if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsMistyTerrainAffected(battler, ability, holdEffect, gFieldStatuses)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_MISTY; BattleScriptExecute(BattleScript_TerrainPreventsEnd2); @@ -924,9 +900,11 @@ static bool32 HandleEndTurnYawn(u32 battler) else { if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[battler].status1 |= ((Random() % 3) + 2); + gBattleMons[battler].status1 |= (RandomUniform(RNG_SLEEP_TURNS, 2, 4)); + else if (B_SLEEP_TURNS >= GEN_3) + gBattleMons[battler].status1 |= (RandomUniform(RNG_SLEEP_TURNS, 2, 5)); else - gBattleMons[battler].status1 |= ((Random() % 4) + 3); + gBattleMons[battler].status1 |= (RandomUniform(RNG_SLEEP_TURNS, 2, 8)); CancelMultiTurnMoves(battler, SKY_DROP_STATUS_YAWN); TryActivateSleepClause(battler, gBattlerPartyIndexes[battler]); @@ -949,8 +927,8 @@ static bool32 HandleEndTurnPerishSong(u32 battler) if (IsBattlerAlive(battler) && gBattleMons[battler].volatiles.perishSong) { - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[battler].perishSongTimer); - if (gDisableStructs[battler].perishSongTimer == 0) + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gBattleMons[battler].volatiles.perishSongTimer); + if (gBattleMons[battler].volatiles.perishSongTimer == 0) { gBattleMons[battler].volatiles.perishSong = FALSE; SetPassiveDamageAmount(battler, gBattleMons[battler].hp); @@ -958,7 +936,7 @@ static bool32 HandleEndTurnPerishSong(u32 battler) } else { - gDisableStructs[battler].perishSongTimer--; + gBattleMons[battler].volatiles.perishSongTimer--; BattleScriptExecute(BattleScript_PerishSongCountGoesDown); } effect = TRUE; @@ -973,8 +951,8 @@ static bool32 HandleEndTurnRoost(u32 battler) gBattleStruct->eventState.endTurnBattler++; - if (gDisableStructs[battler].roostActive) - gDisableStructs[battler].roostActive = FALSE; + if (gBattleMons[battler].volatiles.roostActive) + gBattleMons[battler].volatiles.roostActive = FALSE; return effect; } @@ -983,7 +961,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler) { bool32 effect = FALSE; - u32 side = gBattleStruct->eventState.battlerSide; + enum BattleSide side = gBattleStruct->eventState.battlerSide; switch (gBattleStruct->eventState.endTurnBlock) { @@ -1262,7 +1240,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) { gBattlerAttacker = battler; gBattleMons[battler].volatiles.uproarTurns--; // uproar timer goes down - if (WasUnableToUseMove(battler)) + if (gBattleMons[battler].volatiles.unableToUseMove) { CancelMultiTurnMoves(battler, SKY_DROP_IGNORE); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; @@ -1297,7 +1275,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) case ABILITY_MOODY: case ABILITY_PICKUP: case ABILITY_SPEED_BOOST: - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; break; default: @@ -1349,7 +1327,7 @@ static bool32 HandleEndTurnFormChangeAbilities(u32 battler) case ABILITY_SHIELDS_DOWN: case ABILITY_ZEN_MODE: case ABILITY_HUNGER_SWITCH: - if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE)) + if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, MOVE_NONE, TRUE)) effect = TRUE; default: break; @@ -1381,6 +1359,63 @@ static bool32 HandleEndTurnDynamax(u32 battler) return effect; } +static bool32 TryEndTurnTrainerSlide(u32 battler) +{ + return ((ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_LOW_HP) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_LAST_HALF_HP) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE) != TRAINER_SLIDE_TARGET_NONE) + || (ShouldDoTrainerSlide(battler, TRAINER_SLIDE_ENEMY_MON_UNAFFECTED) != TRAINER_SLIDE_TARGET_NONE)); +} + +static bool32 HandleEndTurnTrainerASlides(u32 battler) +{ + gBattleStruct->eventState.endTurnBattler++; + bool32 slide = TryEndTurnTrainerSlide(B_BATTLER_1); + if (slide == TRUE) + BattleScriptExecute(BattleScript_TrainerASlideMsgEnd2); + return slide; +} + +static bool32 HandleEndTurnTrainerBSlides(u32 battler) +{ + gBattleStruct->eventState.endTurnBattler++; + + if (!IsDoubleBattle()) + return FALSE; + + bool32 slide = TryEndTurnTrainerSlide(B_BATTLER_3); + + if (slide == TRUE) + { + if ((TRAINER_BATTLE_PARAM.opponentB == TRAINER_BATTLE_PARAM.opponentA) + || (TRAINER_BATTLE_PARAM.opponentB == TRAINER_NONE) + || (TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) + BattleScriptExecute(BattleScript_TrainerASlideMsgEnd2); + else + BattleScriptExecute(BattleScript_TrainerBSlideMsgEnd2); + } + + return slide; +} + +static bool32 HandleEndTurnTrainerPartnerSlides(u32 battler) +{ + gBattleStruct->eventState.endTurnBattler++; + + if (!IsDoubleBattle()) + return FALSE; + + bool32 slide = TryEndTurnTrainerSlide(B_BATTLER_2); + + if (slide == TRUE) + BattleScriptExecute(BattleScript_TrainerPartnerSlideMsgEnd2); + + return slide; +} + /* * Various end turn effects that happen after all battlers moved. * Each Case will apply the effects for each battler. Moving to the next case when all battlers are done. @@ -1443,11 +1478,14 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = [ENDTURN_FORM_CHANGE_ABILITIES] = HandleEndTurnFormChangeAbilities, [ENDTURN_EJECT_PACK] = HandleEndTurnEjectPack, [ENDTURN_DYNAMAX] = HandleEndTurnDynamax, + [ENDTURN_TRAINER_A_SLIDES] = HandleEndTurnTrainerASlides, + [ENDTURN_TRAINER_B_SLIDES] = HandleEndTurnTrainerBSlides, + [ENDTURN_TRAINER_PARTNER_SLIDES] = HandleEndTurnTrainerPartnerSlides, }; -u32 DoEndTurnEffects(void) +bool32 DoEndTurnEffects(void) { - u32 battler = MAX_BATTLERS_COUNT; + enum BattlerId battler = MAX_BATTLERS_COUNT; for (;;) { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 6054324b7..851a6ba6e 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -345,6 +345,10 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId) { switch (animId) { + case B_ANIM_ILLUSION_OFF: + case B_ANIM_FOCUS_PUNCH_SETUP: + case B_ANIM_SWAP_TO_SUBSTITUTE: + case B_ANIM_SWAP_FROM_SUBSTITUTE: case B_ANIM_SUBSTITUTE_FADE: case B_ANIM_RAIN_CONTINUES: case B_ANIM_SUN_CONTINUES: @@ -353,6 +357,7 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId) case B_ANIM_SNOW_CONTINUES: case B_ANIM_FOG_CONTINUES: case B_ANIM_SNATCH_MOVE: + case B_ANIM_STATS_CHANGE: return TRUE; default: return FALSE; @@ -503,7 +508,7 @@ void DecompressTrainerBackPic(u16 backPicId, u8 battler) u8 position = GetBattlerPosition(battler); CopyTrainerBackspriteFramesToDest(backPicId, gMonSpritesGfxPtr->spritesGfx[position]); LoadPalette(gTrainerBacksprites[backPicId].palette.data, - OBJ_PLTT_ID(battler), PLTT_SIZE_4BPP); + OBJ_PLTT_ID(8 + battler/2), PLTT_SIZE_4BPP); } void FreeTrainerFrontPicPalette(u16 frontPicId) @@ -1049,6 +1054,12 @@ void LoadAndCreateEnemyShadowSprites(void) void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) { + if (gBattleSpritesDataPtr == NULL) + { + shadowSprite->callback = SpriteCB_SetInvisible; + return; + } + bool8 invisible = FALSE; u8 battler = shadowSprite->tBattlerId; struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battler]]; @@ -1067,10 +1078,13 @@ void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) } else if (transformSpecies != SPECIES_NONE) { - xOffset = gSpeciesInfo[transformSpecies].enemyShadowXOffset + (shadowSprite->tSpriteSide == SPRITE_SIDE_LEFT ? -16 : 16); + xOffset = gSpeciesInfo[transformSpecies].enemyShadowXOffset; yOffset = gSpeciesInfo[transformSpecies].enemyShadowYOffset + 16; size = gSpeciesInfo[transformSpecies].enemyShadowSize; + if (B_ENEMY_MON_SHADOW_STYLE >= GEN_4) + xOffset += (shadowSprite->tSpriteSide == SPRITE_SIDE_LEFT ? -16 : 16); + invisible = (B_ENEMY_MON_SHADOW_STYLE >= GEN_4 && P_GBA_STYLE_SPECIES_GFX == FALSE) ? gSpeciesInfo[transformSpecies].suppressEnemyShadow : gSpeciesInfo[transformSpecies].enemyMonElevation == 0; diff --git a/src/battle_gimmick.c b/src/battle_gimmick.c index 38d60d436..2381a6de0 100644 --- a/src/battle_gimmick.c +++ b/src/battle_gimmick.c @@ -68,7 +68,7 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) // There are no trainer party settings in battles, but the AI needs to know which gimmick to use. if (TESTING) { - return gimmick == TestRunner_Battle_GetChosenGimmick(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + return gimmick == TestRunner_Battle_GetChosenGimmick(GetBattlerTrainer(battler), gBattlerPartyIndexes[battler]); } // The player can bypass these checks because they can choose through the controller. else if (IsOnPlayerSide(battler) @@ -91,27 +91,22 @@ bool32 ShouldTrainerBattlerUseGimmick(u32 battler, enum Gimmick gimmick) // Returns whether a trainer has used a gimmick during a battle. bool32 HasTrainerUsedGimmick(u32 battler, enum Gimmick gimmick) { - // Check whether partner battler has used gimmick or plans to during turn. - if (IsDoubleBattle() - && IsPartnerMonFromSameTrainer(battler) - && (gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] - || ((gBattleStruct->gimmick.toActivate & (1u << BATTLE_PARTNER(battler)) - && gBattleStruct->gimmick.usableGimmick[BATTLE_PARTNER(battler)] == gimmick)))) + if (IsDoubleBattle() && (IsPartnerMonFromSameTrainer(battler) || (gimmick == GIMMICK_DYNAMAX))) { - return TRUE; - } - // Otherwise, return whether current battler has used gimmick. - else - { - return gBattleStruct->gimmick.activated[battler][gimmick]; + u32 partner = BATTLE_PARTNER(battler); + if (gBattleStruct->gimmick.activated[partner][gimmick] + || ((gBattleStruct->gimmick.toActivate & (1u << partner)) && gBattleStruct->gimmick.usableGimmick[partner] == gimmick)) + return TRUE; } + + return gBattleStruct->gimmick.activated[battler][gimmick]; } // Sets a gimmick as used by a trainer with checks for Multi Battles. void SetGimmickAsActivated(u32 battler, enum Gimmick gimmick) { gBattleStruct->gimmick.activated[battler][gimmick] = TRUE; - if (IsDoubleBattle() && IsPartnerMonFromSameTrainer(battler)) + if (IsDoubleBattle() && (IsPartnerMonFromSameTrainer(battler) || (gimmick == GIMMICK_DYNAMAX))) gBattleStruct->gimmick.activated[BATTLE_PARTNER(battler)][gimmick] = TRUE; } @@ -152,7 +147,7 @@ void CreateGimmickTriggerSprite(u32 battler) if (gBattleStruct->gimmick.triggerSpriteId == 0xFF) { - if (IsDoubleBattle()) + if (GetBattlerCoordsIndex(battler) == BATTLE_COORDS_DOUBLES) gBattleStruct->gimmick.triggerSpriteId = CreateSprite(gimmick->triggerTemplate, gSprites[gHealthboxSpriteIds[battler]].x - DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE, gSprites[gHealthboxSpriteIds[battler]].y - DOUBLES_GIMMICK_TRIGGER_POS_Y_DIFF, 0); @@ -209,7 +204,7 @@ static void SpriteCb_GimmickTrigger(struct Sprite *sprite) s32 yDiff; s32 xHealthbox = gSprites[gHealthboxSpriteIds[sprite->tBattler]].x; - if (IsDoubleBattle()) + if (GetBattlerCoordsIndex(sprite->tBattler) == BATTLE_COORDS_DOUBLES) { xSlide = DOUBLES_GIMMICK_TRIGGER_POS_X_SLIDE; xPriority = DOUBLES_GIMMICK_TRIGGER_POS_X_PRIORITY; @@ -385,7 +380,8 @@ static const s8 sIndicatorPositions[][2] = void CreateIndicatorSprite(u32 battler) { - u32 position, spriteId; + enum BattlerPosition position; + u32 spriteId; s16 xHealthbox = 0, x = 0, y = 0; position = GetBattlerPosition(battler); diff --git a/src/battle_hold_effects.c b/src/battle_hold_effects.c index d262e024a..08feec4d5 100644 --- a/src/battle_hold_effects.c +++ b/src/battle_hold_effects.c @@ -12,11 +12,8 @@ #include "constants/berry.h" bool32 IsOnSwitchInActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchIn; } -bool32 IsOnSwitchInFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onSwitchInFirstTurn; } bool32 IsMirrorHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerb; } -bool32 IsMirrorHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].mirrorHerbFirstTurn; } bool32 IsWhiteHerbActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerb; } -bool32 IsWhiteHerbFirstTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbFirstTurn; } bool32 IsWhiteHerbEndTurnActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].whiteHerbEndTurn; } bool32 IsOnStatusChangeActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onStatusChange; } bool32 IsOnHpThresholdActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onHpThreshold; } @@ -29,6 +26,7 @@ bool32 IsOrbsActivation(enum HoldEffect holdEffect) { return gHol bool32 IsOnEffectActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onEffect; } bool32 IsOnBerryActivation(enum HoldEffect holdEffect) { return GetItemPocket(gLastUsedItem) == POCKET_BERRIES; } bool32 IsOnFlingActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].onFling; } +bool32 IsBoosterEnergyActivation(enum HoldEffect holdEffect) { return gHoldEffectsInfo[holdEffect].boosterEnergy; } bool32 IsForceTriggerItemActivation(enum HoldEffect holdEffect) { @@ -51,31 +49,29 @@ static enum ItemEffect TryDoublePrize(u32 battler) return effect; } -enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability, ActivationTiming timing) +enum ItemEffect TryBoosterEnergy(u32 battler, enum Ability ability) { enum ItemEffect effect = ITEM_NO_EFFECT; - if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) + if (gBattleMons[battler].volatiles.boosterEnergyActivated || gBattleMons[battler].volatiles.transformed) return ITEM_NO_EFFECT; if (((ability == ABILITY_PROTOSYNTHESIS) && !((gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect())) || ((ability == ABILITY_QUARK_DRIVE) && !(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN))) { - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gBattleMons[battler].volatiles.paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleMons[battler].volatiles.paradoxBoostedStat); gBattlerAbility = gBattleScripting.battler = battler; - gDisableStructs[battler].boosterEnergyActivated = TRUE; + gBattleMons[battler].volatiles.boosterEnergyActivated = TRUE; RecordAbilityBattle(battler, ability); - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BoosterEnergyEnd2); - else - BattleScriptCall(BattleScript_BoosterEnergyRet); + BattleScriptCall(BattleScript_BoosterEnergyRet); effect = ITEM_EFFECT_OTHER; } return effect; } -static enum ItemEffect TryRoomService(u32 battler, ActivationTiming timing) +static enum ItemEffect TryRoomService(u32 battler) { if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && CompareStat(battler, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN, GetBattlerAbility(battler))) { @@ -83,19 +79,15 @@ static enum ItemEffect TryRoomService(u32 battler, ActivationTiming timing) SET_STATCHANGER(STAT_SPEED, 1, TRUE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_SPEED; gBattleScripting.animArg2 = 0; - - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); - + gLastUsedItem = gBattleMons[battler].item; + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; } -enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId, ActivationTiming timing) +enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId) { if (gFieldStatuses & terrainFlag && CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(battler))) { @@ -103,32 +95,29 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, enum Stat statId, Ac SET_STATCHANGER(statId, 1, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; } -static enum ItemEffect TryTerrainSeeds(u32 battler, u32 item, ActivationTiming timing) +static enum ItemEffect TryTerrainSeeds(u32 battler, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; switch (GetItemHoldEffectParam(item)) { case HOLD_EFFECT_PARAM_ELECTRIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF, timing); + effect = TryHandleSeed(battler, STATUS_FIELD_ELECTRIC_TERRAIN, STAT_DEF); break; case HOLD_EFFECT_PARAM_GRASSY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF, timing); + effect = TryHandleSeed(battler, STATUS_FIELD_GRASSY_TERRAIN, STAT_DEF); break; case HOLD_EFFECT_PARAM_MISTY_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF, timing); + effect = TryHandleSeed(battler, STATUS_FIELD_MISTY_TERRAIN, STAT_SPDEF); break; case HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN: - effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF, timing); + effect = TryHandleSeed(battler, STATUS_FIELD_PSYCHIC_TERRAIN, STAT_SPDEF); break; } @@ -139,13 +128,13 @@ static bool32 CanBeInfinitelyConfused(u32 battler) { enum Ability ability = GetBattlerAbility(battler); if (ability == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) + || IsMistyTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), gFieldStatuses) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; } -static enum ItemEffect TryBerserkGene(u32 battler, ActivationTiming timing) +static enum ItemEffect TryBerserkGene(u32 battler) { if (CanBeInfinitelyConfused(battler)) gBattleMons[battler].volatiles.infiniteConfusion = TRUE; @@ -153,11 +142,7 @@ static enum ItemEffect TryBerserkGene(u32 battler, ActivationTiming timing) SET_STATCHANGER(STAT_ATK, 2, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; gBattleScripting.animArg2 = 0; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerserkGeneRetEnd2); - else - BattleScriptCall(BattleScript_BerserkGeneRet); - + BattleScriptCall(BattleScript_BerserkGeneRet); return ITEM_STATS_CHANGE; } @@ -184,7 +169,7 @@ static enum ItemEffect RestoreWhiteHerbStats(u32 battler, ActivationTiming timin return effect; } -static enum ItemEffect TryConsumeMirrorHerb(u32 battler, ActivationTiming timing) +static enum ItemEffect TryConsumeMirrorHerb(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -192,19 +177,23 @@ static enum ItemEffect TryConsumeMirrorHerb(u32 battler, ActivationTiming timing { gProtectStructs[battler].eatMirrorHerb = 0; ChooseStatBoostAnimation(battler); - if (timing == IsMirrorHerbFirstTurnActivation) - BattleScriptExecute(BattleScript_MirrorHerbCopyStatChangeEnd2); - else - BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); + BattleScriptCall(BattleScript_MirrorHerbCopyStatChange); effect = ITEM_STATS_CHANGE; } return effect; } -static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, u32 item) +static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; + + if (!IsBattlerAlive(battlerDef) + || !IsBattlerTurnDamaged(battlerDef) + || MoveIgnoresKingsRock(gCurrentMove) + || MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) + return effect; + enum Ability ability = GetBattlerAbility(battlerAtk); u32 holdEffectParam = GetItemHoldEffectParam(item); @@ -212,11 +201,7 @@ static enum ItemEffect TryKingsRock(u32 battlerAtk, u32 battlerDef, u32 item) holdEffectParam *= 2; if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER) holdEffectParam *= 2; - if (IsBattlerTurnDamaged(battlerDef) - && !MoveIgnoresKingsRock(gCurrentMove) - && IsBattlerAlive(battlerDef) - && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, holdEffectParam) - && ability != ABILITY_STENCH) + if (ability != ABILITY_STENCH && RandomPercentage(RNG_HOLD_EFFECT_FLINCH, holdEffectParam)) { SetMoveEffect(battlerAtk, battlerDef, MOVE_EFFECT_FLINCH, gBattlescriptCurrInstr, NO_FLAGS); effect = ITEM_EFFECT_OTHER; @@ -237,13 +222,9 @@ static enum ItemEffect TryAirBalloon(u32 battler, ActivationTiming timing) effect = ITEM_EFFECT_OTHER; } } - else if (!gSpecialStatuses[battler].switchInItemDone) + else if (gBattleStruct->battlerState[battler].switchIn) { - gSpecialStatuses[battler].switchInItemDone = TRUE; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptPushCursorAndCallback(BattleScript_AirBalloonMsgIn); - else - BattleScriptCall(BattleScript_AirBalloonMsgInRet); + BattleScriptCall(BattleScript_AirBalloonMsgInRet); RecordItemEffectBattle(battler, HOLD_EFFECT_AIR_BALLOON); effect = ITEM_EFFECT_OTHER; } @@ -251,7 +232,7 @@ static enum ItemEffect TryAirBalloon(u32 battler, ActivationTiming timing) return effect; } -static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk, u32 item) +static enum ItemEffect TryRockyHelmet(u32 battlerDef, u32 battlerAtk, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; enum Ability ability = GetBattlerAbility(battlerAtk); @@ -349,7 +330,7 @@ static enum ItemEffect TryAbsorbBulb(u32 battlerDef) return effect; } -static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk, u32 item) +static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -371,7 +352,7 @@ static enum ItemEffect TryJabocaBerry(u32 battlerDef, u32 battlerAtk, u32 item) return effect; } -static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk, u32 item) +static enum ItemEffect TryRowapBerry(u32 battlerDef, u32 battlerAtk, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -407,7 +388,7 @@ static enum ItemEffect TrySetEnigmaBerry(u32 battlerDef, u32 battlerAtk) if (GetBattlerAbility(battlerDef) == ABILITY_RIPEN) healAmount *= 2; SetHealAmount(battlerDef, healAmount); - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); + BattleScriptCall(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } @@ -446,18 +427,18 @@ static enum ItemEffect TryMentalHerb(u32 battler) if (B_MENTAL_HERB >= GEN_5) { // Check taunt - if (gDisableStructs[battler].tauntTimer != 0) + if (gBattleMons[battler].volatiles.tauntTimer != 0) { - gDisableStructs[battler].tauntTimer = 0; + gBattleMons[battler].volatiles.tauntTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT); effect = ITEM_EFFECT_OTHER; } // Check encore - if (gDisableStructs[battler].encoreTimer != 0) + if (gBattleMons[battler].volatiles.encoreTimer != 0) { - gDisableStructs[battler].encoredMove = 0; - gDisableStructs[battler].encoreTimer = 0; + gBattleMons[battler].volatiles.encoredMove = 0; + gBattleMons[battler].volatiles.encoreTimer = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; effect = ITEM_EFFECT_OTHER; } @@ -476,10 +457,10 @@ static enum ItemEffect TryMentalHerb(u32 battler) effect = ITEM_EFFECT_OTHER; } // Check disable - if (gDisableStructs[battler].disableTimer != 0) + if (gBattleMons[battler].volatiles.disableTimer != 0) { - gDisableStructs[battler].disableTimer = 0; - gDisableStructs[battler].disabledMove = 0; + gBattleMons[battler].volatiles.disableTimer = 0; + gBattleMons[battler].volatiles.disabledMove = 0; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE; effect = ITEM_EFFECT_OTHER; } @@ -541,7 +522,7 @@ static enum ItemEffect TryShellBell(u32 battlerAtk) enum ItemEffect effect = ITEM_NO_EFFECT; if (gBattleScripting.savedDmg > 0 - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && !gBattleStruct->unableToUseMove && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) && !IsBattlerAtMaxHp(battlerAtk) && IsBattlerAlive(battlerAtk) @@ -562,7 +543,7 @@ static enum ItemEffect TryLifeOrb(u32 battlerAtk) enum ItemEffect effect = ITEM_NO_EFFECT; if (IsBattlerAlive(battlerAtk) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && !gBattleStruct->unableToUseMove && (IsAnyTargetTurnDamaged(battlerAtk) || gBattleScripting.savedDmg > 0) && !IsAbilityAndRecord(battlerAtk, GetBattlerAbility(battlerAtk), ABILITY_MAGIC_GUARD) && GetMoveEffect(gCurrentMove) != EFFECT_PAIN_SPLIT @@ -576,7 +557,7 @@ static enum ItemEffect TryLifeOrb(u32 battlerAtk) return effect; } -static enum ItemEffect TryStickyBarbOnTargetHit(u32 battlerDef, u32 battlerAtk, u32 item) +static enum ItemEffect TryStickyBarbOnTargetHit(u32 battlerDef, u32 battlerAtk, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -597,7 +578,7 @@ static enum ItemEffect TryStickyBarbOnTargetHit(u32 battlerDef, u32 battlerAtk, return effect; } -static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler, u32 item) +static enum ItemEffect TryStickyBarbOnEndTurn(u32 battler, enum Item item) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -673,7 +654,7 @@ static enum ItemEffect TryBlackSludgeDamage(u32 battler, enum HoldEffect holdEff return effect; } -static enum ItemEffect TryCureParalysis(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureParalysis(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -681,17 +662,14 @@ static enum ItemEffect TryCureParalysis(u32 battler, ActivationTiming timing) { gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PARALYSIS; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); + BattleScriptCall(BattleScript_BerryCureStatusRet); effect = ITEM_STATUS_CHANGE; } return effect; } -static enum ItemEffect TryCurePoison(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCurePoison(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -699,17 +677,14 @@ static enum ItemEffect TryCurePoison(u32 battler, ActivationTiming timing) { gBattleMons[battler].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_POISON; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); + BattleScriptCall(BattleScript_BerryCureStatusRet); effect = ITEM_STATUS_CHANGE; } return effect; } -static enum ItemEffect TryCureBurn(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureBurn(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -717,17 +692,14 @@ static enum ItemEffect TryCureBurn(u32 battler, ActivationTiming timing) { gBattleMons[battler].status1 &= ~STATUS1_BURN; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_BURN; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); + BattleScriptCall(BattleScript_BerryCureStatusRet); effect = ITEM_STATUS_CHANGE; } return effect; } -static enum ItemEffect TryCureFreezeOrFrostbite(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureFreezeOrFrostbite(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -745,17 +717,12 @@ static enum ItemEffect TryCureFreezeOrFrostbite(u32 battler, ActivationTiming ti } if (effect == ITEM_STATUS_CHANGE) - { - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); - } + BattleScriptCall(BattleScript_BerryCureStatusRet); return effect; } -static enum ItemEffect TryCureSleep(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureSleep(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -765,34 +732,28 @@ static enum ItemEffect TryCureSleep(u32 battler, ActivationTiming timing) gBattleMons[battler].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_SLEEP; TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); + BattleScriptCall(BattleScript_BerryCureStatusRet); effect = ITEM_STATUS_CHANGE; } return effect; } -static enum ItemEffect TryCureConfusion(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureConfusion(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; if (gBattleMons[battler].volatiles.confusionTurns > 0) { RemoveConfusionStatus(battler); - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureConfusionEnd2); - else - BattleScriptCall(BattleScript_BerryCureConfusionRet); + BattleScriptCall(BattleScript_BerryCureConfusionRet); effect = ITEM_EFFECT_OTHER; } return effect; } -static enum ItemEffect TryCureAnyStatus(u32 battler, ActivationTiming timing) +static enum ItemEffect TryCureAnyStatus(u32 battler) { enum ItemEffect effect = ITEM_NO_EFFECT; u32 string = 0; @@ -837,10 +798,7 @@ static enum ItemEffect TryCureAnyStatus(u32 battler, ActivationTiming timing) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; gBattleMons[battler].status1 = 0; RemoveConfusionStatus(battler); - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryCureStatusEnd2); - else - BattleScriptCall(BattleScript_BerryCureStatusRet); + BattleScriptCall(BattleScript_BerryCureStatusRet); effect = ITEM_STATUS_CHANGE; } @@ -853,7 +811,7 @@ enum HealAmount PERCENT_HEAL_AMOUNT, }; -static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, ActivationTiming timing) +static u32 ItemHealHp(u32 battler, enum Item itemId, enum HealAmount percentHeal) { enum ItemEffect effect = ITEM_NO_EFFECT; enum Ability ability = GetBattlerAbility(battler); @@ -872,18 +830,14 @@ static u32 ItemHealHp(u32 battler, u32 itemId, enum HealAmount percentHeal, Acti healAmount *= 2; SetHealAmount(battler, healAmount); - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - else - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); - + BattleScriptCall(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } return effect; } -static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) +static u32 ItemRestorePp(u32 battler, enum Item itemId) { enum ItemEffect effect = ITEM_NO_EFFECT; struct Pokemon *mon = GetBattlerMon(battler); @@ -892,7 +846,7 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) for (i = 0; i < MAX_MON_MOVES; i++) { - u32 move = GetMonData(mon, MON_DATA_MOVE1 + i); + enum Move move = GetMonData(mon, MON_DATA_MOVE1 + i); u32 currentPP = GetMonData(mon, MON_DATA_PP1 + i); u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); u32 maxPP = CalculatePPWithBonus(move, ppBonuses, i); @@ -911,12 +865,7 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) changedPP = currentPP + ppRestored; PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); - - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryPPHealEnd2); - else - BattleScriptCall(BattleScript_BerryPPHealRet); - + BattleScriptCall(BattleScript_BerryPPHeal); gBattleScripting.battler = battler; BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(battler); @@ -928,7 +877,7 @@ static u32 ItemRestorePp(u32 battler, u32 itemId, ActivationTiming timing) return effect; } -static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, ActivationTiming timing) +static enum ItemEffect HealConfuseBerry(u32 battler, enum Item itemId, u32 flavorId) { enum ItemEffect effect = ITEM_NO_EFFECT; u32 hpFraction = B_CONFUSE_BERRIES_HEAL >= GEN_7 ? 4 : 2; @@ -941,28 +890,17 @@ static enum ItemEffect HealConfuseBerry(u32 battler, u32 itemId, u32 flavorId, A if (ability == ABILITY_RIPEN) healAmount *= 2; SetHealAmount(battler, healAmount); - if (timing == IsOnSwitchInFirstTurnActivation) - { - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); - else - BattleScriptExecute(BattleScript_ItemHealHP_RemoveItemEnd2); - } + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) + BattleScriptCall(BattleScript_BerryConfuseHeal); else - { - if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavorId) < 0) - BattleScriptCall(BattleScript_BerryConfuseHealRet); - else - BattleScriptCall(BattleScript_ItemHealHP_RemoveItemRet); - } - PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavorId); + BattleScriptCall(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; } return effect; } -static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, enum Stat statId, ActivationTiming timing) +static enum ItemEffect StatRaiseBerry(u32 battler, enum Item itemId, enum Stat statId) { enum ItemEffect effect = ITEM_NO_EFFECT; enum Ability ability = GetBattlerAbility(battler); @@ -974,18 +912,14 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, enum Stat statId, SET_STATCHANGER(statId, ability == ABILITY_RIPEN ? 2 : 1, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; - - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); effect = ITEM_STATS_CHANGE; } return effect; } -static enum ItemEffect CriticalHitRatioUp(u32 battler, u32 itemId, ActivationTiming timing) +static enum ItemEffect CriticalHitRatioUp(u32 battler, enum Item itemId) { enum ItemEffect effect = ITEM_NO_EFFECT; @@ -994,17 +928,14 @@ static enum ItemEffect CriticalHitRatioUp(u32 battler, u32 itemId, ActivationTim && HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), GetItemHoldEffectParam(itemId), itemId)) { gBattleMons[battler].volatiles.focusEnergy = TRUE; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); - else - BattleScriptCall(BattleScript_BerryFocusEnergyRet); + BattleScriptCall(BattleScript_BerryFocusEnergy); effect = ITEM_EFFECT_OTHER; } return effect; } -static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, ActivationTiming timing) +static enum ItemEffect RandomStatRaiseBerry(u32 battler, enum Item itemId) { enum ItemEffect effect = ITEM_NO_EFFECT; enum Stat stat; @@ -1035,27 +966,21 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, ActivationT SET_STATCHANGER(stat, ability == ABILITY_RIPEN ? 4 : 2, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + stat; gBattleScripting.animArg2 = 0; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); - else - BattleScriptCall(BattleScript_ConsumableStatRaiseRet); + BattleScriptCall(BattleScript_ConsumableStatRaiseRet); effect = ITEM_STATS_CHANGE; } return effect; } -static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, ActivationTiming timing) +static enum ItemEffect TrySetMicleBerry(u32 battler, enum Item itemId) { enum ItemEffect effect = ITEM_NO_EFFECT; if (HasEnoughHpToEatBerry(battler, GetBattlerAbility(battler), 4, itemId)) { gBattleStruct->battlerState[battler].usedMicleBerry = TRUE; - if (timing == IsOnSwitchInFirstTurnActivation) - BattleScriptExecute(BattleScript_MicleBerryActivateEnd2); - else - BattleScriptCall(BattleScript_MicleBerryActivateRet); + BattleScriptCall(BattleScript_MicleBerryActivate); effect = ITEM_EFFECT_OTHER; } return effect; @@ -1064,7 +989,7 @@ static enum ItemEffect TrySetMicleBerry(u32 battler, u32 itemId, ActivationTimin enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect holdEffect, ActivationTiming timing) { enum ItemEffect effect = ITEM_NO_EFFECT; - u32 item; + enum Item item; if (timing == IsOnBerryActivation || timing == IsOnFlingActivation) item = gLastUsedItem; @@ -1088,22 +1013,22 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect effect = TryDoublePrize(itemBattler); break; case HOLD_EFFECT_ROOM_SERVICE: - effect = TryRoomService(itemBattler, timing); + effect = TryRoomService(itemBattler); break; case HOLD_EFFECT_TERRAIN_SEED: - effect = TryTerrainSeeds(itemBattler, item, timing); + effect = TryTerrainSeeds(itemBattler, item); break; case HOLD_EFFECT_BERSERK_GENE: - effect = TryBerserkGene(itemBattler, timing); + effect = TryBerserkGene(itemBattler); break; case HOLD_EFFECT_BOOSTER_ENERGY: - effect = TryBoosterEnergy(itemBattler, GetBattlerAbility(itemBattler), timing); + effect = TryBoosterEnergy(itemBattler, GetBattlerAbility(itemBattler)); break; case HOLD_EFFECT_WHITE_HERB: effect = RestoreWhiteHerbStats(itemBattler, timing); break; case HOLD_EFFECT_MIRROR_HERB: - effect = TryConsumeMirrorHerb(itemBattler, timing); + effect = TryConsumeMirrorHerb(itemBattler); break; case HOLD_EFFECT_FLINCH: // Kings Rock effect = TryKingsRock(itemBattler, battler, item); @@ -1181,73 +1106,73 @@ enum ItemEffect ItemBattleEffects(u32 itemBattler, u32 battler, enum HoldEffect effect = TryBlackSludgeDamage(itemBattler, holdEffect); break; case HOLD_EFFECT_CURE_PAR: // Cheri Berry - effect = TryCureParalysis(itemBattler, timing); + effect = TryCureParalysis(itemBattler); break; case HOLD_EFFECT_CURE_PSN: // Pecha Berry - effect = TryCurePoison(itemBattler, timing); + effect = TryCurePoison(itemBattler); break; case HOLD_EFFECT_CURE_BRN: // Rawst Berry - effect = TryCureBurn(itemBattler, timing); + effect = TryCureBurn(itemBattler); break; case HOLD_EFFECT_CURE_FRZ: // Aspear Berry - effect = TryCureFreezeOrFrostbite(itemBattler, timing); + effect = TryCureFreezeOrFrostbite(itemBattler); break; case HOLD_EFFECT_CURE_SLP: // Chesto Berry - effect = TryCureSleep(itemBattler, timing); + effect = TryCureSleep(itemBattler); break; case HOLD_EFFECT_CURE_CONFUSION: // Persim Berry - effect = TryCureConfusion(itemBattler, timing); + effect = TryCureConfusion(itemBattler); break; case HOLD_EFFECT_CURE_STATUS: // Lum Berry - effect = TryCureAnyStatus(itemBattler, timing); + effect = TryCureAnyStatus(itemBattler); break; case HOLD_EFFECT_RESTORE_HP: // Oran / Sitrus Berry / Berry Juice - effect = ItemHealHp(itemBattler, item, FIXED_HEAL_AMOUNT, timing); + effect = ItemHealHp(itemBattler, item, FIXED_HEAL_AMOUNT); break; case HOLD_EFFECT_RESTORE_PCT_HP: // Sitrus Berry - effect = ItemHealHp(itemBattler, item, PERCENT_HEAL_AMOUNT, timing); + effect = ItemHealHp(itemBattler, item, PERCENT_HEAL_AMOUNT); break; case HOLD_EFFECT_RESTORE_PP: // Leppa Berry - effect = ItemRestorePp(itemBattler, item, timing); + effect = ItemRestorePp(itemBattler, item); break; case HOLD_EFFECT_CONFUSE_SPICY: // Figy Berry - effect = HealConfuseBerry(itemBattler, item, FLAVOR_SPICY, timing); + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SPICY); break; case HOLD_EFFECT_CONFUSE_DRY: // Wiki Berry - effect = HealConfuseBerry(itemBattler, item, FLAVOR_DRY, timing); + effect = HealConfuseBerry(itemBattler, item, FLAVOR_DRY); break; case HOLD_EFFECT_CONFUSE_SWEET: // Mago Berry - effect = HealConfuseBerry(itemBattler, item, FLAVOR_SWEET, timing); + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SWEET); break; case HOLD_EFFECT_CONFUSE_BITTER: // Aguav Berry - effect = HealConfuseBerry(itemBattler, item, FLAVOR_BITTER, timing); + effect = HealConfuseBerry(itemBattler, item, FLAVOR_BITTER); break; case HOLD_EFFECT_CONFUSE_SOUR: // Iapapa Berry - effect = HealConfuseBerry(itemBattler, item, FLAVOR_SOUR, timing); + effect = HealConfuseBerry(itemBattler, item, FLAVOR_SOUR); break; case HOLD_EFFECT_ATTACK_UP: // Liechi Berry - effect = StatRaiseBerry(itemBattler, item, STAT_ATK, timing); + effect = StatRaiseBerry(itemBattler, item, STAT_ATK); break; case HOLD_EFFECT_DEFENSE_UP: // Ganlon Berry - effect = StatRaiseBerry(itemBattler, item, STAT_DEF, timing); + effect = StatRaiseBerry(itemBattler, item, STAT_DEF); break; case HOLD_EFFECT_SPEED_UP: // Salac Berry - effect = StatRaiseBerry(itemBattler, item, STAT_SPEED, timing); + effect = StatRaiseBerry(itemBattler, item, STAT_SPEED); break; case HOLD_EFFECT_SP_ATTACK_UP: // Petaya Berry - effect = StatRaiseBerry(itemBattler, item, STAT_SPATK, timing); + effect = StatRaiseBerry(itemBattler, item, STAT_SPATK); break; case HOLD_EFFECT_SP_DEFENSE_UP: // Apicot Berry - effect = StatRaiseBerry(itemBattler, item, STAT_SPDEF, timing); + effect = StatRaiseBerry(itemBattler, item, STAT_SPDEF); break; case HOLD_EFFECT_CRITICAL_UP: // Lansat Berry - effect = CriticalHitRatioUp(itemBattler, item, timing); + effect = CriticalHitRatioUp(itemBattler, item); break; case HOLD_EFFECT_RANDOM_STAT_UP: // Starf Berry - effect = RandomStatRaiseBerry(itemBattler, item, timing); + effect = RandomStatRaiseBerry(itemBattler, item); break; case HOLD_EFFECT_MICLE_BERRY: - effect = TrySetMicleBerry(itemBattler, item, timing); + effect = TrySetMicleBerry(itemBattler, item); break; default: break; diff --git a/src/battle_interface.c b/src/battle_interface.c index 770a36626..ac2456b87 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -791,35 +791,29 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority, bool32 hideHPBoxes) } } +static const s16 sBattlerHealthboxCoords[BATTLE_COORDS_COUNT][MAX_BATTLERS_COUNT][2] = +{ + [BATTLE_COORDS_SINGLES] = + { + [B_POSITION_PLAYER_LEFT] = { 158, 88 }, + [B_POSITION_OPPONENT_LEFT] = { 44, 30 }, + }, + [BATTLE_COORDS_DOUBLES] = + { + [B_POSITION_PLAYER_LEFT] = { 159, 75 }, + [B_POSITION_PLAYER_RIGHT] = { 171, 100 }, + [B_POSITION_OPPONENT_LEFT] = { 44, 19 }, + [B_POSITION_OPPONENT_RIGHT] = { 32, 44 }, + }, +}; + void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y) { - *x = 0, *y = 0; + enum BattlerPosition position = GetBattlerPosition(battler); + enum BattleCoordTypes index = GetBattlerCoordsIndex(battler); - if (!GetBattlerCoordsIndex(battler)) - { - if (GetBattlerSide(battler) != B_SIDE_PLAYER) - *x = 44, *y = 30; - else - *x = 158, *y = 88; - } - else - { - switch (GetBattlerPosition(battler)) - { - case B_POSITION_PLAYER_LEFT: - *x = 159, *y = 75; - break; - case B_POSITION_PLAYER_RIGHT: - *x = 171, *y = 100; - break; - case B_POSITION_OPPONENT_LEFT: - *x = 44, *y = 19; - break; - case B_POSITION_OPPONENT_RIGHT: - *x = 32, *y = 44; - break; - } - } + *x = sBattlerHealthboxCoords[index][position][0]; + *y = sBattlerHealthboxCoords[index][position][1]; } void InitBattlerHealthboxCoords(u8 battler) @@ -1661,7 +1655,7 @@ void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) { u8 battlerId, healthBarSpriteId; - if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) + if (gBattleTypeFlags & (BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_POKEDUDE)) return; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) diff --git a/src/battle_main.c b/src/battle_main.c index 296504851..b92191939 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -25,6 +25,7 @@ #include "dma3.h" #include "event_data.h" #include "evolution_scene.h" +// #include "frontier_util.h" #include "field_weather.h" #include "follower_npc.h" #include "graphics.h" @@ -44,6 +45,7 @@ #include "pokedex.h" #include "pokemon.h" #include "quest_log.h" +#include "pokerus.h" #include "random.h" #include "recorded_battle.h" #include "roamer.h" @@ -117,7 +119,7 @@ static void SetActionsAndBattlersTurnOrder(void); static void UpdateBattlerPartyOrdersOnSwitch(u32 battler); static bool8 AllAtActionConfirmed(void); static void TryChangeTurnOrder(void); -static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom); +static void TryChangingTurnOrderEffects(struct BattleCalcValues *calcValues, u32 *quickClawRandom, u32 *quickDrawRandom); static void CheckChangingTurnOrderEffects(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -131,7 +133,6 @@ static void HandleEndTurn_MonFled(void); static void HandleEndTurn_FinishBattle(void); static u32 Crc32B (const u8 *data, u32 size); static u32 GeneratePartyHash(const struct Trainer *trainer, u32 i); -static s32 Factorial(s32); EWRAM_DATA u16 gBattle_BG0_X = 0; EWRAM_DATA u16 gBattle_BG0_Y = 0; @@ -161,6 +162,7 @@ EWRAM_DATA u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerPositions[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u8 gBattlersBySpeed[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gCurrentTurnActionNumber = 0; EWRAM_DATA u8 gCurrentActionFuncId = 0; EWRAM_DATA struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT] = {0}; @@ -198,7 +200,6 @@ EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA u8 gBideTarget[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u32 gSideStatuses[NUM_BATTLE_SIDES] = {0}; EWRAM_DATA struct SideTimer gSideTimers[NUM_BATTLE_SIDES] = {0}; -EWRAM_DATA struct DisableStruct gDisableStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gPauseCounterBattle = 0; EWRAM_DATA u16 gPaydayMoney = 0; EWRAM_DATA u8 gBattleCommunication[BATTLE_COMMUNICATION_ENTRIES_COUNT] = {0}; @@ -206,18 +207,16 @@ EWRAM_DATA u8 gBattleOutcome = 0; EWRAM_DATA struct ProtectStruct gProtectStructs[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct SpecialStatus gSpecialStatuses[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gBattleWeather = 0; -EWRAM_DATA struct WishFutureKnock gWishFutureKnock = {0}; EWRAM_DATA u16 gIntroSlideFlags = 0; EWRAM_DATA u8 gSentPokesToOpponent[2] = {0}; EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct BattleScripting gBattleScripting = {0}; EWRAM_DATA struct BattleStruct *gBattleStruct = NULL; - +EWRAM_DATA struct StartingStatuses gStartingStatuses = {0}; EWRAM_DATA struct AiThinkingStruct *gAiThinkingStruct = NULL; EWRAM_DATA struct AiLogicData *gAiLogicData = NULL; EWRAM_DATA struct AiPartyData *gAiPartyData = NULL; EWRAM_DATA struct BattleHistory *gBattleHistory = NULL; - EWRAM_DATA struct AiBattleData *gAiBattleData = NULL; EWRAM_DATA u8 *gLinkBattleSendBuffer = NULL; @@ -1848,7 +1847,7 @@ void FreeRestoreBattleData(void) FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); - ResetDynamicAiFunc(); + ResetDynamicAiFunctions(); } void CB2_QuitRecordedBattle(void) @@ -1871,7 +1870,8 @@ void CB2_QuitRecordedBattle(void) if (taskId != TASK_NONE) DestroyTask(taskId); - TestRunner_Battle_AfterLastTurn(); + gCurrentActionFuncId = B_ACTION_FINISHED; + sEndTurnFuncsTable[gBattleOutcome & 0x7F](); // Contains TestRunner_Battle_AfterLastTurn } FreeRestoreBattleData(); FreeAllWindowBuffers(); @@ -1953,6 +1953,7 @@ void CustomTrainerPartyAssignMoves(struct Pokemon *mon, const struct TrainerMon } if (noMoveSet) { + GiveMonInitialMoveset(mon); // TODO: Figure out a default strategy when moves are not set, to generate a good moveset return; } @@ -1998,13 +1999,12 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer s32 ball = -1; u32 personalityHash = GeneratePartyHash(trainer, i); const struct TrainerMon *partyData = trainer->party; - u32 otIdType = OT_ID_RANDOM_NO_SHINY; - u32 fixedOtId = 0; + struct OriginalTrainerId otId = OTID_STRUCT_RANDOM_NO_SHINY; u32 abilityNum = 0; if (trainer->battleType != TRAINER_BATTLE_TYPE_SINGLES) personalityValue = 0x80; - else if (trainer->encounterMusic_gender & F_TRAINER_FEMALE) + else if (trainer->gender == TRAINER_GENDER_FEMALE) personalityValue = 0x78; // Use personality more likely to result in a female Pokémon else personalityValue = 0x88; // Use personality more likely to result in a male Pokémon @@ -2019,10 +2019,10 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer ModifyPersonalityForNature(&personalityValue, partyData[monIndex].nature); if (partyData[monIndex].isShiny) { - otIdType = OT_ID_PRESET; - fixedOtId = HIHALF(personalityValue) ^ LOHALF(personalityValue); + otId.method = OT_ID_PRESET; + otId.value = HIHALF(personalityValue) ^ LOHALF(personalityValue); } - CreateMon(&party[i], partyData[monIndex].species, partyData[monIndex].lvl, 0, TRUE, personalityValue, otIdType, fixedOtId); + CreateMon(&party[i], partyData[monIndex].species, partyData[monIndex].lvl, personalityValue, otId); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[monIndex].heldItem); CustomTrainerPartyAssignMoves(&party[i], &partyData[monIndex]); @@ -2045,8 +2045,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer if (speciesInfo->abilities[abilityNum] == partyData[monIndex].ability) break; } - if (abilityNum >= maxAbilityNum) - abilityNum = 0; + assertf(abilityNum < maxAbilityNum, "illegal ability %S for %S", gAbilitiesInfo[partyData[monIndex].ability].name, speciesInfo->speciesName); } else if (B_TRAINER_MON_RANDOM_ABILITY) { @@ -2769,7 +2768,7 @@ static void ClearSetBScriptingStruct(void) gBattleScripting.battleStyle = OPTIONS_BATTLE_STYLE_SET; else gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; - gBattleScripting.expOnCatch = (B_EXP_CATCH >= GEN_6); + gBattleScripting.expOnCatch = (GetConfig(CONFIG_EXP_CATCH) >= GEN_6); gBattleScripting.specialTrainerBattleType = specialBattleType; } @@ -2780,17 +2779,15 @@ static void BattleStartClearSetData(void) TurnValuesCleanUp(FALSE); memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); - memset(&gDisableStructs, 0, sizeof(gDisableStructs)); memset(&gFieldTimers, 0, sizeof(gFieldTimers)); memset(&gSideStatuses, 0, sizeof(gSideStatuses)); memset(&gSideTimers, 0, sizeof(gSideTimers)); - memset(&gWishFutureKnock, 0, sizeof(gWishFutureKnock)); memset(&gBattleResults, 0, sizeof(gBattleResults)); ClearSetBScriptingStruct(); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - gDisableStructs[i].isFirstTurn = 2; + gBattleStruct->battlerState[i].isFirstTurn = 2; gLastMoves[i] = MOVE_NONE; gLastLandedMoves[i] = MOVE_NONE; gLastHitByType[i] = 0; @@ -2900,7 +2897,6 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) { s32 i; enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - struct DisableStruct disableStructCopy = gDisableStructs[battler]; ClearIllusionMon(battler); if (effect != EFFECT_BATON_PASS) @@ -2909,12 +2905,12 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + if (gBattleMons[i].volatiles.escapePrevention && gBattleMons[i].volatiles.battlerPreventingEscape == battler) gBattleMons[i].volatiles.escapePrevention = FALSE; - if (gBattleMons[i].volatiles.lockOn && gDisableStructs[i].battlerWithSureHit == battler) + if (gBattleMons[i].volatiles.lockOn && gBattleMons[i].volatiles.battlerWithSureHit == battler) { gBattleMons[i].volatiles.lockOn = 0; - gDisableStructs[i].battlerWithSureHit = 0; + gBattleMons[i].volatiles.battlerWithSureHit = 0; } } } @@ -2936,7 +2932,7 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) { if (!IsBattlerAlly(battler, i) && gBattleMons[i].volatiles.lockOn != 0 - && (gDisableStructs[i].battlerWithSureHit == battler)) + && (gBattleMons[i].volatiles.battlerWithSureHit == battler)) { gBattleMons[i].volatiles.lockOn = 0; } @@ -2953,36 +2949,35 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gBattleMons[i].volatiles.wrapped = FALSE; if (gBattleMons[i].volatiles.syrupBomb && gBattleMons[i].volatiles.stickySyrupedBy == battler) gBattleMons[i].volatiles.syrupBomb = FALSE; - if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) - gDisableStructs[i].octolock = FALSE; + if (gBattleMons[i].volatiles.octolock && gBattleMons[i].volatiles.octolockedBy == battler) + gBattleMons[i].volatiles.octolock = FALSE; } gActionSelectionCursor[battler] = 0; gMoveSelectionCursor[battler] = 0; - memset(&gDisableStructs[battler], 0, sizeof(struct DisableStruct)); - if (GetProtectType(gProtectStructs[battler].protected) == PROTECT_TYPE_SINGLE) // Side type protects expire at the end of the turn gProtectStructs[battler].protected = PROTECT_NONE; if (effect == EFFECT_BATON_PASS) { - gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; - gDisableStructs[battler].battlerWithSureHit = disableStructCopy.battlerWithSureHit; - gDisableStructs[battler].perishSongTimer = disableStructCopy.perishSongTimer; - gDisableStructs[battler].battlerPreventingEscape = disableStructCopy.battlerPreventingEscape; - gDisableStructs[battler].embargoTimer = disableStructCopy.embargoTimer; - gDisableStructs[battler].healBlockTimer = disableStructCopy.healBlockTimer; + gBattleMons[battler].volatiles.substituteHP = volatilesCopy->substituteHP; + gBattleMons[battler].volatiles.battlerWithSureHit = volatilesCopy->battlerWithSureHit; + gBattleMons[battler].volatiles.perishSongTimer = volatilesCopy->perishSongTimer; + gBattleMons[battler].volatiles.battlerPreventingEscape = volatilesCopy->battlerPreventingEscape; + gBattleMons[battler].volatiles.embargoTimer = volatilesCopy->embargoTimer; + gBattleMons[battler].volatiles.healBlockTimer = volatilesCopy->healBlockTimer; } else if (effect == EFFECT_SHED_TAIL) { gBattleMons[battler].volatiles.substitute = TRUE; - gDisableStructs[battler].substituteHP = disableStructCopy.substituteHP; + gBattleMons[battler].volatiles.substituteHP = volatilesCopy->substituteHP; } gBattleStruct->moveResultFlags[battler] = 0; - gDisableStructs[battler].isFirstTurn = 2; - gDisableStructs[battler].truantSwitchInHack = disableStructCopy.truantSwitchInHack; + gBattleStruct->battlerState[battler].isFirstTurn = 2; + gBattleStruct->battlerState[battler].fainted = FALSE; + gBattleMons[battler].volatiles.truantSwitchInHack = volatilesCopy->truantSwitchInHack; gLastMoves[battler] = MOVE_NONE; gLastLandedMoves[battler] = MOVE_NONE; gLastHitByType[battler] = 0; @@ -2992,7 +2987,6 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gLastHitBy[battler] = 0xFF; gBattleStruct->lastTakenMove[battler] = 0; - gBattleStruct->metronomeItemCounter[battler] = 0; gBattleStruct->lastTakenMoveFrom[battler][0] = 0; gBattleStruct->lastTakenMoveFrom[battler][1] = 0; gBattleStruct->lastTakenMoveFrom[battler][2] = 0; @@ -3002,8 +2996,6 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) gBattleStruct->battlerState[battler].canPickupItem = FALSE; gBattleStruct->battlerState[battler].wasAboveHalfHp = gBattleMons[battler].hp > gBattleMons[battler].maxHP / 2; gBattleStruct->hazardsCounter = 0; - gDisableStructs[battler].hazardsDone = FALSE; - gSpecialStatuses[battler].switchInItemDone = FALSE; ClearPursuitValuesIfSet(battler); @@ -3023,24 +3015,15 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) } gBattleStruct->choicedMove[battler] = MOVE_NONE; - gCurrentMove = MOVE_NONE; gBattleStruct->eventState.arenaTurn = 0xFF; - // Restore struct member so replacement does not miss timing - gSpecialStatuses[battler].switchInAbilityDone = FALSE; - // Reset damage to prevent things like red card activating if the switched-in mon is holding it - gSpecialStatuses[battler].physicalDmg = 0; - gSpecialStatuses[battler].specialDmg = 0; - gSpecialStatuses[battler].enduredDamage = FALSE; + gSpecialStatuses[battler].damagedByAttack = FALSE; // Reset Eject Button / Eject Pack switch detection gAiLogicData->ejectButtonSwitch = FALSE; gAiLogicData->ejectPackSwitch = FALSE; - // Reset G-Max Chi Strike boosts. - gBattleStruct->bonusCritStages[battler] = 0; - // Clear selected party ID so Revival Blessing doesn't get confused. gSelectedMonPartyId = PARTY_SIZE; @@ -3048,10 +3031,10 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + enum BattleTrainer trainer = GetBattlerTrainer(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(trainer, partyIndex)) + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(trainer, partyIndex); } #endif // TESTING @@ -3072,7 +3055,7 @@ const u8* FaintClearSetData(u32 battler) for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].volatiles.escapePrevention && gDisableStructs[i].battlerPreventingEscape == battler) + if (gBattleMons[i].volatiles.escapePrevention && gBattleMons[i].volatiles.battlerPreventingEscape == battler) gBattleMons[i].volatiles.escapePrevention = FALSE; if (gBattleMons[i].volatiles.infatuation == INFATUATED_WITH(battler)) gBattleMons[i].volatiles.infatuation = 0; @@ -3080,15 +3063,13 @@ const u8* FaintClearSetData(u32 battler) gBattleMons[i].volatiles.wrapped = FALSE; if (gBattleMons[i].volatiles.syrupBomb && gBattleMons[i].volatiles.stickySyrupedBy == battler) gBattleMons[i].volatiles.syrupBomb = FALSE; - if (gDisableStructs[i].octolock && gDisableStructs[i].octolockedBy == battler) - gDisableStructs[i].octolock = FALSE; + if (gBattleMons[i].volatiles.octolock && gBattleMons[i].volatiles.octolockedBy == battler) + gBattleMons[i].volatiles.octolock = FALSE; } gActionSelectionCursor[battler] = 0; gMoveSelectionCursor[battler] = 0; - memset(&gDisableStructs[battler], 0, sizeof(struct DisableStruct)); - if (GetProtectType(gProtectStructs[battler].protected) == PROTECT_TYPE_SINGLE) // Side type protects expire at the end of the turn gProtectStructs[battler].protected = PROTECT_NONE; @@ -3097,15 +3078,12 @@ const u8* FaintClearSetData(u32 battler) gProtectStructs[battler].helpingHand = 0; gProtectStructs[battler].bounceMove = FALSE; gProtectStructs[battler].stealMove = FALSE; - gProtectStructs[battler].nonVolatileStatusImmobility = FALSE; - gProtectStructs[battler].unableToUseMove = FALSE; - gProtectStructs[battler].confusionSelfDmg = FALSE; gProtectStructs[battler].chargingTurn = FALSE; gProtectStructs[battler].fleeType = 0; gProtectStructs[battler].statRaised = FALSE; gProtectStructs[battler].pranksterElevated = FALSE; - gDisableStructs[battler].isFirstTurn = 2; + gBattleStruct->battlerState[battler].isFirstTurn = 2; gLastMoves[battler] = MOVE_NONE; gLastLandedMoves[battler] = MOVE_NONE; @@ -3116,7 +3094,6 @@ const u8* FaintClearSetData(u32 battler) gLastHitBy[battler] = 0xFF; gBattleStruct->choicedMove[battler] = MOVE_NONE; - gBattleStruct->metronomeItemCounter[battler] = 0; gBattleStruct->lastTakenMove[battler] = MOVE_NONE; gBattleStruct->lastTakenMoveFrom[battler][0] = 0; gBattleStruct->lastTakenMoveFrom[battler][1] = 0; @@ -3179,16 +3156,16 @@ const u8* FaintClearSetData(u32 battler) // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash, // confuse them upon release and print "confused via fatigue" message and animation. - if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) + if (gBattleMons[otherSkyDropper].volatiles.rampageTurns) { - gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; + gBattleMons[otherSkyDropper].volatiles.rampageTurns = 0; // If the released mon can be confused, do so. // Don't use CanBeConfused here, since it can cause issues in edge cases. enum Ability ability = GetBattlerAbility(otherSkyDropper); if (!(ability == ABILITY_OWN_TEMPO || gBattleMons[otherSkyDropper].volatiles.confusionTurns - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) + || IsMistyTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), gFieldStatuses))) { gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; @@ -3252,17 +3229,17 @@ static void DoBattleIntro(void) gBattleMons[battler].types[1] = GetSpeciesType(gBattleMons[battler].species, 1); gBattleMons[battler].types[2] = TYPE_MYSTERY; gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); - gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)] = gBattleMons[battler].hp; + gBattleStruct->battlerState[battler].hpOnSwitchout = gBattleMons[battler].hp; memset(&gBattleMons[battler].volatiles, 0, sizeof(struct Volatiles)); for (i = 0; i < NUM_BATTLE_STATS; i++) gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + enum BattleTrainer trainer = GetBattlerTrainer(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(trainer, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(trainer, partyIndex); } #endif } @@ -3284,7 +3261,7 @@ static void DoBattleIntro(void) { BtlController_EmitLoadMonSprite(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); - gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); + gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); } break; case B_POSITION_PLAYER_RIGHT: @@ -3307,9 +3284,11 @@ static void DoBattleIntro(void) { BtlController_EmitLoadMonSprite(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); - gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); + gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); } break; + default: + break; } // if (gBattleTypeFlags & BATTLE_TYPE_ARENA) @@ -3506,22 +3485,7 @@ static void DoBattleIntro(void) case BATTLE_INTRO_STATE_SET_DEX_AND_BATTLE_VARS: if (!gBattleControllerExecFlags) { - for (battler = 0; battler < gBattlersCount; battler++) - { - if (GetBattlerSide(battler) == B_SIDE_OPPONENT - && (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_POKEDUDE - | BATTLE_TYPE_LINK - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_GHOST - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_LEGENDARY)) - || ((gBattleTypeFlags & (BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED)) && !IsGhostBattleWithoutScope()))) - { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); - } - } - gBattleStruct->eventState.beforeFristTurn = 0; + gBattleStruct->eventState.beforeFirstTurn = 0; gBattleStruct->switchInBattlerCounter = 0; Ai_InitPartyStruct(); // Save mons party counts, and first 2/4 mons on the battlefield. @@ -3529,23 +3493,19 @@ static void DoBattleIntro(void) for (battler = 0; battler < gBattlersCount; battler++) GetBattlerPartyState(battler)->sentOut = TRUE; +#define UNPACK_STARTING_STATUS_TO_BATTLE(_enum, _fieldName, ...) gStartingStatuses._fieldName = (statusesOpponentA._fieldName || statusesOpponentB._fieldName || gStartingStatuses._fieldName); + + struct StartingStatuses statusesOpponentA = {0}; + struct StartingStatuses statusesOpponentB = {0}; + // Try to set a status to start the battle with - gBattleStruct->startingStatus = 0; - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB)) + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB); - gBattleStruct->startingStatusTimer = 0; // infinite - } - else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA)) - { - gBattleStruct->startingStatus = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA); - gBattleStruct->startingStatusTimer = 0; // infinite - } - else if (B_VAR_STARTING_STATUS != 0) - { - gBattleStruct->startingStatus = VarGet(B_VAR_STARTING_STATUS); - gBattleStruct->startingStatusTimer = VarGet(B_VAR_STARTING_STATUS_TIMER); + statusesOpponentA = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentA); + if (TRAINER_BATTLE_PARAM.opponentB != 0xFFFF) + statusesOpponentB = GetTrainerStartingStatusFromId(TRAINER_BATTLE_PARAM.opponentB); } + STARTING_STATUS_DEFINITIONS(UNPACK_STARTING_STATUS_TO_BATTLE); gBattleMainFunc = TryDoEventsBeforeFirstTurn; } break; @@ -3554,12 +3514,12 @@ static void DoBattleIntro(void) static void TryDoEventsBeforeFirstTurn(void) { - s32 i, j; + s32 i; if (gBattleControllerExecFlags) return; - switch (gBattleStruct->eventState.beforeFristTurn) + switch (gBattleStruct->eventState.beforeFirstTurn) { case FIRST_TURN_EVENTS_START: // Set invalid mons as absent(for example when starting a double battle with only one pokemon). @@ -3580,51 +3540,36 @@ static void TryDoEventsBeforeFirstTurn(void) { for (i = 0; i < gBattlersCount; ++i) { - u32 side = GetBattlerSide(i); + enum BattleTrainer trainer = GetBattlerTrainer(i); u32 partyIndex = gBattlerPartyIndexes[i]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(trainer, partyIndex)) + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(trainer, partyIndex); } } #endif // TESTING gBattleStruct->speedTieBreaks = RandomUniform(RNG_SPEED_TIE, 0, Factorial(MAX_BATTLERS_COUNT) - 1); gBattleTurnCounter = 0; - - struct BattleContext ctx = {0}; - for (i = 0; i < gBattlersCount; i++) - { - gBattlerByTurnOrder[i] = i; - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); - } - for (i = 0; i < gBattlersCount - 1; i++) - { - for (j = i + 1; j < gBattlersCount; j++) - { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; - - if (GetWhichBattlerFaster(&ctx, TRUE) == -1) - SwapTurnOrder(i, j); - } - } - gBattleStruct->eventState.beforeFristTurn++; + gBattleStruct->eventState.beforeFirstTurn++; break; case FIRST_TURN_EVENTS_OVERWORLD_WEATHER: - gBattleStruct->eventState.beforeFristTurn++; + gBattleStruct->eventState.beforeFirstTurn++; if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_WEATHER)) return; break; case FIRST_TURN_EVENTS_TERRAIN: - gBattleStruct->eventState.beforeFristTurn++; + gBattleStruct->eventState.beforeFirstTurn++; if (TryFieldEffects(FIELD_EFFECT_OVERWORLD_TERRAIN)) return; break; case FIRST_TURN_EVENTS_STARTING_STATUS: - gBattleStruct->eventState.beforeFristTurn++; - if (TryFieldEffects(FIELD_EFFECT_TRAINER_STATUSES)) - return; + while (TRUE) + { + if (TryFieldEffects(FIELD_EFFECT_TRAINER_STATUSES)) + return; + break; + } + gBattleStruct->eventState.beforeFirstTurn++; break; case FIRST_TURN_EVENTS_TOTEM_BOOST: for (i = 0; i < gBattlersCount; i++) @@ -3637,79 +3582,44 @@ static void TryDoEventsBeforeFirstTurn(void) } } memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); // erase all totem boosts for Mirror Herb and Opportunist - gBattleStruct->eventState.beforeFristTurn++; + gBattleStruct->eventState.beforeFirstTurn++; break; - case FIRST_TURN_EVENTS_NEUTRALIZING_GAS: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - i = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, i, gBattleMons[i].ability, 0, 0) != 0) - return; - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES, i, 0, 0, 0) != 0) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; + case FIRST_TURN_SWITCH_IN_EVENTS: + gBattleStruct->eventState.switchIn = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) + gBattleStruct->battlerState[battler].switchIn = TRUE; + BattleScriptPushCursorAndCallback(BattleScript_FirstTurnSwitchInEvents); + gBattleStruct->eventState.beforeFirstTurn++; break; - case FIRST_TURN_EVENTS_SWITCH_IN_ABILITIES: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - - if (TryPrimalReversion(battler)) - return; - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0)) - return; - if (TryClearIllusion(battler, ABILITYEFFECT_ON_SWITCHIN)) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; - break; - case FIRST_TURN_EVENTS_ITEM_EFFECTS: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInFirstTurnActivation)) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; - break; - case FIRST_TURN_EVENTS_WHITE_HERB: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbFirstTurnActivation)) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; - break; - case FIRST_TURN_EVENTS_OPPORTUNIST: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST_FIRST_TURN, battler, GetBattlerAbility(battler), 0, 0)) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; - break; - case FIRST_TURN_EVENTS_MIRROR_HERB: - while (gBattleStruct->switchInBattlerCounter < gBattlersCount) // From fastest to slowest - { - u32 battler = gBattlerByTurnOrder[gBattleStruct->switchInBattlerCounter++]; - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbFirstTurnActivation)) - return; - } - gBattleStruct->switchInBattlerCounter = 0; - gBattleStruct->eventState.beforeFristTurn++; - break; - case FIRST_TURN_EVENTS_EJECT_PACK: - gBattleStruct->eventState.beforeFristTurn++; - if (TrySwitchInEjectPack(FIRST_TURN)) + case FIRST_TURN_FAINTED_BATTLERS: + // Handle any Pokemon that fainted from starting hazards before transitioning to action selection + if (HandleFaintedMonActions()) return; + gBattleStruct->eventState.faintedAction = 0; + gBattleStruct->eventState.beforeFirstTurn++; + break; + case FIRST_TURN_EVENTS_TRAINER_SLIDE_A: + if (ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_BEFORE_FIRST_TURN)) + BattleScriptExecute(BattleScript_TrainerASlideMsgEnd2); + gBattleStruct->eventState.beforeFirstTurn++; + break; + case FIRST_TURN_EVENTS_TRAINER_SLIDE_B: + if (ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT), TRAINER_SLIDE_BEFORE_FIRST_TURN)) + { + // Ensures only trainer A slide is played in single-trainer doubles (B == A / B == TRAINER_NONE) and 2v1 multibattles (B == 0xFFFF) + if (!((TRAINER_BATTLE_PARAM.opponentB == TRAINER_BATTLE_PARAM.opponentA) + || (TRAINER_BATTLE_PARAM.opponentB == TRAINER_NONE) + || (TRAINER_BATTLE_PARAM.opponentB == 0xFFFF))) + { + BattleScriptExecute(BattleScript_TrainerBSlideMsgEnd2); + } + } + gBattleStruct->eventState.beforeFirstTurn++; + break; + case FIRST_TURN_EVENTS_TRAINER_SLIDE_PARTNER: + if (ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT), TRAINER_SLIDE_BEFORE_FIRST_TURN)) + BattleScriptExecute(BattleScript_TrainerPartnerSlideMsgEnd2); + gBattleStruct->eventState.beforeFirstTurn++; break; case FIRST_TURN_EVENTS_END: for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -3744,9 +3654,7 @@ static void TryDoEventsBeforeFirstTurn(void) // BattleScriptExecute(BattleScript_ArenaTurnBeginning); // } - if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_BEFORE_FIRST_TURN))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - gBattleStruct->eventState.beforeFristTurn = 0; + gBattleStruct->eventState.beforeFirstTurn = 0; break; } } @@ -3790,7 +3698,6 @@ void BattleTurnPassed(void) gBattleStruct->eventState.faintedAction = 0; TurnValuesCleanUp(FALSE); - gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker &= ~HITMARKER_PLAYER_FAINTED; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; @@ -3839,20 +3746,10 @@ void BattleTurnPassed(void) SetAiLogicDataForTurn(gAiLogicData); // get assumed abilities, hold effects, etc of all battlers gBattleMainFunc = HandleTurnActionSelectionState; - if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_LAST_LOW_HP))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_LAST_HALF_HP))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); - else if ((i = ShouldDoTrainerSlide(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), TRAINER_SLIDE_ENEMY_MON_UNAFFECTED))) - BattleScriptExecute(i == 1 ? BattleScript_TrainerASlideMsgEnd2 : BattleScript_TrainerBSlideMsgEnd2); + // if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + // BattleScriptExecute(BattleScript_PalacePrintFlavorText); + // else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->eventState.arenaTurn == 0) + // BattleScriptExecute(BattleScript_ArenaTurnBeginning); } u8 IsRunningFromBattleImpossible(u32 battler) @@ -3887,7 +3784,7 @@ u8 IsRunningFromBattleImpossible(u32 battler) if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN) return BATTLE_RUN_SUCCESS; - if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return BATTLE_RUN_SUCCESS; if (gBattleTypeFlags & BATTLE_TYPE_LINK) return BATTLE_RUN_SUCCESS; @@ -3978,7 +3875,7 @@ static void HandleTurnActionSelectionState(void) gBattleCommunication[ACTIONS_CONFIRMED_COUNT] = 0; for (battler = 0; battler < gBattlersCount; battler++) { - u32 position = GetBattlerPosition(battler); + enum BattlerPosition position = GetBattlerPosition(battler); switch (gBattleCommunication[battler]) { case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn. @@ -4004,7 +3901,7 @@ static void HandleTurnActionSelectionState(void) else { if (gBattleMons[battler].volatiles.multipleTurns - || gDisableStructs[battler].rechargeTimer > 0) + || gBattleMons[battler].volatiles.rechargeTimer > 0) { gChosenActionByBattler[battler] = B_ACTION_USE_MOVE; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; @@ -4054,11 +3951,18 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; return; } - else if (GetGenConfig(GEN_CONFIG_ENCORE_TARGET) < GEN_5 && gDisableStructs[battler].encoredMove != MOVE_NONE) + else if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5 && gBattleMons[battler].volatiles.encoredMove != MOVE_NONE) { - gChosenMoveByBattler[battler] = gDisableStructs[battler].encoredMove; - gBattleStruct->chosenMovePositions[battler] = gDisableStructs[battler].encoredMovePos; + gChosenMoveByBattler[battler] = gBattleMons[battler].volatiles.encoredMove; + gBattleStruct->chosenMovePositions[battler] = gBattleMons[battler].volatiles.encoredMovePos; gBattleCommunication[battler] = STATE_WAIT_ACTION_CONFIRMED_STANDBY; + if (gTestRunnerEnabled) + { + UNUSED enum Gimmick gimmick = GIMMICK_NONE; + if (gBattleResources->bufferB[battler][2] & RET_GIMMICK) + gimmick = gBattleStruct->gimmick.usableGimmick[battler]; + TestRunner_Battle_CheckChosenMove(battler, gBattleMons[battler].volatiles.encoredMove, gBattleMons[battler].volatiles.encoredMovePos, gimmick); + } return; } else @@ -4120,7 +4024,7 @@ static void HandleTurnActionSelectionState(void) case B_ACTION_SWITCH: gBattleStruct->battlerPartyIndexes[battler] = gBattlerPartyIndexes[battler]; if (gBattleTypeFlags & BATTLE_TYPE_ARENA - || !CanBattlerEscape(battler)) + || (!CanBattlerEscape(battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SHED_SHELL)) { BtlController_EmitChoosePokemon(battler, B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, 0, gBattleStruct->battlerPartyOrders[battler]); } @@ -4150,12 +4054,18 @@ static void HandleTurnActionSelectionState(void) return; } break; +#if !IS_FRLG + case B_ACTION_SAFARI_POKEBLOCK: + BtlController_EmitChooseItem(battler, B_COMM_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[battler]); + MarkBattlerForControllerExec(battler); + break; +#endif case B_ACTION_CANCEL_PARTNER: gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); if (gBattleMons[GetPartnerBattler(battler)].volatiles.multipleTurns - || gDisableStructs[GetPartnerBattler(battler)].rechargeTimer > 0) + || gBattleMons[GetPartnerBattler(battler)].volatiles.rechargeTimer > 0) { BtlController_EmitEndBounceEffect(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); @@ -4171,7 +4081,7 @@ static void HandleTurnActionSelectionState(void) } else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE && (gProtectStructs[GetPartnerBattler(battler)].noValidMoves - || gDisableStructs[GetPartnerBattler(battler)].encoredMove)) + || gBattleMons[GetPartnerBattler(battler)].volatiles.encoredMove)) { RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } @@ -4538,7 +4448,7 @@ u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect speed *= 2; else if (ability == ABILITY_SAND_RUSH && gBattleWeather & B_WEATHER_SANDSTORM) speed *= 2; - else if (ability == ABILITY_SLUSH_RUSH && (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + else if (ability == ABILITY_SLUSH_RUSH && (gBattleWeather & B_WEATHER_ICY_ANY)) speed *= 2; } @@ -4547,13 +4457,13 @@ u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect speed = (speed * 150) / 100; else if (ability == ABILITY_SURGE_SURFER && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) speed *= 2; - else if (ability == ABILITY_SLOW_START && gDisableStructs[battler].slowStartTimer != 0) + else if (ability == ABILITY_SLOW_START && gBattleMons[battler].volatiles.slowStartTimer != 0) speed /= 2; - else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].volatiles.transformed) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battler].boosterEnergyActivated)) - speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].volatiles.transformed) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivated)) - speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; - else if (ability == ABILITY_UNBURDEN && gDisableStructs[battler].unburdenActive) + else if (ability == ABILITY_PROTOSYNTHESIS && !(gBattleMons[battler].volatiles.transformed) && ((gBattleWeather & B_WEATHER_SUN && HasWeatherEffect()) || gBattleMons[battler].volatiles.boosterEnergyActivated)) + speed = (GetParadoxBoostedStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].volatiles.transformed) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleMons[battler].volatiles.boosterEnergyActivated)) + speed = (GetParadoxBoostedStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_UNBURDEN && gBattleMons[battler].volatiles.unburdenActive) speed *= 2; // player's badge boost @@ -4580,7 +4490,7 @@ u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect // paralysis drop if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) - speed /= GetGenConfig(GEN_CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; + speed /= GetConfig(CONFIG_PARALYSIS_SPEED) >= GEN_7 ? 2 : 4; if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SWAMP) speed /= 4; @@ -4590,7 +4500,7 @@ u32 GetBattlerTotalSpeedStat(u32 battler, enum Ability ability, enum HoldEffect s32 GetChosenMovePriority(u32 battler, enum Ability ability) { - u16 move; + enum Move move; gProtectStructs[battler].pranksterElevated = FALSE; if (gProtectStructs[battler].noValidMoves) @@ -4601,7 +4511,7 @@ s32 GetChosenMovePriority(u32 battler, enum Ability ability) return GetBattleMovePriority(battler, ability, move); } -s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) +s32 GetBattleMovePriority(u32 battler, enum Ability ability, enum Move move) { s32 priority = 0; @@ -4619,7 +4529,7 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) priority = -8; } else if (ability == ABILITY_GALE_WINGS - && (GetGenConfig(GEN_CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) + && (GetConfig(CONFIG_GALE_WINGS) < GEN_7 || IsBattlerAtMaxHp(battler)) && GetMoveType(move) == TYPE_FLYING) { priority++; @@ -4629,7 +4539,9 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE + && IsGrassyTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), gFieldStatuses) + && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } @@ -4641,7 +4553,7 @@ s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move) return priority; } -s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) +s32 GetWhichBattlerFasterArgs(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4650,18 +4562,18 @@ s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMove // Quick Claw / Quick Draw / Custap Berry - always first // Stall / Mycelium Might - last but before Lagging Tail // Lagging Tail - always last - bool32 battler1HasQuickEffect = gProtectStructs[ctx->battlerAtk].quickDraw || gProtectStructs[ctx->battlerAtk].usedCustapBerry; - bool32 battler2HasQuickEffect = gProtectStructs[ctx->battlerDef].quickDraw || gProtectStructs[ctx->battlerDef].usedCustapBerry; - bool32 battler1HasStallingAbility = ctx->abilities[ctx->battlerAtk] == ABILITY_STALL || gProtectStructs[ctx->battlerAtk].myceliumMight; - bool32 battler2HasStallingAbility = ctx->abilities[ctx->battlerDef] == ABILITY_STALL || gProtectStructs[ctx->battlerDef].myceliumMight; + bool32 battler1HasQuickEffect = gProtectStructs[calcValues->battlerAtk].quickDraw || gProtectStructs[calcValues->battlerAtk].usedCustapBerry; + bool32 battler2HasQuickEffect = gProtectStructs[calcValues->battlerDef].quickDraw || gProtectStructs[calcValues->battlerDef].usedCustapBerry; + bool32 battler1HasStallingAbility = calcValues->abilities[calcValues->battlerAtk] == ABILITY_STALL || gProtectStructs[calcValues->battlerAtk].myceliumMight; + bool32 battler2HasStallingAbility = calcValues->abilities[calcValues->battlerDef] == ABILITY_STALL || gProtectStructs[calcValues->battlerDef].myceliumMight; if (battler1HasQuickEffect && !battler2HasQuickEffect) strikesFirst = 1; else if (battler2HasQuickEffect && !battler1HasQuickEffect) strikesFirst = -1; - else if (gProtectStructs[ctx->battlerAtk].laggingTail && !gProtectStructs[ctx->battlerDef].laggingTail) + else if (gProtectStructs[calcValues->battlerAtk].laggingTail && !gProtectStructs[calcValues->battlerDef].laggingTail) strikesFirst = -1; - else if (gProtectStructs[ctx->battlerDef].laggingTail && !gProtectStructs[ctx->battlerAtk].laggingTail) + else if (gProtectStructs[calcValues->battlerDef].laggingTail && !gProtectStructs[calcValues->battlerAtk].laggingTail) strikesFirst = 1; else if (battler1HasStallingAbility && !battler2HasStallingAbility) strikesFirst = -1; @@ -4703,22 +4615,22 @@ s32 GetWhichBattlerFasterArgs(struct BattleContext *ctx, bool32 ignoreChosenMove return strikesFirst; } -s32 GetWhichBattlerFasterOrTies(struct BattleContext *ctx, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFasterOrTies(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves) { s32 priority1 = 0, priority2 = 0; - u32 speedBattler1 = GetBattlerTotalSpeedStat(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->holdEffects[ctx->battlerAtk]); - u32 speedBattler2 = GetBattlerTotalSpeedStat(ctx->battlerDef, ctx->abilities[ctx->battlerDef], ctx->holdEffects[ctx->battlerDef]); + u32 speedBattler1 = GetBattlerTotalSpeedStat(calcValues->battlerAtk, calcValues->abilities[calcValues->battlerAtk], calcValues->holdEffects[calcValues->battlerAtk]); + u32 speedBattler2 = GetBattlerTotalSpeedStat(calcValues->battlerDef, calcValues->abilities[calcValues->battlerDef], calcValues->holdEffects[calcValues->battlerDef]); if (!ignoreChosenMoves) { - if (gChosenActionByBattler[ctx->battlerAtk] == B_ACTION_USE_MOVE) - priority1 = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); - if (gChosenActionByBattler[ctx->battlerDef] == B_ACTION_USE_MOVE) - priority2 = GetChosenMovePriority(ctx->battlerDef, ctx->abilities[ctx->battlerDef]); + if (gChosenActionByBattler[calcValues->battlerAtk] == B_ACTION_USE_MOVE) + priority1 = GetChosenMovePriority(calcValues->battlerAtk, calcValues->abilities[calcValues->battlerAtk]); + if (gChosenActionByBattler[calcValues->battlerDef] == B_ACTION_USE_MOVE) + priority2 = GetChosenMovePriority(calcValues->battlerDef, calcValues->abilities[calcValues->battlerDef]); } return GetWhichBattlerFasterArgs( - ctx, + calcValues, ignoreChosenMoves, speedBattler1, speedBattler2, @@ -4757,13 +4669,13 @@ static const u8 sBattlerOrders[24][4] = { 3, 2, 1, 0 }, }; -s32 GetWhichBattlerFaster(struct BattleContext *ctx, bool32 ignoreChosenMoves) +s32 GetWhichBattlerFaster(struct BattleCalcValues *calcValues, bool32 ignoreChosenMoves) { - s32 strikesFirst = GetWhichBattlerFasterOrTies(ctx, ignoreChosenMoves); + s32 strikesFirst = GetWhichBattlerFasterOrTies(calcValues, ignoreChosenMoves); if (strikesFirst == 0) { - s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerAtk]; - s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][ctx->battlerDef]; + s32 order1 = sBattlerOrders[gBattleStruct->speedTieBreaks][calcValues->battlerAtk]; + s32 order2 = sBattlerOrders[gBattleStruct->speedTieBreaks][calcValues->battlerDef]; if (order1 < order2) strikesFirst = 1; else @@ -4857,19 +4769,19 @@ static void SetActionsAndBattlersTurnOrder(void) turnOrderId++; } } - struct BattleContext ctx = {0}; + struct BattleCalcValues calcValues = {0}; for (i = 0; i < gBattlersCount; i++) { - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); + calcValues.abilities[i] = GetBattlerAbility(i); + calcValues.holdEffects[i] = GetBattlerHoldEffect(i); } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; - TryChangingTurnOrderEffects(&ctx, quickClawRandom, quickDrawRandom); + calcValues.battlerAtk = gBattlerByTurnOrder[i]; + calcValues.battlerDef = gBattlerByTurnOrder[j]; + TryChangingTurnOrderEffects(&calcValues, quickClawRandom, quickDrawRandom); if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -4877,7 +4789,7 @@ static void SetActionsAndBattlersTurnOrder(void) && gActionsByTurnOrder[i] != B_ACTION_THROW_BALL && gActionsByTurnOrder[j] != B_ACTION_THROW_BALL) { - if (GetWhichBattlerFaster(&ctx, FALSE) == -1) + if (GetWhichBattlerFaster(&calcValues, FALSE) == -1) SwapTurnOrder(i, j); } } @@ -4906,17 +4818,17 @@ static void TurnValuesCleanUp(bool8 var0) { memset(&gProtectStructs[i], 0, sizeof(struct ProtectStruct)); - if (gDisableStructs[i].isFirstTurn) - gDisableStructs[i].isFirstTurn--; + if (gBattleStruct->battlerState[i].isFirstTurn) + gBattleStruct->battlerState[i].isFirstTurn--; - if (gDisableStructs[i].rechargeTimer) - gDisableStructs[i].rechargeTimer--; + if (gBattleMons[i].volatiles.rechargeTimer) + gBattleMons[i].volatiles.rechargeTimer--; gBattleStruct->battlerState[i].canPickupItem = FALSE; gBattleStruct->battlerState[i].wasAboveHalfHp = FALSE; } - if (gDisableStructs[i].substituteHP == 0) + if (gBattleMons[i].volatiles.substituteHP == 0) gBattleMons[i].volatiles.substitute = FALSE; if (gBattleMons[i].volatiles.semiInvulnerable != STATE_COMMANDER) @@ -4925,13 +4837,13 @@ static void TurnValuesCleanUp(bool8 var0) gSpecialStatuses[i].parentalBondState = PARENTAL_BOND_OFF; gBattleStruct->battlerState[i].usedEjectItem = FALSE; gProtectStructs[i].lashOutAffected = FALSE; - gDisableStructs[i].endured = FALSE; + gBattleMons[i].volatiles.endured = FALSE; } gSideTimers[B_SIDE_PLAYER].followmeTimer = 0; gSideTimers[B_SIDE_OPPONENT].followmeTimer = 0; - gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceller + gBattleStruct->pledgeMove = FALSE; // combined pledge move may not have been used due to a canceler gBattleStruct->tryDestinyBond = FALSE; gBattleStruct->tryGrudge = FALSE; ClearPursuitValues(); @@ -4977,7 +4889,7 @@ static bool32 TryDoGimmicksBeforeMoves(void) } } - if (GetGenConfig(GEN_CONFIG_MEGA_EVO_TURN_ORDER) >= GEN_7) + if (GetConfig(CONFIG_MEGA_EVO_TURN_ORDER) >= GEN_7) TryChangeTurnOrder(); // This will just do nothing if no mon has mega evolved. return FALSE; } @@ -4995,7 +4907,7 @@ static bool32 TryDoMoveEffectsBeforeMoves(void) { if (!gBattleStruct->battlerState[battlers[i]].focusPunchBattlers && !(gBattleMons[battlers[i]].status1 & STATUS1_SLEEP) - && !(gDisableStructs[battlers[i]].truantCounter) + && !(gBattleMons[battlers[i]].volatiles.truantCounter) && !(gProtectStructs[battlers[i]].noValidMoves)) { gBattleStruct->battlerState[battlers[i]].focusPunchBattlers = TRUE; @@ -5026,37 +4938,37 @@ static void TryChangeTurnOrder(void) { u32 i, j; - struct BattleContext ctx = {0}; + struct BattleCalcValues calcValues = {0}; for (i = 0; i < gBattlersCount; i++) { - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); + calcValues.abilities[i] = GetBattlerAbility(i); + calcValues.holdEffects[i] = GetBattlerHoldEffect(i); } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; + calcValues.battlerAtk = gBattlerByTurnOrder[i]; + calcValues.battlerDef = gBattlerByTurnOrder[j]; if (gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE) { - if (GetWhichBattlerFaster(&ctx, FALSE) == -1) + if (GetWhichBattlerFaster(&calcValues, FALSE) == -1) SwapTurnOrder(i, j); } } } } -static void TryChangingTurnOrderEffects(struct BattleContext *ctx, u32 *quickClawRandom, u32 *quickDrawRandom) +static void TryChangingTurnOrderEffects(struct BattleCalcValues *calcValues, u32 *quickClawRandom, u32 *quickDrawRandom) { - u32 battler1 = ctx->battlerAtk; - u32 battler2 = ctx->battlerDef; - enum Ability ability1 = ctx->abilities[ctx->battlerAtk]; - enum Ability ability2 = ctx->abilities[ctx->battlerDef]; - enum HoldEffect holdEffectBattler1 = ctx->holdEffects[ctx->battlerAtk]; - enum HoldEffect holdEffectBattler2 = ctx->holdEffects[ctx->battlerDef]; + u32 battler1 = calcValues->battlerAtk; + u32 battler2 = calcValues->battlerDef; + enum Ability ability1 = calcValues->abilities[calcValues->battlerAtk]; + enum Ability ability2 = calcValues->abilities[calcValues->battlerDef]; + enum HoldEffect holdEffectBattler1 = calcValues->holdEffects[calcValues->battlerAtk]; + enum HoldEffect holdEffectBattler2 = calcValues->holdEffects[calcValues->battlerDef]; // Battler 1 // Quick Draw @@ -5090,10 +5002,10 @@ static void CheckChangingTurnOrderEffects(void) battler = gBattlerAttacker = gBattleStruct->quickClawBattlerId; gBattleStruct->quickClawBattlerId++; if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE - && gChosenMoveByBattler[battler] != MOVE_FOCUS_PUNCH // quick claw message doesn't need to activate here + && GetMoveEffect(gChosenMoveByBattler[battler]) != EFFECT_FOCUS_PUNCH // quick claw message doesn't need to activate here && (gProtectStructs[battler].usedCustapBerry || gProtectStructs[battler].quickDraw) && !(gBattleMons[battler].status1 & STATUS1_SLEEP) - && !(gDisableStructs[gBattlerAttacker].truantCounter) + && !(gBattleMons[gBattlerAttacker].volatiles.truantCounter) && !(gProtectStructs[battler].noValidMoves)) { if (gProtectStructs[battler].usedCustapBerry) @@ -5126,6 +5038,16 @@ static void CheckChangingTurnOrderEffects(void) // setup stuff before turns/actions TryClearRageAndFuryCutter(); + + // Prevents trainer slides triggering a turn late if another slide took priority on the previous turn + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + for (enum TrainerSlideType slideId = 0; slideId < TRAINER_SLIDE_COUNT; slideId++) + { + MarkInitializedTrainerSlidesAsPlayed(i, slideId); + } + } + gCurrentTurnActionNumber = 0; gCurrentActionFuncId = gActionsByTurnOrder[0]; gBattleStruct->dynamicMoveType = 0; @@ -5166,18 +5088,11 @@ static void RunTurnActionsFunctions(void) } } - *(&gBattleStruct->savedTurnActionNumber) = gCurrentTurnActionNumber; + gBattleStruct->savedTurnActionNumber = gCurrentTurnActionNumber; sTurnActionsFuncsTable[gCurrentActionFuncId](); if (gCurrentTurnActionNumber >= gBattlersCount) // everyone did their actions, turn finished - { gBattleMainFunc = sEndTurnFuncsTable[gBattleOutcome & 0x7F]; - } - else - { - if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battler - gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; - } } static void HandleEndTurn_BattleWon(void) @@ -5196,8 +5111,8 @@ static void HandleEndTurn_BattleWon(void) && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_EREADER_TRAINER)) { BattleStopLowHpSound(); - PlayBGM(MUS_VICTORY_TRAINER); gBattlescriptCurrInstr = BattleScript_BattleTowerTrainerBattleWon; + PlayBGM(MUS_VICTORY_TRAINER); } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { @@ -5234,10 +5149,27 @@ static void HandleEndTurn_BattleLost(void) if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { - gBattleTextBuff1[0] = gBattleOutcome; - gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; - gBattleOutcome &= ~B_OUTCOME_LINK_BATTLE_RAN; + // if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) + // { + // if (gBattleOutcome & B_OUTCOME_LINK_BATTLE_RAN) + // { + // gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeitedLinkBattle; + // gBattleOutcome &= ~B_OUTCOME_LINK_BATTLE_RAN; + // gSaveBlock2Ptr->frontier.disableRecordBattle = TRUE; + // } + // else + // { + // gBattlescriptCurrInstr = BattleScript_FrontierLinkBattleLost; + // gBattleOutcome &= ~B_OUTCOME_LINK_BATTLE_RAN; + // } + // } + // else + { + gBattleTextBuff1[0] = gBattleOutcome; + gBattlerAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost; + gBattleOutcome &= ~B_OUTCOME_LINK_BATTLE_RAN; + } } else { @@ -5262,18 +5194,39 @@ static void HandleEndTurn_BattleLost(void) static void HandleEndTurn_RanFromBattle(void) { gCurrentActionFuncId = 0; - switch (gProtectStructs[gBattlerAttacker].fleeType) - { - default: - gBattlescriptCurrInstr = BattleScript_GotAwaySafely; - break; - case FLEE_ITEM: - gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; - break; - case FLEE_ABILITY: - gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; - break; - } + + // if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER && gBattleTypeFlags & BATTLE_TYPE_TRAINER) + // { + // gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited; + // gBattleOutcome = B_OUTCOME_FORFEITED; + // gSaveBlock2Ptr->frontier.disableRecordBattle = TRUE; + // } + // else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) + // { + // gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited; + // gBattleOutcome = B_OUTCOME_FORFEITED; + // } + // else if (CanPlayerForfeitNormalTrainerBattle()) + // { + // gBattlescriptCurrInstr = BattleScript_ForfeitBattleGaveMoney; + // gBattleOutcome = B_OUTCOME_FORFEITED; + // } + // else + // { + switch (gProtectStructs[gBattlerAttacker].fleeType) + { + default: + gBattlescriptCurrInstr = BattleScript_GotAwaySafely; + break; + case FLEE_ITEM: + gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; + break; + case FLEE_ABILITY: + gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; + break; + } + // } + gBattleMainFunc = HandleEndTurn_FinishBattle; } @@ -5293,13 +5246,13 @@ static void HandleEndTurn_FinishBattle(void) if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER + if (!(gBattleTypeFlags & (BATTLE_TYPE_TRAINER_TOWER | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_BATTLE_TOWER - | BATTLE_TYPE_SAFARI - | BATTLE_TYPE_FIRST_BATTLE + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_CATCH_TUTORIAL + | BATTLE_TYPE_BATTLE_TOWER + | BATTLE_TYPE_SAFARI + | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_LINK)) && !(gBattleTypeFlags & BATTLE_TYPE_GHOST && IsGhostBattleWithoutScope())) { @@ -5309,40 +5262,47 @@ static void HandleEndTurn_FinishBattle(void) { if (gBattleResults.playerMon1Species == SPECIES_NONE) { - gBattleResults.playerMon1Species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); + gBattleResults.playerMon1Species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, gBattleResults.playerMon1Name); } else { - gBattleResults.playerMon2Species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); + gBattleResults.playerMon2Species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); GetMonData(GetBattlerMon(battler), MON_DATA_NICKNAME, gBattleResults.playerMon2Name); } } - else if (!IsOnPlayerSide(battler)) - { - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); - } } } TrySetQuestLogBattleEvent(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) ClearRematchStateByTrainerId(); - RecordedBattle_SetPlaybackFinished(); - if (gTestRunnerEnabled) - TestRunner_Battle_AfterLastTurn(); + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_FRONTIER))) + { + for (enum BattleSide side = 0; side < NUM_BATTLE_SIDES; side++) + { + struct Pokemon *party = GetSideParty(side); + + if (side == B_SIDE_PLAYER && !B_PARTNER_MONS_MARKED_SEEN) + continue; + + for (u32 partySlot = 0; partySlot < PARTY_SIZE; partySlot++) + { + if (gBattleStruct->partyState[side][partySlot].sentOut) + HandleSetPokedexFlagFromMon(&party[partySlot], FLAG_SET_SEEN); + } + } + } + BeginFastPaletteFade(3); FadeOutMapMusic(5); if (B_TRAINERS_KNOCK_OFF_ITEMS == TRUE || B_RESTORE_HELD_BATTLE_ITEMS >= GEN_9) TryRestoreHeldItems(); - // Undo Dynamax HP multiplier before recalculating stats. - for (battler = 0; battler < gBattlersCount; ++battler) - { - if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) - UndoDynamax(battler); - } - for (i = 0; i < PARTY_SIZE; i++) { bool32 changedForm = TryRevertPartyMonFormChange(i); @@ -5351,6 +5311,9 @@ static void HandleEndTurn_FinishBattle(void) if (!changedForm && B_RECALCULATE_STATS >= GEN_5) CalculateMonStats(&gPlayerParty[i]); } + RecordedBattle_SetPlaybackFinished(); + if (gTestRunnerEnabled) + TestRunner_Battle_AfterLastTurn(); // Clear battle mon species to avoid a bug on the next battle that causes // healthboxes loading incorrectly due to it trying to create a Mega Indicator // if the previous battler would've had it. @@ -5358,6 +5321,13 @@ static void HandleEndTurn_FinishBattle(void) { gBattleMons[i].species = SPECIES_NONE; } + + // Set Battle Controllers to BATTLE_CONTROLLER_NONE + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + gBattlerBattleController[i] = BATTLE_CONTROLLER_NONE; + } + gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; } @@ -5392,7 +5362,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_OLD_MAN_TUTORIAL + | BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (B_EVOLUTION_AFTER_WHITEOUT >= GEN_6 || gBattleOutcome == B_OUTCOME_WON @@ -5417,7 +5387,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) { ZeroEnemyPartyMons(); } - ResetDynamicAiFunc(); + ResetDynamicAiFunctions(); FreeMonSpritesGfx(); FreeBattleResources(); FreeBattleSpritesData(); @@ -5471,8 +5441,9 @@ static void ReturnFromBattleToOverworld(void) { if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { - RandomlyGivePartyPokerus(gPlayerParty); - PartySpreadPokerus(gPlayerParty); + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + PartySpreadPokerus(); } if (gBattleTypeFlags & BATTLE_TYPE_LINK && gReceivedRemoteLinkPlayers) @@ -5520,7 +5491,7 @@ void RunBattleScriptCommands(void) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } -enum Type TrySetAteType(u32 move, u32 battlerAtk, enum Ability attackerAbility) +enum Type TrySetAteType(enum Move move, u32 battlerAtk, enum Ability attackerAbility) { enum Type ateType = TYPE_NONE; @@ -5568,7 +5539,7 @@ enum Type TrySetAteType(u32 move, u32 battlerAtk, enum Ability attackerAbility) } // Returns TYPE_NONE if type doesn't change. -enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) +enum Type GetDynamicMoveType(struct Pokemon *mon, enum Move move, u32 battler, enum MonState state) { enum Type moveType = GetMoveType(move); enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -5615,7 +5586,7 @@ enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum Mo return TYPE_ROCK; else if (gBattleWeather & B_WEATHER_SUN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA) return TYPE_FIRE; - else if (gBattleWeather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) + else if (gBattleWeather & B_WEATHER_ICY_ANY) return TYPE_ICE; else return moveType; @@ -5686,11 +5657,11 @@ enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum Mo enum Type teraType; if (gimmick == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) return teraType; - else if (type1 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type1 == TYPE_FLYING)) + else if (type1 != TYPE_MYSTERY && !(gBattleMons[battler].volatiles.roostActive && type1 == TYPE_FLYING)) return type1; - else if (type2 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type2 == TYPE_FLYING)) + else if (type2 != TYPE_MYSTERY && !(gBattleMons[battler].volatiles.roostActive && type2 == TYPE_FLYING)) return type2; - else if (gDisableStructs[battler].roostActive) + else if (gBattleMons[battler].volatiles.roostActive) return (B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY); else if (type3 != TYPE_MYSTERY) return type3; @@ -5727,7 +5698,7 @@ enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum Mo case EFFECT_TERRAIN_PULSE: if (state == MON_IN_BATTLE) { - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_TERRAIN_ANY)) + if (IsAnyTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), gFieldStatuses)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; @@ -5806,7 +5777,7 @@ enum Type GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum Mo return TYPE_NONE; } -void SetTypeBeforeUsingMove(u32 move, u32 battler) +void SetTypeBeforeUsingMove(enum Move move, u32 battler) { enum Type moveType; u32 heldItem = gBattleMons[battler].item; @@ -5872,7 +5843,7 @@ bool32 IsWildMonSmart(void) #endif } -static s32 Factorial(s32 n) +s32 Factorial(s32 n) { s32 f = 1, i; for (i = 2; i <= n; i++) diff --git a/src/battle_message.c b/src/battle_message.c index 148d25e30..a7b416495 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -17,7 +17,6 @@ #include "menu.h" #include "battle_controllers.h" #include "graphics.h" -#include "battle_ai_switch_items.h" #include "recorded_battle.h" #include "test_runner.h" #include "constants/abilities.h" @@ -295,10 +294,11 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_DIDNOTLEARNMOVE] = COMPOUND_STRING("{B_BUFF1} did not learn {B_BUFF2}.\p"), [STRINGID_PKMNLEARNEDMOVE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} learned {B_BUFF1}!"), [STRINGID_ATTACKMISSED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s attack missed!"), - [STRINGID_PKMNPROTECTEDITSELF] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} protected itself!"), + [STRINGID_PKMNPROTECTEDITSELF] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} protected itself!"), [STRINGID_STATSWONTINCREASE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s stats won't go any higher!"), [STRINGID_AVOIDEDDAMAGE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided damage with {B_DEF_ABILITY}!"), //not in gen 5+, ability popup [STRINGID_ITDOESNTAFFECT] = COMPOUND_STRING("It doesn't affect {B_DEF_NAME_WITH_PREFIX2}…"), + [STRINGID_SCR_ITDOESNTAFFECT] = COMPOUND_STRING("It doesn't affect {B_SCR_NAME_WITH_PREFIX2}…"), [STRINGID_BATTLERFAINTED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} fainted!\p"), [STRINGID_PLAYERGOTMONEY] = COMPOUND_STRING("You got Â¥{B_BUFF1} for winning!\p"), [STRINGID_PLAYERWHITEOUT] = COMPOUND_STRING("You have no more Pokémon that can fight!\p"), @@ -478,6 +478,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_STATFELL] = gText_StatFell, [STRINGID_ATTACKERSSTATROSE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"), [STRINGID_DEFENDERSSTATROSE] = gText_DefendersStatRose, + [STRINGID_SCRIPTINGSTATROSE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}rose!"), [STRINGID_ATTACKERSSTATFELL] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), [STRINGID_DEFENDERSSTATFELL] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1} {B_BUFF2}fell!"), [STRINGID_CRITICALHIT] = COMPOUND_STRING("A critical hit!"), @@ -564,7 +565,6 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_ITEMALLOWSONLYYMOVE] = COMPOUND_STRING("{B_LAST_ITEM} only allows the use of {B_CURRENT_MOVE}!\p"), [STRINGID_PKMNHUNGONWITHX] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} hung on using its {B_LAST_ITEM}!"), [STRINGID_EMPTYSTRING3] = gText_EmptyString3, - [STRINGID_PKMNSXBLOCKSY] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXRESTOREDHPALITTLE2] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_ATK_ABILITY} restored its HP a little!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWHIPPEDUPSANDSTORM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} whipped up a sandstorm!"), //not in gen 5+, ability popup [STRINGID_PKMNSXPREVENTSYLOSS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} prevents {B_BUFF1} loss!"), //not in gen 5+, ability popup @@ -602,12 +602,12 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_PKMNSITEMNORMALIZEDSTATUS] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_LAST_ITEM} normalized its status!"), [STRINGID_TRAINER1USEDITEM] = COMPOUND_STRING("{B_ATK_TRAINER_NAME_WITH_CLASS} used {B_LAST_ITEM}!"), [STRINGID_BOXISFULL] = COMPOUND_STRING("The Box is full! You can't catch any more!\p"), - [STRINGID_PKMNAVOIDEDATTACK] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} avoided the attack!"), + [STRINGID_PKMNAVOIDEDATTACK] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} avoided the attack!"), [STRINGID_PKMNSXMADEITINEFFECTIVE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} made it ineffective!"), //not in gen 5+, ability popup [STRINGID_PKMNSXPREVENTSFLINCHING] = COMPOUND_STRING("{B_EFF_NAME_WITH_PREFIX}'s {B_EFF_ABILITY} prevents flinching!"), //not in gen 5+, ability popup [STRINGID_PKMNALREADYHASBURN] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is already burned!"), [STRINGID_STATSWONTDECREASE2] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s stats won't go any lower!"), - [STRINGID_PKMNSXBLOCKSY2] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup + [STRINGID_PKMNSXBLOCKSY] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} blocks {B_CURRENT_MOVE}!"), //not in gen 5+, ability popup [STRINGID_PKMNSXWOREOFF] = COMPOUND_STRING("{B_ATK_TEAM1} team's {B_BUFF1} wore off!"), [STRINGID_THEWALLSHATTERED] = COMPOUND_STRING("The wall shattered!"), //not in gen5+, uses "your teams light screen wore off!" etc instead [STRINGID_PKMNSXCUREDITSYPROBLEM] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s {B_SCR_ABILITY} cured its {B_BUFF1} problem!"), //not in gen 5+, ability popup @@ -727,9 +727,9 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TOXICSPIKESPOISONED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was poisoned!"), [STRINGID_TOXICSPIKESBADLYPOISONED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was badly poisoned!"), [STRINGID_STICKYWEBSWITCHIN] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} was caught in a sticky web!"), - [STRINGID_HEALINGWISHCAMETRUE] = COMPOUND_STRING("The healing wish came true for {B_ATK_NAME_WITH_PREFIX2}!"), - [STRINGID_HEALINGWISHHEALED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} regained health!"), - [STRINGID_LUNARDANCECAMETRUE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} became cloaked in mystical moonlight!"), + [STRINGID_HEALINGWISHCAMETRUE] = COMPOUND_STRING("The healing wish came true for {B_SCR_NAME_WITH_PREFIX2}!"), + [STRINGID_HEALINGWISHHEALED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} regained health!"), + [STRINGID_LUNARDANCECAMETRUE] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX} became cloaked in mystical moonlight!"), [STRINGID_CURSEDBODYDISABLED] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1} was disabled by {B_DEF_NAME_WITH_PREFIX2}'s {B_DEF_ABILITY}!"), [STRINGID_ATTACKERACQUIREDABILITY] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} acquired {B_ATK_ABILITY}!"), [STRINGID_TARGETABILITYSTATLOWER] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} {B_BUFF2}lowered its {B_BUFF1}!"), @@ -777,7 +777,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SWEETVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} can't fall asleep due to a veil of sweetness!"), [STRINGID_AROMAVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} is protected by an aromatic veil!"), [STRINGID_CELEBRATEMESSAGE] = COMPOUND_STRING("Congratulations, {B_PLAYER_NAME}!"), - [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} followed {B_BUFF1}'s instructions!"), + [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX} followed {B_ATK_NAME_WITH_PREFIX2}'s instructions!"), [STRINGID_THROATCHOPENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} can use sound-based moves again!"), [STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("The effects of Throat Chop prevent {B_ATK_NAME_WITH_PREFIX2} from using certain moves!\p"), [STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} concentrated intensely!"), @@ -1043,6 +1043,11 @@ const u16 gStartingStatusStringIds[B_MSG_STARTING_STATUS_COUNT] = [B_MSG_SET_RAINBOW] = STRINGID_ARAINBOWAPPEAREDONSIDE, [B_MSG_SET_SEA_OF_FIRE] = STRINGID_SEAOFFIREENVELOPEDSIDE, [B_MSG_SET_SWAMP] = STRINGID_SWAMPENVELOPEDSIDE, + [B_MSG_SET_SPIKES] = STRINGID_SPIKESSCATTERED, + [B_MSG_SET_POISON_SPIKES] = STRINGID_POISONSPIKESSCATTERED, + [B_MSG_SET_STICKY_WEB] = STRINGID_STICKYWEBUSED, + [B_MSG_SET_STEALTH_ROCK] = STRINGID_POINTEDSTONESFLOAT, + [B_MSG_SET_SHARP_STEEL] = STRINGID_SHARPSTEELFLOATS, }; const u16 gTerrainStringIds[B_MSG_TERRAIN_COUNT] = @@ -1135,6 +1140,18 @@ const u16 gMoveWeatherChangeStringIds[] = [B_MSG_STARTED_FOG] = STRINGID_FOGCREPTUP, // Unused, can use for custom moves that set fog }; +const u16 gAbilityWeatherChangeStringId[] = +{ + [B_MSG_STARTED_DRIZZLE] = STRINGID_PKMNMADEITRAIN, + [B_MSG_STARTED_SAND_STREAM] = STRINGID_PKMNSXWHIPPEDUPSANDSTORM, + [B_MSG_STARTED_DROUGHT] = STRINGID_PKMNSXINTENSIFIEDSUN, + [B_MSG_STARTED_HAIL_WARNING] = STRINGID_SNOWWARNINGHAIL, + [B_MSG_STARTED_SNOW_WARNING] = STRINGID_SNOWWARNINGSNOW, + [B_MSG_STARTED_DESOLATE_LAND] = STRINGID_EXTREMELYHARSHSUNLIGHT, + [B_MSG_STARTED_PRIMORDIAL_SEA] = STRINGID_HEAVYRAIN, + [B_MSG_STARTED_STRONG_WINDS] = STRINGID_MYSTERIOUSAIRCURRENT, +}; + const u16 gWeatherEndsStringIds[B_MSG_WEATHER_END_COUNT] = { [B_MSG_WEATHER_END_RAIN] = STRINGID_RAINSTOPPED, @@ -1390,7 +1407,10 @@ const u16 gWeatherStartsStringIds[] = const u16 gTerrainStartsStringIds[] = { - STRINGID_MISTSWIRLSAROUND, STRINGID_ELECTRICCURRENTISRUNNING, STRINGID_ISCOVEREDWITHGRASS, STRINGID_SEEMSWEIRD, + [B_MSG_TERRAIN_SET_MISTY] = STRINGID_MISTSWIRLSAROUND, + [B_MSG_TERRAIN_SET_ELECTRIC] = STRINGID_ELECTRICCURRENTISRUNNING, + [B_MSG_TERRAIN_SET_PSYCHIC] = STRINGID_SEEMSWEIRD, + [B_MSG_TERRAIN_SET_GRASSY] = STRINGID_ISCOVEREDWITHGRASS, }; const u16 gPrimalWeatherBlocksStringIds[] = @@ -1717,7 +1737,7 @@ void BufferStringBattle(enum StringID stringID, u32 battler) stringPtr = sText_WildPkmnAppeared2; else if (IsDoubleBattle() && IsValidForBattle(GetBattlerMon(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))) stringPtr = sText_TwoWildPkmnAppeared; - else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL) + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL) stringPtr = sText_WildPkmnAppearedPause; else stringPtr = sText_WildPkmnAppeared; @@ -2146,6 +2166,8 @@ static const u8 *BattleStringGetOpponentName(u8 *text, u8 multiplayerId, u8 batt else toCpy = BattleStringGetOpponentNameByTrainerId(TRAINER_BATTLE_PARAM.opponentA, text, multiplayerId, battler); break; + default: + break; } return toCpy; @@ -2183,6 +2205,8 @@ static const u8 *BattleStringGetPlayerName(u8 *text, u8 battler) toCpy = gSaveBlock2Ptr->playerName; } break; + default: + break; } return toCpy; @@ -2649,6 +2673,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) else toCpy = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; + default: + break; } break; case B_TXT_ATK_TRAINER_NAME_WITH_CLASS: @@ -2675,6 +2701,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) else classString = BattleStringGetOpponentClassByTrainerId(TRAINER_BATTLE_PARAM.opponentA); break; + default: + break; } classLength = 0; nameLength = 0; @@ -3277,11 +3305,11 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = { }, }; -static const u8 sNpcTextColorToFont[] = +static const u8 sNpcTextColorToFont[] = { - [NPC_TEXT_COLOR_MALE] = FONT_MALE, - [NPC_TEXT_COLOR_FEMALE] = FONT_FEMALE, - [NPC_TEXT_COLOR_MON] = FONT_NORMAL, + [NPC_TEXT_COLOR_MALE] = FONT_MALE, + [NPC_TEXT_COLOR_FEMALE] = FONT_FEMALE, + [NPC_TEXT_COLOR_MON] = FONT_NORMAL, [NPC_TEXT_COLOR_NEUTRAL] = FONT_NORMAL, }; diff --git a/src/battle_move_resolution.c b/src/battle_move_resolution.c new file mode 100644 index 000000000..9c7a46989 --- /dev/null +++ b/src/battle_move_resolution.c @@ -0,0 +1,1901 @@ +#include "global.h" +#include "battle.h" +#include "battle_hold_effects.h" +#include "battle_ai_util.h" +#include "battle_util.h" +#include "battle_move_resolution.h" +#include "battle_scripts.h" +#include "battle_z_move.h" +#include "item.h" +#include "battle_controllers.h" +#include "move.h" +#include "constants/battle_move_resolution.h" + +static void ValidateBattlers(void); +static enum Move GetOriginallyUsedMove(enum Move chosenMove); +static void SetSameMoveTurnValues(u32 moveEffect); +static void TryClearChargeVolatile(enum Type moveType); +static inline bool32 IsBattlerUsingBeakBlast(u32 battler); + +// Attackcanceler + +// ---- +// TODO +// ---- + +// Move End + +static enum MoveEndResult MoveEnd_SetValues(void) +{ + gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; + gBattleStruct->eventState.moveEndBattler = 0; + gBattleStruct->eventState.moveEndBlock = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_ProtectLikeEffect(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + u32 temp = 0; + + if (CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) + { + gBattleScripting.moveendState++; + return result; + } + + enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected; + switch (method) + { + case PROTECT_SPIKY_SHIELD: + if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + { + SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); + BattleScriptCall(BattleScript_SpikyShieldEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case PROTECT_KINGS_SHIELD: + SWAP(gBattlerAttacker, gBattlerTarget, temp); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + if (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; + else + gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; + BattleScriptCall(BattleScript_KingsShieldEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + break; + case PROTECT_BANEFUL_BUNKER: + if (CanBePoisoned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerTarget), GetBattlerAbility(gBattlerAttacker))) + { + gBattleScripting.moveEffect = MOVE_EFFECT_POISON; + BattleScriptCall(BattleScript_BanefulBunkerEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case PROTECT_BURNING_BULWARK: + if (CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) + { + gBattleScripting.moveEffect = MOVE_EFFECT_BURN; + BattleScriptCall(BattleScript_BanefulBunkerEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case PROTECT_OBSTRUCT: + SWAP(gBattlerAttacker, gBattlerTarget, temp); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; + BattleScriptCall(BattleScript_KingsShieldEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + break; + case PROTECT_SILK_TRAP: + SWAP(gBattlerAttacker, gBattlerTarget, temp); // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable + gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; + BattleScriptCall(BattleScript_KingsShieldEffect); + result = MOVEEND_STEP_RUN_SCRIPT; + break; + default: + break; + } + + // Not strictly a protect effect, but works the same way + if (IsBattlerUsingBeakBlast(gBattlerTarget) + && CanBeBurned(gBattlerAttacker, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) + && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); + MarkBattlerForControllerExec(gBattlerAttacker); + BattleScriptCall(BattleScript_BeakBlastBurn); + result = MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_Absorb(void) +{ + if (gBattleStruct->unableToUseMove) + { + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; + } + + if (IsExplosionMove(gCurrentMove) + && (gBattleStruct->doneDoublesSpreadHit || !IsDoubleSpreadMove()) + && !IsBattlerAlive(gBattlerAttacker) + && !gBattleStruct->battlerState[gBattlerAttacker].fainted) + { + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = 0; + BattleScriptCall(BattleScript_FaintAttackerForExplosion); + gBattleScripting.moveendState++; + return MOVEEND_STEP_RUN_SCRIPT; + } + + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + switch (moveEffect) + { + case EFFECT_ABSORB: + case EFFECT_DREAM_EATER: + if (!gBattleMons[gBattlerAttacker].volatiles.healBlock + && gBattleStruct->moveDamage[gBattlerTarget] > 0 + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker)) + { + s32 healAmount = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); + healAmount = GetDrainedBigRootHp(gBattlerAttacker, healAmount); + if ((moveEffect == EFFECT_DREAM_EATER && GetConfig(CONFIG_DREAM_EATER_LIQUID_OOZE) < GEN_5) + || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) + { + SetHealAmount(gBattlerAttacker, healAmount); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; + BattleScriptCall(BattleScript_EffectAbsorb); + } + else // Liquid Ooze damage + { + SetPassiveDamageAmount(gBattlerAttacker, healAmount); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; + BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); + } + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_MAX_HP_50_RECOIL: + if (IsBattlerAlive(gBattlerAttacker) + && !gBattleStruct->unableToUseMove + && (gBattleStruct->doneDoublesSpreadHit || !IsDoubleSpreadMove()) + && !gSpecialStatuses[gBattlerAttacker].mindBlownRecoil + && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) + && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) + { + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); + gSpecialStatuses[gBattlerAttacker].mindBlownRecoil = TRUE; + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MaxHp50Recoil); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + default: + break; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_Rage(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (gBattleMons[gBattlerTarget].volatiles.rage + && IsBattlerAlive(gBattlerTarget) + && gBattlerAttacker != gBattlerTarget + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) + && IsBattlerTurnDamaged(gBattlerTarget) + && !IsBattleMoveStatus(gCurrentMove) + && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) + { + SET_STATCHANGER(STAT_ATK, 1, FALSE); + BattleScriptCall(BattleScript_RageIsBuilding); + result = MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_SynchronizeTarget(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_Abilities(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum Ability targetAbility = GetBattlerAbility(gBattlerTarget); + + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerTarget, targetAbility, 0, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + else if (TryClearIllusion(gBattlerTarget, targetAbility)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_AbilitiesAttacker(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END_ATTACKER, gBattlerAttacker, 0, 0, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_StatusImmunityAbilities(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + } + + if (result == MOVEEND_STEP_CONTINUE) + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_SynchronizeAttacker(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBattlerAttacker, 0, 0, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_AttackerInvisible(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) + && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) + { + BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, TRUE); + MarkBattlerForControllerExec(gBattlerAttacker); + result = MOVEEND_STEP_BREAK; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_AttackerVisible(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (IsBattlerUnaffectedByMove(gBattlerTarget) + || !IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) + || gBattleStruct->unableToUseMove) + { + BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; + gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = TRUE; + gBattleScripting.moveendState++; + return MOVEEND_STEP_BREAK; + } + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_TargetVisible(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount + && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) + { + BtlController_EmitSpriteInvisibility(gBattlerTarget, B_COMM_TO_CONTROLLER, FALSE); + MarkBattlerForControllerExec(gBattlerTarget); + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + result = MOVEEND_STEP_BREAK; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ItemEffectsTarget(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); + + if (ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnTargetHitActivation) + || ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnStatusChangeActivation)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ItemEffectsAttacker1(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnAttackerAfterHitActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_Symbiosis(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if ((gSpecialStatuses[battler].berryReduced + || (GetConfig(CONFIG_SYMBIOSIS_GEMS) >= GEN_7 && gSpecialStatuses[battler].gemBoost)) + && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) + { + BestowItem(BATTLE_PARTNER(battler), battler); + gLastUsedAbility = gBattleMons[BATTLE_PARTNER(battler)].ability; + gEffectBattler = battler; + gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(battler); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; + result = MOVEEND_STEP_RUN_SCRIPT; + break; + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_Substitute(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + for (u32 i = 0; i < gBattlersCount; i++) + { + if (gBattleMons[i].volatiles.substituteHP == 0) + gBattleMons[i].volatiles.substitute = FALSE; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_FaintBlock(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + do + { + switch (gBattleStruct->eventState.moveEndBlock) + { + case FAINT_BLOCK_FINAL_GAMBIT: + if (GetMoveEffect(gCurrentMove) == EFFECT_FINAL_GAMBIT + && IsBattlerAlive(gBattlerAttacker) + && !gBattleStruct->unableToUseMove + && (gBattleStruct->doneDoublesSpreadHit || !IsDoubleSpreadMove()) + && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + BattleScriptCall(BattleScript_FinalGambit); + result = MOVEEND_STEP_RUN_SCRIPT; + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_CHECK_TARGET_FAINTED: // Stop if target already ran the block / is alive or absent + if (IsBattlerAlive(gBattlerTarget) + || gBattleStruct->battlerState[gBattlerTarget].fainted) + { + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; + } + + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_END_NEUTRALIZING_GAS: + if (gBattleMons[gBattlerTarget].volatiles.neutralizingGas) + { + gBattleMons[gBattlerTarget].volatiles.neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptCall(BattleScript_NeutralizingGasExits); + result = MOVEEND_STEP_RUN_SCRIPT; + } + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_TRY_DESTINY_BOND: // Checked before FAINT_BLOCK_FAINT_TARGET but occurs after since volatiles are cleared on faint + if (gBattleMons[gBattlerTarget].volatiles.destinyBond + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + { + gBattleStruct->tryDestinyBond = TRUE; + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_TRY_GRUDGE: // Checked before FAINT_BLOCK_FAINT_TARGET but occurs after since volatiles are cleared on faint + if (gBattleMons[gBattlerTarget].volatiles.grudge + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) + && !IsZMove(gCurrentMove) + && gCurrentMove != MOVE_STRUGGLE + && GetMoveEffect(gCurrentMove) != EFFECT_FUTURE_SIGHT) + { + gBattleStruct->tryGrudge = TRUE; + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_FAINT_TARGET: + gBattlerFainted = gBattlerTarget; + TryUpdateEvolutionTracker(IF_DEFEAT_X_WITH_ITEMS, 1, MOVE_NONE); + TryDeactivateSleepClause(GetBattlerSide(gBattlerTarget), gBattlerPartyIndexes[gBattlerTarget]); + gHitMarker |= HITMARKER_FAINTED(gBattlerTarget); + gBattleStruct->eventState.faintedAction = 0; + if (IsOnPlayerSide(gBattlerTarget)) + { + gHitMarker |= HITMARKER_PLAYER_FAINTED; + if (gBattleResults.playerFaintCounter < 255) + gBattleResults.playerFaintCounter++; + AdjustFriendshipOnBattleFaint(gBattlerTarget); + gSideTimers[B_SIDE_PLAYER].retaliateTimer = 2; + } + else + { + if (gBattleResults.opponentFaintCounter < 255) + gBattleResults.opponentFaintCounter++; + gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(gBattlerTarget), MON_DATA_SPECIES); + gSideTimers[B_SIDE_OPPONENT].retaliateTimer = 2; + } + BattleScriptCall(BattleScript_FaintBattler); + result = MOVEEND_STEP_RUN_SCRIPT; + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_DO_DESTINY_BOND: + if (gBattleStruct->tryDestinyBond) + { + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; + BattleScriptCall(BattleScript_DestinyBondTakesLife); + result = MOVEEND_STEP_RUN_SCRIPT; + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_DO_GRUDGE: + if (gBattleStruct->tryGrudge) + { + u32 moveIndex = gBattleStruct->chosenMovePositions[gBattlerAttacker]; + + gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].pp[moveIndex]), &gBattleMons[gBattlerAttacker].pp[moveIndex]); + MarkBattlerForControllerExec(gBattlerAttacker); + PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) + BattleScriptCall(BattleScript_GrudgeTakesPp); + result = MOVEEND_STEP_RUN_SCRIPT; + } + gBattleStruct->eventState.moveEndBlock++; + break; + case FAINT_BLOCK_COUNT: // Clear bits for other potential fainting targets + gBattleStruct->tryDestinyBond = FALSE; + gBattleStruct->tryGrudge = FALSE; + gBattleStruct->eventState.moveEndBlock = 0; + break; + } + + if (result == MOVEEND_STEP_RUN_SCRIPT) + break; + + } while (gBattleStruct->eventState.moveEndBlock != 0); + + if (result == MOVEEND_STEP_CONTINUE) + { + gBattleStruct->eventState.moveEndBlock = 0; + gBattleScripting.moveendState++; + } + + return result; +} + +static enum MoveEndResult MoveEnd_SkyDropConfuse(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleStruct->skyDropTargets[battler] == SKY_DROP_RELEASED_TARGET) + { + // Find the battler id of the Pokemon that was held by Sky Drop + u32 targetId; + for (targetId = 0; targetId < gBattlersCount; targetId++) + { + if (gBattleStruct->skyDropTargets[targetId] == battler) + break; + } + + gBattleScripting.battler = targetId; + BattleScriptCall(BattleScript_ThrashConfusesRet); // Jump to "confused due to fatigue" script + + // Clear skyDropTargets data + gBattleStruct->skyDropTargets[battler] = SKY_DROP_NO_TARGET; + gBattleStruct->skyDropTargets[targetId] = SKY_DROP_NO_TARGET; + result = MOVEEND_STEP_RUN_SCRIPT; + break; + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_UpdateLastMoves(void) +{ + if (!IsOnPlayerSide(gBattlerAttacker)) + UpdateStallMons(); + + if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) + || gBattleMons[gBattlerAttacker].volatiles.flinched + || gBattleStruct->pledgeMove == TRUE // Is the battler that uses the first Pledge move in the combo + || gBattleStruct->unableToUseMove) + gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; + + // After swapattackerwithtarget is used for snatch the correct battlers have to be restored so data is stored correctly + if (gBattleStruct->snatchedMoveIsUsed) + { + u32 temp; + SWAP(gBattlerAttacker, gBattlerTarget, temp); + } + + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gBattleMons[gBattlerAttacker].volatiles.usedMoves |= 1u << gCurrMovePos; + gBattleStruct->battlerState[gBattlerAttacker].lastMoveTarget = gBattlerTarget; + } + + enum BattleMoveEffects originalEffect = GetMoveEffect(GetOriginallyUsedMove(gChosenMove)); + if (IsBattlerAlive(gBattlerAttacker) + && originalEffect != EFFECT_BATON_PASS + && originalEffect != EFFECT_HEALING_WISH + && originalEffect != EFFECT_LUNAR_DANCE) + { + if (!gBattleStruct->unableToUseMove) + { + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gLastMoves[gBattlerAttacker] = gChosenMove; + RecordKnownMove(gBattlerAttacker, gChosenMove); + gLastResultingMoves[gBattlerAttacker] = gCurrentMove; + gLastUsedMoveType[gBattlerAttacker] = GetBattleMoveType(gCurrentMove); + } + } + else + { + gLastMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; + gLastResultingMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; + gLastUsedMoveType[gBattlerAttacker] = 0; + } + + if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) + gLastHitBy[gBattlerTarget] = gBattlerAttacker; + + if (!gBattleStruct->unableToUseMove && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + if (gChosenMove == MOVE_UNAVAILABLE) + { + gLastLandedMoves[gBattlerTarget] = gChosenMove; + } + else + { + gLastLandedMoves[gBattlerTarget] = gCurrentMove; + gLastHitByType[gBattlerTarget] = GetBattleMoveType(gCurrentMove); + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gLastUsedMove = gCurrentMove; + if (IsMaxMove(gCurrentMove)) + gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; + } + } + } + else + { + gLastLandedMoves[gBattlerTarget] = MOVE_UNAVAILABLE; + } + } + + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_MirrorMove(void) +{ + if (!gBattleStruct->unableToUseMove + && gBattlerAttacker != gBattlerTarget + && IsBattlerAlive(gBattlerAttacker) + && IsBattlerAlive(gBattlerTarget) + && !IsMoveMirrorMoveBanned(GetOriginallyUsedMove(gChosenMove)) + && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + gBattleStruct->lastTakenMove[gBattlerTarget] = gChosenMove; + gBattleStruct->lastTakenMoveFrom[gBattlerTarget][gBattlerAttacker] = gChosenMove; + } + + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_Defrost(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattlerAttacker != gBattlerTarget + && (GetBattleMoveType(gCurrentMove) == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) + && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + BattleScriptCall(BattleScript_DefrostedViaFireMove); + result = MOVEEND_STEP_RUN_SCRIPT; + } + else if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && gBattlerAttacker != gBattlerTarget + && MoveThawsUser(GetOriginallyUsedMove(gChosenMove)) + && !IsBattlerUnaffectedByMove(gBattlerTarget)) + { + gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + MarkBattlerForControllerExec(gBattlerTarget); + BattleScriptCall(BattleScript_FrostbiteHealedViaFireMove); + result = MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_NextTarget(void) +{ + enum MoveTarget moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[gBattlerTarget] = TRUE; + + if (gBattleStruct->unableToUseMove || gProtectStructs[gBattlerAttacker].chargingTurn) + { + // unable to use move + } + else if (moveTarget == TARGET_USER_AND_ALLY) + { + u32 partner = BATTLE_PARTNER(gBattlerAttacker); + if (partner != gBattlerTarget && IsBattlerAlive(partner)) + { + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = partner; + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + gBattleScripting.moveendState = 0; + MoveValuesCleanUp(); + return MOVEEND_STEP_BREAK; + } + } + else if (IsSpreadMove(moveTarget)) + { + u32 nextTarget = GetNextTarget(moveTarget, FALSE); + + if (nextTarget != MAX_BATTLERS_COUNT) + { + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; // Fix for moxie spread moves + gBattleScripting.moveendState = 0; + MoveValuesCleanUp(); + + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + // Edge cases for moves that shouldn't repeat their own script + if (moveEffect == EFFECT_MAGNITUDE) + BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); + else + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return MOVEEND_STEP_BREAK; + } + // Check if the move used was actually a bounced move. If so, we need to go back to the original attacker and make sure, its move hits all 2 or 3 pokemon. + else if (gBattleStruct->bouncedMoveIsUsed) + { + u8 originalBounceTarget = gBattlerAttacker; + gBattleStruct->bouncedMoveIsUsed = FALSE; + gBattlerAttacker = gBattleStruct->attackerBeforeBounce; + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[originalBounceTarget] = TRUE; + for (u32 i = 0; i < gBattlersCount; i++) + gBattleStruct->battlerState[originalBounceTarget].targetsDone[i] = FALSE; + nextTarget = GetNextTarget(moveTarget, FALSE); + if (nextTarget != MAX_BATTLERS_COUNT) + { + // We found another target for the original move user. + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; + gBattleScripting.moveendState = 0; + gBattleScripting.animTurn = 0; + gBattleScripting.animTargetsHit = 0; + MoveValuesCleanUp(); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return MOVEEND_STEP_BREAK; + } + } + } + + RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_HpThresholdItemsTarget(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (gMultiHitCounter && + ItemBattleEffects(gBattlerTarget, gBattlerAttacker, GetBattlerHoldEffect(gBattlerTarget), IsOnHpThresholdActivation)) + { + result = MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_MultihitMove(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (!IsBattlerUnaffectedByMove(gBattlerTarget) + && !gBattleStruct->unableToUseMove + && gMultiHitCounter) + { + enum MoveTarget target = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + gMultiHitCounter--; + if (!IsBattlerAlive(gBattlerTarget) && target != TARGET_SMART) + gMultiHitCounter = 0; + + gBattleScripting.multihitString[4]++; + if (gMultiHitCounter == 0) + { + if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_SCALE_SHOT) && !NoAliveMonsForEitherParty()) + BattleScriptCall(BattleScript_ScaleShot); + else + BattleScriptCall(BattleScript_MultiHitPrintStrings); + result = MOVEEND_STEP_RUN_SCRIPT; + } + else + { + if (target == TARGET_SMART + && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(gBattlerTarget), gCurrentMove) + && !(gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & MOVE_RESULT_MISSED) // didn't miss the other target + && CanTargetPartner(gBattlerAttacker, gBattlerTarget) + && !IsBattlerUnaffectedByMove(BATTLE_PARTNER(gBattlerTarget))) + gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); // Target the partner in doubles for second hit. + + enum BattleMoveEffects chosenEffect = GetMoveEffect(gChosenMove); + + if (gBattleMons[gBattlerAttacker].hp + && gBattleMons[gBattlerTarget].hp + && (IsUsableWhileAsleepEffect(chosenEffect) || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) + && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) + { + if (gSpecialStatuses[gBattlerAttacker].parentalBondState) + gSpecialStatuses[gBattlerAttacker].parentalBondState--; + + gBattleScripting.animTargetsHit = 0; + gBattleScripting.moveendState = 0; + gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; + MoveValuesCleanUp(); + BattleScriptPush(GetMoveBattleScript(gCurrentMove)); + gBattlescriptCurrInstr = BattleScript_FlushMessageBox; + return MOVEEND_STEP_BREAK; + } + else + { + BattleScriptCall(BattleScript_MultiHitPrintStrings); + result = MOVEEND_STEP_RUN_SCRIPT; + } + } + } + + gMultiHitCounter = 0; + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; + gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_MoveBlock(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum BattleSide side = GetBattlerSide(gBattlerTarget); + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + switch (moveEffect) + { + case EFFECT_KNOCK_OFF: + if (gBattleMons[gBattlerTarget].item != ITEM_NONE + && IsBattlerAlive(gBattlerAttacker) + && !(B_KNOCK_OFF_REMOVAL >= GEN_5 && side == B_SIDE_PLAYER && !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && IsBattlerTurnDamaged(gBattlerTarget) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) + && CanBattlerGetOrLoseItem(gBattlerTarget, gBattlerAttacker, gBattleMons[gBattlerTarget].item) + && !NoAliveMonsForEitherParty()) + { + enum BattleSide side = GetBattlerSide(gBattlerTarget); + + if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + gBattlerAbility = gBattlerTarget; + BattleScriptCall(BattleScript_StickyHoldActivatesRet); + result = MOVEEND_STEP_RUN_SCRIPT; + break; + } + + gLastUsedItem = gBattleMons[gBattlerTarget].item; + gBattleMons[gBattlerTarget].item = 0; + if (gBattleMons[gBattlerTarget].ability != ABILITY_GORILLA_TACTICS) + gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; + CheckSetUnburden(gBattlerTarget); + + // In Gen 5+, Knock Off removes the target's item rather than rendering it unusable + if (B_KNOCK_OFF_REMOVAL >= GEN_5) + { + BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + MarkBattlerForControllerExec(gBattlerTarget); + // Mark item as stolen so it will be restored after battle + gBattleStruct->itemLost[side][gBattlerPartyIndexes[gBattlerTarget]].stolen = TRUE; + } + else + { + GetBattlerPartyState(gBattlerTarget)->isKnockedOff = TRUE; + } + + BattleScriptCall(BattleScript_KnockedOff); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_STEAL_ITEM: + if (!IsBattlerTurnDamaged(gBattlerTarget) + || gBattleMons[gBattlerAttacker].item != ITEM_NONE + || gBattleMons[gBattlerTarget].item == ITEM_NONE + || !IsBattlerAlive(gBattlerAttacker) + || !CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item)) + { + result = MOVEEND_STEP_CONTINUE; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + BattleScriptCall(BattleScript_NoItemSteal); + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + result = MOVEEND_STEP_RUN_SCRIPT; + } + else + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item + + if (!(GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 + && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) + { + gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) + gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later + } + gEffectBattler = gBattlerTarget; + BattleScriptCall(BattleScript_ItemSteal); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_HIT_SWITCH_TARGET: + if (IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && gBattleMons[BATTLE_PARTNER(gBattlerTarget)].volatiles.semiInvulnerable != STATE_COMMANDER) + { + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + if (targetAbility == ABILITY_GUARD_DOG) + break; + + if (targetAbility == ABILITY_SUCTION_CUPS) + { + BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet); + } + else if (gBattleMons[gBattlerTarget].volatiles.root) + { + BattleScriptCall(BattleScript_PrintMonIsRootedRet); + } + else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + { + BattleScriptCall(BattleScript_HitSwitchTargetDynamaxed); + } + else + { + gBattleScripting.switchCase = B_SWITCH_HIT; + BattleScriptCall(BattleScript_TryHitSwitchTarget); + } + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget)) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) + { + gBattleMons[gBattlerTarget].volatiles.smackDown = TRUE; + gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; + gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; + gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; + BattleScriptCall(BattleScript_MoveEffectSmackDown); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_RECOIL_IF_MISS: + if (IsBattlerAlive(gBattlerAttacker) + && IsBattlerUnaffectedByMove(gBattlerTarget) + && !gBattleStruct->unableToUseMove) + { + s32 recoil = 0; + if (B_CRASH_IF_TARGET_IMMUNE == GEN_4 && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_DOESNT_AFFECT_FOE) + { + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + } + if (B_RECOIL_IF_MISS_DMG >= GEN_5) + { + recoil = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; + } + else if (B_RECOIL_IF_MISS_DMG >= GEN_3) + { + if ((GetNonDynamaxMaxHP(gBattlerTarget) / 2) < gBattleStruct->moveDamage[gBattlerTarget]) + recoil = gBattleStruct->moveDamage[gBattlerTarget]; + else + recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; + } + else if (B_RECOIL_IF_MISS_DMG == GEN_2) + { + recoil = gBattleStruct->moveDamage[gBattlerTarget] / 8; + } + else + { + recoil = 1; + } + SetPassiveDamageAmount(gBattlerAttacker, recoil); + BattleScriptCall(BattleScript_RecoilIfMiss); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_RECOIL: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gBattleStruct->moveDamage[gBattlerTarget] > 0) + { + enum Ability ability = GetBattlerAbility(gBattlerAttacker); + if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) + || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) + break; + + SetPassiveDamageAmount(gBattlerAttacker, gBattleScripting.savedDmg * max(1, GetMoveRecoil(gCurrentMove)) / 100); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MoveEffectRecoil); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_CHLOROBLAST: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) + { + enum Ability ability = GetBattlerAbility(gBattlerAttacker); + if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) + || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) + break; + + s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP + SetPassiveDamageAmount(gBattlerAttacker, recoil); + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); + BattleScriptCall(BattleScript_MoveEffectRecoil); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_RAPID_SPIN: + if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) + { + BattleScriptCall(BattleScript_RapidSpinAway); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_FELL_STINGER: + if (IsBattlerAlive(gBattlerAttacker) + && !IsBattlerAlive(gBattlerTarget) + && IsBattlerTurnDamaged(gBattlerTarget) + && !NoAliveMonsForEitherParty() + && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerAttacker))) + { + SET_STATCHANGER(STAT_ATK, GetConfig(CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_STONE_AXE: + if (!IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_StealthRockActivates; + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_CEASELESS_EDGE: + if (gSideTimers[side].spikesAmount < 3 + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker)) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; + BattleScriptPush(gBattlescriptCurrInstr + 1); + if (gBattleStruct->isSkyBattle) + { + result = MOVEEND_STEP_CONTINUE; + } + else + { + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_SpikesActivates; + result = MOVEEND_STEP_RUN_SCRIPT; + } + } + break; + default: + result = MOVEEND_STEP_CONTINUE; + break; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ItemEffectsAttacker2(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); + + if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_AbilityEffectFoesFainted(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END_FOES_FAINTED, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_SheerForce(void) +{ + if (IsSheerForceAffected(gCurrentMove, GetBattlerAbility(gBattlerAttacker))) + gBattleScripting.moveendState = MOVEEND_EJECT_PACK; + else + gBattleScripting.moveendState++; + + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_ShellTrap(void) +{ + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (battlerDef == gBattlerAttacker || IsBattlerAlly(battlerDef, gBattlerAttacker)) + continue; + + // Set ShellTrap to activate after the attacker's turn if target was hit by a physical move. + if (GetMoveEffect(gChosenMoveByBattler[battlerDef]) == EFFECT_SHELL_TRAP + && IsBattleMovePhysical(gCurrentMove) + && IsBattlerTurnDamaged(battlerDef) + && gProtectStructs[battlerDef].physicalBattlerId == gBattlerAttacker) + { + gProtectStructs[battlerDef].shellTrap = TRUE; + if (IsDoubleBattle()) // Change move order in double battles, so the hit mon with shell trap moves immediately after being hit. + ChangeOrderTargetAfterAttacker(); // In what order should 2 targets move that will activate a trap? + } + } + + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_ColorChange(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (battler == gBattlerAttacker) + continue; + if (AbilityBattleEffects(ABILITYEFFECT_COLOR_CHANGE, battler, GetBattlerAbility(battler), 0, TRUE)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_KeeMarangaHpThresholdItemTarget(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battlerDef = gBattleStruct->eventState.moveEndBattler++; + if (battlerDef == gBattlerAttacker) + continue; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battlerDef); + if (ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsKeeMarangaBerryActivation) + || ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsOnHpThresholdActivation)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static bool32 TryRedCard(u32 battlerAtk, u32 redCardBattler, u32 move) +{ + if (!IsBattlerAlive(redCardBattler) + || !IsBattlerTurnDamaged(redCardBattler) + || DoesSubstituteBlockMove(battlerAtk, redCardBattler, move) + || !CanBattlerSwitch(battlerAtk)) + return FALSE; + + gLastUsedItem = gBattleMons[redCardBattler].item; + SaveBattlerTarget(redCardBattler); // save battler with red card + SaveBattlerAttacker(battlerAtk); + gBattleScripting.battler = gBattlerTarget = redCardBattler; + gEffectBattler = battlerAtk; + if (gBattleStruct->battlerState[battlerAtk].commanderSpecies != SPECIES_NONE + || GetBattlerAbility(battlerAtk) == ABILITY_GUARD_DOG + || GetActiveGimmick(battlerAtk) == GIMMICK_DYNAMAX) + BattleScriptCall(BattleScript_RedCardActivationNoSwitch); + else + BattleScriptCall(BattleScript_RedCardActivates); + + return TRUE; +} + +static bool32 TryEjectButton(u32 battlerAtk, u32 ejectButtonBattler) +{ + if (!IsBattlerTurnDamaged(ejectButtonBattler) + || !IsBattlerAlive(ejectButtonBattler) + || !CanBattlerSwitch(ejectButtonBattler)) + return FALSE; + + gBattleScripting.battler = ejectButtonBattler; + gLastUsedItem = gBattleMons[ejectButtonBattler].item; + gBattleStruct->battlerState[ejectButtonBattler].usedEjectItem = TRUE; + BattleScriptCall(BattleScript_EjectButtonActivates); + gAiLogicData->ejectButtonSwitch = TRUE; + return TRUE; +} + +static enum MoveEndResult MoveEnd_CardButton(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + u32 redCardBattlers = 0; + u32 ejectButtonBattlers = 0; + + // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattlerAttacker == battlerDef) + continue; + + if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_BUTTON) + ejectButtonBattlers |= 1u << battlerDef; + + if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_RED_CARD) + redCardBattlers |= 1u << battlerDef; + } + + if (!redCardBattlers && !ejectButtonBattlers) + { + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; + } + + u8 battlers[4] = {0, 1, 2, 3}; + SortBattlersBySpeed(battlers, FALSE); + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + u32 battler = battlers[battlerDef]; + + // Only fastest red card or eject button activates + if (redCardBattlers & 1u << battler && TryRedCard(gBattlerAttacker, battler, gCurrentMove)) + result = MOVEEND_STEP_RUN_SCRIPT; + else if (ejectButtonBattlers & 1u << battler && TryEjectButton(gBattlerAttacker, battler)) + result = MOVEEND_STEP_RUN_SCRIPT; + + if (result == MOVEEND_STEP_RUN_SCRIPT) + { + for (u32 i = 0; i < gBattlersCount; i++) + gBattleMons[i].volatiles.tryEjectPack = FALSE; + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; + return result; + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_LifeOrbShellBell(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (ItemBattleEffects(gBattlerAttacker, 0, GetBattlerHoldEffect(gBattlerAttacker), IsLifeOrbShellBellActivation)) + result = MOVEEND_STEP_RUN_SCRIPT; + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_FormChange(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_AFTER_MOVE)) + { + result = MOVEEND_STEP_RUN_SCRIPT; + BattleScriptCall(BattleScript_AttackerFormChangeMoveEffect); + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_EmergencyExit(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + u32 numEmergencyExitBattlers = 0; + u32 emergencyExitBattlers = 0; + + // Because sorting the battlers by speed takes lots of cycles, + // we check if EE can be activated and count how many. + for (u32 i = 0; i < gBattlersCount; i++) + { + if (IsBattlerTurnDamaged(i) && EmergencyExitCanBeTriggered(i)) + { + emergencyExitBattlers |= 1u << i; + numEmergencyExitBattlers++; + } + } + + if (numEmergencyExitBattlers == 0) + { + gBattleScripting.moveendState++; + return result; + } + + for (u32 i = 0; i < gBattlersCount; i++) + gBattleMons[i].volatiles.tryEjectPack = FALSE; + + u8 battlers[4] = {0, 1, 2, 3}; + if (numEmergencyExitBattlers > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + + if (!(emergencyExitBattlers & 1u << battler)) + continue; + + gBattleScripting.battler = battler; + BattleScriptCall(BattleScript_EmergencyExit); + result = MOVEEND_STEP_RUN_SCRIPT; + break; // Only the fastest Emergency Exit / Wimp Out activates + } + + if (result == MOVEEND_STEP_RUN_SCRIPT) + gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; + else + gBattleScripting.moveendState++; + return result; +} + +static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) +{ + if (gBattleMons[battlerDef].volatiles.tryEjectPack + && GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_PACK + && IsBattlerAlive(battlerDef) + && CountUsablePartyMons(battlerDef) > 0 + && !gProtectStructs[battlerDef].disableEjectPack + && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battlerAtk)) + && !(moveEffect == EFFECT_PARTING_SHOT && CanBattlerSwitch(battlerAtk))) + return TRUE; + return FALSE; +} + +static enum MoveEndResult MoveEnd_EjectPack(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + u32 ejectPackBattlers = 0; + u32 numEjectPackBattlers = 0; + + // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. + for (u32 i = 0; i < gBattlersCount; i++) + { + if (CanEjectPackTrigger(gBattlerAttacker, i, GetMoveEffect(gCurrentMove))) + { + ejectPackBattlers |= 1u << i; + numEjectPackBattlers++; + } + } + + if (numEjectPackBattlers == 0) + { + gBattleScripting.moveendState++; + return result; + } + + u8 battlers[4] = {0, 1, 2, 3}; + if (numEjectPackBattlers > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (u32 i = 0; i < gBattlersCount; i++) + gBattleMons[i].volatiles.tryEjectPack = FALSE; + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 battler = battlers[i]; + + if (!(ejectPackBattlers & 1u << battler)) + continue; + + gBattleScripting.battler = battler; + gLastUsedItem = gBattleMons[battler].item; + gBattleStruct->battlerState[battler].usedEjectItem = TRUE; + BattleScriptCall(BattleScript_EjectPackActivates); + gAiLogicData->ejectPackSwitch = TRUE; + result = MOVEEND_STEP_RUN_SCRIPT; + break; // Only the fastest Eject item activates + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_HitEscape(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_ESCAPE + && !gBattleStruct->unableToUseMove + && IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !NoAliveMonsForBattlerSide(gBattlerTarget)) + { + result = MOVEEND_STEP_RUN_SCRIPT; + BattleScriptCall(BattleScript_EffectHitEscape); + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ItemsEffectsAll(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); + if (ItemBattleEffects(battler, 0, holdEffect, IsOnStatusChangeActivation) + || ItemBattleEffects(battler, 0, holdEffect, IsOnHpThresholdActivation)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_WhiteHerb(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) + continue; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbActivation)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_Opportunist(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) + continue; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, TRUE)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_MirrorHerb(void) +{ + while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) + { + u32 battler = gBattleStruct->eventState.moveEndBattler++; + if (!IsBattlerAlive(battler)) + continue; + + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation)) + return MOVEEND_STEP_RUN_SCRIPT; + } + + gBattleStruct->eventState.moveEndBattler = 0; + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_Pickpocket(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (IsBattlerAlive(gBattlerAttacker) + && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item + && !GetBattlerPartyState(gBattlerAttacker)->isKnockedOff // But not knocked off + && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact + && !IsBattlerUnaffectedByMove(gBattlerTarget)) // Obviously attack needs to have worked + { + u8 battlers[4] = {0, 1, 2, 3}; + SortBattlersBySpeed(battlers, FALSE); // Pickpocket activates for fastest mon without item + for (u32 i = 0; i < gBattlersCount; i++) + { + u8 battler = battlers[i]; + // Attacker is mon who made contact, battler is mon with pickpocket + if (battler != gBattlerAttacker // Cannot pickpocket yourself + && GetBattlerAbility(battler) == ABILITY_PICKPOCKET // Target must have pickpocket ability + && IsBattlerTurnDamaged(battler) // Target needs to have been damaged + && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) // Subsitute unaffected + && IsBattlerAlive(battler) // Battler must be alive to pickpocket + && gBattleMons[battler].item == ITEM_NONE // Pickpocketer can't have an item already + && CanStealItem(battler, gBattlerAttacker, gBattleMons[gBattlerAttacker].item)) // Cannot steal plates, mega stones, etc + { + gBattlerTarget = gBattlerAbility = battler; + // Battle scripting is super brittle so we shall do the item exchange now (if possible) + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STICKY_HOLD) + StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item + + gEffectBattler = gBattlerAttacker; + BattleScriptCall(BattleScript_Pickpocket); // Includes sticky hold check to print separate string + result = MOVEEND_STEP_RUN_SCRIPT; + break; // Pickpocket activates on fastest mon, so exit loop. + } + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ThirdMoveBlock(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + switch (moveEffect) + { + case EFFECT_STEEL_ROLLER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY && IsBattlerTurnDamaged(gBattlerTarget)) + { + BattleScriptCall(BattleScript_RemoveTerrain); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_ICE_SPINNER: + if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY + && gLastPrintedMoves[gBattlerAttacker] == gCurrentMove + && IsBattlerAlive(gBattlerAttacker) + && IsBattlerTurnDamaged(gBattlerTarget)) + { + BattleScriptCall(BattleScript_RemoveTerrain); + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + case EFFECT_NATURAL_GIFT: + if (!gBattleStruct->unableToUseMove && GetItemPocket(gBattleMons[gBattlerAttacker].item) == POCKET_BERRIES) + { + enum Item item = gBattleMons[gBattlerAttacker].item; + gBattleMons[gBattlerAttacker].item = ITEM_NONE; + gBattleStruct->battlerState[gBattlerAttacker].canPickupItem = TRUE; + GetBattlerPartyState(gBattlerAttacker)->usedHeldItem = item; + CheckSetUnburden(gBattlerAttacker); + BtlController_EmitSetMonData( + gBattlerAttacker, + B_COMM_TO_CONTROLLER, + REQUEST_HELDITEM_BATTLE, + 0, + sizeof(gBattleMons[gBattlerAttacker].item), + &gBattleMons[gBattlerAttacker].item); + MarkBattlerForControllerExec(gBattlerAttacker); + ClearBattlerItemEffectHistory(gBattlerAttacker); + + if (!TrySymbiosis(gBattlerAttacker, item, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + } + break; + default: + break; + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_ChangedItems(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleStruct->changedItems[battler] != ITEM_NONE) + { + gBattleMons[battler].item = gBattleStruct->changedItems[battler]; + gBattleStruct->changedItems[battler] = ITEM_NONE; + } + } + + gBattleScripting.moveendState++; + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_ClearBits(void) +{ + ValidateBattlers(); + + enum Move originallyUsedMove = GetOriginallyUsedMove(gChosenMove); + enum Type moveType = GetBattleMoveType(gCurrentMove); + enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + + if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) + gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; + if (gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget) + gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; + + // If the Pokémon needs to keep track of move usage for its evolutions, do it + if (originallyUsedMove != MOVE_NONE) + TryUpdateEvolutionTracker(IF_USED_MOVE_X_TIMES, 1, originallyUsedMove); + + if (B_RAMPAGE_CANCELLING >= GEN_5 + && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging + && IsBattlerUnaffectedByMove(gBattlerTarget) // And it is unusable + && gBattleMons[gBattlerAttacker].volatiles.rampageTurns != 1) // And won't end this turn + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it + + SetSameMoveTurnValues(moveEffect); + TryClearChargeVolatile(moveType); + gProtectStructs[gBattlerAttacker].shellTrap = FALSE; + gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + gBattleStruct->swapDamageCategory = FALSE; + gBattleStruct->categoryOverride = FALSE; + gBattleStruct->additionalEffectsCounter = 0; + gBattleStruct->poisonPuppeteerConfusion = FALSE; + gBattleStruct->fickleBeamBoosted = FALSE; + gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; + gBattleStruct->toxicChainPriority = FALSE; + if (gBattleStruct->unableToUseMove) + gBattleStruct->pledgeMove = FALSE; + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) + SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); + if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) + gBattleMons[gBattlerAttacker].volatiles.destinyBond--; + // check if Stellar type boost should be used up + if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA + && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR + && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS + && IsTypeStellarBoosted(gBattlerAttacker, moveType)) + ExpendTypeStellarBoost(gBattlerAttacker, moveType); + memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); + + for (u32 i = 0; i < gBattlersCount; i++) + { + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; + gBattleMons[i].volatiles.tryEjectPack = FALSE; + + if (gBattleStruct->battlerState[i].commanderSpecies != SPECIES_NONE && !IsBattlerAlive(i)) + { + u32 partner = BATTLE_PARTNER(i); + gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; + if (IsBattlerAlive(partner)) + gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; + } + } + + // Need to check a specific battle during the end turn and dancer + gBattleMons[gBattlerAttacker].volatiles.unableToUseMove = gBattleStruct->unableToUseMove; + gBattleScripting.moveendState++; + + return MOVEEND_STEP_CONTINUE; +} + +static enum MoveEndResult MoveEnd_Dancer(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (IsDanceMove(gCurrentMove) && !gBattleStruct->snatchedMoveIsUsed) + { + u32 battler, nextDancer = 0; + bool32 hasDancerTriggered = FALSE; + + for (battler = 0; battler < gBattlersCount; battler++) + { + if (gSpecialStatuses[battler].dancerUsedMove) + { + // in case a battler fails to act on a Dancer-called move + hasDancerTriggered = TRUE; + break; + } + } + + if (!(!IsAnyTargetAffected() + || (gBattleStruct->unableToUseMove && !hasDancerTriggered) + || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) + { // Dance move succeeds + // Set target for other Dancer mons; set bit so that mon cannot activate Dancer off of its own move + if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) + { + gBattleScripting.savedBattler = gBattlerTarget | 0x4; + gBattleScripting.savedBattler |= (gBattlerAttacker << 4); + gSpecialStatuses[gBattlerAttacker].dancerUsedMove = TRUE; + } + for (battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) + { + if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) + nextDancer = battler | 0x4; + } + } + if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, gCurrentMove, TRUE)) + result = MOVEEND_STEP_RUN_SCRIPT; + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult MoveEnd_PursuitNextAction(void) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + if (gBattleStruct->battlerState[gBattlerTarget].pursuitTarget) + { + u32 storedTarget = gBattlerTarget; + if (SetTargetToNextPursuiter(gBattlerTarget)) + { + ChangeOrderTargetAfterAttacker(); + gBattleStruct->moveTarget[gBattlerTarget] = storedTarget; + gBattlerTarget = storedTarget; + } + else if (IsBattlerAlive(gBattlerTarget)) + { + gBattlerAttacker = gBattlerTarget; + if (gBattleStruct->pursuitStoredSwitch == PARTY_SIZE) + gBattlescriptCurrInstr = BattleScript_MoveSwitchOpenPartyScreen; + else + gBattlescriptCurrInstr = BattleScript_DoSwitchOut; + gBattleStruct->monToSwitchIntoId[gBattlerTarget] = gBattleStruct->pursuitStoredSwitch; + ClearPursuitValues(); + result = MOVEEND_STEP_RUN_SCRIPT; + } + } + + gBattleScripting.moveendState++; + return result; +} + +static enum MoveEndResult (*const sMoveEndHandlers[])(void) = +{ + [MOVEEND_SET_VALUES] = MoveEnd_SetValues, + [MOVEEND_PROTECT_LIKE_EFFECT] = MoveEnd_ProtectLikeEffect, + [MOVEEND_ABSORB] = MoveEnd_Absorb, + [MOVEEND_RAGE] = MoveEnd_Rage, + [MOVEEND_SYNCHRONIZE_TARGET] = MoveEnd_SynchronizeTarget, + [MOVEEND_ABILITIES] = MoveEnd_Abilities, + [MOVEEND_ABILITIES_ATTACKER] = MoveEnd_AbilitiesAttacker, + [MOVEEND_STATUS_IMMUNITY_ABILITIES] = MoveEnd_StatusImmunityAbilities, + [MOVEEND_SYNCHRONIZE_ATTACKER] = MoveEnd_SynchronizeAttacker, + [MOVEEND_ATTACKER_INVISIBLE] = MoveEnd_AttackerInvisible, + [MOVEEND_ATTACKER_VISIBLE] = MoveEnd_AttackerVisible, + [MOVEEND_TARGET_VISIBLE] = MoveEnd_TargetVisible, + [MOVEEND_ITEM_EFFECTS_TARGET] = MoveEnd_ItemEffectsTarget, + [MOVEEND_ITEM_EFFECTS_ATTACKER_1] = MoveEnd_ItemEffectsAttacker1, + [MOVEEND_SYMBIOSIS] = MoveEnd_Symbiosis, + [MOVEEND_SUBSTITUTE] = MoveEnd_Substitute, + [MOVEEND_FAINT_BLOCK] = MoveEnd_FaintBlock, + [MOVEEND_SKY_DROP_CONFUSE] = MoveEnd_SkyDropConfuse, + [MOVEEND_UPDATE_LAST_MOVES] = MoveEnd_UpdateLastMoves, + [MOVEEND_MIRROR_MOVE] = MoveEnd_MirrorMove, + [MOVEEND_DEFROST] = MoveEnd_Defrost, + [MOVEEND_NEXT_TARGET] = MoveEnd_NextTarget, + [MOVEEND_HP_THRESHOLD_ITEMS_TARGET] = MoveEnd_HpThresholdItemsTarget, + [MOVEEND_MULTIHIT_MOVE] = MoveEnd_MultihitMove, + [MOVEEND_MOVE_BLOCK] = MoveEnd_MoveBlock, + [MOVEEND_ITEM_EFFECTS_ATTACKER_2] = MoveEnd_ItemEffectsAttacker2, + [MOVEEND_ABILITY_EFFECT_FOES_FAINTED] = MoveEnd_AbilityEffectFoesFainted, + [MOVEEND_SHEER_FORCE] = MoveEnd_SheerForce, + [MOVEEND_SHELL_TRAP] = MoveEnd_ShellTrap, + [MOVEEND_COLOR_CHANGE] = MoveEnd_ColorChange, + [MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET] = MoveEnd_KeeMarangaHpThresholdItemTarget, + [MOVEEND_CARD_BUTTON] = MoveEnd_CardButton, + [MOVEEND_LIFE_ORB_SHELL_BELL] = MoveEnd_LifeOrbShellBell, + [MOVEEND_FORM_CHANGE] = MoveEnd_FormChange, + [MOVEEND_EMERGENCY_EXIT] = MoveEnd_EmergencyExit, + [MOVEEND_EJECT_PACK] = MoveEnd_EjectPack, + [MOVEEND_HIT_ESCAPE] = MoveEnd_HitEscape, + [MOVEEND_ITEMS_EFFECTS_ALL] = MoveEnd_ItemsEffectsAll, + [MOVEEND_WHITE_HERB] = MoveEnd_WhiteHerb, + [MOVEEND_OPPORTUNIST] = MoveEnd_Opportunist, + [MOVEEND_MIRROR_HERB] = MoveEnd_MirrorHerb, + [MOVEEND_PICKPOCKET] = MoveEnd_Pickpocket, + [MOVEEND_THIRD_MOVE_BLOCK] = MoveEnd_ThirdMoveBlock, + [MOVEEND_CHANGED_ITEMS] = MoveEnd_ChangedItems, + [MOVEEND_CLEAR_BITS] = MoveEnd_ClearBits, + [MOVEEND_DANCER] = MoveEnd_Dancer, + [MOVEEND_PURSUIT_NEXT_ACTION] = MoveEnd_PursuitNextAction, +}; + +bool32 DoMoveEnd(enum MoveEndState endMode, enum MoveEndState endState) +{ + enum MoveEndResult result = MOVEEND_STEP_CONTINUE; + + do + { + result = sMoveEndHandlers[gBattleScripting.moveendState](); + + if (endMode == 1 && result == MOVEEND_STEP_CONTINUE) + gBattleScripting.moveendState = MOVEEND_COUNT; + if (endMode == 2 && endState == gBattleScripting.moveendState) + gBattleScripting.moveendState = MOVEEND_COUNT; + + } while (gBattleScripting.moveendState != MOVEEND_COUNT && result == MOVEEND_STEP_CONTINUE); + + return result; +} + +// Utility functions + +static void ValidateBattlers(void) +{ + assertf(gBattlerAttacker < gBattlersCount, "invalid gBattlerAttacker: %d\nmove: %S", gBattlerAttacker, GetMoveName(gCurrentMove)); + assertf(gBattlerTarget < gBattlersCount, "invalid gBattlerTarget: %d\nmove: %S", gBattlerTarget, GetMoveName(gCurrentMove)); + + // More calls to SaveBattlerAttacker than RestoreBattlerAttacker. + assertf(gBattleStruct->savedAttackerCount == 0, "savedAttackerCount is greater than 0"); + + // More calls to SaveBattlerTarget than RestoreBattlerTarget. + assertf(gBattleStruct->savedTargetCount == 0, "savedTargetCount is greater than 0"); +} + +static enum Move GetOriginallyUsedMove(enum Move chosenMove) +{ + return (gChosenMove == MOVE_UNAVAILABLE) ? MOVE_NONE : gChosenMove; +} + +static void SetSameMoveTurnValues(u32 moveEffect) +{ + bool32 increment = IsAnyTargetAffected() + && !gBattleStruct->unableToUseMove + && gLastResultingMoves[gBattlerAttacker] == gCurrentMove; + + switch (moveEffect) + { + case EFFECT_FURY_CUTTER: + if (increment && gBattleMons[gBattlerAttacker].volatiles.furyCutterCounter < 5) + gBattleMons[gBattlerAttacker].volatiles.furyCutterCounter++; + else + gBattleMons[gBattlerAttacker].volatiles.furyCutterCounter = 0; + break; + case EFFECT_ROLLOUT: + if (increment && ++gBattleMons[gBattlerAttacker].volatiles.rolloutTimer < 5) + { + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; + gLockedMoves[gBattlerAttacker] = gCurrentMove; + } + else + { + gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; + gBattleMons[gBattlerAttacker].volatiles.rolloutTimer = 0; + } + break; + case EFFECT_ECHOED_VOICE: + if (!gBattleStruct->unableToUseMove) // Increment even if targets unaffected + gBattleStruct->incrementEchoedVoice = TRUE; + break; + default: // not consecutive + gBattleMons[gBattlerAttacker].volatiles.rolloutTimer = 0; + gBattleMons[gBattlerAttacker].volatiles.furyCutterCounter = 0; + break; + } + + if (increment) + gBattleMons[gBattlerAttacker].volatiles.metronomeItemCounter++; + else + gBattleMons[gBattlerAttacker].volatiles.metronomeItemCounter = 0; +} + +static void TryClearChargeVolatile(enum Type moveType) +{ + if (B_CHARGE < GEN_9) // Prior to gen9, charge is cleared during the end turn + return; + + if (moveType == TYPE_ELECTRIC && gBattleMons[gBattlerAttacker].volatiles.chargeTimer == 1) + gBattleMons[gBattlerAttacker].volatiles.chargeTimer = 0; + + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleMons[battler].volatiles.chargeTimer == 2) // Has been set this turn by move or ability + gBattleMons[battler].volatiles.chargeTimer--; + } +} + +static inline bool32 IsBattlerUsingBeakBlast(u32 battler) +{ + if (gChosenActionByBattler[battler] != B_ACTION_USE_MOVE) + return FALSE; + if (GetMoveEffect(gChosenMoveByBattler[battler]) != EFFECT_BEAK_BLAST) + return FALSE; + return !HasBattlerActedThisTurn(battler); +} + +// Is there any point in still doing this? +void MoveValuesCleanUp(void) +{ + gBattleScripting.moveEffect = MOVE_EFFECT_NONE; + gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; + gBattleCommunication[MISS_TYPE] = 0; +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 392578514..87d642373 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3,11 +3,14 @@ #include "battle_hold_effects.h" #include "battle_message.h" #include "battle_anim.h" +#include "battle_anim_scripts.h" #include "battle_ai_main.h" #include "battle_ai_util.h" #include "battle_scripts.h" +#include "battle_switch_in.h" #include "battle_environment.h" #include "battle_z_move.h" +#include "battle_move_resolution.h" #include "item.h" #include "util.h" #include "pokemon.h" @@ -321,27 +324,20 @@ static void DrawLevelUpWindow2(void); static void PutMonIconOnLvlUpBanner(void); static void DrawLevelUpBannerText(void); static void SpriteCB_MonIconOnLvlUpBanner(struct Sprite *sprite); -static bool32 CriticalCapture(u32 odds); -static void BestowItem(u32 battlerAtk, u32 battlerDef); static bool32 IsFinalStrikeEffect(enum MoveEffect moveEffect); static void TryUpdateRoundTurnOrder(void); -static bool32 ChangeOrderTargetAfterAttacker(void); -static bool32 SetTargetToNextPursuiter(u32 battlerDef); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllWeather(void); static void RemoveAllTerrains(void); static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef); -static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); -static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove); -static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move); +static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr); static void ResetValuesForCalledMove(void); -static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd); static bool32 CanAbilityShieldActivateForBattler(u32 battler); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); static void Cmd_printattackstring(void); -static void Cmd_unused_0x3(void); +static void Cmd_printselectionstringfromtable(void); static void Cmd_critcalc(void); static void Cmd_damagecalc(void); static void Cmd_typecalc(void); @@ -358,7 +354,7 @@ static void Cmd_printstring(void); static void Cmd_printselectionstring(void); static void Cmd_waitmessage(void); static void Cmd_printfromtable(void); -static void Cmd_printselectionstringfromtable(void); +static void Cmd_setpreattackadditionaleffect(void); static void Cmd_setadditionaleffects(void); static void Cmd_seteffectprimary(void); static void Cmd_seteffectsecondary(void); @@ -410,7 +406,7 @@ static void Cmd_endselectionscript(void); static void Cmd_playanimation(void); static void Cmd_playanimation_var(void); static void Cmd_jumpfifsemiinvulnerable(void); -static void Cmd_unused_0x48(void); +static void Cmd_trainerslidein(void); static void Cmd_moveend(void); static void Cmd_sethealblock(void); static void Cmd_returnatktoball(void); @@ -421,7 +417,7 @@ static void Cmd_jumpifcantswitch(void); static void Cmd_openpartyscreen(void); static void Cmd_switchhandleorder(void); static void Cmd_switchineffects(void); -static void Cmd_trainerslidein(void); +static void Cmd_switchinevents(void); static void Cmd_playse(void); static void Cmd_fanfare(void); static void Cmd_playfaintcry(void); @@ -439,8 +435,8 @@ static void Cmd_drawpartystatussummary(void); static void Cmd_hidepartystatussummary(void); static void Cmd_jumptocalledmove(void); static void Cmd_statusanimation(void); -static void Cmd_unused_0x65(void); -static void Cmd_unused_0x66(void); +static void Cmd_futuresighttargetfailure(void); +static void Cmd_getpossiblenexttarget(void); static void Cmd_yesnobox(void); static void Cmd_cancelallactions(void); static void Cmd_setgravity(void); @@ -499,8 +495,8 @@ static void Cmd_mimicattackcopy(void); static void Cmd_setcalledmove(void); static void Cmd_unused_0x9f(void); static void Cmd_unused_0xA0(void); -static void Cmd_counterdamagecalculator(void); -static void Cmd_mirrorcoatdamagecalculator(void); +static void Cmd_unused_0xA1(void); +static void Cmd_unused_0xA2(void); static void Cmd_disablelastusedattack(void); static void Cmd_trysetencore(void); static void Cmd_painsplitdmgcalc(void); @@ -517,9 +513,9 @@ static void Cmd_cursetarget(void); static void Cmd_trysetspikes(void); static void Cmd_setvolatile(void); static void Cmd_trysetperishsong(void); -static void Cmd_handlerollout(void); +static void Cmd_unused_0xb3(void); static void Cmd_jumpifconfusedandstatmaxed(void); -static void Cmd_handlefurycutter(void); +static void Cmd_unused_0xb5(void); static void Cmd_setembargo(void); static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); @@ -536,16 +532,16 @@ static void Cmd_selectfirstvalidtarget(void); static void Cmd_setfutureattack(void); static void Cmd_trydobeatup(void); static void Cmd_setsemiinvulnerablebit(void); -static void Cmd_tryfiretwoturnmovenowbyeffect(void); +static void Cmd_unused_0xC6(void); static void Cmd_unused_0xC7(void); static void Cmd_unused_c8(void); static void Cmd_trymemento(void); static void Cmd_setforcedtarget(void); -static void Cmd_setcharge(void); +static void Cmd_unused_0xcb(void); static void Cmd_unused_0xCC(void); static void Cmd_curestatuswithmove(void); static void Cmd_settorment(void); -static void Cmd_jumpifnodamage(void); +static void Cmd_unused_0xCF(void); static void Cmd_settaunt(void); static void Cmd_trysethelpinghand(void); static void Cmd_tryswapitems(void); @@ -554,7 +550,7 @@ static void Cmd_trywish(void); static void Cmd_settoxicspikes(void); static void Cmd_setgastroacid(void); static void Cmd_setyawn(void); -static void Cmd_setdamagetohealthdifference(void); +static void Cmd_unused0xd8(void); static void Cmd_setroom(void); static void Cmd_tryswapabilities(void); static void Cmd_tryimprison(void); @@ -576,13 +572,13 @@ static void Cmd_tryrecycleitem(void); static void Cmd_settypetoenvironment(void); static void Cmd_pursuitdoubles(void); static void Cmd_snatchsetbattlers(void); -static void Cmd_removescreens(void); +static void Cmd_unused_0xee(void); static void Cmd_handleballthrow(void); static void Cmd_givecaughtmon(void); static void Cmd_trysetcaughtmondexflags(void); static void Cmd_displaydexinfo(void); static void Cmd_trygivecaughtmonnick(void); -static void Cmd_unused_0xf4(void); +static void Cmd_sortbattlers(void); static void Cmd_removeattackerstatus1(void); static void Cmd_finishaction(void); static void Cmd_finishturn(void); @@ -597,262 +593,262 @@ static void Cmd_callnative(void); void (*const gBattleScriptingCommandsTable[])(void) = { - Cmd_attackcanceler, //0x0 - Cmd_accuracycheck, //0x1 - Cmd_printattackstring, //0x2 - Cmd_unused_0x3, //0x3 - Cmd_critcalc, //0x4 - Cmd_damagecalc, //0x5 - Cmd_typecalc, //0x6 - Cmd_adjustdamage, //0x7 - Cmd_multihitresultmessage, //0x8 - Cmd_attackanimation, //0x9 - Cmd_waitanimation, //0xA - Cmd_healthbarupdate, //0xB - Cmd_datahpupdate, //0xC - Cmd_critmessage, //0xD - Cmd_effectivenesssound, //0xE - Cmd_resultmessage, //0xF - Cmd_printstring, //0x10 - Cmd_printselectionstring, //0x11 - Cmd_waitmessage, //0x12 - Cmd_printfromtable, //0x13 - Cmd_printselectionstringfromtable, //0x14 - Cmd_setadditionaleffects, //0x15 - Cmd_seteffectprimary, //0x16 - Cmd_seteffectsecondary, //0x17 - Cmd_clearvolatile, //0x18 - Cmd_tryfaintmon, //0x19 - Cmd_dofaintanimation, //0x1A - Cmd_cleareffectsonfaint, //0x1B - Cmd_jumpifstatus, //0x1C - Cmd_jumpifvolatile, //0x1D - Cmd_jumpifability, //0x1E - Cmd_jumpifsideaffecting, //0x1F - Cmd_jumpifstat, //0x20 - Cmd_jumpifstatignorecontrary, //0x21 - Cmd_jumpbasedontype, //0x22 - Cmd_getexp, //0x23 - Cmd_checkteamslost, //0x24 - Cmd_movevaluescleanup, //0x25 - Cmd_setmultihit, //0x26 - Cmd_decrementmultihit, //0x27 - Cmd_goto, //0x28 - Cmd_jumpifbyte, //0x29 - Cmd_jumpifhalfword, //0x2A - Cmd_jumpifword, //0x2B - Cmd_jumpifarrayequal, //0x2C - Cmd_jumpifarraynotequal, //0x2D - Cmd_setbyte, //0x2E - Cmd_addbyte, //0x2F - Cmd_subbyte, //0x30 - Cmd_copyarray, //0x31 - Cmd_copyarraywithindex, //0x32 - Cmd_orbyte, //0x33 - Cmd_orhalfword, //0x34 - Cmd_orword, //0x35 - Cmd_bicbyte, //0x36 - Cmd_bichalfword, //0x37 - Cmd_bicword, //0x38 - Cmd_pause, //0x39 - Cmd_waitstate, //0x3A - Cmd_isdmgblockedbydisguise, //0x3B - Cmd_return, //0x3C - Cmd_end, //0x3D - Cmd_end2, //0x3E - Cmd_end3, //0x3F - Cmd_setchargingturn, //0x40 - Cmd_call, //0x41 - Cmd_setroost, //0x42 - Cmd_jumpifabilitypresent, //0x43 - Cmd_endselectionscript, //0x44 - Cmd_playanimation, //0x45 - Cmd_playanimation_var, //0x46 - Cmd_jumpfifsemiinvulnerable, //0x47 - Cmd_unused_0x48, //0x48 - Cmd_moveend, //0x49 - Cmd_sethealblock, //0x4A - Cmd_returnatktoball, //0x4B - Cmd_getswitchedmondata, //0x4C - Cmd_switchindataupdate, //0x4D - Cmd_switchinanim, //0x4E - Cmd_jumpifcantswitch, //0x4F - Cmd_openpartyscreen, //0x50 - Cmd_switchhandleorder, //0x51 - Cmd_switchineffects, //0x52 - Cmd_trainerslidein, //0x53 - Cmd_playse, //0x54 - Cmd_fanfare, //0x55 - Cmd_playfaintcry, //0x56 - Cmd_endlinkbattle, //0x57 - Cmd_returntoball, //0x58 - Cmd_handlelearnnewmove, //0x59 - Cmd_yesnoboxlearnmove, //0x5A - Cmd_yesnoboxstoplearningmove, //0x5B - Cmd_hitanimation, //0x5C - Cmd_getmoneyreward, //0x5D - Cmd_updatebattlermoves, //0x5E - Cmd_swapattackerwithtarget, //0x5F - Cmd_incrementgamestat, //0x60 - Cmd_drawpartystatussummary, //0x61 - Cmd_hidepartystatussummary, //0x62 - Cmd_jumptocalledmove, //0x63 - Cmd_statusanimation, //0x64 - Cmd_unused_0x65, //0x65 - Cmd_unused_0x66, //0x66 - Cmd_yesnobox, //0x67 - Cmd_cancelallactions, //0x68 - Cmd_setgravity, //0x69 - Cmd_removeitem, //0x6A - Cmd_atknameinbuff1, //0x6B - Cmd_drawlvlupbox, //0x6C - Cmd_resetsentmonsvalue, //0x6D - Cmd_setatktoplayer0, //0x6E - Cmd_makevisible, //0x6F - Cmd_recordability, //0x70 - Cmd_buffermovetolearn, //0x71 - Cmd_jumpifplayerran, //0x72 - Cmd_hpthresholds, //0x73 - Cmd_hpthresholds2, //0x74 - Cmd_useitemonopponent, //0x75 - Cmd_unused_0x78, //0x76 - Cmd_setprotectlike, //0x77 - Cmd_tryexplosion, //0x78 - Cmd_setatkhptozero, //0x79 - Cmd_jumpifnexttargetvalid, //0x7A - Cmd_tryhealhalfhealth, //0x7B - Cmd_unused_0x7e, //0x7C - Cmd_setfieldweather, //0x7D - Cmd_setreflect, //0x7E - Cmd_setseeded, //0x7F - Cmd_manipulatedamage, //0x80 - Cmd_trysetrest, //0x81 - Cmd_unused_0x82, //0x82 - Cmd_unused_0x83, //0x83 - Cmd_jumpifuproarwakes, //0x84 - Cmd_stockpile, //0x85 - Cmd_stockpiletobasedamage, //0x86 - Cmd_stockpiletohpheal, //0x87 - Cmd_unused_0x88, //0x88 - Cmd_statbuffchange, //0x89 - Cmd_normalisebuffs, //0x8A - Cmd_setbide, //0x8B - Cmd_twoturnmoveschargestringandanimation, //0x8C - Cmd_trynonvolatilestatus, //0x8D - Cmd_initmultihitstring, //0x8E - Cmd_forcerandomswitch, //0x8F - Cmd_tryconversiontypechange, //0x90 - Cmd_givepaydaymoney, //0x91 - Cmd_setlightscreen, //0x92 - Cmd_tryKO, //0x93 - Cmd_checknonvolatiletrigger, //0x94 - Cmd_copybidedmg, //0x95 - Cmd_animatewildpokemonafterfailedpokeball, //0x96 - Cmd_tryinfatuating, //0x97 - Cmd_updatestatusicon, //0x98 - Cmd_setmist, //0x99 - Cmd_setfocusenergy, //0x9A - Cmd_transformdataexecution, //0x9B - Cmd_setsubstitute, //0x9C - Cmd_mimicattackcopy, //0x9D - Cmd_setcalledmove, //0x9E - Cmd_unused_0x9f, //0x9F - Cmd_unused_0xA0, //0xA0 - Cmd_counterdamagecalculator, //0xA1 - Cmd_mirrorcoatdamagecalculator, //0xA2 - Cmd_disablelastusedattack, //0xA3 - Cmd_trysetencore, //0xA4 - Cmd_painsplitdmgcalc, //0xA5 - Cmd_settypetorandomresistance, //0xA6 - Cmd_setalwayshitflag, //0xA7 - Cmd_copymovepermanently, //0xA8 - Cmd_unused_0xA9, //0xA9 - Cmd_unused_AA, //0xAA - Cmd_unused_0xab, //0xAB - Cmd_settailwind, //0xAC - Cmd_tryspiteppreduce, //0xAD - Cmd_healpartystatus, //0xAE - Cmd_cursetarget, //0xAF - Cmd_trysetspikes, //0xB0 - Cmd_setvolatile, //0xB1 - Cmd_trysetperishsong, //0xB2 - Cmd_handlerollout, //0xB3 - Cmd_jumpifconfusedandstatmaxed, //0xB4 - Cmd_handlefurycutter, //0xB5 - Cmd_setembargo, //0xB6 - Cmd_presentdamagecalculation, //0xB7 - Cmd_setsafeguard, //0xB8 - Cmd_magnitudedamagecalculation, //0xB9 - Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_tryactivateitem, //0xBB - Cmd_halvehp, //0xBC - Cmd_copyfoestats, //0xBD - Cmd_rapidspinfree, //0xBE - Cmd_unused_0xBF, //0xBF - Cmd_recoverbasedonsunlight, //0xC0 - Cmd_setstickyweb, //0xC1 - Cmd_selectfirstvalidtarget, //0xC2 - Cmd_setfutureattack, //0xC3 - Cmd_trydobeatup, //0xC4 - Cmd_setsemiinvulnerablebit, //0xC5 - Cmd_tryfiretwoturnmovenowbyeffect, //0xC6 - Cmd_unused_0xC7, //0xC7 - Cmd_unused_c8, //0xC8 - Cmd_trymemento, //0xC9 - Cmd_setforcedtarget, //0xCA - Cmd_setcharge, //0xCB - Cmd_unused_0xCC, //0xCC - Cmd_curestatuswithmove, //0xCD - Cmd_settorment, //0xCE - Cmd_jumpifnodamage, //0xCF - Cmd_settaunt, //0xD0 - Cmd_trysethelpinghand, //0xD1 - Cmd_tryswapitems, //0xD2 - Cmd_trycopyability, //0xD3 - Cmd_trywish, //0xD4 - Cmd_settoxicspikes, //0xD5 - Cmd_setgastroacid, //0xD6 - Cmd_setyawn, //0xD7 - Cmd_setdamagetohealthdifference, //0xD8 - Cmd_setroom, //0xD9 - Cmd_tryswapabilities, //0xDA - Cmd_tryimprison, //0xDB - Cmd_setstealthrock, //0xDC - Cmd_trysetvolatile, //0xDD - Cmd_unused_0xde, //0xDE - Cmd_trysetmagiccoat, //0xDF - Cmd_trysetsnatch, //0xE0 - Cmd_unused2, //0xE1 - Cmd_switchoutabilities, //0xE2 - Cmd_jumpifhasnohp, //0xE3 - Cmd_unused_0xE4, //0xE4 - Cmd_pickup, //0xE5 - Cmd_unused_0xE6, //0xE6 - Cmd_unused_0xE7, //0xE7 - Cmd_settypebasedhalvers, //0xE8 - Cmd_jumpifsubstituteblocks, //0xE9 - Cmd_tryrecycleitem, //0xEA - Cmd_settypetoenvironment, //0xEB - Cmd_pursuitdoubles, //0xEC - Cmd_snatchsetbattlers, //0xED - Cmd_removescreens, //0xEE - Cmd_handleballthrow, //0xEF - Cmd_givecaughtmon, //0xF0 - Cmd_trysetcaughtmondexflags, //0xF1 - Cmd_displaydexinfo, //0xF2 - Cmd_trygivecaughtmonnick, //0xF3 - Cmd_unused_0xf4, //0xF4 - Cmd_removeattackerstatus1, //0xF5 - Cmd_finishaction, //0xF6 - Cmd_finishturn, //0xF7 - Cmd_trainerslideout, //0xF8 - Cmd_settelekinesis, //0xF9 - Cmd_swapstatstages, //0xFA - Cmd_averagestats, //0xFB - Cmd_jumpifcaptivateaffected, //0xFC - Cmd_setnonvolatilestatus, //0xFD - Cmd_tryoverwriteability, //0xFE - Cmd_callnative, //0xFF + [B_SCR_OP_ATTACKCANCELER] = Cmd_attackcanceler, + [B_SCR_OP_ACCURACYCHECK] = Cmd_accuracycheck, + [B_SCR_OP_PRINTATTACKSTRING] = Cmd_printattackstring, + [B_SCR_OP_PRINTSELECTIONSTRINGFROMTABLE] = Cmd_printselectionstringfromtable, + [B_SCR_OP_CRITCALC] = Cmd_critcalc, + [B_SCR_OP_DAMAGECALC] = Cmd_damagecalc, + [B_SCR_OP_TYPECALC] = Cmd_typecalc, + [B_SCR_OP_ADJUSTDAMAGE] = Cmd_adjustdamage, + [B_SCR_OP_MULTIHITRESULTMESSAGE] = Cmd_multihitresultmessage, + [B_SCR_OP_ATTACKANIMATION] = Cmd_attackanimation, + [B_SCR_OP_WAITANIMATION] = Cmd_waitanimation, + [B_SCR_OP_HEALTHBARUPDATE] = Cmd_healthbarupdate, + [B_SCR_OP_DATAHPUPDATE] = Cmd_datahpupdate, + [B_SCR_OP_CRITMESSAGE] = Cmd_critmessage, + [B_SCR_OP_EFFECTIVENESSSOUND] = Cmd_effectivenesssound, + [B_SCR_OP_RESULTMESSAGE] = Cmd_resultmessage, + [B_SCR_OP_PRINTSTRING] = Cmd_printstring, + [B_SCR_OP_PRINTSELECTIONSTRING] = Cmd_printselectionstring, + [B_SCR_OP_WAITMESSAGE] = Cmd_waitmessage, + [B_SCR_OP_PRINTFROMTABLE] = Cmd_printfromtable, + [B_SCR_OP_SETPREATTACKADDITIONALEFFECT] = Cmd_setpreattackadditionaleffect, + [B_SCR_OP_SETADDITIONALEFFECTS] = Cmd_setadditionaleffects, + [B_SCR_OP_SETEFFECTPRIMARY] = Cmd_seteffectprimary, + [B_SCR_OP_SETEFFECTSECONDARY] = Cmd_seteffectsecondary, + [B_SCR_OP_CLEARVOLATILE] = Cmd_clearvolatile, + [B_SCR_OP_TRYFAINTMON] = Cmd_tryfaintmon, + [B_SCR_OP_DOFAINTANIMATION] = Cmd_dofaintanimation, + [B_SCR_OP_CLEAREFFECTSONFAINT] = Cmd_cleareffectsonfaint, + [B_SCR_OP_JUMPIFSTATUS] = Cmd_jumpifstatus, + [B_SCR_OP_JUMPIFVOLATILE] = Cmd_jumpifvolatile, + [B_SCR_OP_JUMPIFABILITY] = Cmd_jumpifability, + [B_SCR_OP_JUMPIFSIDEAFFECTING] = Cmd_jumpifsideaffecting, + [B_SCR_OP_JUMPIFSTAT] = Cmd_jumpifstat, + [B_SCR_OP_JUMPIFSTATIGNORECONTRARY] = Cmd_jumpifstatignorecontrary, + [B_SCR_OP_JUMPBASEDONTYPE] = Cmd_jumpbasedontype, + [B_SCR_OP_GETEXP] = Cmd_getexp, + [B_SCR_OP_CHECKTEAMSLOST] = Cmd_checkteamslost, + [B_SCR_OP_MOVEVALUESCLEANUP] = Cmd_movevaluescleanup, + [B_SCR_OP_SETMULTIHIT] = Cmd_setmultihit, + [B_SCR_OP_DECREMENTMULTIHIT] = Cmd_decrementmultihit, + [B_SCR_OP_GOTO] = Cmd_goto, + [B_SCR_OP_JUMPIFBYTE] = Cmd_jumpifbyte, + [B_SCR_OP_JUMPIFHALFWORD] = Cmd_jumpifhalfword, + [B_SCR_OP_JUMPIFWORD] = Cmd_jumpifword, + [B_SCR_OP_JUMPIFARRAYEQUAL] = Cmd_jumpifarrayequal, + [B_SCR_OP_JUMPIFARRAYNOTEQUAL] = Cmd_jumpifarraynotequal, + [B_SCR_OP_SETBYTE] = Cmd_setbyte, + [B_SCR_OP_ADDBYTE] = Cmd_addbyte, + [B_SCR_OP_SUBBYTE] = Cmd_subbyte, + [B_SCR_OP_COPYARRAY] = Cmd_copyarray, + [B_SCR_OP_COPYARRAYWITHINDEX] = Cmd_copyarraywithindex, + [B_SCR_OP_ORBYTE] = Cmd_orbyte, + [B_SCR_OP_ORHALFWORD] = Cmd_orhalfword, + [B_SCR_OP_ORWORD] = Cmd_orword, + [B_SCR_OP_BICBYTE] = Cmd_bicbyte, + [B_SCR_OP_BICHALFWORD] = Cmd_bichalfword, + [B_SCR_OP_BICWORD] = Cmd_bicword, + [B_SCR_OP_PAUSE] = Cmd_pause, + [B_SCR_OP_WAITSTATE] = Cmd_waitstate, + [B_SCR_OP_ISDMGBLOCKEDBYDISGUISE] = Cmd_isdmgblockedbydisguise, + [B_SCR_OP_RETURN] = Cmd_return, + [B_SCR_OP_END] = Cmd_end, + [B_SCR_OP_END2] = Cmd_end2, + [B_SCR_OP_END3] = Cmd_end3, + [B_SCR_OP_SETCHARGINGTURN] = Cmd_setchargingturn, + [B_SCR_OP_CALL] = Cmd_call, + [B_SCR_OP_SETROOST] = Cmd_setroost, + [B_SCR_OP_JUMPIFABILITYPRESENT] = Cmd_jumpifabilitypresent, + [B_SCR_OP_ENDSELECTIONSCRIPT] = Cmd_endselectionscript, + [B_SCR_OP_PLAYANIMATION] = Cmd_playanimation, + [B_SCR_OP_PLAYANIMATION_VAR] = Cmd_playanimation_var, + [B_SCR_OP_JUMPFIFSEMIINVULNERABLE] = Cmd_jumpfifsemiinvulnerable, + [B_SCR_OP_TRAINERSLIDEIN] = Cmd_trainerslidein, + [B_SCR_OP_MOVEEND] = Cmd_moveend, + [B_SCR_OP_SETHEALBLOCK] = Cmd_sethealblock, + [B_SCR_OP_RETURNATKTOBALL] = Cmd_returnatktoball, + [B_SCR_OP_GETSWITCHEDMONDATA] = Cmd_getswitchedmondata, + [B_SCR_OP_SWITCHINDATAUPDATE] = Cmd_switchindataupdate, + [B_SCR_OP_SWITCHINANIM] = Cmd_switchinanim, + [B_SCR_OP_JUMPIFCANTSWITCH] = Cmd_jumpifcantswitch, + [B_SCR_OP_OPENPARTYSCREEN] = Cmd_openpartyscreen, + [B_SCR_OP_SWITCHHANDLEORDER] = Cmd_switchhandleorder, + [B_SCR_OP_SWITCHINEFFECTS] = Cmd_switchineffects, + [B_SCR_OP_SWITCHINEVENTS] = Cmd_switchinevents, + [B_SCR_OP_PLAYSE] = Cmd_playse, + [B_SCR_OP_FANFARE] = Cmd_fanfare, + [B_SCR_OP_PLAYFAINTCRY] = Cmd_playfaintcry, + [B_SCR_OP_ENDLINKBATTLE] = Cmd_endlinkbattle, + [B_SCR_OP_RETURNTOBALL] = Cmd_returntoball, + [B_SCR_OP_HANDLELEARNNEWMOVE] = Cmd_handlelearnnewmove, + [B_SCR_OP_YESNOBOXLEARNMOVE] = Cmd_yesnoboxlearnmove, + [B_SCR_OP_YESNOBOXSTOPLEARNINGMOVE] = Cmd_yesnoboxstoplearningmove, + [B_SCR_OP_HITANIMATION] = Cmd_hitanimation, + [B_SCR_OP_GETMONEYREWARD] = Cmd_getmoneyreward, + [B_SCR_OP_UPDATEBATTLERMOVES] = Cmd_updatebattlermoves, + [B_SCR_OP_SWAPATTACKERWITHTARGET] = Cmd_swapattackerwithtarget, + [B_SCR_OP_INCREMENTGAMESTAT] = Cmd_incrementgamestat, + [B_SCR_OP_DRAWPARTYSTATUSSUMMARY] = Cmd_drawpartystatussummary, + [B_SCR_OP_HIDEPARTYSTATUSSUMMARY] = Cmd_hidepartystatussummary, + [B_SCR_OP_JUMPTOCALLEDMOVE] = Cmd_jumptocalledmove, + [B_SCR_OP_STATUSANIMATION] = Cmd_statusanimation, + [B_SCR_OP_FUTURESIGHTTARGETFAILURE] = Cmd_futuresighttargetfailure, + [B_SCR_OP_GETPOSSIBLENEXTTARGET] = Cmd_getpossiblenexttarget, + [B_SCR_OP_YESNOBOX] = Cmd_yesnobox, + [B_SCR_OP_CANCELALLACTIONS] = Cmd_cancelallactions, + [B_SCR_OP_SETGRAVITY] = Cmd_setgravity, + [B_SCR_OP_REMOVEITEM] = Cmd_removeitem, + [B_SCR_OP_ATKNAMEINBUFF1] = Cmd_atknameinbuff1, + [B_SCR_OP_DRAWLVLUPBOX] = Cmd_drawlvlupbox, + [B_SCR_OP_RESETSENTMONSVALUE] = Cmd_resetsentmonsvalue, + [B_SCR_OP_SETATKTOPLAYER0] = Cmd_setatktoplayer0, + [B_SCR_OP_MAKEVISIBLE] = Cmd_makevisible, + [B_SCR_OP_RECORDABILITY] = Cmd_recordability, + [B_SCR_OP_BUFFERMOVETOLEARN] = Cmd_buffermovetolearn, + [B_SCR_OP_JUMPIFPLAYERRAN] = Cmd_jumpifplayerran, + [B_SCR_OP_HPTHRESHOLDS] = Cmd_hpthresholds, + [B_SCR_OP_HPTHRESHOLDS2] = Cmd_hpthresholds2, + [B_SCR_OP_USEITEMONOPPONENT] = Cmd_useitemonopponent, + [B_SCR_OP_UNUSED_0X78] = Cmd_unused_0x78, + [B_SCR_OP_SETPROTECTLIKE] = Cmd_setprotectlike, + [B_SCR_OP_TRYEXPLOSION] = Cmd_tryexplosion, + [B_SCR_OP_SETATKHPTOZERO] = Cmd_setatkhptozero, + [B_SCR_OP_JUMPIFNEXTTARGETVALID] = Cmd_jumpifnexttargetvalid, + [B_SCR_OP_TRYHEALHALFHEALTH] = Cmd_tryhealhalfhealth, + [B_SCR_OP_UNUSED_0X7E] = Cmd_unused_0x7e, + [B_SCR_OP_SETFIELDWEATHER] = Cmd_setfieldweather, + [B_SCR_OP_SETREFLECT] = Cmd_setreflect, + [B_SCR_OP_SETSEEDED] = Cmd_setseeded, + [B_SCR_OP_MANIPULATEDAMAGE] = Cmd_manipulatedamage, + [B_SCR_OP_TRYSETREST] = Cmd_trysetrest, + [B_SCR_OP_UNUSED_0X82] = Cmd_unused_0x82, + [B_SCR_OP_UNUSED_0X83] = Cmd_unused_0x83, + [B_SCR_OP_JUMPIFUPROARWAKES] = Cmd_jumpifuproarwakes, + [B_SCR_OP_STOCKPILE] = Cmd_stockpile, + [B_SCR_OP_STOCKPILETOBASEDAMAGE] = Cmd_stockpiletobasedamage, + [B_SCR_OP_STOCKPILETOHPHEAL] = Cmd_stockpiletohpheal, + [B_SCR_OP_UNUSED_0X88] = Cmd_unused_0x88, + [B_SCR_OP_STATBUFFCHANGE] = Cmd_statbuffchange, + [B_SCR_OP_NORMALISEBUFFS] = Cmd_normalisebuffs, + [B_SCR_OP_SETBIDE] = Cmd_setbide, + [B_SCR_OP_TWOTURNMOVESCHARGESTRINGANDANIMATION] = Cmd_twoturnmoveschargestringandanimation, + [B_SCR_OP_TRYNONVOLATILESTATUS] = Cmd_trynonvolatilestatus, + [B_SCR_OP_INITMULTIHITSTRING] = Cmd_initmultihitstring, + [B_SCR_OP_FORCERANDOMSWITCH] = Cmd_forcerandomswitch, + [B_SCR_OP_TRYCONVERSIONTYPECHANGE] = Cmd_tryconversiontypechange, + [B_SCR_OP_GIVEPAYDAYMONEY] = Cmd_givepaydaymoney, + [B_SCR_OP_SETLIGHTSCREEN] = Cmd_setlightscreen, + [B_SCR_OP_TRYKO] = Cmd_tryKO, + [B_SCR_OP_CHECKNONVOLATILETRIGGER] = Cmd_checknonvolatiletrigger, + [B_SCR_OP_COPYBIDEDMG] = Cmd_copybidedmg, + [B_SCR_OP_ANIMATEWILDPOKEMONAFTERFAILEDPOKEBALL] = Cmd_animatewildpokemonafterfailedpokeball, + [B_SCR_OP_TRYINFATUATING] = Cmd_tryinfatuating, + [B_SCR_OP_UPDATESTATUSICON] = Cmd_updatestatusicon, + [B_SCR_OP_SETMIST] = Cmd_setmist, + [B_SCR_OP_SETFOCUSENERGY] = Cmd_setfocusenergy, + [B_SCR_OP_TRANSFORMDATAEXECUTION] = Cmd_transformdataexecution, + [B_SCR_OP_SETSUBSTITUTE] = Cmd_setsubstitute, + [B_SCR_OP_MIMICATTACKCOPY] = Cmd_mimicattackcopy, + [B_SCR_OP_SETCALLEDMOVE] = Cmd_setcalledmove, + [B_SCR_OP_UNUSED_0X9F] = Cmd_unused_0x9f, + [B_SCR_OP_UNUSED_0XA0] = Cmd_unused_0xA0, + [B_SCR_OP_UNUSED_0XA1] = Cmd_unused_0xA1, + [B_SCR_OP_UNUSED_0XA2] = Cmd_unused_0xA2, + [B_SCR_OP_DISABLELASTUSEDATTACK] = Cmd_disablelastusedattack, + [B_SCR_OP_TRYSETENCORE] = Cmd_trysetencore, + [B_SCR_OP_PAINSPLITDMGCALC] = Cmd_painsplitdmgcalc, + [B_SCR_OP_SETTYPETORANDOMRESISTANCE] = Cmd_settypetorandomresistance, + [B_SCR_OP_SETALWAYSHITFLAG] = Cmd_setalwayshitflag, + [B_SCR_OP_COPYMOVEPERMANENTLY] = Cmd_copymovepermanently, + [B_SCR_OP_UNUSED_0XA9] = Cmd_unused_0xA9, + [B_SCR_OP_UNUSED_AA] = Cmd_unused_AA, + [B_SCR_OP_UNUSED_0XAB] = Cmd_unused_0xab, + [B_SCR_OP_SETTAILWIND] = Cmd_settailwind, + [B_SCR_OP_TRYSPITEPPREDUCE] = Cmd_tryspiteppreduce, + [B_SCR_OP_HEALPARTYSTATUS] = Cmd_healpartystatus, + [B_SCR_OP_CURSETARGET] = Cmd_cursetarget, + [B_SCR_OP_TRYSETSPIKES] = Cmd_trysetspikes, + [B_SCR_OP_SETVOLATILE] = Cmd_setvolatile, + [B_SCR_OP_TRYSETPERISHSONG] = Cmd_trysetperishsong, + [B_SCR_OP_UNUSED_0XB3] = Cmd_unused_0xb3, + [B_SCR_OP_JUMPIFCONFUSEDANDSTATMAXED] = Cmd_jumpifconfusedandstatmaxed, + [B_SCR_OP_UNUSED_0XB5] = Cmd_unused_0xb5, + [B_SCR_OP_SETEMBARGO] = Cmd_setembargo, + [B_SCR_OP_PRESENTDAMAGECALCULATION] = Cmd_presentdamagecalculation, + [B_SCR_OP_SETSAFEGUARD] = Cmd_setsafeguard, + [B_SCR_OP_MAGNITUDEDAMAGECALCULATION] = Cmd_magnitudedamagecalculation, + [B_SCR_OP_JUMPIFNOPURSUITSWITCHDMG] = Cmd_jumpifnopursuitswitchdmg, + [B_SCR_OP_TRYACTIVATEITEM] = Cmd_tryactivateitem, + [B_SCR_OP_HALVEHP] = Cmd_halvehp, + [B_SCR_OP_COPYFOESTATS] = Cmd_copyfoestats, + [B_SCR_OP_RAPIDSPINFREE] = Cmd_rapidspinfree, + [B_SCR_OP_UNUSED_0XBF] = Cmd_unused_0xBF, + [B_SCR_OP_RECOVERBASEDONSUNLIGHT] = Cmd_recoverbasedonsunlight, + [B_SCR_OP_SETSTICKYWEB] = Cmd_setstickyweb, + [B_SCR_OP_SELECTFIRSTVALIDTARGET] = Cmd_selectfirstvalidtarget, + [B_SCR_OP_SETFUTUREATTACK] = Cmd_setfutureattack, + [B_SCR_OP_TRYDOBEATUP] = Cmd_trydobeatup, + [B_SCR_OP_SETSEMIINVULNERABLEBIT] = Cmd_setsemiinvulnerablebit, + [B_SCR_OP_UNUSED_0XC6] = Cmd_unused_0xC6, + [B_SCR_OP_UNUSED_0XC7] = Cmd_unused_0xC7, + [B_SCR_OP_UNUSED_C8] = Cmd_unused_c8, + [B_SCR_OP_TRYMEMENTO] = Cmd_trymemento, + [B_SCR_OP_SETFORCEDTARGET] = Cmd_setforcedtarget, + [B_SCR_OP_UNUSED_0XCB] = Cmd_unused_0xcb, + [B_SCR_OP_UNUSED_0XCC] = Cmd_unused_0xCC, + [B_SCR_OP_CURESTATUSWITHMOVE] = Cmd_curestatuswithmove, + [B_SCR_OP_SETTORMENT] = Cmd_settorment, + [B_SCR_OP_UNUSED_0XCF] = Cmd_unused_0xCF, + [B_SCR_OP_SETTAUNT] = Cmd_settaunt, + [B_SCR_OP_TRYSETHELPINGHAND] = Cmd_trysethelpinghand, + [B_SCR_OP_TRYSWAPITEMS] = Cmd_tryswapitems, + [B_SCR_OP_TRYCOPYABILITY] = Cmd_trycopyability, + [B_SCR_OP_TRYWISH] = Cmd_trywish, + [B_SCR_OP_SETTOXICSPIKES] = Cmd_settoxicspikes, + [B_SCR_OP_SETGASTROACID] = Cmd_setgastroacid, + [B_SCR_OP_SETYAWN] = Cmd_setyawn, + [B_SCR_OP_UNUSED0XD8] = Cmd_unused0xd8, + [B_SCR_OP_SETROOM] = Cmd_setroom, + [B_SCR_OP_TRYSWAPABILITIES] = Cmd_tryswapabilities, + [B_SCR_OP_TRYIMPRISON] = Cmd_tryimprison, + [B_SCR_OP_SETSTEALTHROCK] = Cmd_setstealthrock, + [B_SCR_OP_TRYSETVOLATILE] = Cmd_trysetvolatile, + [B_SCR_OP_UNUSED_0XDE] = Cmd_unused_0xde, + [B_SCR_OP_TRYSETMAGICCOAT] = Cmd_trysetmagiccoat, + [B_SCR_OP_TRYSETSNATCH] = Cmd_trysetsnatch, + [B_SCR_OP_UNUSED2] = Cmd_unused2, + [B_SCR_OP_SWITCHOUTABILITIES] = Cmd_switchoutabilities, + [B_SCR_OP_JUMPIFHASNOHP] = Cmd_jumpifhasnohp, + [B_SCR_OP_UNUSED_0XE4] = Cmd_unused_0xE4, + [B_SCR_OP_PICKUP] = Cmd_pickup, + [B_SCR_OP_UNUSED_0XE6] = Cmd_unused_0xE6, + [B_SCR_OP_UNUSED_0XE7] = Cmd_unused_0xE7, + [B_SCR_OP_SETTYPEBASEDHALVERS] = Cmd_settypebasedhalvers, + [B_SCR_OP_JUMPIFSUBSTITUTEBLOCKS] = Cmd_jumpifsubstituteblocks, + [B_SCR_OP_TRYRECYCLEITEM] = Cmd_tryrecycleitem, + [B_SCR_OP_SETTYPETOENVIRONMENT] = Cmd_settypetoenvironment, + [B_SCR_OP_PURSUITDOUBLES] = Cmd_pursuitdoubles, + [B_SCR_OP_SNATCHSETBATTLERS] = Cmd_snatchsetbattlers, + [B_SCR_OP_UNUSED_0XEE] = Cmd_unused_0xee, + [B_SCR_OP_HANDLEBALLTHROW] = Cmd_handleballthrow, + [B_SCR_OP_GIVECAUGHTMON] = Cmd_givecaughtmon, + [B_SCR_OP_TRYSETCAUGHTMONDEXFLAGS] = Cmd_trysetcaughtmondexflags, + [B_SCR_OP_DISPLAYDEXINFO] = Cmd_displaydexinfo, + [B_SCR_OP_TRYGIVECAUGHTMONNICK] = Cmd_trygivecaughtmonnick, + [B_SCR_OP_SORTBATTLERS] = Cmd_sortbattlers, + [B_SCR_OP_REMOVEATTACKERSTATUS1] = Cmd_removeattackerstatus1, + [B_SCR_OP_FINISHACTION] = Cmd_finishaction, + [B_SCR_OP_FINISHTURN] = Cmd_finishturn, + [B_SCR_OP_TRAINERSLIDEOUT] = Cmd_trainerslideout, + [B_SCR_OP_SETTELEKINESIS] = Cmd_settelekinesis, + [B_SCR_OP_SWAPSTATSTAGES] = Cmd_swapstatstages, + [B_SCR_OP_AVERAGESTATS] = Cmd_averagestats, + [B_SCR_OP_JUMPIFCAPTIVATEAFFECTED] = Cmd_jumpifcaptivateaffected, + [B_SCR_OP_SETNONVOLATILESTATUS] = Cmd_setnonvolatilestatus, + [B_SCR_OP_TRYOVERWRITEABILITY] = Cmd_tryoverwriteability, + [B_SCR_OP_CALLNATIVE] = Cmd_callnative, }; const struct StatFractions gAccuracyStageRatios[] = @@ -914,8 +910,6 @@ static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner = .callback = SpriteCB_MonIconOnLvlUpBanner }; -static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8}; - #define _ 0 static const struct PickupItem sPickupTable[] = @@ -954,54 +948,10 @@ static const struct PickupItem sPickupTable[] = #undef _ -static void ValidateSavedBattlerCounts(void) -{ - if (gBattleStruct->savedAttackerCount > 0) - { - if (TESTING) - Test_ExitWithResult(TEST_RESULT_ERROR, 0, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!", __FILE__, __LINE__); - else - DebugPrintfLevel(MGBA_LOG_WARN, "savedAttackerCount is greater than 0! More calls to SaveBattlerAttacker than RestoreBattlerAttacker!"); - } - if (gBattleStruct->savedTargetCount > 0) - { - if (TESTING) - Test_ExitWithResult(TEST_RESULT_ERROR, 0, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!", __FILE__, __LINE__); - else - DebugPrintfLevel(MGBA_LOG_WARN, "savedTargetCount is greater than 0! More calls to SaveBattlerTarget than RestoreBattlerTarget!"); - } -} - -static bool32 NoTargetPresent(u8 battler, u32 move) -{ - if (!IsBattlerAlive(gBattlerTarget)) - gBattlerTarget = GetBattleMoveTarget(move, NO_TARGET_OVERRIDE); - - switch (GetBattlerMoveTargetType(battler, move)) - { - case MOVE_TARGET_SELECTED: - case MOVE_TARGET_DEPENDS: - case MOVE_TARGET_RANDOM: - if (!IsBattlerAlive(gBattlerTarget)) - return TRUE; - break; - case MOVE_TARGET_BOTH: - if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget))) - return TRUE; - break; - case MOVE_TARGET_FOES_AND_ALLY: - if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) - return TRUE; - break; - } - - return FALSE; -} - -bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, enum Type moveType) +bool32 ProteanTryChangeType(u32 battler, enum Ability ability, enum Move move, enum Type moveType) { if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO) - && !gDisableStructs[gBattlerAttacker].usedProteanLibero + && !gBattleMons[gBattlerAttacker].volatiles.usedProteanLibero && (gBattleMons[battler].types[0] != moveType || gBattleMons[battler].types[1] != moveType || (gBattleMons[battler].types[2] != moveType && gBattleMons[battler].types[2] != TYPE_MYSTERY)) && move != MOVE_STRUGGLE @@ -1013,11 +963,6 @@ bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, enum Ty return FALSE; } -bool32 IsMoveNotAllowedInSkyBattles(u32 move) -{ - return (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)); -} - u32 NumAffectedSpreadMoveTargets(void) { u32 targetCount = 0; @@ -1027,60 +972,58 @@ u32 NumAffectedSpreadMoveTargets(void) for (u32 battler = 0; battler < gBattlersCount; battler++) { - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + if (battler == gBattlerAttacker) + continue; + + if (!IsBattlerUnaffectedByMove(battler)) targetCount++; } return targetCount; } -u32 NumFaintedBattlersByAttacker(u32 battlerAtk) +static inline bool32 IsBattlerUsingBeakBlast(u32 battler) { - u32 battler, numMonsFainted = 0; + if (gChosenActionByBattler[battler] != B_ACTION_USE_MOVE) + return FALSE; + if (GetMoveEffect(gChosenMoveByBattler[battler]) != EFFECT_BEAK_BLAST) + return FALSE; + return !HasBattlerActedThisTurn(battler); +} - for (battler = 0; battler < gBattlersCount; battler++) +static bool32 ShouldSkipToMoveEnd(void) +{ + enum MoveTarget moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + + switch (moveTarget) { - if (battler == battlerAtk) - continue; - - if (IsBattlerTurnDamaged(battler) && !IsBattlerAlive(battler)) - numMonsFainted++; + case TARGET_NONE: + case TARGET_FIELD: + case TARGET_OPPONENTS_FIELD: + case TARGET_USER: + case TARGET_ALL_BATTLERS: + return FALSE; + case TARGET_DEPENDS: + case TARGET_OPPONENT: + case TARGET_RANDOM: + case TARGET_SELECTED: + case TARGET_SMART: + case TARGET_ALLY: + case TARGET_USER_AND_ALLY: + case TARGET_USER_OR_ALLY: + case TARGET_FOES_AND_ALLY: + case TARGET_BOTH: + return gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_AVOIDED_ATTACK; } - return numMonsFainted; -} - -bool32 IsPowderMoveBlocked(struct BattleContext *ctx) -{ - if (!IsPowderMove(ctx->currentMove) - || ctx->battlerAtk == ctx->battlerDef - || IsAffectedByPowderMove(ctx->battlerDef, ctx->abilities[ctx->battlerDef], GetBattlerHoldEffect(ctx->battlerDef))) - return FALSE; - - gBattlescriptCurrInstr = BattleScript_PowderMoveNoEffect; - return TRUE; -} - -bool32 EmergencyExitCanBeTriggered(u32 battler) -{ - enum Ability ability = GetBattlerAbility(battler); - - if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) - return FALSE; - - if (IsBattlerAlive(battler) - && HadMoreThanHalfHpNowDoesnt(battler) - && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) - && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) - return TRUE; - return FALSE; } static void Cmd_attackcanceler(void) { CMD_ARGS(); + assertf(gBattlerAttacker < gBattlersCount, "invalid gBattlerAttacker: %d\nmove: %S", gBattlerAttacker, GetMoveName(gCurrentMove)); + assertf(gBattlerTarget < gBattlersCount, "invalid gBattlerTarget: %d\nmove: %S", gBattlerTarget, GetMoveName(gCurrentMove)); if (gBattleStruct->battlerState[gBattlerAttacker].usedEjectItem) { @@ -1095,144 +1038,43 @@ static void Cmd_attackcanceler(void) return; } - struct BattleContext ctx = {0}; - ctx.battlerAtk = gBattlerAttacker; - ctx.battlerDef = gBattlerTarget; - ctx.currentMove = gCurrentMove; + if (AtkCanceler_MoveSuccessOrder() != MOVE_STEP_SUCCESS) + return; - enum BattleMoveEffects moveEffect = GetMoveEffect(ctx.currentMove); - - if (!IsBattlerAlive(gBattlerAttacker) - && moveEffect != EFFECT_EXPLOSION - && moveEffect != EFFECT_MISTY_EXPLOSION) + if (gBattleStruct->magicBounceActive && !gBattleStruct->bouncedMoveIsUsed) + { + gBattleStruct->bouncedMoveIsUsed = TRUE; + gBattleStruct->magicBounceActive = FALSE; + gBattlerAbility = gBattlerTarget = gBattleStruct->moveBouncer; + BattleScriptCall(BattleScript_MagicBounce); + return; + } + else if (gBattleStruct->magicCoatActive && !gBattleStruct->bouncedMoveIsUsed) + { + gBattleStruct->bouncedMoveIsUsed = TRUE; + gBattleStruct->magicCoatActive = FALSE; + gEffectBattler = gBattlerTarget = gBattleStruct->moveBouncer; + BattleScriptCall(BattleScript_MagicCoat); + return; + } + + // Hack: Prevents messages being printed multiply times + // This is potentially bad. Bad if there are damage scripts that check further stuff + // E.g. it didn't work well with the old Synchronoise implementation + // I don't have better ideas right now though that would make sure nothing else breaks + if (ShouldSkipToMoveEnd()) { - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveEnd; return; } - // With how attackcanceller works right now we only need attacker and target abilities. Might change in the future - ctx.abilities[ctx.battlerAtk] = GetBattlerAbility(ctx.battlerAtk); - ctx.abilities[ctx.battlerDef] = GetBattlerAbility(ctx.battlerDef); - - if (AtkCanceller_MoveSuccessOrder(&ctx) != MOVE_STEP_SUCCESS) - return; - - if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_OFF - && ctx.abilities[ctx.battlerAtk] == ABILITY_PARENTAL_BOND - && IsMoveAffectedByParentalBond(gCurrentMove, gBattlerAttacker) - && !(gAbsentBattlerFlags & (1u << gBattlerTarget)) - && GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE) + for (u32 i = 0; i < gCurrentTurnActionNumber; i++) { - gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_1ST_HIT; - gMultiHitCounter = 2; - PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) - return; - } + if (!gProtectStructs[gBattlerByTurnOrder[i]].stealMove + || !MoveCanBeSnatched(gCurrentMove)) + continue; - if (CanAbilityBlockMove( - ctx.battlerAtk, - ctx.battlerDef, - ctx.abilities[ctx.battlerAtk], - ctx.abilities[ctx.battlerDef], - ctx.currentMove, - RUN_SCRIPT)) - return; - - if (GetMoveNonVolatileStatus(ctx.currentMove) == MOVE_EFFECT_PARALYSIS) - { - if (CanAbilityAbsorbMove( - ctx.battlerAtk, - ctx.battlerDef, - ctx.abilities[ctx.battlerDef], - ctx.currentMove, - GetBattleMoveType(ctx.currentMove), - RUN_SCRIPT)) - return; - } - - if (IsPowderMoveBlocked(&ctx)) - return; - - // Check if no available target present on the field or if Sky Battles ban the move - if ((NoTargetPresent(gBattlerAttacker, gCurrentMove) - && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns))) - || (IsMoveNotAllowedInSkyBattles(gCurrentMove))) - { - gBattleStruct->noTargetPresent = TRUE; - - if (moveEffect == EFFECT_FLING) // Edge case for removing a mon's item when there is no target available after using Fling. - gBattlescriptCurrInstr = BattleScript_FlingFailConsumeItem; - else - gBattlescriptCurrInstr = BattleScript_ButItFailed; - - if (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - return; - } - - u32 isBounceable = MoveCanBeBouncedBack(gCurrentMove); - if (gProtectStructs[gBattlerTarget].bounceMove - && isBounceable - && !gBattleStruct->bouncedMoveIsUsed) - { - gBattleStruct->bouncedMoveIsUsed = TRUE; - // Edge case for bouncing a powder move against a grass type pokemon. - - ClearDamageCalcResults(); - gEffectBattler = gBattlerTarget; - if (BlocksPrankster(gCurrentMove, gBattlerTarget, gBattlerAttacker, TRUE)) - { - // Opponent used a prankster'd magic coat -> reflected status move should fail against a dark-type attacker - gBattlerTarget = gBattlerAttacker; - gBattlescriptCurrInstr = BattleScript_MagicCoatPrankster; - } - else - { - BattleScriptCall(BattleScript_MagicCoat); - } - return; - } - else if (isBounceable && !gBattleStruct->bouncedMoveIsUsed) - { - u32 battler = gBattlerTarget; - - if (ctx.abilities[ctx.battlerDef] == ABILITY_MAGIC_BOUNCE) - { - battler = gBattlerTarget; - gBattleStruct->bouncedMoveIsUsed = TRUE; - } - else if (IsDoubleBattle() - && GetBattlerMoveTargetType(battler, gCurrentMove) == MOVE_TARGET_OPPONENTS_FIELD - && GetBattlerAbility(BATTLE_PARTNER(gBattlerTarget)) == ABILITY_MAGIC_BOUNCE) - { - gBattlerTarget = battler = BATTLE_PARTNER(gBattlerTarget); - gBattleStruct->bouncedMoveIsUsed = TRUE; - } - - if (gBattleStruct->bouncedMoveIsUsed) - { - ClearDamageCalcResults(); - BattleScriptCall(BattleScript_MagicBounce); - gBattlerAbility = battler; - return; - } - } - - // Z-moves and Max Moves bypass protection, but deal reduced damage (factored in AccumulateOtherModifiers) - if ((IsZMove(gCurrentMove) || IsMaxMove(gCurrentMove)) - && gProtectStructs[gBattlerTarget].protected != PROTECT_NONE - && gProtectStructs[gBattlerTarget].protected != PROTECT_MAX_GUARD) - { - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_CouldntFullyProtect; - return; - } - - u32 i; - for (i = 0; i < gBattlersCount; i++) - { - if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && MoveCanBeSnatched(gCurrentMove)) + if (B_SNATCH < GEN_5 || !gBattleStruct->snatchedMoveIsUsed) { gProtectStructs[gBattlerByTurnOrder[i]].stealMove = FALSE; gBattleStruct->snatchedMoveIsUsed = TRUE; @@ -1242,66 +1084,7 @@ static void Cmd_attackcanceler(void) } } - if (gSpecialStatuses[gBattlerTarget].abilityRedirected) - { - gSpecialStatuses[gBattlerTarget].abilityRedirected = FALSE; - BattleScriptCall(BattleScript_TookAttack); - } - else if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (moveEffect != EFFECT_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) - && (!gBattleMoveEffects[moveEffect].twoTurnEffect || (gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) - && moveEffect != EFFECT_SUCKER_PUNCH - && moveEffect != EFFECT_COUNTER - && moveEffect != EFFECT_UPPER_HAND) - { - if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) - gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gLastLandedMoves[gBattlerTarget] = 0; - gLastHitByType[gBattlerTarget] = 0; - - if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT) - { - gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; // No second hit if first hit was blocked - gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; - gMultiHitCounter = 0; - } - gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else if (gProtectStructs[gBattlerTarget].beakBlastCharge && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; - } -} - -static void JumpIfMoveFailed(u32 adder, u32 move, u32 moveType, const u8 *failInstr) -{ - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gLastLandedMoves[gBattlerTarget] = 0; - gLastHitByType[gBattlerTarget] = 0; - gBattlescriptCurrInstr = failInstr; - return; - } - else - { - if (CanAbilityAbsorbMove(gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerTarget), - move, - moveType, - RUN_SCRIPT)) - return; - } - - gBattlescriptCurrInstr += adder; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_setchargingturn(void) @@ -1317,164 +1100,138 @@ static void Cmd_setchargingturn(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, const u8 *failInstr) +static bool32 ShouldSkipAccuracyCalcPastFirstHit(u32 battlerAtk, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 moveEffect) { - bool32 affected = IsBattlerProtected(gBattlerAttacker, battler, move); - if (affected) - { - gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; - if (shouldJump) - JumpIfMoveFailed(7, move, GetBattleMoveType(move), failInstr); - } - return affected; + if (gSpecialStatuses[battlerAtk].parentalBondState == PARENTAL_BOND_2ND_HIT) + return TRUE; + + if (!gSpecialStatuses[battlerAtk].multiHitOn) + return FALSE; + + if (moveEffect == EFFECT_TRIPLE_KICK || moveEffect == EFFECT_POPULATION_BOMB) + return FALSE; + + if (abilityAtk == ABILITY_SKILL_LINK || holdEffectAtk == HOLD_EFFECT_LOADED_DICE) + return TRUE; + + return FALSE; } -static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move) +static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr) { - if (IS_FRLG && - ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE - && (!BtlCtrl_OakOldMan_TestState2Flag(1) || !BtlCtrl_OakOldMan_TestState2Flag(2)) - && gMovesInfo[move].power != 0 - && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) || (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))) - { - JumpIfMoveFailed(7, move, GetBattleMoveType(move), failInstr); - return; - } - - if (move == ACC_CURR_MOVE) - move = gCurrentMove; - - if (move == NO_ACC_CALC_CHECK_LOCK_ON) - { - if (gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) - gBattlescriptCurrInstr = nextInstr; - else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) - gBattlescriptCurrInstr = failInstr; - else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, failInstr)) - gBattlescriptCurrInstr = nextInstr; - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - { - if (gProtectStructs[gBattlerTarget].protected == PROTECT_MAX_GUARD) - gBattlescriptCurrInstr = nextInstr; - else - CanAbilityAbsorbMove(gBattlerAttacker, - gBattlerTarget, - GetBattlerAbility(gBattlerTarget), - gCurrentMove, - GetBattleMoveType(gCurrentMove), - RUN_SCRIPT); - } - return; - } - enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); - enum BattleMoveEffects effect = GetMoveEffect(move); + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_2ND_HIT - || (gSpecialStatuses[gBattlerAttacker].multiHitOn - && (abilityAtk == ABILITY_SKILL_LINK || holdEffectAtk == HOLD_EFFECT_LOADED_DICE - || !(effect == EFFECT_TRIPLE_KICK || effect == EFFECT_POPULATION_BOMB)))) + if (IS_FRLG && + ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && (!BtlCtrl_OakOldMan_TestState2Flag(1) || !BtlCtrl_OakOldMan_TestState2Flag(2)) + && gMovesInfo[gCurrentMove].power != 0 && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) + || (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))) + { if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) + { + gBattleStruct->moveResultFlags[gBattlerTarget] = MOVE_RESULT_MISSED; + gLastLandedMoves[gBattlerTarget] = 0; + gLastHitByType[gBattlerTarget] = 0; + gBattlescriptCurrInstr = failInstr; + } + else + { + gBattlescriptCurrInstr = nextInstr; + } + } + + if (ShouldSkipAccuracyCalcPastFirstHit(gBattlerAttacker, abilityAtk, holdEffectAtk, effect) + || IsMaxMove(gCurrentMove) + || IsZMove(gCurrentMove)) { - // No acc checks for second hit of Parental Bond or multi hit moves, except Triple Kick/Triple Axel/Population Bomb gBattlescriptCurrInstr = nextInstr; + return; + } + + u32 numTargets = 0, numMisses = 0; + enum MoveTarget moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + bool32 calcSpreadMove = IsSpreadMove(moveTarget); + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleStruct->calculatedSpreadMoveAccuracy) + break; + + if (!calcSpreadMove && battlerDef != gBattlerTarget) + continue; + + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) + continue; + + numTargets++; + enum Ability abilityDef = GetBattlerAbility(battlerDef); + + if (CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, gCurrentMove, RUN_SCRIPT)) + continue; + + u32 holdEffectDef = GetBattlerHoldEffect(battlerDef); + u32 accuracy = GetTotalAccuracy(gBattlerAttacker, + battlerDef, + gCurrentMove, + abilityAtk, + abilityDef, + holdEffectAtk, + holdEffectDef); + + if (!RandomPercentage(RNG_ACCURACY, accuracy)) + { + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_MISSED; + gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; + numMisses++; + + if (holdEffectAtk == HOLD_EFFECT_BLUNDER_POLICY) + gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks + + if (moveTarget == TARGET_SMART + && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(battlerDef), gCurrentMove) + && !recalcDragonDarts // So we don't jump back and forth between targets + && CanTargetPartner(gBattlerAttacker, battlerDef) + && !IsBattlerUnaffectedByMove(BATTLE_PARTNER(battlerDef))) + { + // Smart target to partner if miss + numMisses = 0; // Other dart might hit + gBattlerTarget = BATTLE_PARTNER(battlerDef); + AccuracyCheck(TRUE, nextInstr, failInstr); + return; + } + } + } + + if (numTargets == numMisses) + { + SetOrClearRageVolatile(); + gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; + } + + if (calcSpreadMove) + gBattleStruct->calculatedSpreadMoveAccuracy = TRUE; + + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) + { + gBattleStruct->moveResultFlags[gBattlerTarget] = MOVE_RESULT_MISSED; + gLastLandedMoves[gBattlerTarget] = 0; + gLastHitByType[gBattlerTarget] = 0; + gBattlescriptCurrInstr = failInstr; } else { - u32 battlerDef, - numTargets = 0, - numMisses = 0, - moveType = GetBattleMoveType(move), - moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); - bool32 calcSpreadMove = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(move); - - for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (gBattleStruct->calculatedSpreadMoveAccuracy) - break; - - if ((!calcSpreadMove && battlerDef != gBattlerTarget) - || IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) - continue; - - numTargets++; - enum Ability abilityDef = GetBattlerAbility(battlerDef); - if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) - || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) - continue; - - u32 holdEffectDef = GetBattlerHoldEffect(battlerDef); - u32 accuracy = GetTotalAccuracy(gBattlerAttacker, - battlerDef, - move, - abilityAtk, - abilityDef, - holdEffectAtk, - holdEffectDef); - - if (!RandomPercentage(RNG_ACCURACY, accuracy)) - { - gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_MISSED; - gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; - numMisses++; - - if (holdEffectAtk == HOLD_EFFECT_BLUNDER_POLICY) - gBattleStruct->blunderPolicy = TRUE; // Only activates from missing through acc/evasion checks - - if (effect == EFFECT_DRAGON_DARTS - && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(battlerDef), gCurrentMove) - && !recalcDragonDarts // So we don't jump back and forth between targets - && CanTargetPartner(gBattlerAttacker, battlerDef) - && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(battlerDef))) - { - // Smart target to partner if miss - numMisses = 0; // Other dart might hit - gBattlerTarget = BATTLE_PARTNER(battlerDef); - AccuracyCheck(TRUE, nextInstr, failInstr, move); - return; - } - - if (GetMovePower(move) != 0) - { - struct DamageContext ctx = {0}; - ctx.battlerAtk = gBattlerAttacker; - ctx.battlerDef = battlerDef; - ctx.move = move; - ctx.chosenMove = gChosenMove; - ctx.moveType = moveType; - ctx.updateFlags = TRUE; - ctx.abilityAtk = abilityAtk; - ctx.abilityDef = abilityDef; - ctx.holdEffectAtk = holdEffectAtk; - ctx.holdEffectDef = holdEffectDef; - - CalcTypeEffectivenessMultiplier(&ctx); - } - } - } - - if (numTargets == numMisses) - gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_MISSED) - gBattleStruct->moveResultFlags[gBattlerTarget] = MOVE_RESULT_MISSED; - - if (calcSpreadMove) - gBattleStruct->calculatedSpreadMoveAccuracy = TRUE; - - JumpIfMoveFailed(7, move, moveType, failInstr); + gBattlescriptCurrInstr = nextInstr; } } static void Cmd_accuracycheck(void) { - CMD_ARGS(const u8 *failInstr, u16 move); + CMD_ARGS(const u8 *failInstr); // The main body of this function has been moved to AccuracyCheck() to accomodate // Dragon Darts' multiple accuracy checks on a single attack; // each dart can try to re-target once after missing. - AccuracyCheck(FALSE, cmd->nextInstr, cmd->failInstr, cmd->move); + AccuracyCheck(FALSE, cmd->nextInstr, cmd->failInstr); } static void Cmd_printattackstring(void) @@ -1489,231 +1246,32 @@ static void Cmd_printattackstring(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_0x3(void) +static void Cmd_printselectionstringfromtable(void) { + CMD_ARGS(const u16 *ptr); + + if (gBattleControllerExecFlags == 0) + { + const u16 *ptr = cmd->ptr; + ptr += gBattleCommunication[MULTISTRING_CHOOSER]; + + BtlController_EmitPrintSelectionString(gBattlerAttacker, B_COMM_TO_CONTROLLER, *ptr); + MarkBattlerForControllerExec(gBattlerAttacker); + + gBattlescriptCurrInstr = cmd->nextInstr; + gBattleCommunication[MSG_DISPLAY] = 1; + } } -// The chance is 1/N for each stage. -static const u32 sGen7CriticalHitOdds[] = {24, 8, 2, 1, 1}; // 1/X -static const u32 sGen6CriticalHitOdds[] = {16, 8, 2, 1, 1}; // 1/X -static const u32 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // 1/X, Gens 3,4,5 -static const u32 sGen2CriticalHitOdds[] = {17, 32, 64, 85, 128}; // X/256 - -static inline u32 GetCriticalHitOdds(u32 critChance) -{ - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) >= GEN_7) - return sGen7CriticalHitOdds[critChance]; - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_6) - return sGen6CriticalHitOdds[critChance]; - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) - return sGen2CriticalHitOdds[critChance]; - - return sCriticalHitOdds[critChance]; -} - -static inline u32 IsBattlerLeekAffected(u32 battler, enum HoldEffect holdEffect) -{ - if (holdEffect == HOLD_EFFECT_LEEK) - { - return GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_FARFETCHD - || gBattleMons[battler].species == SPECIES_SIRFETCHD; - } - return FALSE; -} - -static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum HoldEffect holdEffect) -{ - u32 critStageIncrease = 0; - - switch (holdEffect) - { - case HOLD_EFFECT_SCOPE_LENS: - critStageIncrease = 1; - break; - case HOLD_EFFECT_LUCKY_PUNCH: - if (gBattleMons[battler].species == SPECIES_CHANSEY) - critStageIncrease = 2; - break; - case HOLD_EFFECT_LEEK: - if (IsBattlerLeekAffected(battler, holdEffect)) - critStageIncrease = 2; - break; - default: - critStageIncrease = 0; - break; - } - - return critStageIncrease; -} - -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) -{ - s32 critChance = 0; - - if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) - { - critChance = CRITICAL_HIT_BLOCKED; - } - else if (gBattleMons[battlerAtk].volatiles.laserFocus - || MoveAlwaysCrits(move) - || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) - { - critChance = CRITICAL_HIT_ALWAYS; - } - else - { - critChance = (gBattleMons[battlerAtk].volatiles.focusEnergy != 0 ? 2 : 0) - + (gBattleMons[battlerAtk].volatiles.dragonCheer != 0 ? 1 : 0) - + GetMoveCriticalHitStage(move) - + GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk) - + ((B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(battlerAtk) == AFFECTION_FIVE_HEARTS) ? 2 : 0) - + (abilityAtk == ABILITY_SUPER_LUCK ? 1 : 0) - + gBattleStruct->bonusCritStages[gBattlerAttacker]; - - if (critChance >= ARRAY_COUNT(sCriticalHitOdds)) - critChance = ARRAY_COUNT(sCriticalHitOdds) - 1; - } - - if (critChance != CRITICAL_HIT_BLOCKED && (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR)) - { - // Record ability only if move had 100% chance to get a crit - if (recordAbility) - { - if (critChance == CRITICAL_HIT_ALWAYS) - RecordAbilityBattle(battlerDef, abilityDef); - else if (GetCriticalHitOdds(critChance) == 1) - RecordAbilityBattle(battlerDef, abilityDef); - } - critChance = CRITICAL_HIT_BLOCKED; - } - - return critChance; -} - -// Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Critical_hit#Generation_I -// Crit chance = Threshold / 256, Threshold maximum of 255 -// Threshold = Base Speed / 2 -// High crit move = 8 * (Base Speed / 2) -// Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum HoldEffect holdEffectAtk) -{ - s32 critChance = 0; - s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); - s32 bonusCritStage = gBattleStruct->bonusCritStages[battlerAtk]; // G-Max Chi Strike - u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(battlerAtk, holdEffectAtk); - u16 baseSpeed = GetSpeciesBaseSpeed(gBattleMons[battlerAtk].species); - - critChance = baseSpeed / 2; - - // Crit scaling - if (moveCritStage > 0) - critChance *= 8 * moveCritStage; - - if (bonusCritStage > 0) - critChance *= bonusCritStage; - - if (gBattleMons[battlerAtk].volatiles.focusEnergy) - critChance *= 4; - else if (gBattleMons[battlerAtk].volatiles.dragonCheer) - critChance *= 2; - - if (holdEffectCritStage > 0) - critChance *= 4 * holdEffectCritStage; - - if (abilityAtk == ABILITY_SUPER_LUCK) - critChance *= 4; - - if (critChance > 255) - critChance = 255; - - // Prevented crits - if (gSideStatuses[battlerDef] & SIDE_STATUS_LUCKY_CHANT) - critChance = CRITICAL_HIT_BLOCKED; - else if (abilityDef == ABILITY_BATTLE_ARMOR || abilityDef == ABILITY_SHELL_ARMOR) - { - if (recordAbility) - RecordAbilityBattle(battlerDef, abilityDef); - critChance = CRITICAL_HIT_BLOCKED; - } - - // Guaranteed crits - else if (gBattleMons[battlerAtk].volatiles.laserFocus - || MoveAlwaysCrits(move) - || (abilityAtk == ABILITY_MERCILESS && gBattleMons[battlerDef].status1 & STATUS1_PSN_ANY)) - { - critChance = CRITICAL_HIT_ALWAYS; - } - - return critChance; -} - -s32 GetCritHitOdds(s32 critChanceIndex) -{ - if (critChanceIndex < 0) - return -1; - else - return GetCriticalHitOdds(critChanceIndex); -} - +// Calculations have been moved to cmd_damagecalc. Please remove the macro from scripts +// Will be set to unused next cycle static void Cmd_critcalc(void) { CMD_ARGS(); - - u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker], - moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), - battlerDef; - bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - enum HoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); - gPotentialItemEffectBattler = gBattlerAttacker; - - for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (gBattleStruct->calculatedDamageDone) - break; - - if (!calcSpreadMoveDamage && battlerDef != gBattlerTarget) - continue; - - if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE - || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) - continue; - - enum Ability abilityDef = GetBattlerAbility(battlerDef); - enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); - - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) - gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); - else - gBattleStruct->critChance[battlerDef] = CalcCritChanceStage(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk); - - if ((gBattleTypeFlags & (BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) - || ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) && (!IS_FRLG || !BtlCtrl_OakOldMan_TestState2Flag(1)))) - gSpecialStatuses[battlerDef].criticalHit = FALSE; - else if (gBattleStruct->critChance[battlerDef] == -1) - gSpecialStatuses[battlerDef].criticalHit = FALSE; - else if (gBattleStruct->critChance[battlerDef] == -2) - gSpecialStatuses[battlerDef].criticalHit = TRUE; - else - { - if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) - gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, gBattleStruct->critChance[battlerDef], 256); - else if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_2) - gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef]), 256); - else - gSpecialStatuses[battlerDef].criticalHit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(gBattleStruct->critChance[battlerDef])); - } - - // Counter for IF_CRITICAL_HITS_GE evolution condition. - if (gSpecialStatuses[battlerDef].criticalHit && IsOnPlayerSide(gBattlerAttacker) - && !(gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_LEFT)) - gPartyCriticalHits[partySlot]++; - } - gBattlescriptCurrInstr = cmd->nextInstr; } -static inline void CalculateAndSetMoveDamage(struct DamageContext *ctx) +static inline void CalculateAndSetMoveDamage(struct BattleContext *ctx) { SetDynamicMoveCategory(gBattlerAttacker, ctx->battlerDef, gCurrentMove); ctx->isCrit = gSpecialStatuses[ctx->battlerDef].criticalHit; @@ -1721,13 +1279,21 @@ static inline void CalculateAndSetMoveDamage(struct DamageContext *ctx) gBattleStruct->moveDamage[ctx->battlerDef] = CalculateMoveDamage(ctx); // Slighly hacky but we need to check move result flags for distortion match-up as well but it can only be done after damage calcs - if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups && gBattleStruct->moveResultFlags[ctx->battlerDef] & MOVE_RESULT_NO_EFFECT) + if (gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups && IsBattlerUnaffectedByMove(ctx->battlerDef)) { gSpecialStatuses[ctx->battlerDef].distortedTypeMatchups = FALSE; gSpecialStatuses[ctx->battlerDef].teraShellAbilityDone = FALSE; } } +static u32 GetWeather(void) +{ + if (gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) + return B_WEATHER_NONE; + else + return gBattleWeather; +} + static void Cmd_damagecalc(void) { CMD_ARGS(); @@ -1738,24 +1304,22 @@ static void Cmd_damagecalc(void) return; } - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.battlerAtk = gBattlerAttacker; ctx.move = gCurrentMove; ctx.chosenMove = gChosenMove; ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.weather = GetWeather(); + ctx.fieldStatuses = gFieldStatuses; ctx.randomFactor = TRUE; ctx.updateFlags = TRUE; - if (IsSpreadMove(moveTarget)) + if (IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) { u32 battlerDef; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE - || gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; ctx.battlerDef = battlerDef; @@ -1775,22 +1339,18 @@ static void Cmd_typecalc(void) { CMD_ARGS(); - if (!IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove))) // Handled in CANCELLER_MULTI_TARGET_MOVES for Spread Moves - { - struct DamageContext ctx = {0}; - ctx.battlerAtk = gBattlerAttacker; - ctx.battlerDef = gBattlerTarget; - ctx.move = gCurrentMove; - ctx.chosenMove = gChosenMove; - ctx.moveType = GetBattleMoveType(gCurrentMove); - ctx.updateFlags = TRUE; - ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); - ctx.abilityDef = GetBattlerAbility(gBattlerTarget); - ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); - ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget); - - CalcTypeEffectivenessMultiplier(&ctx); - } + struct BattleContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = gCurrentMove; + ctx.chosenMove = gChosenMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); + ctx.updateFlags = TRUE; + ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); + ctx.abilityDef = GetBattlerAbility(gBattlerTarget); + ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget); + CalcTypeEffectivenessMultiplier(&ctx); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -1804,9 +1364,8 @@ static void Cmd_adjustdamage(void) u32 battlerDef; u32 rand = Random() % 100; u32 affectionScore; - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); + bool32 calcSpreadMoveDamage = IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); u32 enduredHit = 0; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -1817,27 +1376,22 @@ static void Cmd_adjustdamage(void) if (!calcSpreadMoveDamage && battlerDef != gBattlerTarget) continue; - if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; if (DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) continue; if (DoesDisguiseBlockMove(battlerDef, gCurrentMove)) - { - gSpecialStatuses[battlerDef].enduredDamage = TRUE; continue; - } if (GetBattlerAbility(battlerDef) == ABILITY_ICE_FACE && IsBattleMovePhysical(gCurrentMove) && gBattleMons[battlerDef].species == SPECIES_EISCUE) { // Damage deals typeless 0 HP. gBattleStruct->moveResultFlags[battlerDef] &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); gBattleStruct->moveDamage[battlerDef] = 0; - gSpecialStatuses[battlerDef].enduredDamage = TRUE; RecordAbilityBattle(battlerDef, ABILITY_ICE_FACE); - gDisableStructs[battlerDef].iceFaceActivationPrevention = TRUE; + gBattleMons[battlerDef].volatiles.triggerIceFace = TRUE; // Form change will be done after attack animation in Cmd_resultmessage. continue; } @@ -1855,7 +1409,7 @@ static void Cmd_adjustdamage(void) { enduredHit |= 1u << battlerDef; } - else if (gDisableStructs[battlerDef].endured) + else if (gBattleMons[battlerDef].volatiles.endured) { enduredHit |= 1u << battlerDef; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_ENDURED; @@ -1867,7 +1421,7 @@ static void Cmd_adjustdamage(void) gLastUsedItem = gBattleMons[battlerDef].item; gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_FOE_HUNG_ON; } - else if (B_STURDY >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) + else if (GetConfig(CONFIG_STURDY) >= GEN_5 && GetBattlerAbility(battlerDef) == ABILITY_STURDY && IsBattlerAtMaxHp(battlerDef)) { enduredHit |= 1u << battlerDef; RecordAbilityBattle(battlerDef, ABILITY_STURDY); @@ -1896,7 +1450,6 @@ static void Cmd_adjustdamage(void) if (enduredHit & 1u << battlerDef) { gBattleStruct->moveDamage[battlerDef] = gBattleMons[battlerDef].hp - 1; - gSpecialStatuses[battlerDef].enduredDamage = TRUE; gProtectStructs[battlerDef].assuranceDoubled = TRUE; } } @@ -1907,8 +1460,8 @@ static void Cmd_adjustdamage(void) gBattlescriptCurrInstr = cmd->nextInstr; if (gSpecialStatuses[gBattlerAttacker].gemBoost - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && !IsBattlerUnaffectedByMove(gBattlerTarget) + && !gBattleStruct->unableToUseMove && gBattleMons[gBattlerAttacker].item) { BattleScriptCall(BattleScript_GemActivates); @@ -1966,8 +1519,7 @@ static u32 UpdateEffectivenessResultFlagsForDoubleSpreadMoves(u32 resultFlags) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (gBattleStruct->moveResultFlags[battlerDef] & (MOVE_RESULT_MISSED | MOVE_RESULT_NO_EFFECT) - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; switch (sound) @@ -1993,7 +1545,7 @@ static u32 UpdateEffectivenessResultFlagsForDoubleSpreadMoves(u32 resultFlags) return resultFlags; } -static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, u32 moveType) +static inline bool32 TryStrongWindsWeakenAttack(u32 battlerDef, enum Type moveType) { if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect()) { @@ -2027,6 +1579,11 @@ static inline bool32 TryTeraShellDistortTypeMatchups(u32 battlerDef) // It doesn't have any impact on gameplay and is only a visual thing which can be adjusted later. static inline bool32 TryActivateWeaknessBerry(u32 battlerDef) { + if (DoesDisguiseBlockMove(battlerDef, gCurrentMove)) + { + gSpecialStatuses[battlerDef].berryReduced = FALSE; + return FALSE; + } if (gSpecialStatuses[battlerDef].berryReduced && gBattleMons[battlerDef].item != ITEM_NONE) { gBattleScripting.battler = battlerDef; @@ -2044,17 +1601,12 @@ static bool32 ProcessPreAttackAnimationFuncs(void) u32 moveType = GetBattleMoveType(gCurrentMove); if (IsDoubleSpreadMove()) { - u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - if (!gBattleStruct->printedStrongWindsWeakenedAttack) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; - if (TryStrongWindsWeakenAttack(battlerDef, moveType)) return TRUE; } @@ -2062,11 +1614,8 @@ static bool32 ProcessPreAttackAnimationFuncs(void) for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef, moveTarget) - || (battlerDef == BATTLE_PARTNER(gBattlerAttacker) && !(moveTarget & MOVE_TARGET_FOES_AND_ALLY)) - || gBattleStruct->noResultString[battlerDef] == WILL_FAIL) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; - if (TryTeraShellDistortTypeMatchups(battlerDef)) return TRUE; if (TryActivateWeaknessBerry(battlerDef)) @@ -2100,7 +1649,9 @@ static void Cmd_attackanimation(void) if (IsDoubleSpreadMove()) moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); - if ((gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) + bool32 isAnimDisabled = (gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION) + || gBattleStruct->preAttackAnimPlayed); + if (isAnimDisabled && effect != EFFECT_TRANSFORM && effect != EFFECT_SUBSTITUTE && effect != EFFECT_ALLY_SWITCH @@ -2120,20 +1671,23 @@ static void Cmd_attackanimation(void) return; } - if ((moveTarget & MOVE_TARGET_BOTH - || moveTarget & MOVE_TARGET_FOES_AND_ALLY - || moveTarget & MOVE_TARGET_DEPENDS) - && gBattleScripting.animTargetsHit) + if (gBattleScripting.animTargetsHit) { - gBattlescriptCurrInstr = cmd->nextInstr; - return; + if (moveTarget == TARGET_BOTH + || moveTarget == TARGET_ALL_BATTLERS + || moveTarget == TARGET_FOES_AND_ALLY + || moveTarget == TARGET_DEPENDS) + { + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } } - // handle special move animations - if (GetMoveEffect(gCurrentMove) == EFFECT_EXPANDING_FORCE && moveTarget & MOVE_TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, BATTLE_OPPOSITE(gBattlerAttacker) > 1)) + // handle special move animations. + if (GetMoveAnimationScript(gCurrentMove) == gBattleAnimMove_ExpandingForce && moveTarget == TARGET_BOTH && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, BATTLE_OPPOSITE(gBattlerAttacker) > 1)) gBattleScripting.animTurn = 1; - if (!(moveResultFlags & MOVE_RESULT_NO_EFFECT)) + if (!(moveResultFlags & MOVE_RESULT_NO_EFFECT) || moveTarget == TARGET_ALL_BATTLERS) { u32 multihit; if (gBattleMons[gBattlerTarget].volatiles.substitute) @@ -2159,8 +1713,11 @@ static void Cmd_attackanimation(void) gBattleMovePower, gBattleStruct->moveDamage[gBattlerTarget], gBattleMons[gBattlerAttacker].friendship, - &gDisableStructs[gBattlerAttacker], multihit); +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = TRUE; + gSpriteAllocs = 0; +#endif gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -2179,7 +1736,12 @@ static void Cmd_waitanimation(void) CMD_ARGS(); if (gBattleControllerExecFlags == 0 && gBattleStruct->battlerKOAnimsRunning == 0) + { +#if T_SHOULD_RUN_MOVE_ANIM + gCountAllocs = FALSE; +#endif gBattlescriptCurrInstr = cmd->nextInstr; + } } static void DoublesHPBarReduction(void) @@ -2189,9 +1751,8 @@ static void DoublesHPBarReduction(void) for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT + if (IsBattlerUnaffectedByMove(battlerDef) || gBattleStruct->moveDamage[battlerDef] == 0 - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE || DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove) || DoesDisguiseBlockMove(battlerDef, gCurrentMove)) continue; @@ -2231,7 +1792,7 @@ static void Cmd_healthbarupdate(void) { PrepareStringBattle(STRINGID_SUBSTITUTEDAMAGED, battler); } - else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + else if (!IsBattlerUnaffectedByMove(gBattlerTarget) && !DoesDisguiseBlockMove(battler, gCurrentMove)) { s32 damage = min(gBattleStruct->moveDamage[battler], 10000); @@ -2261,6 +1822,8 @@ static void PassiveDataHpUpdate(u32 battler, const u8 *nextInstr) gBattleMons[battler].hp -= gBattleStruct->passiveHpUpdate[battler]; else gBattleMons[battler].hp = 0; + // Since this is reset for the next turn, it should be fine to set it here. + gProtectStructs[battler].assuranceDoubled = TRUE; } // Send updated HP @@ -2278,45 +1841,51 @@ static void PassiveDataHpUpdate(u32 battler, const u8 *nextInstr) static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nextInstr) { - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + if (IsBattlerUnaffectedByMove(gBattlerTarget)) { gBattlescriptCurrInstr = nextInstr; + return; } - else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gDisableStructs[battler].substituteHP) + else if (DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && gBattleMons[battler].volatiles.substituteHP) { - if (gDisableStructs[battler].substituteHP >= gBattleStruct->moveDamage[battler]) + if (gBattleMons[battler].volatiles.substituteHP >= gBattleStruct->moveDamage[battler]) { - gDisableStructs[battler].substituteHP -= gBattleStruct->moveDamage[battler]; + TestRunner_Battle_RecordSubHit(battler, gBattleStruct->moveDamage[battler], FALSE); + gBattleMons[battler].volatiles.substituteHP -= gBattleStruct->moveDamage[battler]; } else { - gBattleStruct->moveDamage[battler] = gDisableStructs[battler].substituteHP; - gDisableStructs[battler].substituteHP = 0; + TestRunner_Battle_RecordSubHit(battler, gBattleMons[battler].volatiles.substituteHP, TRUE); + gBattleStruct->moveDamage[battler] = gBattleMons[battler].volatiles.substituteHP; + gBattleMons[battler].volatiles.substituteHP = 0; } // check substitute fading - if (gDisableStructs[battler].substituteHP == 0) + if (gBattleMons[battler].volatiles.substituteHP == 0) { gBattlescriptCurrInstr = nextInstr; BattleScriptCall(BattleScript_SubstituteFade); - return; } else { gBattlescriptCurrInstr = nextInstr; - return; } + return; } else if (DoesDisguiseBlockMove(battler, gCurrentMove)) { // TODO: Convert this to a proper FORM_CHANGE type. gBattleScripting.battler = battler; + gBattleStruct->moveDamage[battler] = 0; + gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + if (GetMoveEffect(gCurrentMove) == EFFECT_OHKO) + gProtectStructs[battler].survivedOHKO = TRUE; if (GetBattlerPartyState(battler)->changedSpecies == SPECIES_NONE) GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; if (gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED) gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else gBattleMons[battler].species = SPECIES_MIMIKYU_BUSTED; - if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) SetPassiveDamageAmount(battler, GetNonDynamaxMaxHP(battler) / 8); BattleScriptPush(nextInstr); gBattlescriptCurrInstr = BattleScript_TargetFormChange; @@ -2333,14 +1902,15 @@ static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nex else { gBideDmg[battler] += gBattleStruct->moveDamage[battler]; - if (scriptBattler == BS_TARGET) - gBideTarget[battler] = gBattlerAttacker; - else - gBideTarget[battler] = gBattlerTarget; + gBideTarget[battler] = gBattlerAttacker; // Deal damage to the battler if (gBattleMons[battler].hp > gBattleStruct->moveDamage[battler]) { + if (GetMoveEffect(gCurrentMove) == EFFECT_OHKO && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FOE_HUNG_ON) + { + gProtectStructs[battler].survivedOHKO = TRUE; + } gBattleMons[battler].hp -= gBattleStruct->moveDamage[battler]; } else @@ -2348,30 +1918,9 @@ static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nex gBattleStruct->moveDamage[battler] = gBattleMons[battler].hp; gBattleMons[battler].hp = 0; } + gProtectStructs[battler].assuranceDoubled = TRUE; + gProtectStructs[battler].revengeDoubled |= 1u << gBattlerAttacker; - // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, they are - // used in combination as general damage trackers for other purposes. specialDmg is additionally used - // to help determine if a fire move should defrost the target. - if (IsBattleMovePhysical(gCurrentMove)) - { - gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].physicalDmg = gBattleStruct->moveDamage[battler]; - if (scriptBattler == BS_TARGET) // What's the point of this??? It will be always target - gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].physicalBattlerId = gBattlerTarget; - gProtectStructs[battler].assuranceDoubled = TRUE; - } - else // Physical move - { - gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler]; - gSpecialStatuses[battler].specialDmg = gBattleStruct->moveDamage[battler]; - if (scriptBattler == BS_TARGET) // What's the point of this??? It will be always target - gProtectStructs[battler].specialBattlerId = gBattlerAttacker; - else - gProtectStructs[battler].specialBattlerId = gBattlerTarget; - gProtectStructs[battler].assuranceDoubled = TRUE; - } } // Send updated HP BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[battler].hp), &gBattleMons[battler].hp); @@ -2379,8 +1928,26 @@ static void MoveDamageDataHpUpdate(u32 battler, u32 scriptBattler, const u8 *nex gBattlescriptCurrInstr = nextInstr; } - if (IsBattlerTurnDamaged(gBattlerTarget) && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS) - GetBattlerPartyState(battler)->timesGotHit++; + // Note: While physicalDmg/specialDmg below are only distinguished between for Counter/Mirror Coat, + // they are used in combination as general damage trackers for other purposes. + if (GetConfig(CONFIG_COUNTER_MIRROR_COAT_ALLY) <= GEN_4 || !IsBattlerAlly(battler, gBattlerAttacker)) + { + if (IsBattleMovePhysical(gCurrentMove) || ((GetConfig(CONFIG_HIDDEN_POWER_COUNTER) < GEN_4) && GetMoveEffect(gCurrentMove) == EFFECT_HIDDEN_POWER)) + { + gProtectStructs[battler].physicalDmg = gBattleStruct->moveDamage[battler] + 1; + gProtectStructs[battler].physicalBattlerId = gBattlerAttacker; + gProtectStructs[battler].lastHitBySpecialMove = FALSE; + } + else // Special move + { + gProtectStructs[battler].specialDmg = gBattleStruct->moveDamage[battler] + 1; + gProtectStructs[battler].specialBattlerId = gBattlerAttacker; + gProtectStructs[battler].lastHitBySpecialMove = TRUE; + } + } + + GetBattlerPartyState(battler)->timesGotHit++; + gSpecialStatuses[battler].damagedByAttack = TRUE; } static void Cmd_datahpupdate(void) @@ -2391,6 +1958,7 @@ static void Cmd_datahpupdate(void) if (gBattleControllerExecFlags) return; + switch (cmd->updateState) { case PASSIVE_HP_UPDATE: @@ -2411,7 +1979,7 @@ static void Cmd_critmessage(void) if (gBattleControllerExecFlags == 0) { - if (gSpecialStatuses[gBattlerTarget].criticalHit && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + if (gSpecialStatuses[gBattlerTarget].criticalHit && !IsBattlerUnaffectedByMove(gBattlerTarget)) { PrepareStringBattle(STRINGID_CRITICALHIT, gBattlerAttacker); @@ -2444,7 +2012,7 @@ static void Cmd_effectivenesssound(void) } moveResultFlags = UpdateEffectivenessResultFlagsForDoubleSpreadMoves(gBattleStruct->moveResultFlags[gBattlerTarget]); } - else if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && DoesBattlerNegateDamage(gBattlerTarget)) + else if (!IsBattlerUnaffectedByMove(gBattlerTarget) && DoesBattlerNegateDamage(gBattlerTarget)) moveResultFlags = 0; if (!(moveResultFlags & MOVE_RESULT_MISSED)) @@ -2493,15 +2061,15 @@ static inline bool32 ShouldPrintTwoFoesMessage(u32 moveResult) { return gBattlerTarget == BATTLE_OPPOSITE(gBattlerAttacker) && gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & moveResult - && gBattleStruct->noResultString[BATTLE_PARTNER(gBattlerTarget)] == CAN_DAMAGE; + && !(gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & MOVE_RESULT_AVOIDED_ATTACK); } static inline bool32 ShouldRelyOnTwoFoesMessage(u32 moveResult) { - return gBattlerTarget == BATTLE_PARTNER(BATTLE_OPPOSITE(gBattlerAttacker)) - && gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & moveResult - && !(gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(gBattlerAttacker)] & MOVE_RESULT_MISSED && gBattleStruct->missStringId[BATTLE_OPPOSITE(gBattlerAttacker)] > B_MSG_AVOIDED_ATK) - && gBattleStruct->noResultString[BATTLE_OPPOSITE(gBattlerAttacker)] == CAN_DAMAGE; + u32 oppositeTarget = BATTLE_OPPOSITE(gBattlerAttacker); + return gBattlerTarget == BATTLE_PARTNER(oppositeTarget) + && gBattleStruct->moveResultFlags[oppositeTarget] & moveResult + && !(gBattleStruct->moveResultFlags[oppositeTarget] & MOVE_RESULT_AVOIDED_ATTACK); } static void Cmd_resultmessage(void) @@ -2516,9 +2084,9 @@ static void Cmd_resultmessage(void) // TODO: Convert this to a proper FORM_CHANGE type. // Do Ice Face form change which was set up in Cmd_adjustdamage. - if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention) + if (gBattleMons[gBattlerTarget].volatiles.triggerIceFace) { - gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; + gBattleMons[gBattlerTarget].volatiles.triggerIceFace = FALSE; if (GetBattlerPartyState(gBattlerTarget)->changedSpecies == SPECIES_NONE) GetBattlerPartyState(gBattlerTarget)->changedSpecies = gBattleMons[gBattlerTarget].species; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; @@ -2527,8 +2095,7 @@ static void Cmd_resultmessage(void) return; } - if (*moveResultFlags & MOVE_RESULT_MISSED - && (!(*moveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK)) + if (*moveResultFlags & MOVE_RESULT_MISSED && !(*moveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)) { if (gMultiHitCounter && gMultiHitCounter < GetMoveStrikeCount(gCurrentMove)) { @@ -2537,18 +2104,11 @@ static void Cmd_resultmessage(void) BattleScriptCall(BattleScript_MultiHitPrintStrings); return; } - - if (gBattleStruct->missStringId[gBattlerTarget] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate + else { - gBattlerAbility = gBattlerTarget; - gBattleCommunication[MULTISTRING_CHOOSER] = gBattleStruct->missStringId[gBattlerTarget]; - gBattlescriptCurrInstr = cmd->nextInstr; - BattleScriptCall(BattleScript_AbilityAvoidsDamage); - return; + gBattleCommunication[MSG_DISPLAY] = 1; + stringId = STRINGID_ATTACKMISSED; } - - gBattleCommunication[MSG_DISPLAY] = 1; - stringId = gMissStringIds[gBattleStruct->missStringId[gBattlerTarget]]; } else { @@ -2571,6 +2131,8 @@ static void Cmd_resultmessage(void) } if (stringId == STRINGID_SUPEREFFECTIVE || stringId == STRINGID_SUPEREFFECTIVETWOFOES) TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(gBattlerTarget); + if (stringId == STRINGID_SUPEREFFECTIVETWOFOES) + TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(BATTLE_PARTNER(gBattlerTarget)); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: if (IsDoubleSpreadMove()) @@ -2601,6 +2163,8 @@ static void Cmd_resultmessage(void) { if (ShouldPrintTwoFoesMessage(MOVE_RESULT_DOESNT_AFFECT_FOE)) { + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); + TryInitializeTrainerSlideEnemyMonUnaffected(BATTLE_PARTNER(gBattlerTarget)); stringId = STRINGID_ITDOESNTAFFECTTWOFOES; } else if (ShouldRelyOnTwoFoesMessage(MOVE_RESULT_DOESNT_AFFECT_FOE)) @@ -2608,10 +2172,14 @@ static void Cmd_resultmessage(void) stringId = 0; // Was handled or will be handled as a double string } else + { + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); stringId = STRINGID_ITDOESNTAFFECT; + } } else { + TryInitializeTrainerSlideEnemyMonUnaffected(gBattlerTarget); stringId = STRINGID_ITDOESNTAFFECT; } break; @@ -2735,23 +2303,6 @@ static void Cmd_printfromtable(void) } } -static void Cmd_printselectionstringfromtable(void) -{ - CMD_ARGS(const u16 *ptr); - - if (gBattleControllerExecFlags == 0) - { - const u16 *ptr = cmd->ptr; - ptr += gBattleCommunication[MULTISTRING_CHOOSER]; - - BtlController_EmitPrintSelectionString(gBattlerAttacker, B_COMM_TO_CONTROLLER, *ptr); - MarkBattlerForControllerExec(gBattlerAttacker); - - gBattlescriptCurrInstr = cmd->nextInstr; - gBattleCommunication[MSG_DISPLAY] = 1; - } -} - bool32 HasBattlerActedThisTurn(u32 battler) { u32 i; @@ -2774,19 +2325,13 @@ u32 GetBattlerTurnOrderNum(u32 battler) return i; } -static void CheckSetUnburden(u8 battler) -{ - if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_UNBURDEN)) - gDisableStructs[battler].unburdenActive = TRUE; -} - // battlerStealer steals the item of itemBattler void StealTargetItem(u8 battlerStealer, u8 itemBattler) { gLastUsedItem = gBattleMons[itemBattler].item; gBattleMons[itemBattler].item = ITEM_NONE; - if (GetGenConfig(GEN_STEAL_WILD_ITEMS) >= GEN_9 + if (GetConfig(CONFIG_STEAL_WILD_ITEMS) >= GEN_9 && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)) && GetMoveEffect(gCurrentMove) == EFFECT_STEAL_ITEM && battlerStealer == gBattlerAttacker) // ensure that Pickpocket isn't activating this @@ -2798,12 +2343,12 @@ void StealTargetItem(u8 battlerStealer, u8 itemBattler) RecordItemEffectBattle(battlerStealer, GetItemHoldEffect(gLastUsedItem)); gBattleMons[battlerStealer].item = gLastUsedItem; - gDisableStructs[battlerStealer].unburdenActive = FALSE; + gBattleMons[battlerStealer].volatiles.unburdenActive = FALSE; BtlController_EmitSetMonData(battlerStealer, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); // set attacker item MarkBattlerForControllerExec(battlerStealer); } - RecordItemEffectBattle(itemBattler, ITEM_NONE); + RecordItemEffectBattle(itemBattler, HOLD_EFFECT_NONE); CheckSetUnburden(itemBattler); BtlController_EmitSetMonData(itemBattler, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[itemBattler].item), &gBattleMons[itemBattler].item); // remove target item @@ -2817,7 +2362,7 @@ void StealTargetItem(u8 battlerStealer, u8 itemBattler) static inline bool32 TrySetReflect(u32 battler) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) { gSideStatuses[side] |= SIDE_STATUS_REFLECT; @@ -2838,7 +2383,7 @@ static inline bool32 TrySetReflect(u32 battler) static inline bool32 TrySetLightScreen(u32 battler) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) { gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; @@ -2876,9 +2421,11 @@ static void SetNonVolatileStatus(u32 effectBattler, enum MoveEffect effect, cons { case MOVE_EFFECT_SLEEP: if (B_SLEEP_TURNS >= GEN_5) - gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 1, 3)); + gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(RandomUniform(RNG_SLEEP_TURNS, 2, 4)); + else if (B_SLEEP_TURNS >= GEN_3) + gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(RandomUniform(RNG_SLEEP_TURNS, 2, 5)); else - gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(1 + RandomUniform(RNG_SLEEP_TURNS, 2, 5)); + gBattleMons[effectBattler].status1 |= STATUS1_SLEEP_TURN(RandomUniform(RNG_SLEEP_TURNS, 2, 8)); TryActivateSleepClause(effectBattler, gBattlerPartyIndexes[effectBattler]); gBattlescriptCurrInstr = BattleScript_MoveEffectSleep; break; @@ -2932,21 +2479,20 @@ static void SetNonVolatileStatus(u32 effectBattler, enum MoveEffect effect, cons } // To avoid confusion the arguments are naned battler/effectBattler since they can be different from gBattlerAttacker/gBattlerTarget -void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, const u8 *battleScript, enum SetMoveEffectFlags effectFlags) +void SetMoveEffect(u32 battlerAtk, u32 effectBattler, enum MoveEffect moveEffect, const u8 *battleScript, enum SetMoveEffectFlags effectFlags) { + enum Ability abilities[MAX_BATTLERS_COUNT] = {ABILITY_NONE}; + abilities[battlerAtk] = GetBattlerAbility(battlerAtk); + abilities[effectBattler] = GetBattlerAbility(effectBattler); + s32 i; bool32 primary = effectFlags & EFFECT_PRIMARY; bool32 certain = effectFlags & EFFECT_CERTAIN; - bool32 affectsUser = (battler == effectBattler); - bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR); + bool32 affectsUser = (battlerAtk == effectBattler); + bool32 mirrorArmorReflected = (abilities[gBattlerTarget] == ABILITY_MIRROR_ARMOR); union StatChangeFlags flags = {0}; - u32 battlerAbility; bool32 activateAfterFaint = FALSE; - // NULL move effect - if (moveEffect == MOVE_EFFECT_NONE) - return; - if (gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && IsBattlerAlive(gBattlerTarget) && IsFinalStrikeEffect(moveEffect)) @@ -2960,21 +2506,21 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_PAYDAY: case MOVE_EFFECT_BUG_BITE: + case MOVE_EFFECT_FLAME_BURST: activateAfterFaint = TRUE; break; default: break; } - gBattleScripting.battler = battler; + gBattleScripting.battler = battlerAtk; gEffectBattler = effectBattler; - battlerAbility = GetBattlerAbility(gEffectBattler); - if (!primary && !affectsUser && IsMoveEffectBlockedByTarget(battlerAbility)) + if (!primary && !affectsUser && IsMoveEffectBlockedByTarget(abilities[effectBattler])) moveEffect = MOVE_EFFECT_NONE; else if (!primary - && TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove) - && !(GetMoveEffect(gCurrentMove) == EFFECT_ORDER_UP && gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE)) + && IsSheerForceAffected(gCurrentMove, abilities[battlerAtk]) + && !(moveEffect == MOVE_EFFECT_ORDER_UP && gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE)) moveEffect = MOVE_EFFECT_NONE; else if (!IsBattlerAlive(gEffectBattler) && !activateAfterFaint) moveEffect = MOVE_EFFECT_NONE; @@ -3000,8 +2546,8 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c else if (CanSetNonVolatileStatus( gBattlerAttacker, gEffectBattler, - GetBattlerAbility(gBattlerAttacker), - battlerAbility, + abilities[gBattlerAttacker], + abilities[gBattlerTarget], moveEffect, CHECK_TRIGGER)) SetNonVolatileStatus(gEffectBattler, moveEffect, battleScript, TRIGGER_ON_MOVE); @@ -3015,13 +2561,13 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } else { - gBattleMons[gEffectBattler].volatiles.confusionTurns = ((Random()) % 4) + 2; // 2-5 turns + gBattleMons[gEffectBattler].volatiles.confusionTurns = RandomUniform(RNG_CONFUSION_TURNS, 2, B_CONFUSION_TURNS); // 2-5 turns // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. // Otherwise, do normal confusion script. if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) { - gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; + gBattleMons[gEffectBattler].volatiles.rampageTurns = 0; gBattlerAttacker = gEffectBattler; gBattlescriptCurrInstr = BattleScript_ThrashConfuses; } @@ -3033,7 +2579,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } break; case MOVE_EFFECT_FLINCH: - if (battlerAbility == ABILITY_INNER_FOCUS) + if (abilities[effectBattler] == ABILITY_INNER_FOCUS) { // Inner Focus ALWAYS prevents flinching but only activates // on a move that's supposed to flinch, like Fake Out @@ -3070,7 +2616,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c { gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].volatiles.uproarTurns = B_UPROAR_TURNS >= GEN_5 ? 3 : (Random() & 3) + 2; + gBattleMons[gEffectBattler].volatiles.uproarTurns = B_UPROAR_TURNS >= GEN_5 + ? B_UPROAR_TURN_COUNT - 2 + : RandomUniform(RNG_CONFUSION_TURNS, 2, B_UPROAR_TURN_COUNT); BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_MoveEffectUproar; @@ -3126,7 +2674,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c MOVE_EFFECT_FREEZE_OR_FROSTBITE, MOVE_EFFECT_PARALYSIS }; - SetMoveEffect(battler, effectBattler, RandomElement(RNG_TRI_ATTACK, sTriAttackEffects), battleScript, effectFlags); + SetMoveEffect(battlerAtk, effectBattler, RandomElement(RNG_TRI_ATTACK, sTriAttackEffects), battleScript, effectFlags); } break; case MOVE_EFFECT_WRAP: @@ -3136,10 +2684,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } else { - if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; - else - gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); + SetWrapTurns(gEffectBattler, GetBattlerHoldEffect(gBattlerAttacker)); gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; gBattleMons[gEffectBattler].volatiles.wrappedMove = gCurrentMove; gBattleMons[gEffectBattler].volatiles.wrappedBy = gBattlerAttacker; @@ -3263,7 +2808,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd break; - gDisableStructs[gEffectBattler].rechargeTimer = 2; + gBattleMons[gEffectBattler].volatiles.rechargeTimer = 2; gLockedMoves[gEffectBattler] = gCurrentMove; gBattlescriptCurrInstr = battleScript; break; @@ -3275,7 +2820,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) // Do we need to check if the status is already set? { gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.battlerPreventingEscape = gBattlerAttacker; } gBattlescriptCurrInstr = battleScript; break; @@ -3283,6 +2828,10 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattleMons[gBattlerTarget].volatiles.nightmare = TRUE; gBattlescriptCurrInstr = battleScript; break; + case MOVE_EFFECT_GLAIVE_RUSH: + gBattleMons[gBattlerAttacker].volatiles.glaiveRush = TRUE; + gBattlescriptCurrInstr = battleScript; + break; case MOVE_EFFECT_ALL_STATS_UP: if (!NoAliveMonsForEitherParty()) { @@ -3309,7 +2858,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c s32 recoil = (gBattleMons[gEffectBattler].maxHP) / 4; if (recoil == 0) recoil = 1; - if (GetBattlerAbility(gEffectBattler) == ABILITY_PARENTAL_BOND) + if (abilities[gEffectBattler] == ABILITY_PARENTAL_BOND) recoil *= 2; SetPassiveDamageAmount(gEffectBattler, recoil); TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); @@ -3319,7 +2868,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } case MOVE_EFFECT_THRASH: // Petal Dance doesn't lock mons that copy the move with Dancer - if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].volatiles.lockConfusionTurns) + if (gSpecialStatuses[gEffectBattler].dancerUsedMove || gBattleMons[gEffectBattler].volatiles.rampageTurns) { gBattlescriptCurrInstr = battleScript; } @@ -3327,7 +2876,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c { gBattleMons[gEffectBattler].volatiles.multipleTurns = TRUE; gLockedMoves[gEffectBattler] = gCurrentMove; - gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = RandomUniform(RNG_RAMPAGE_TURNS, 2, 3); + gBattleMons[gEffectBattler].volatiles.rampageTurns = RandomUniform(RNG_RAMPAGE_TURNS, 2, B_RAMPAGE_TURNS); } break; case MOVE_EFFECT_CLEAR_SMOG: @@ -3394,7 +2943,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } break; case MOVE_EFFECT_THROAT_CHOP: - gDisableStructs[gEffectBattler].throatChopTimer = 2; + gBattleMons[gEffectBattler].volatiles.throatChopTimer = B_THROAT_CHOP_TIMER; gBattlescriptCurrInstr = battleScript; break; case MOVE_EFFECT_INCINERATE: @@ -3418,7 +2967,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattlescriptCurrInstr = battleScript; } else if (GetItemPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES - && battlerAbility != ABILITY_STICKY_HOLD) + && abilities[effectBattler] != ABILITY_STICKY_HOLD) { // target loses their berry gLastUsedItem = gBattleMons[gEffectBattler].item; @@ -3438,10 +2987,10 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattlescriptCurrInstr = BattleScript_BothCanNoLongerEscape; } if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.battlerPreventingEscape = gBattlerAttacker; if (!gBattleMons[gBattlerAttacker].volatiles.escapePrevention) - gDisableStructs[gBattlerAttacker].battlerPreventingEscape = gBattlerTarget; + gBattleMons[gBattlerAttacker].volatiles.battlerPreventingEscape = gBattlerTarget; gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; gBattleMons[gBattlerAttacker].volatiles.escapePrevention = TRUE; @@ -3474,7 +3023,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c if (!gBattleMons[gEffectBattler].status1) { static const u8 sDireClawEffects[] = { MOVE_EFFECT_POISON, MOVE_EFFECT_PARALYSIS, MOVE_EFFECT_SLEEP }; - SetMoveEffect(battler, effectBattler, RandomElement(RNG_DIRE_CLAW, sDireClawEffects), battleScript, effectFlags); + SetMoveEffect(battlerAtk, effectBattler, RandomElement(RNG_DIRE_CLAW, sDireClawEffects), battleScript, effectFlags); } break; case MOVE_EFFECT_STEALTH_ROCK: @@ -3492,8 +3041,8 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattleMons[gEffectBattler].volatiles.syrupBomb = TRUE; gBattleMons[gEffectBattler].volatiles.stickySyrupedBy = gBattlerAttacker; - gDisableStructs[gEffectBattler].syrupBombTimer = 3; - gDisableStructs[gEffectBattler].syrupBombIsShiny = IsMonShiny(mon); + gBattleMons[gEffectBattler].volatiles.syrupBombTimer = B_SYRUP_BOMB_TIMER; + gBattleMons[gEffectBattler].volatiles.syrupBombIsShiny = IsMonShiny(mon); BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_SyrupBombActivates; } @@ -3521,25 +3070,29 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } } else - SetMoveEffect(battler, effectBattler, gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect, battleScript, effectFlags); + { + SetMoveEffect(battlerAtk, effectBattler, gBattleEnvironmentInfo[gBattleEnvironment].secretPowerEffect, battleScript, effectFlags); + } break; case MOVE_EFFECT_PSYCHIC_NOISE: - battlerAbility = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); + { + u32 battler = IsAbilityOnSide(gEffectBattler, ABILITY_AROMA_VEIL); - if (battlerAbility) + if (battler) { - gBattlerAbility = battlerAbility - 1; + gBattlerAbility = battler - 1; BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_AromaVeilProtectsRet; } else if (!gBattleMons[gEffectBattler].volatiles.healBlock) { gBattleMons[gEffectBattler].volatiles.healBlock = TRUE; - gDisableStructs[gEffectBattler].healBlockTimer = 2; + gBattleMons[gEffectBattler].volatiles.healBlockTimer = 2; BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise; } break; + } case MOVE_EFFECT_TERA_BLAST: if (GetActiveGimmick(gEffectBattler) == GIMMICK_TERA && GetBattlerTeraType(gEffectBattler) == TYPE_STELLAR @@ -3655,7 +3208,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c ConvertIntToDecimalStringN(gBattleTextBuff2, ppToDeduct, STR_CONV_MODE_LEFT_ALIGN, 1); PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 1, ppToDeduct) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) + if (!(gBattleMons[gBattlerTarget].volatiles.mimickedMoves & (1u << i)) && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); @@ -3815,14 +3368,8 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c default: break; } - if (!(gFieldStatuses & statusFlag) && statusFlag != 0) + if (TryChangeBattleTerrain(gBattlerAttacker, statusFlag)) { - gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; - gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_TERRAIN_EXTENDER) - gFieldTimers.terrainTimer = 8; - else - gFieldTimers.terrainTimer = 5; BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_EffectSetTerrain; } @@ -3888,20 +3435,15 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c break; case MOVE_EFFECT_SANDBLAST_SIDE: case MOVE_EFFECT_FIRE_SPIN_SIDE: - { // Affects both opponents, but doesn't print strings so we can handle it here. - u8 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) + for (u32 battler = 0; battler < MAX_BATTLERS_COUNT; ++battler) { if (!IsBattlerAlly(battler, gBattlerTarget)) continue; if (!gBattleMons[battler].volatiles.wrapped) { gBattleMons[battler].volatiles.wrapped = TRUE; - if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) - gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; - else - gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; + SetWrapTurns(battler, GetBattlerHoldEffect(gBattlerAttacker)); // The Wrap effect does not expire when the user switches, so here's some cheese. gBattleMons[battler].volatiles.wrappedBy = gBattlerTarget; if (moveEffect == MOVE_EFFECT_SANDBLAST_SIDE) @@ -3911,11 +3453,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } } break; - } case MOVE_EFFECT_YAWN_FOE: - { if (gBattleMons[gBattlerTarget].volatiles.yawn == 0 - && CanBeSlept(gBattlerTarget, gBattlerTarget, GetBattlerAbility(gBattlerTarget), BLOCKED_BY_SLEEP_CLAUSE) + && CanBeSlept(gBattlerTarget, gBattlerTarget, abilities[gBattlerTarget], BLOCKED_BY_SLEEP_CLAUSE) && RandomPercentage(RNG_G_MAX_SNOOZE, 50)) { gBattleMons[gBattlerTarget].volatiles.yawn = 2; @@ -3923,7 +3463,6 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattlescriptCurrInstr = BattleScript_MoveEffectYawnSide; } break; - } case MOVE_EFFECT_SPITE: if (gLastMoves[gBattlerTarget] != MOVE_NONE && gLastMoves[gBattlerTarget] != MOVE_UNAVAILABLE) @@ -3975,8 +3514,10 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c gBattlescriptCurrInstr = BattleScript_EffectMeanLookSide; break; case MOVE_EFFECT_CRIT_PLUS_SIDE: - gBattleStruct->bonusCritStages[gBattlerAttacker]++; - gBattleStruct->bonusCritStages[BATTLE_PARTNER(gBattlerAttacker)]++; + if (gBattleMons[gBattlerAttacker].volatiles.bonusCritStages < 3) + gBattleMons[gBattlerAttacker].volatiles.bonusCritStages++; + if (gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].volatiles.bonusCritStages < 3) + gBattleMons[BATTLE_PARTNER(gBattlerAttacker)].volatiles.bonusCritStages++; BattleScriptPush(battleScript); gBattlescriptCurrInstr = BattleScript_EffectRaiseCritAlliesAnim; break; @@ -3999,7 +3540,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c { u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); if ((gBattleMons[gEffectBattler].status1 & argStatus) - && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) + && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(abilities[gEffectBattler]))) { gBattleMons[gEffectBattler].status1 &= ~(argStatus); BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); @@ -4033,15 +3574,130 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c } break; } - default: + case MOVE_EFFECT_BREAK_SCREEN: + if (B_BRICK_BREAK >= GEN_4) + i = GetBattlerSide(gBattlerTarget); // From Gen 4 onwards, Brick Break can remove screens on the user's side if used on an ally + else + i = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; + + if (gSideStatuses[i] & SIDE_STATUS_SCREEN_ANY) + { + bool32 failed; + + if (B_BRICK_BREAK >= GEN_5) + failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; + else + failed = FALSE; + + if (!failed) + { + gSideStatuses[i] &= ~SIDE_STATUS_SCREEN_ANY; + gBattleScripting.animTurn = 1; + gBattleScripting.animTargetsHit = 1; + gBattleStruct->preAttackAnimPlayed = TRUE; // The whole brick break animation is covered by the move so don't play twice + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_BreakScreens; + } + else + { + gBattleScripting.animTurn = 0; + gBattleScripting.animTargetsHit = 0; + } + } + break; + case MOVE_EFFECT_STEAL_STATS: + if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + { break; + } + else + { + bool32 contrary = abilities[gBattlerAttacker] == ABILITY_CONTRARY; + gBattleStruct->stolenStats[0] = 0; // Stats to steal. + gBattleScripting.animArg1 = 0; + for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) + { + if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) + { + bool32 byTwo = FALSE; + + gBattleStruct->stolenStats[0] |= (1 << (stat)); + // Store by how many stages to raise the stat. + gBattleStruct->stolenStats[stat] = gBattleMons[gBattlerTarget].statStages[stat] - DEFAULT_STAT_STAGE; + + while (gBattleMons[gBattlerAttacker].statStages[stat] + gBattleStruct->stolenStats[stat] > MAX_STAT_STAGE) + gBattleStruct->stolenStats[stat]--; + + gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; + + if (gBattleStruct->stolenStats[stat] >= 2) + byTwo++; + + if (gBattleScripting.animArg1 == 0) + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + stat; + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + stat; + } + else + { + if (byTwo) + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); + else + gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); + } + } + } + + if (gBattleStruct->stolenStats[0] != 0) + { + gBattleStruct->preAttackAnimPlayed = FALSE; // if set by the previous move effect, reset it for final Spectral Thief anim + BattleScriptPush(battleScript); + gBattlescriptCurrInstr = BattleScript_StealStats; + } + } + break; + default: + break; } gBattleScripting.moveEffect = MOVE_EFFECT_NONE; } +static void Cmd_setpreattackadditionaleffect(void) +{ + CMD_ARGS(); + + u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); + if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(gCurrentMove, gBattleStruct->additionalEffectsCounter); + gBattleStruct->additionalEffectsCounter++; + + if (!additionalEffect->preAttackEffect) + return; + + SetMoveEffect( + gBattlerAttacker, + additionalEffect->self ? gBattlerAttacker : gBattlerTarget, + additionalEffect->moveEffect, + gBattlescriptCurrInstr, + EFFECT_PRIMARY + ); + + return; + } + + gBattleStruct->additionalEffectsCounter = 0; + gBattlescriptCurrInstr = cmd->nextInstr; +} + static bool32 CanApplyAdditionalEffect(const struct AdditionalEffect *additionalEffect) { + if (additionalEffect->preAttackEffect) + return FALSE; + // If Toxic Chain will activate it blocks all other non volatile effects if (gBattleStruct->toxicChainPriority && additionalEffect->moveEffect <= MOVE_EFFECT_FROSTBITE) return FALSE; @@ -4080,7 +3736,7 @@ static void Cmd_setadditionaleffects(void) { CMD_ARGS(); - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) + if (!IsBattlerUnaffectedByMove(gBattlerTarget)) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(gCurrentMove); SetToxicChainPriority(); @@ -4088,7 +3744,6 @@ static void Cmd_setadditionaleffects(void) { u32 percentChance; const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(gCurrentMove, gBattleStruct->additionalEffectsCounter); - const u8 *currentPtr = gBattlescriptCurrInstr; // Various checks for if this move effect can be applied this turn if (CanApplyAdditionalEffect(additionalEffect)) @@ -4108,34 +3763,22 @@ static void Cmd_setadditionaleffects(void) gBattlerAttacker, additionalEffect->self ? gBattlerAttacker : gBattlerTarget, additionalEffect->moveEffect, - cmd->nextInstr, + gBattlescriptCurrInstr, flags ); + + gBattleStruct->additionalEffectsCounter++; + return; } } - // Move script along if we haven't jumped elsewhere - if (gBattlescriptCurrInstr == currentPtr) - gBattlescriptCurrInstr = cmd->nextInstr; - - // Call setadditionaleffects again in the case of a move with multiple effects gBattleStruct->additionalEffectsCounter++; - if (numAdditionalEffects > gBattleStruct->additionalEffectsCounter) - gBattleScripting.moveEffect = MOVE_EFFECT_CONTINUE; - else - gBattleScripting.moveEffect = gBattleStruct->additionalEffectsCounter = 0; - } - else - { - gBattleScripting.moveEffect = 0; - gBattlescriptCurrInstr = cmd->nextInstr; } } - else - { - gBattleScripting.moveEffect = 0; - gBattlescriptCurrInstr = cmd->nextInstr; - } + + gBattleStruct->additionalEffectsCounter = 0; + gBattleScripting.moveEffect = 0; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_seteffectprimary(void) @@ -4173,7 +3816,6 @@ static void Cmd_tryfaintmon(void) { CMD_ARGS(u8 battler, bool8 isSpikes, const u8 *instr); u32 battler; - const u8 *faintScript; battler = GetBattlerForBattleScript(cmd->battler); if (cmd->isSpikes != 0) @@ -4190,27 +3832,25 @@ static void Cmd_tryfaintmon(void) } else { - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS - && !(gAbsentBattlerFlags & (1u << battler)) - && !IsBattlerAlive(battler)) + if (!IsBattlerAlive(battler) + && !(gBattleStruct->battlerState[battler].fainted)) { - gBattleMons[battler].ability = ABILITY_NONE; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - return; - } + if (gBattleMons[battler].volatiles.neutralizingGas) + { + gBattleMons[battler].volatiles.neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptPush(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } + } - if (cmd->battler == BS_ATTACKER) - TryUpdateEvolutionTracker(IF_DEFEAT_X_WITH_ITEMS, 1, MOVE_NONE); - - gBattlerFainted = battler; - faintScript = BattleScript_FaintBattler; - if (!(gAbsentBattlerFlags & (1u << battler)) - && !IsBattlerAlive(battler)) - { gHitMarker |= HITMARKER_FAINTED(battler); + gBattleStruct->eventState.faintedAction = 0; + gBattlerFainted = battler; BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = faintScript; + gBattlescriptCurrInstr = BattleScript_FaintBattler; if (IsOnPlayerSide(battler)) { gHitMarker |= HITMARKER_PLAYER_FAINTED; @@ -4223,15 +3863,10 @@ static void Cmd_tryfaintmon(void) { if (gBattleResults.opponentFaintCounter < 255) gBattleResults.opponentFaintCounter++; - gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES, NULL); + gBattleResults.lastOpponentSpecies = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES); gSideTimers[B_SIDE_OPPONENT].retaliateTimer = 2; } - if (gBattleMons[gBattlerTarget].volatiles.destinyBond) - gBattleStruct->tryDestinyBond = TRUE; - if (gBattleMons[gBattlerTarget].volatiles.grudge) - gBattleStruct->tryGrudge = TRUE; - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); } else @@ -4258,6 +3893,8 @@ static void Cmd_dofaintanimation(void) return; } + gBattleStruct->battlerState[battler].fainted = TRUE; + BtlController_EmitFaintAnimation(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; @@ -4363,7 +4000,7 @@ static void Cmd_jumpifsideaffecting(void) { CMD_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); - u32 side = GetBattlerSide(GetBattlerForBattleScript(cmd->battler)); + enum BattleSide side = GetBattlerSide(GetBattlerForBattleScript(cmd->battler)); if (gSideStatuses[side] & cmd->flags) gBattlescriptCurrInstr = cmd->jumpInstr; @@ -4455,7 +4092,7 @@ static bool32 BattleTypeAllowsExp(void) static u32 GetMonHoldEffect(struct Pokemon *mon) { enum HoldEffect holdEffect; - u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); + enum Item item = GetMonData(mon, MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY_E_READER) #if FREE_ENIGMA_BERRY == FALSE @@ -4620,7 +4257,7 @@ static void Cmd_getexp(void) if ((holdEffect == HOLD_EFFECT_EXP_SHARE || IsGen6ExpShareEnabled()) && (B_SPLIT_EXP < GEN_6 || gBattleStruct->battlerExpReward == 0)) // only give exp share bonus in later gens if the mon wasn't sent out { - gBattleStruct->battlerExpReward += GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expShareExpValue);; + gBattleStruct->battlerExpReward += GetSoftLevelCapExpValue(gPlayerParty[*expMonId].level, gBattleStruct->expShareExpValue); } ApplyExperienceMultipliers(&gBattleStruct->battlerExpReward, *expMonId, gBattlerFainted); @@ -4782,8 +4419,6 @@ static void Cmd_getexp(void) // not sure why gf clears the item and ability here gBattleStruct->expOrderId = 0; gBattleStruct->teamGotExpMsgPrinted = FALSE; - gBattleMons[gBattlerFainted].item = ITEM_NONE; - gBattleMons[gBattlerFainted].ability = ABILITY_NONE; gBattlescriptCurrInstr = cmd->nextInstr; } break; @@ -4927,8 +4562,10 @@ static void Cmd_checkteamslost(void) u32 occupiedOpponentSpots = (gBattlersCount / 2) - emptyOpponentSpots; u32 alivePlayerPartyMons = CountAliveMonsForBattlerSide(B_POSITION_PLAYER_LEFT) - occupiedPlayerSpots; u32 aliveOpponentPartyMons = CountAliveMonsForBattlerSide(B_POSITION_OPPONENT_LEFT) - occupiedOpponentSpots; + u32 emptySlotsTotal = emptyPlayerSpots + emptyOpponentSpots; + u32 alivePartyMonsTotal = alivePlayerPartyMons + aliveOpponentPartyMons; - if (emptyPlayerSpots > 0 && alivePlayerPartyMons > 0 && emptyOpponentSpots > 0 && aliveOpponentPartyMons > 0) + if (emptySlotsTotal >= 2 && alivePartyMonsTotal >= 2) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -4940,13 +4577,6 @@ static void Cmd_checkteamslost(void) } } -static void MoveValuesCleanUp(void) -{ - gBattleScripting.moveEffect = MOVE_EFFECT_NONE; - gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; - gBattleCommunication[MISS_TYPE] = 0; -} - static void Cmd_movevaluescleanup(void) { CMD_ARGS(); @@ -5313,7 +4943,7 @@ static void Cmd_isdmgblockedbydisguise(void) gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED_TOTEM; else gBattleMons[gBattlerAttacker].species = SPECIES_MIMIKYU_BUSTED; - if (GetGenConfig(GEN_CONFIG_DISGUISE_HP_LOSS) >= GEN_8) + if (GetConfig(CONFIG_DISGUISE_HP_LOSS) >= GEN_8) SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); BattleScriptPush(BattleScript_MoveEnd); gBattlescriptCurrInstr = BattleScript_TargetFormChange; @@ -5364,7 +4994,7 @@ static void Cmd_setroost(void) { CMD_ARGS(); - gDisableStructs[gBattlerAttacker].roostActive = TRUE; + gBattleMons[gBattlerAttacker].volatiles.roostActive = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -5411,7 +5041,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n || animId == B_ANIM_TERA_CHARGE || animId == B_ANIM_TERA_ACTIVATE) { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, &gDisableStructs[battler], *argPtr); + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, *argPtr); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } @@ -5427,7 +5057,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n || animId == B_ANIM_SNOW_CONTINUES || animId == B_ANIM_FOG_CONTINUES) { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, &gDisableStructs[battler], *argPtr); + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, *argPtr); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } @@ -5437,7 +5067,7 @@ static void PlayAnimation(u32 battler, u8 animId, const u16 *argPtr, const u8 *n } else { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, &gDisableStructs[battler], *argPtr); + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, animId, *argPtr); MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = nextInstr; } @@ -5471,35 +5101,15 @@ static void Cmd_jumpfifsemiinvulnerable(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_0x48(void) +static void Cmd_trainerslidein(void) { -} + CMD_ARGS(u8 position); -static inline bool32 TryTriggerSymbiosis(u32 battler, u32 ally) -{ - return GetBattlerAbility(ally) == ABILITY_SYMBIOSIS - && gBattleMons[battler].item == ITEM_NONE - && gBattleMons[ally].item != ITEM_NONE - && CanBattlerGetOrLoseItem(battler, gBattleMons[ally].item) - && CanBattlerGetOrLoseItem(ally, gBattleMons[ally].item) - && IsBattlerAlive(battler) - && IsBattlerAlive(ally); -} + u32 battler = GetBattlerForBattleScript(cmd->position); + BtlController_EmitTrainerSlide(battler, B_COMM_TO_CONTROLLER); + MarkBattlerForControllerExec(battler); -static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) -{ - u32 battler; - for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) - { - if (battler == gBattlerAttacker || !IsBattlerAlive(battler)) - continue; - - if (!(excludeCurrent && battler == gBattlerTarget) - && !gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] - && (!IsBattlerAlly(battler, gBattlerAttacker) || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) - break; - } - return battler; + gBattlescriptCurrInstr = cmd->nextInstr; } static inline bool32 IsProtectivePadsProtected(u32 battler, enum HoldEffect holdEffect) @@ -5511,1635 +5121,18 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, enum HoldEffect hold return TRUE; } -static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) -{ - if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_BUTTON - && battlerAtk != battlerDef - && IsBattlerTurnDamaged(battlerDef) - && IsBattlerAlive(battlerDef) - && CountUsablePartyMons(battlerDef) > 0 - && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battlerAtk))) - return TRUE; - - return FALSE; -} - -static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) -{ - if (gDisableStructs[battlerDef].tryEjectPack - && GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_PACK - && IsBattlerAlive(battlerDef) - && CountUsablePartyMons(battlerDef) > 0 - && !gProtectStructs[battlerDef].disableEjectPack - && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battlerAtk)) - && !(moveEffect == EFFECT_PARTING_SHOT && CanBattlerSwitch(battlerAtk))) - return TRUE; - - return FALSE; -} - -static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move) -{ - bool32 effect = FALSE; - enum Ability abilityAtk = GetBattlerAbility(battlerAtk); - - switch (abilityAtk) - { - case ABILITY_MAGICIAN: - if (GetMoveEffect(move) != EFFECT_FLING - && GetMoveEffect(move) != EFFECT_NATURAL_GIFT - && gBattleMons[battlerAtk].item == ITEM_NONE - && IsBattlerAlive(battlerAtk) - && !gSpecialStatuses[battlerAtk].gemBoost) // In base game, gems are consumed after magician would activate. - { - u32 numMagicianTargets = 0; - u32 magicianTargets = 0; - - for (u32 i = 0; i < gBattlersCount; i++) - { - if (gBattleMons[i].item != ITEM_NONE - && i != battlerAtk - && IsBattlerTurnDamaged(i) - && CanStealItem(battlerAtk, i, gBattleMons[i].item) - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(i)] & (1u << gBattlerPartyIndexes[i])) - && !DoesSubstituteBlockMove(battlerAtk, i, move) - && (GetBattlerAbility(i) != ABILITY_STICKY_HOLD || !IsBattlerAlive(i))) - { - magicianTargets |= 1u << i; - numMagicianTargets++; - } - } - - if (numMagicianTargets == 0) - { - effect = FALSE; - break; - } - - u8 battlers[4] = {0, 1, 2, 3}; - if (numMagicianTargets > 1) - SortBattlersBySpeed(battlers, FALSE); - - for (u32 i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - - if (!(magicianTargets & 1u << battler)) - continue; - - StealTargetItem(battlerAtk, battler); - gBattlerAbility = battlerAtk; - gEffectBattler = battler; - BattleScriptCall(BattleScript_MagicianActivates); - effect = TRUE; - break; // found target to steal from - } - } - break; - case ABILITY_MOXIE: - case ABILITY_CHILLING_NEIGH: - case ABILITY_AS_ONE_ICE_RIDER: - case ABILITY_GRIM_NEIGH: - case ABILITY_AS_ONE_SHADOW_RIDER: - case ABILITY_BEAST_BOOST: - { - if (!IsBattlerAlive(battlerAtk) || NoAliveMonsForEitherParty()) - break; - - enum Stat stat = STAT_ATK; - u32 numMonsFainted = NumFaintedBattlersByAttacker(battlerAtk); - - if (abilityAtk == ABILITY_BEAST_BOOST) - stat = GetHighestStatId(battlerAtk); - else if (abilityAtk == ABILITY_GRIM_NEIGH || abilityAtk == ABILITY_AS_ONE_SHADOW_RIDER) - stat = STAT_SPATK; - - if (numMonsFainted && CompareStat(battlerAtk, stat, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) - { - gLastUsedAbility = abilityAtk; - if (abilityAtk == ABILITY_AS_ONE_ICE_RIDER) - gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; - else if (abilityAtk == ABILITY_AS_ONE_SHADOW_RIDER) - gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; - - SET_STATCHANGER(stat, numMonsFainted, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); - BattleScriptCall(BattleScript_RaiseStatOnFaintingTarget); - effect = TRUE; - } - } - break; - case ABILITY_BATTLE_BOND: - { - if (!IsBattlerAlive(battlerAtk) - || NoAliveMonsForEitherParty() - || NumFaintedBattlersByAttacker(battlerAtk) == 0) - break; - - if (GetBattlerPartyState(battlerAtk)->battleBondBoost) - break; - - if (GetGenConfig(GEN_CONFIG_BATTLE_BOND) < GEN_9 && gBattleMons[battlerAtk].species == SPECIES_GRENINJA_BATTLE_BOND) - { - // TODO: Convert this to a proper FORM_CHANGE type. - gLastUsedAbility = abilityAtk; - GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battlerAtk].species); - GetBattlerPartyState(battlerAtk)->changedSpecies = gBattleMons[battlerAtk].species; - gBattleMons[battlerAtk].species = SPECIES_GRENINJA_ASH; - BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker); - effect = TRUE; - } - else - { - u32 numStatBuffs = 0; - if (CompareStat(battlerAtk, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) - { - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_ATK) + STAT_ANIM_PLUS1; - numStatBuffs++; - } - if (CompareStat(battlerAtk, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) - { - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPATK) + STAT_ANIM_PLUS1; - numStatBuffs++; - } - if (CompareStat(battlerAtk, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, abilityAtk)) - { - gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPEED) + STAT_ANIM_PLUS1; - numStatBuffs++; - } - - if (numStatBuffs > 0) - { - if (numStatBuffs > 1) - gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; - - gLastUsedAbility = abilityAtk; - gBattlerAbility = battlerAtk; - GetBattlerPartyState(battlerAtk)->battleBondBoost = TRUE; - BattleScriptCall(BattleScript_EffectBattleBondStatIncrease); - effect = TRUE; - } - } - } - break; - default: - break; - } - - return effect; -} - -static bool32 HandleMoveEndMoveBlock(u32 moveEffect) -{ - if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - return FALSE; - - bool32 effect = FALSE; - enum BattleSide side = GetBattlerSide(gBattlerTarget); - switch (moveEffect) - { - case EFFECT_KNOCK_OFF: - if (gBattleMons[gBattlerTarget].item != ITEM_NONE - && IsBattlerAlive(gBattlerAttacker) - && !(B_KNOCK_OFF_REMOVAL >= GEN_5 && side == B_SIDE_PLAYER && !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) - && IsBattlerTurnDamaged(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) - && !NoAliveMonsForEitherParty()) - { - u32 side = GetBattlerSide(gBattlerTarget); - - if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - gBattlerAbility = gBattlerTarget; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StickyHoldActivatesRet; - effect = TRUE; - break; - } - gLastUsedItem = gBattleMons[gBattlerTarget].item; - gBattleMons[gBattlerTarget].item = 0; - if (gBattleMons[gBattlerTarget].ability != ABILITY_GORILLA_TACTICS) - gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; - CheckSetUnburden(gBattlerTarget); - - // In Gen 5+, Knock Off removes the target's item rather than rendering it unusable - if (B_KNOCK_OFF_REMOVAL >= GEN_5) - { - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); - MarkBattlerForControllerExec(gBattlerTarget); - // Mark item as stolen so it will be restored after battle - gBattleStruct->itemLost[side][gBattlerPartyIndexes[gBattlerTarget]].stolen = TRUE; - } - else - { - gWishFutureKnock.knockedOffMons[side] |= 1u << gBattlerPartyIndexes[gBattlerTarget]; - } - - BattleScriptCall(BattleScript_KnockedOff); - effect = TRUE; - } - break; - case EFFECT_STEAL_ITEM: - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - || gBattleMons[gBattlerAttacker].item != ITEM_NONE - || gBattleMons[gBattlerTarget].item == ITEM_NONE - || !IsBattlerAlive(gBattlerAttacker) - || !IsBattlerTurnDamaged(gBattlerTarget)) - { - effect = FALSE; - } - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - BattleScriptCall(BattleScript_NoItemSteal); - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - effect = TRUE; - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - - if (!(GetGenConfig(GEN_STEAL_WILD_ITEMS) >= GEN_9 - && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) - { - gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - } - gEffectBattler = gBattlerTarget; - BattleScriptCall(BattleScript_ItemSteal); - effect = TRUE; - } - break; - case EFFECT_HIT_SWITCH_TARGET: - if (IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && gBattleMons[BATTLE_PARTNER(gBattlerTarget)].volatiles.semiInvulnerable != STATE_COMMANDER) - { - u32 targetAbility = GetBattlerAbility(gBattlerTarget); - if (targetAbility == ABILITY_GUARD_DOG) - return FALSE; - - if (targetAbility == ABILITY_SUCTION_CUPS) - { - BattleScriptCall(BattleScript_AbilityPreventsPhasingOutRet); - } - else if (gBattleMons[gBattlerTarget].volatiles.root) - { - BattleScriptCall(BattleScript_PrintMonIsRootedRet); - } - else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) - { - BattleScriptCall(BattleScript_HitSwitchTargetDynamaxed); - } - else - { - gBattleScripting.switchCase = B_SWITCH_HIT; - BattleScriptCall(BattleScript_TryHitSwitchTarget); - } - effect = TRUE; - } - break; - case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget)) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - { - gBattleMons[gBattlerTarget].volatiles.smackDown = TRUE; - gBattleMons[gBattlerTarget].volatiles.telekinesis = FALSE; - gBattleMons[gBattlerTarget].volatiles.magnetRise = FALSE; - gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; - BattleScriptCall(BattleScript_MoveEffectSmackDown); - effect = TRUE; - } - break; - case EFFECT_RECOIL_IF_MISS: - if (IsBattlerAlive(gBattlerAttacker) - && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !gBattleStruct->noTargetPresent) - { - s32 recoil = 0; - if (B_RECOIL_IF_MISS_DMG >= GEN_5 || (B_CRASH_IF_TARGET_IMMUNE == GEN_4 && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_DOESNT_AFFECT_FOE)) - recoil = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; - else if (B_RECOIL_IF_MISS_DMG == GEN_4 && (GetNonDynamaxMaxHP(gBattlerTarget) / 2) < gBattleStruct->moveDamage[gBattlerTarget]) - recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - else // Fallback if B_RECOIL_IF_MISS_DMG is set to gen3 or lower. - recoil = GetNonDynamaxMaxHP(gBattlerTarget) / 2; - SetPassiveDamageAmount(gBattlerAttacker, recoil); - BattleScriptCall(BattleScript_RecoilIfMiss); - effect = TRUE; - } - break; - case EFFECT_RECOIL: - if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) - { - enum Ability ability = GetBattlerAbility(gBattlerAttacker); - if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) - || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) - break; - - SetPassiveDamageAmount(gBattlerAttacker, gBattleScripting.savedDmg * max(1, GetMoveRecoil(gCurrentMove)) / 100); - TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); - BattleScriptCall(BattleScript_MoveEffectRecoil); - effect = TRUE; - } - break; - case EFFECT_EXPLOSION: - case EFFECT_MISTY_EXPLOSION: - if (!IsAbilityOnField(ABILITY_DAMP)) - { - gBattleStruct->passiveHpUpdate[gBattlerAttacker] = 0; - BattleScriptCall(BattleScript_FaintAttackerForExplosion); - effect = TRUE; - } - break; - case EFFECT_MAX_HP_50_RECOIL: - if (IsBattlerAlive(gBattlerAttacker) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_FAILED) - && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) - { - s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP - SetPassiveDamageAmount(gBattlerAttacker, recoil); - TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); - BattleScriptCall(BattleScript_MaxHp50Recoil); - effect = TRUE; - } - break; - case EFFECT_CHLOROBLAST: - if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) - { - enum Ability ability = GetBattlerAbility(gBattlerAttacker); - if (IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_ROCK_HEAD) - || IsAbilityAndRecord(gBattlerAttacker, ability, ABILITY_MAGIC_GUARD)) - break; - - s32 recoil = (GetNonDynamaxMaxHP(gBattlerAttacker) + 1) / 2; // Half of Max HP Rounded UP - SetPassiveDamageAmount(gBattlerAttacker, recoil); - TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->passiveHpUpdate[gBattlerAttacker], MOVE_NONE); - BattleScriptCall(BattleScript_MoveEffectRecoil); - effect = TRUE; - } - break; - case EFFECT_RAPID_SPIN: - if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) - { - BattleScriptCall(BattleScript_RapidSpinAway); - effect = TRUE; - } - break; - case EFFECT_FELL_STINGER: - if (IsBattlerAlive(gBattlerAttacker) - && !IsBattlerAlive(gBattlerTarget) - && IsBattlerTurnDamaged(gBattlerTarget) - && !NoAliveMonsForEitherParty() - && CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerAttacker))) - { - SET_STATCHANGER(STAT_ATK, GetGenConfig(GEN_CONFIG_FELL_STINGER_STAT_RAISE) >= GEN_7 ? 3 : 2, FALSE); - PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; - effect = TRUE; - } - break; - case EFFECT_STONE_AXE: - if (!IsHazardOnSide(side, HAZARDS_STEALTH_ROCK) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_POINTEDSTONESFLOAT; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_StealthRockActivates; - effect = TRUE; - } - break; - case EFFECT_CEASELESS_EDGE: - if (gSideTimers[side].spikesAmount < 3 - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker)) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SPIKESSCATTERED; - BattleScriptPush(gBattlescriptCurrInstr + 1); - if (gBattleStruct->isSkyBattle) - { - effect = FALSE; - } - else - { - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SpikesActivates; - effect = TRUE; - } - } - break; - default: - effect = FALSE; - break; - } - - return effect; -} - static void Cmd_moveend(void) { CMD_ARGS(u8 endMode, u8 endState); + assertf(gBattlerAttacker < gBattlersCount, "invalid gBattlerAttacker: %d\nmove: %S", gBattlerAttacker, GetMoveName(gCurrentMove)); + assertf(gBattlerTarget < gBattlersCount, "invalid gBattlerTarget: %d\nmove: %S", gBattlerTarget, GetMoveName(gCurrentMove)); - s32 i; - bool32 effect = FALSE; - u32 moveType = 0; - u32 endMode, endState; - u32 originallyUsedMove; + enum MoveEndResult result = DoMoveEnd(cmd->endMode, cmd->endState); - if (gChosenMove == MOVE_UNAVAILABLE) - originallyUsedMove = MOVE_NONE; - else - originallyUsedMove = gChosenMove; + if (result == MOVEEND_STEP_BREAK) + return; - endMode = cmd->endMode; - endState = cmd->endState; - - moveType = GetBattleMoveType(gCurrentMove); - - enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - - do - { - switch (gBattleScripting.moveendState) - { - case MOVEEND_SET_VALUES: - gBattleScripting.savedDmg += gBattleStruct->moveDamage[gBattlerTarget]; - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_PROTECT_LIKE_EFFECT: - if (gProtectStructs[gBattlerAttacker].touchedProtectLike) - { - enum ProtectMethod method = gProtectStructs[gBattlerTarget].protected; - switch (method) - { - case PROTECT_SPIKY_SHIELD: - if (moveEffect != EFFECT_COUNTER - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) - && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 8); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_SPIKY_SHIELD); - BattleScriptCall(BattleScript_SpikyShieldEffect); - effect = 1; - } - break; - case PROTECT_KINGS_SHIELD: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - if (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_1; - else - gBattleScripting.moveEffect = MOVE_EFFECT_ATK_MINUS_2; - BattleScriptCall(BattleScript_KingsShieldEffect); - effect = 1; - } - break; - case PROTECT_BANEFUL_BUNKER: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) - && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_POISON; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); - BattleScriptCall(BattleScript_BanefulBunkerEffect); - effect = 1; - } - break; - case PROTECT_BURNING_BULWARK: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) - && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) - { - gEffectBattler = - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_BURN; - PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BURNING_BULWARK); - BattleScriptCall(BattleScript_BanefulBunkerEffect); - effect = 1; - } - break; - case PROTECT_OBSTRUCT: - if (moveEffect != EFFECT_SUCKER_PUNCH // Why??? - && moveEffect != EFFECT_UPPER_HAND // Why??? - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - gBattleScripting.moveEffect = MOVE_EFFECT_DEF_MINUS_2; - BattleScriptCall(BattleScript_KingsShieldEffect); - effect = 1; - } - break; - case PROTECT_SILK_TRAP: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - i = gBattlerAttacker; - gBattlerAttacker = gBattlerTarget; - gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable - gBattleScripting.moveEffect = MOVE_EFFECT_SPD_MINUS_1; - BattleScriptCall(BattleScript_KingsShieldEffect); - effect = 1; - } - break; - default: - break; - } - - // Not strictly a protect effect, but works the same way - if (gProtectStructs[gBattlerTarget].beakBlastCharge - && CanBeBurned(gBattlerAttacker, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; - gBattleMons[gBattlerAttacker].status1 = STATUS1_BURN; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].status1), &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); - BattleScriptCall(BattleScript_BeakBlastBurn); - effect = 1; - } - } - gBattleScripting.moveendState++; - break; - - case MOVEEND_GRUDGE: - if (gBattleStruct->tryGrudge - && IsBattlerTurnDamaged(gBattlerTarget) - && !IsBattlerAlive(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && !IsZMove(gCurrentMove) - && gCurrentMove != MOVE_STRUGGLE) - { - u32 moveIndex = gBattleStruct->chosenMovePositions[gBattlerAttacker]; - - gBattleStruct->tryGrudge = FALSE; - gBattleMons[gBattlerAttacker].pp[moveIndex] = 0; - BattleScriptCall(BattleScript_GrudgeTakesPp); - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].pp[moveIndex]), &gBattleMons[gBattlerAttacker].pp[moveIndex]); - MarkBattlerForControllerExec(gBattlerAttacker); - PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) - } - gBattleScripting.moveendState++; - break; - - case MOVEEND_DESTINY_BOND: - if (gBattleStruct->tryDestinyBond - && IsBattlerTurnDamaged(gBattlerTarget) - && !IsBattlerAlive(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !(GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - { - gBattleStruct->tryDestinyBond = FALSE; - gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerAttacker].hp; - BattleScriptCall(BattleScript_DestinyBondTakesLife); - effect = TRUE; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_ABSORB: - if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE - || !IsBattlerTurnDamaged(gBattlerTarget)) - { - gBattleScripting.moveendState++; - break; - } - switch (moveEffect) - { - case EFFECT_ABSORB: - case EFFECT_DREAM_EATER: - if (!gBattleMons[gBattlerAttacker].volatiles.healBlock - && gBattleStruct->moveDamage[gBattlerTarget] > 0 - && IsBattlerAlive(gBattlerAttacker)) - { - s32 healAmount = (gBattleStruct->moveDamage[gBattlerTarget] * GetMoveAbsorbPercentage(gCurrentMove) / 100); - healAmount = GetDrainedBigRootHp(gBattlerAttacker, healAmount); - effect = TRUE; - if ((moveEffect == EFFECT_DREAM_EATER && GetGenConfig(GEN_DREAM_EATER_LIQUID_OOZE) < GEN_5) - || GetBattlerAbility(gBattlerTarget) != ABILITY_LIQUID_OOZE) - { - SetHealAmount(gBattlerAttacker, healAmount); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB; - BattleScriptCall(BattleScript_EffectAbsorb); - } - else // Liquid Ooze damage - { - SetPassiveDamageAmount(gBattlerAttacker, healAmount); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABSORB_OOZE; - BattleScriptCall(BattleScript_EffectAbsorbLiquidOoze); - } - } - break; - case EFFECT_FINAL_GAMBIT: - BattleScriptCall(BattleScript_FinalGambit); - effect = TRUE; - break; - default: - break; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_RAGE: // rage check - if (gBattleMons[gBattlerTarget].volatiles.rage - && IsBattlerAlive(gBattlerTarget) - && gBattlerAttacker != gBattlerTarget - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget) - && IsBattlerTurnDamaged(gBattlerTarget) - && !IsBattleMoveStatus(gCurrentMove) - && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) - { - SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptCall(BattleScript_RageIsBuilding); - effect = TRUE; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_SYNCHRONIZE_TARGET: // target synchronize - if (AbilityBattleEffects(ABILITYEFFECT_SYNCHRONIZE, gBattlerTarget, 0, 0, 0)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_ABILITIES: // Such as abilities activating on contact(Poison Spore, Rough Skin, etc.). - if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END, gBattlerTarget, 0, 0, 0)) - effect = TRUE; - else if (TryClearIllusion(gBattlerTarget, ABILITYEFFECT_MOVE_END)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_ABILITIES_ATTACKER: // Poison Touch, possibly other in the future - if (AbilityBattleEffects(ABILITYEFFECT_MOVE_END_ATTACKER, gBattlerAttacker, 0, 0, 0)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_STATUS_IMMUNITY_ABILITIES: // status immunities - for (u16 battler = 0; battler < gBattlersCount; battler++) - { - if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, 0)) - effect = TRUE; - } - if (!effect) - gBattleScripting.moveendState++; - break; - case MOVEEND_SYNCHRONIZE_ATTACKER: // attacker synchronize - if (AbilityBattleEffects(ABILITYEFFECT_ATK_SYNCHRONIZE, gBattlerAttacker, 0, 0, 0)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_ITEM_EFFECTS_TARGET: - { - enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); - if (ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnTargetHitActivation) - || ItemBattleEffects(gBattlerTarget, gBattlerAttacker, holdEffect, IsOnStatusChangeActivation)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - } - case MOVEEND_ITEM_EFFECTS_ATTACKER_1: - { - enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); - if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnAttackerAfterHitActivation) - || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) - || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - } - case MOVEEND_SYMBIOSIS: - for (i = 0; i < gBattlersCount; i++) - { - if ((gSpecialStatuses[i].berryReduced - || (B_SYMBIOSIS_GEMS >= GEN_7 && gSpecialStatuses[i].gemBoost)) - && TryTriggerSymbiosis(i, BATTLE_PARTNER(i))) - { - BestowItem(BATTLE_PARTNER(i), i); - gLastUsedAbility = gBattleMons[BATTLE_PARTNER(i)].ability; - gEffectBattler = i; - gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(i); - gBattlerAttacker = i; - BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; - effect = TRUE; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_ATTACKER_INVISIBLE: // make attacker sprite invisible - if (IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) - && gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION)) - { - BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, TRUE); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattleScripting.moveendState++; - return; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_ATTACKER_VISIBLE: // make attacker sprite visible - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || !IsSemiInvulnerable(gBattlerAttacker, CHECK_ALL) - || WasUnableToUseMove(gBattlerAttacker)) - { - BtlController_EmitSpriteInvisibility(gBattlerAttacker, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(gBattlerAttacker); - gBattleMons[gBattlerAttacker].volatiles.semiInvulnerable = STATE_NONE; - gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = TRUE; - gBattleScripting.moveendState++; - return; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_TARGET_VISIBLE: // make target sprite visible - if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount - && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) - { - BtlController_EmitSpriteInvisibility(gBattlerTarget, B_COMM_TO_CONTROLLER, FALSE); - MarkBattlerForControllerExec(gBattlerTarget); - gBattleMons[gBattlerTarget].volatiles.semiInvulnerable = STATE_NONE; - gBattleScripting.moveendState++; - return; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_SUBSTITUTE: - for (i = 0; i < gBattlersCount; i++) - { - if (gDisableStructs[i].substituteHP == 0) - gBattleMons[i].volatiles.substitute = FALSE; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_SKY_DROP_CONFUSE: // If a Pokemon was released from Sky Drop and was in LOCK_CONFUSE, go to "confused due to fatigue" scripts and clear Sky Drop data. - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleStruct->skyDropTargets[i] == SKY_DROP_RELEASED_TARGET) - { - u8 targetId; - // Find the battler id of the Pokemon that was held by Sky Drop - for (targetId = 0; targetId < gBattlersCount; targetId++) - { - if (gBattleStruct->skyDropTargets[targetId] == i) - break; - } - - // Set gBattlerAttacker to the battler id of the target - gBattlerAttacker = targetId; - - // Jump to "confused due to fatigue" script - gBattlescriptCurrInstr = BattleScript_ThrashConfuses; - - // Clear skyDropTargets data - gBattleStruct->skyDropTargets[i] = SKY_DROP_NO_TARGET; - gBattleStruct->skyDropTargets[targetId] = SKY_DROP_NO_TARGET; - return; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_UPDATE_LAST_MOVES: - if (!IsOnPlayerSide(gBattlerAttacker)) - UpdateStallMons(); - if ((gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE)) - || gBattleMons[gBattlerAttacker].volatiles.flinched - || gBattleStruct->pledgeMove == TRUE // Is the battler that uses the first Pledge move in the combo - || gProtectStructs[gBattlerAttacker].nonVolatileStatusImmobility) - gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; - - // Set ShellTrap to activate after the attacker's turn if target was hit by a physical move. - if (GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP - && gBattlerTarget != gBattlerAttacker - && !IsBattlerAlly(gBattlerTarget, gBattlerAttacker) - && gProtectStructs[gBattlerTarget].physicalDmg - && gProtectStructs[gBattlerTarget].physicalBattlerId == gBattlerAttacker - && !TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) - { - gProtectStructs[gBattlerTarget].shellTrap = TRUE; - // Change move order in double battles, so the hit mon with shell trap moves immediately after being hit. - if (IsDoubleBattle()) - { - ChangeOrderTargetAfterAttacker(); - } - } - - // After swapattackerwithtarget is used for snatch the correct battlers have to be restored so data is stored correctly - if (gBattleStruct->snatchedMoveIsUsed) - { - u32 temp; - SWAP(gBattlerAttacker, gBattlerTarget, temp); - } - - if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) - { - gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; - gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget; - } - enum BattleMoveEffects originalEffect = GetMoveEffect(originallyUsedMove); - if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && originalEffect != EFFECT_BATON_PASS && originalEffect != EFFECT_HEALING_WISH) - { - if (gHitMarker & HITMARKER_OBEYS) - { - if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) - { - gLastMoves[gBattlerAttacker] = gChosenMove; - RecordKnownMove(gBattlerAttacker, gChosenMove); - gLastResultingMoves[gBattlerAttacker] = gCurrentMove; - gLastUsedMoveType[gBattlerAttacker] = GetBattleMoveType(gCurrentMove); - } - } - else - { - gLastMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; - gLastResultingMoves[gBattlerAttacker] = MOVE_UNAVAILABLE; - gLastUsedMoveType[gBattlerAttacker] = 0; - } - - if (!(gHitMarker & HITMARKER_FAINTED(gBattlerTarget))) - gLastHitBy[gBattlerTarget] = gBattlerAttacker; - - if (gHitMarker & HITMARKER_OBEYS && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - if (gChosenMove == MOVE_UNAVAILABLE) - { - gLastLandedMoves[gBattlerTarget] = gChosenMove; - } - else - { - gLastLandedMoves[gBattlerTarget] = gCurrentMove; - gLastHitByType[gBattlerTarget] = GetBattleMoveType(gCurrentMove); - if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) - { - gLastUsedMove = gCurrentMove; - if (IsMaxMove(gCurrentMove)) - gBattleStruct->dynamax.lastUsedBaseMove = gBattleStruct->dynamax.baseMoves[gBattlerAttacker]; - } - } - } - else - { - gLastLandedMoves[gBattlerTarget] = MOVE_UNAVAILABLE; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_MIRROR_MOVE: // mirror move - if (!(gAbsentBattlerFlags & (1u << gBattlerAttacker)) - && !IsMoveMirrorMoveBanned(originallyUsedMove) - && gHitMarker & HITMARKER_OBEYS - && gBattlerAttacker != gBattlerTarget - && !(gHitMarker & HITMARKER_FAINTED(gBattlerTarget)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gBattleStruct->lastTakenMove[gBattlerTarget] = gChosenMove; - gBattleStruct->lastTakenMoveFrom[gBattlerTarget][gBattlerAttacker] = gChosenMove; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_DEFROST: - if (gBattleMons[gBattlerTarget].status1 & STATUS1_FREEZE - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && gBattlerAttacker != gBattlerTarget - && (moveType == TYPE_FIRE || CanBurnHitThaw(gCurrentMove)) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptCall(BattleScript_DefrostedViaFireMove); - effect = TRUE; - } - if (gBattleMons[gBattlerTarget].status1 & STATUS1_FROSTBITE - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && gBattlerAttacker != gBattlerTarget - && MoveThawsUser(originallyUsedMove) - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FROSTBITE; - BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - BattleScriptCall(BattleScript_FrostbiteHealedViaFireMove); - effect = TRUE; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon. - { - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - - gBattleStruct->battlerState[gBattlerAttacker].targetsDone[gBattlerTarget] = TRUE; - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsDoubleBattle() - && !gProtectStructs[gBattlerAttacker].chargingTurn - && (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY)) - { - u32 nextTarget = GetNextTarget(moveTarget, FALSE); - - if (nextTarget != MAX_BATTLERS_COUNT) - { - gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; // Fix for moxie spread moves - gBattleScripting.moveendState = 0; - MoveValuesCleanUp(); - gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect; - - // Edge cases for moves that shouldn't repeat their own script - if (moveEffect == EFFECT_EXPLOSION - || moveEffect == EFFECT_MISTY_EXPLOSION - || moveEffect == EFFECT_MAGNITUDE - || moveEffect == EFFECT_SYNCHRONOISE - || gBattleMoveEffects[moveEffect].battleScript == BattleScript_EffectTwoTurnsAttack) - BattleScriptPush(gBattleMoveEffects[EFFECT_HIT].battleScript); - else - BattleScriptPush(GetMoveBattleScript(gCurrentMove)); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; - } - // Check if the move used was actually a bounced move. If so, we need to go back to the original attacker and make sure, its move hits all 2 or 3 pokemon. - else if (gBattleStruct->bouncedMoveIsUsed) - { - u8 originalBounceTarget = gBattlerAttacker; - gBattleStruct->bouncedMoveIsUsed = FALSE; - gBattlerAttacker = gBattleStruct->attackerBeforeBounce; - gBattleStruct->battlerState[gBattlerAttacker].targetsDone[originalBounceTarget] = TRUE; - for (i = 0; i < gBattlersCount; i++) - gBattleStruct->battlerState[originalBounceTarget].targetsDone[i] = FALSE; - nextTarget = GetNextTarget(moveTarget, FALSE); - if (nextTarget != MAX_BATTLERS_COUNT) - { - // We found another target for the original move user. - gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; - gBattleScripting.moveendState = 0; - gBattleScripting.animTurn = 0; - gBattleScripting.animTargetsHit = 0; - MoveValuesCleanUp(); - BattleScriptPush(GetMoveBattleScript(gCurrentMove)); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; - } - } - } - RecordLastUsedMoveBy(gBattlerAttacker, gCurrentMove); - gBattleScripting.moveendState++; - break; - } - case MOVEEND_HP_THRESHHOLD_ITEMS_TARGET: - if (gMultiHitCounter - && ItemBattleEffects(gBattlerTarget, gBattlerAttacker, GetBattlerHoldEffect(gBattlerTarget), IsOnHpThresholdActivation)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_MULTIHIT_MOVE: - { - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gMultiHitCounter - && !(moveEffect == EFFECT_PRESENT && gBattleStruct->presentBasePower == 0)) // Silly edge case - { - gMultiHitCounter--; - if (!IsBattlerAlive(gBattlerTarget) && moveEffect != EFFECT_DRAGON_DARTS) - gMultiHitCounter = 0; - - gBattleScripting.multihitString[4]++; - if (gMultiHitCounter == 0) - { - if (GetMoveEffectArg_MoveProperty(gCurrentMove) == MOVE_EFFECT_SCALE_SHOT && !NoAliveMonsForEitherParty()) - BattleScriptCall(BattleScript_ScaleShot); - else - BattleScriptCall(BattleScript_MultiHitPrintStrings); - effect = TRUE; - } - else - { - if (moveEffect == EFFECT_DRAGON_DARTS - && !IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(gBattlerTarget), gCurrentMove) - && !(gBattleStruct->moveResultFlags[BATTLE_PARTNER(gBattlerTarget)] & MOVE_RESULT_MISSED) // didn't miss the other target - && CanTargetPartner(gBattlerAttacker, gBattlerTarget) - && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(gBattlerTarget))) - gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); // Target the partner in doubles for second hit. - - enum BattleMoveEffects chosenEffect = GetMoveEffect(gChosenMove); - - if (gBattleMons[gBattlerAttacker].hp - && gBattleMons[gBattlerTarget].hp - && (chosenEffect == EFFECT_SLEEP_TALK || chosenEffect == EFFECT_SNORE || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) - && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) - { - if (gSpecialStatuses[gBattlerAttacker].parentalBondState) - gSpecialStatuses[gBattlerAttacker].parentalBondState--; - - gBattleScripting.animTargetsHit = 0; - gBattleScripting.moveendState = 0; - gSpecialStatuses[gBattlerAttacker].multiHitOn = TRUE; - MoveValuesCleanUp(); - BattleScriptPush(GetMoveBattleScript(gCurrentMove)); - gBattlescriptCurrInstr = BattleScript_FlushMessageBox; - return; - } - else - { - BattleScriptCall(BattleScript_MultiHitPrintStrings); - effect = TRUE; - } - } - } - gMultiHitCounter = 0; - gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; - gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; - gBattleScripting.moveendState++; - break; - } - case MOVEEND_MOVE_BLOCK: - effect = HandleMoveEndMoveBlock(moveEffect); - gBattleScripting.moveendState++; - break; - case MOVEEND_ITEM_EFFECTS_ATTACKER_2: - { - enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker); - if (ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnStatusChangeActivation) - || ItemBattleEffects(gBattlerAttacker, gBattlerTarget, holdEffect, IsOnHpThresholdActivation)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - } - case MOVEEND_ABILITY_BLOCK: - effect = HandleMoveEndAbilityBlock(gBattlerAttacker, gBattlerTarget, gCurrentMove); - gBattleScripting.moveendState++; - break; - case MOVEEND_SHEER_FORCE: - if (TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) - gBattleScripting.moveendState = MOVEEND_EJECT_PACK; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_COLOR_CHANGE: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battler = gBattleStruct->eventState.moveEndBattler++; - if (battler == gBattlerAttacker) - continue; - if (AbilityBattleEffects(ABILITYEFFECT_COLOR_CHANGE, battler, GetBattlerAbility(battler), 0, 0)) - return; - } - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_KEE_MARANGA_HP_THRESHOLD_ITEM_TARGET: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battlerDef = gBattleStruct->eventState.moveEndBattler++; - if (battlerDef == gBattlerAttacker) - continue; - enum HoldEffect holdEffect = GetBattlerHoldEffect(battlerDef); - if (ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsKeeMarangaBerryActivation) - || ItemBattleEffects(battlerDef, gBattlerAttacker, holdEffect, IsOnHpThresholdActivation)) - return; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_RED_CARD: - { - u32 redCardBattlers = 0, i; - for (i = 0; i < gBattlersCount; i++) - { - if (i == gBattlerAttacker) - continue; - if (GetBattlerHoldEffect(i) == HOLD_EFFECT_RED_CARD) - redCardBattlers |= (1u << i); - } - if (redCardBattlers && IsBattlerAlive(gBattlerAttacker)) - { - // Since we check if battler was damaged, we don't need to check move result. - // In fact, doing so actually prevents multi-target moves from activating red card properly - u8 battlers[4] = {0, 1, 2, 3}; - SortBattlersBySpeed(battlers, FALSE); - for (i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - // Search for fastest hit pokemon with a red card - // Attacker is the one to be switched out, battler is one with red card - if (redCardBattlers & (1u << battler) - && IsBattlerAlive(battler) - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) - && IsBattlerTurnDamaged(battler) - && CanBattlerSwitch(gBattlerAttacker) - && !(moveEffect == EFFECT_HIT_SWITCH_TARGET && CanBattlerSwitch(battler))) - { - effect = TRUE; - gLastUsedItem = gBattleMons[battler].item; - SaveBattlerTarget(battler); // save battler with red card - SaveBattlerAttacker(gBattlerAttacker); - gBattleScripting.battler = battler; - gEffectBattler = gBattlerAttacker; - BattleScriptPushCursor(); - if (gBattleStruct->battlerState[gBattlerAttacker].commanderSpecies != SPECIES_NONE - || GetBattlerAbility(gBattlerAttacker) == ABILITY_GUARD_DOG - || GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - gBattlescriptCurrInstr = BattleScript_RedCardActivationNoSwitch; - else - gBattlescriptCurrInstr = BattleScript_RedCardActivates; - break; // Only fastest red card activates - } - } - } - } - if (effect) - gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_EJECT_BUTTON: - { - // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. - u32 numEjectButtonBattlers = 0; - u32 ejectButtonBattlers = 0; - - for (i = 0; i < gBattlersCount; i++) - { - if (CanEjectButtonTrigger(gBattlerAttacker, i, moveEffect)) - { - ejectButtonBattlers |= 1u << i; - numEjectButtonBattlers++; - } - } - - if (numEjectButtonBattlers == 0) - { - gBattleScripting.moveendState++; - break; - } - - for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].tryEjectPack = FALSE; - - u8 battlers[4] = {0, 1, 2, 3}; - if (numEjectButtonBattlers > 1) - SortBattlersBySpeed(battlers, FALSE); - - for (i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - - if (!(ejectButtonBattlers & 1u << battler)) - continue; - - gBattleScripting.battler = battler; - gLastUsedItem = gBattleMons[battler].item; - effect = TRUE; - gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptCall(BattleScript_EjectButtonActivates); - gAiLogicData->ejectButtonSwitch = TRUE; - break; // Only the fastest Eject Button activates - } - } - if (effect) - gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_LIFE_ORB_SHELL_BELL: - if (ItemBattleEffects(gBattlerAttacker, 0, GetBattlerHoldEffect(gBattlerAttacker), IsLifeOrbShellBellActivation)) - effect = TRUE; - gBattleScripting.moveendState++; - break; - case MOVEEND_FORM_CHANGE: - if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_AFTER_MOVE)) - { - effect = TRUE; - BattleScriptCall(BattleScript_AttackerFormChangeMoveEffect); - } - gBattleScripting.moveendState++; - break; - case MOVEEND_EMERGENCY_EXIT: // Special case, because moves hitting multiple opponents stop after switching out - { - // Because sorting the battlers by speed takes lots of cycles, - // we check if EE can be activated and count how many. - u32 numEmergencyExitBattlers = 0; - u32 emergencyExitBattlers = 0; - - for (i = 0; i < gBattlersCount; i++) - { - if (IsBattlerTurnDamaged(i) && EmergencyExitCanBeTriggered(i)) - { - emergencyExitBattlers |= 1u << i; - numEmergencyExitBattlers++; - } - } - - if (numEmergencyExitBattlers == 0) - { - gBattleScripting.moveendState++; - break; - } - - for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].tryEjectPack = FALSE; - - u8 battlers[4] = {0, 1, 2, 3}; - if (numEmergencyExitBattlers > 1) - SortBattlersBySpeed(battlers, FALSE); - - for (i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - - if (!(emergencyExitBattlers & 1u << battler)) - continue; - - effect = TRUE; - gBattleScripting.battler = battler; - - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - BattleScriptCall(BattleScript_EmergencyExit); - else - BattleScriptCall(BattleScript_EmergencyExitWild); - - break; // Only the fastest Emergency Exit / Wimp Out activates - } - } - if (effect) - gBattleScripting.moveendState = MOVEEND_JUMP_TO_HIT_ESCAPE_PLUS_ONE; - else - gBattleScripting.moveendState++; - break; - case MOVEEND_HIT_ESCAPE: - if (moveEffect == EFFECT_HIT_ESCAPE - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !NoAliveMonsForBattlerSide(gBattlerTarget)) - { - effect = TRUE; - BattleScriptCall(BattleScript_EffectHitEscape); - } - gBattleScripting.moveendState++; - break; - case MOVEEND_EJECT_PACK: - { - // Because sorting the battlers by speed takes lots of cycles, it's better to just check if any of the battlers has the Eject items. - u32 ejectPackBattlers = 0; - u32 numEjectPackBattlers = 0; - - for (i = 0; i < gBattlersCount; i++) - { - if (CanEjectPackTrigger(gBattlerAttacker, i, moveEffect)) - { - ejectPackBattlers |= 1u << i; - numEjectPackBattlers++; - } - } - - if (numEjectPackBattlers == 0) - { - gBattleScripting.moveendState++; - break; - } - - u8 battlers[4] = {0, 1, 2, 3}; - if (numEjectPackBattlers > 1) - SortBattlersBySpeed(battlers, FALSE); - - for (i = 0; i < gBattlersCount; i++) - gDisableStructs[i].tryEjectPack = FALSE; - - for (i = 0; i < gBattlersCount; i++) - { - u32 battler = battlers[i]; - - if (!(ejectPackBattlers & 1u << battler)) - continue; - - gBattleScripting.battler = battler; - gLastUsedItem = gBattleMons[battler].item; - effect = TRUE; - gBattleStruct->battlerState[battler].usedEjectItem = TRUE; - BattleScriptCall(BattleScript_EjectPackActivates); - gAiLogicData->ejectPackSwitch = TRUE; - break; // Only the fastest Eject item activates - } - } - gBattleScripting.moveendState++; - break; - - case MOVEEND_ITEMS_EFFECTS_ALL: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battler = gBattleStruct->eventState.moveEndBattler++; - enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); - if (ItemBattleEffects(battler, 0, holdEffect, IsOnStatusChangeActivation) - || ItemBattleEffects(battler, 0, holdEffect, IsOnHpThresholdActivation)) - return; - } - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_WHITE_HERB: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battler = gBattleStruct->eventState.moveEndBattler++; - if (!IsBattlerAlive(battler)) - continue; - - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsWhiteHerbActivation)) - return; - } - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_OPPORTUNIST: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battler = gBattleStruct->eventState.moveEndBattler++; - if (!IsBattlerAlive(battler)) - continue; - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, GetBattlerAbility(battler), 0, 0)) - return; - } - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_MIRROR_HERB: - while (gBattleStruct->eventState.moveEndBattler < gBattlersCount) - { - u32 battler = gBattleStruct->eventState.moveEndBattler++; - if (!IsBattlerAlive(battler)) - continue; - - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation)) - return; - } - gBattleStruct->eventState.moveEndBattler = 0; - gBattleScripting.moveendState++; - break; - case MOVEEND_PICKPOCKET: - if (IsBattlerAlive(gBattlerAttacker) - && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item - && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off - && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact - && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked - { - u8 battlers[4] = {0, 1, 2, 3}; - SortBattlersBySpeed(battlers, FALSE); // Pickpocket activates for fastest mon without item - for (i = 0; i < gBattlersCount; i++) - { - u8 battler = battlers[i]; - // Attacker is mon who made contact, battler is mon with pickpocket - if (battler != gBattlerAttacker // Cannot pickpocket yourself - && GetBattlerAbility(battler) == ABILITY_PICKPOCKET // Target must have pickpocket ability - && IsBattlerTurnDamaged(battler) // Target needs to have been damaged - && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) // Subsitute unaffected - && IsBattlerAlive(battler) // Battler must be alive to pickpocket - && gBattleMons[battler].item == ITEM_NONE // Pickpocketer can't have an item already - && CanStealItem(battler, gBattlerAttacker, gBattleMons[gBattlerAttacker].item)) // Cannot steal plates, mega stones, etc - { - gBattlerTarget = gBattlerAbility = battler; - // Battle scripting is super brittle so we shall do the item exchange now (if possible) - if (GetBattlerAbility(gBattlerAttacker) != ABILITY_STICKY_HOLD) - StealTargetItem(gBattlerTarget, gBattlerAttacker); // Target takes attacker's item - - gEffectBattler = gBattlerAttacker; - BattleScriptCall(BattleScript_Pickpocket); // Includes sticky hold check to print separate string - effect = TRUE; - break; // Pickpocket activates on fastest mon, so exit loop. - } - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_THIRD_MOVE_BLOCK: - if (gChosenMove == MOVE_UNAVAILABLE) - { - gBattleScripting.moveendState++; - break; - } - - // Special case for Steel Roller since it has to check the chosen move - if (GetMoveEffect(gChosenMove) == EFFECT_STEEL_ROLLER && IsBattlerTurnDamaged(gBattlerTarget)) - { - BattleScriptCall(BattleScript_RemoveTerrain); - effect = TRUE; - gBattleScripting.moveendState++; - break; - } - - switch (moveEffect) - { - case EFFECT_ICE_SPINNER: - if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY - && IsBattlerAlive(gBattlerAttacker) - && IsBattlerTurnDamaged(gBattlerTarget)) - { - BattleScriptCall(BattleScript_RemoveTerrain); - effect = TRUE; - } - break; - case EFFECT_NATURAL_GIFT: - if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && GetItemPocket(gBattleMons[gBattlerAttacker].item) == POCKET_BERRIES) - { - u32 item = gBattleMons[gBattlerAttacker].item; - gBattleMons[gBattlerAttacker].item = ITEM_NONE; - gBattleStruct->battlerState[gBattlerAttacker].canPickupItem = TRUE; - GetBattlerPartyState(gBattlerAttacker)->usedHeldItem = item; - CheckSetUnburden(gBattlerAttacker); - BtlController_EmitSetMonData( - gBattlerAttacker, - B_COMM_TO_CONTROLLER, - REQUEST_HELDITEM_BATTLE, - 0, - sizeof(gBattleMons[gBattlerAttacker].item), - &gBattleMons[gBattlerAttacker].item); - MarkBattlerForControllerExec(gBattlerAttacker); - ClearBattlerItemEffectHistory(gBattlerAttacker); - - if (!TrySymbiosis(gBattlerAttacker, item, TRUE)) - effect = TRUE; - } - default: - break; - } - gBattleScripting.moveendState++; - break; - case MOVEEND_CHANGED_ITEMS: - for (i = 0; i < gBattlersCount; i++) - { - if (gBattleStruct->changedItems[i] != ITEM_NONE) - { - gBattleMons[i].item = gBattleStruct->changedItems[i]; - gBattleStruct->changedItems[i] = ITEM_NONE; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_SAME_MOVE_TURNS: - if (gCurrentMove != gLastResultingMoves[gBattlerAttacker] - || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT - || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - gBattleStruct->metronomeItemCounter[gBattlerAttacker] = 0; - else if (gCurrentMove == gLastResultingMoves[gBattlerAttacker] && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) - gBattleStruct->metronomeItemCounter[gBattlerAttacker]++; - gBattleScripting.moveendState++; - break; - case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits. - if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget) - gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3; - if (gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget) - gBattleStruct->moveTarget[gBattlerAttacker] = gSpecialStatuses[gBattlerAttacker].dancerOriginalTarget & 0x3; - - // If the Pokémon needs to keep track of move usage for its evolutions, do it - if (originallyUsedMove != MOVE_NONE) - TryUpdateEvolutionTracker(IF_USED_MOVE_X_TIMES, 1, originallyUsedMove); - - if (B_RAMPAGE_CANCELLING >= GEN_5 - && MoveHasAdditionalEffectSelf(gCurrentMove, MOVE_EFFECT_THRASH) // If we're rampaging - && gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT // And it is unusable - && gBattleMons[gBattlerAttacker].volatiles.lockConfusionTurns != 1) // And won't end this turn - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Cancel it - - ValidateSavedBattlerCounts(); - gProtectStructs[gBattlerAttacker].shellTrap = FALSE; - gBattleStruct->battlerState[gBattlerAttacker].ateBoost = FALSE; - gSpecialStatuses[gBattlerAttacker].gemBoost = FALSE; - gSpecialStatuses[gBattlerTarget].berryReduced = FALSE; - gSpecialStatuses[gBattlerTarget].distortedTypeMatchups = FALSE; - gBattleScripting.moveEffect = MOVE_EFFECT_NONE; - gBattleStruct->swapDamageCategory = FALSE; - gBattleStruct->categoryOverride = FALSE; - gBattleStruct->additionalEffectsCounter = 0; - gBattleStruct->poisonPuppeteerConfusion = FALSE; - gBattleStruct->fickleBeamBoosted = FALSE; - gBattleStruct->battlerState[gBattlerAttacker].usedMicleBerry = FALSE; - gBattleStruct->noTargetPresent = FALSE; - gBattleStruct->toxicChainPriority = FALSE; - if (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - gBattleStruct->pledgeMove = FALSE; - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_Z_MOVE) - SetActiveGimmick(gBattlerAttacker, GIMMICK_NONE); - if (B_CHARGE >= GEN_9 && moveType == TYPE_ELECTRIC && (IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - gBattleMons[gBattlerAttacker].volatiles.charge = FALSE; - if (gBattleMons[gBattlerAttacker].volatiles.destinyBond > 0) - gBattleMons[gBattlerAttacker].volatiles.destinyBond--; - if (moveEffect == EFFECT_ECHOED_VOICE && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) - gBattleStruct->incrementEchoedVoice = TRUE; - // check if Stellar type boost should be used up - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA - && GetBattlerTeraType(gBattlerAttacker) == TYPE_STELLAR - && GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS - && IsTypeStellarBoosted(gBattlerAttacker, moveType)) - ExpendTypeStellarBoost(gBattlerAttacker, moveType); - memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); - - for (i = 0; i < gBattlersCount; i++) - { - gBattleStruct->battlerState[gBattlerAttacker].targetsDone[i] = FALSE; - gDisableStructs[i].tryEjectPack = FALSE; - - if (gBattleStruct->battlerState[i].commanderSpecies != SPECIES_NONE && !IsBattlerAlive(i)) - { - u32 partner = BATTLE_PARTNER(i); - gBattleStruct->battlerState[i].commanderSpecies = SPECIES_NONE; - if (IsBattlerAlive(partner)) - gBattleMons[partner].volatiles.semiInvulnerable = STATE_NONE; - } - } - - gBattleScripting.moveendState++; - break; - case MOVEEND_DANCER: - if (gCurrentMove == MOVE_NONE) - originallyUsedMove = gChosenMove; // Fallback to chosen move in case attacker is switched out in the middle of an attack resolution (eg red card) - else - originallyUsedMove = gCurrentMove; - if (IsDanceMove(originallyUsedMove) && !gBattleStruct->snatchedMoveIsUsed) - { - u32 battler, nextDancer = 0; - bool32 hasDancerTriggered = FALSE; - - for (battler = 0; battler < gBattlersCount; battler++) - { - if (gSpecialStatuses[battler].dancerUsedMove) - { - // in case a battler fails to act on a Dancer-called move - hasDancerTriggered = TRUE; - break; - } - } - - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE) - || (gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE && !hasDancerTriggered) - || (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove && gBattleStruct->bouncedMoveIsUsed))) - { // Dance move succeeds - // Set target for other Dancer mons; set bit so that mon cannot activate Dancer off of its own move - if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) - { - gBattleScripting.savedBattler = gBattlerTarget | 0x4; - gBattleScripting.savedBattler |= (gBattlerAttacker << 4); - gSpecialStatuses[gBattlerAttacker].dancerUsedMove = TRUE; - } - for (battler = 0; battler < gBattlersCount; battler++) - { - if (GetBattlerAbility(battler) == ABILITY_DANCER && !gSpecialStatuses[battler].dancerUsedMove) - { - if (!nextDancer || (gBattleMons[battler].speed < gBattleMons[nextDancer & 0x3].speed)) - nextDancer = battler | 0x4; - } - } - if (nextDancer && AbilityBattleEffects(ABILITYEFFECT_MOVE_END_OTHER, nextDancer & 0x3, 0, 0, originallyUsedMove)) - effect = TRUE; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_PURSUIT_NEXT_ACTION: - if (gBattleStruct->battlerState[gBattlerTarget].pursuitTarget) - { - u32 storedTarget = gBattlerTarget; - if (SetTargetToNextPursuiter(gBattlerTarget)) - { - ChangeOrderTargetAfterAttacker(); - gBattleStruct->moveTarget[gBattlerTarget] = storedTarget; - gBattlerTarget = storedTarget; - } - else if (IsBattlerAlive(gBattlerTarget)) - { - gBattlerAttacker = gBattlerTarget; - if (gBattleStruct->pursuitStoredSwitch == PARTY_SIZE) - gBattlescriptCurrInstr = BattleScript_MoveSwitchOpenPartyScreen; - else - gBattlescriptCurrInstr = BattleScript_DoSwitchOut; - gBattleStruct->monToSwitchIntoId[gBattlerTarget] = gBattleStruct->pursuitStoredSwitch; - ClearPursuitValues(); - effect = TRUE; - } - } - gBattleScripting.moveendState++; - break; - case MOVEEND_COUNT: - break; - } - - if (endMode == 1 && effect == FALSE) - gBattleScripting.moveendState = MOVEEND_COUNT; - if (endMode == 2 && endState == gBattleScripting.moveendState) - gBattleScripting.moveendState = MOVEEND_COUNT; - - } while (gBattleScripting.moveendState != MOVEEND_COUNT && effect == FALSE); - - if (gBattleScripting.moveendState == MOVEEND_COUNT && effect == FALSE) + if (gBattleScripting.moveendState == MOVEEND_COUNT && result == MOVEEND_STEP_CONTINUE) gBattlescriptCurrInstr = cmd->nextInstr; } @@ -7154,7 +5147,7 @@ static void Cmd_sethealblock(void) else { gBattleMons[gBattlerTarget].volatiles.healBlock = TRUE; - gDisableStructs[gBattlerTarget].healBlockTimer = 5; + gBattleMons[gBattlerTarget].volatiles.healBlockTimer = B_HEAL_BLOCK_TIMER; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -7171,6 +5164,36 @@ static void Cmd_returnatktoball(void) gBattlescriptCurrInstr = cmd->nextInstr; } +static bool32 IsValidSwitchIn(enum BattleSide side, u32 index) +{ + if (index >= PARTY_SIZE) + return FALSE; + + struct Pokemon *party = GetSideParty(side); + if (!IsValidForBattle(&party[index])) + return FALSE; + + for (u32 i = 0; i < gBattlersCount; i++) + { + if (GetBattlerSide(i) == side && gBattlerPartyIndexes[i] == index && IsBattlerAlive(i)) + return FALSE; + } + + return TRUE; +} + +static u32 GetArbitraryValidSwitchIn(enum BattleSide side) +{ + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (IsValidSwitchIn(side, i)) + return i; + } + + errorf("no valid switch ins for side: %d", side); + return 0; +} + static void Cmd_getswitchedmondata(void) { CMD_ARGS(u8 battler); @@ -7179,10 +5202,11 @@ static void Cmd_getswitchedmondata(void) if (gBattleControllerExecFlags) return; - if (TESTING - && gBattlerPartyIndexes[battler] == gBattleStruct->monToSwitchIntoId[battler] - && IsBattlerAlive(battler)) - Test_ExitWithResult(TEST_RESULT_ERROR, 0, ":L:%s:%d: battler is trying to switch to themself", __FILE__, __LINE__); + enum BattleSide side = GetBattlerSide(battler); + assertf(IsValidSwitchIn(side, gBattleStruct->monToSwitchIntoId[battler])) + { + gBattleStruct->monToSwitchIntoId[battler] = GetArbitraryValidSwitchIn(side); + } gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler]; @@ -7210,33 +5234,13 @@ static void Cmd_switchindataupdate(void) for (i = 0; i < sizeof(struct BattlePokemon); i++) monData[i] = gBattleResources->bufferB[battler][4 + i]; - // Edge case: the sent out pokemon has 0 HP. This should never happen. - if (!IsBattlerAlive(battler)) + enum BattleSide side = GetBattlerSide(battler); + assertf(IsBattlerAlive(battler)) { - // If it's a test, mark it as invalid. - if (gTestRunnerEnabled) - { - TestRunner_Battle_InvalidNoHPMon(battler, gBattlerPartyIndexes[battler]); - } - // Handle in-game scenario. - else - { - struct Pokemon *party = GetBattlerParty(battler); - // Find the first possible replacement for the not valid pokemon. - for (i = 0; i < PARTY_SIZE; i++) - { - if (IsValidForBattle(&party[i])) - break; - } - // There is valid replacement. - if (i != PARTY_SIZE) - { - gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler] = i; - BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); - MarkBattlerForControllerExec(battler); - return; - } - } + gBattlerPartyIndexes[battler] = gBattleStruct->monToSwitchIntoId[battler] = GetArbitraryValidSwitchIn(side); + BtlController_EmitGetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 1u << gBattlerPartyIndexes[battler]); + MarkBattlerForControllerExec(battler); + return; } gBattleMons[battler].types[0] = GetSpeciesType(gBattleMons[battler].species, 0); @@ -7246,16 +5250,14 @@ static void Cmd_switchindataupdate(void) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + enum BattleTrainer trainer = GetBattlerTrainer(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(trainer, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(trainer, partyIndex); } #endif - // check knocked off item - i = GetBattlerSide(battler); - if (gWishFutureKnock.knockedOffMons[i] & (1u << gBattlerPartyIndexes[battler])) + if (GetBattlerPartyState(battler)->isKnockedOff) { gBattleMons[battler].item = ITEM_NONE; } @@ -7296,19 +5298,6 @@ static void Cmd_switchinanim(void) battler = GetBattlerForBattleScript(cmd->battler); - if (!IsOnPlayerSide(battler) - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_TRAINER_HILL - | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_LEGENDARY - | BATTLE_TYPE_OLD_MAN_TUTORIAL - | BATTLE_TYPE_POKEDUDE - | BATTLE_TYPE_GHOST))) - HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[battler].species), FLAG_SET_SEEN, gBattleMons[battler].personality); - - GetBattlerPartyState(battler)->sentOut = TRUE; gAbsentBattlerFlags &= ~(1u << battler); @@ -7470,7 +5459,7 @@ static void Cmd_jumpifcantswitch(void) CMD_ARGS(u8 battler:7, u8 ignoreEscapePrevention:1, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!cmd->ignoreEscapePrevention && !CanBattlerEscape(battler)) + if (!cmd->ignoreEscapePrevention && !CanBattlerEscape(battler) && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SHED_SHELL) { gBattlescriptCurrInstr = cmd->jumpInstr; } @@ -7774,265 +5763,39 @@ static void Cmd_switchhandleorder(void) gBattlescriptCurrInstr = cmd->nextInstr; } -bool32 DoSwitchInAbilities(u32 battler) -{ - return (TryPrimalReversion(battler) - || AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0) - || (gBattleWeather & B_WEATHER_ANY && HasWeatherEffect() && AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0)) - || (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY && AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0))); -} - static void UpdateSentMonFlags(u32 battler) { UpdateSentPokesToOpponentValue(battler); - gHitMarker &= ~HITMARKER_FAINTED(battler); gSpecialStatuses[battler].faintedHasReplacement = FALSE; -} + gBattleStruct->battlerState[battler].switchIn = TRUE; + gProtectStructs[battler].forcedSwitch = FALSE; -static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) -{ - gBattleScripting.battler = battler; - gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; + // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. + // The truant counter is not updated in the case where a mon switches in after a lost judgment in the battle arena. + if (GetBattlerAbility(battler) == ABILITY_TRUANT + && gCurrentActionFuncId != B_ACTION_USE_MOVE + && !gBattleMons[battler].volatiles.truantSwitchInHack) + gBattleMons[battler].volatiles.truantCounter = 1; + gBattleMons[battler].volatiles.truantSwitchInHack = 0; - if (gBattlescriptCurrInstr[1] == BS_TARGET) - BattleScriptCall(BattleScript_DmgHazardsOnTarget); - else if (gBattlescriptCurrInstr[1] == BS_ATTACKER) - BattleScriptCall(BattleScript_DmgHazardsOnAttacker); - else if (gBattlescriptCurrInstr[1] == BS_SCRIPTING) - BattleScriptCall(BattleScript_DmgHazardsOnBattlerScripting); - else - BattleScriptCall(BattleScript_DmgHazardsOnFaintedBattler); -} - -void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) -{ - switch (hazardType) + for (u32 i = 0; i < gBattlersCount; i++) { - case HAZARDS_NONE: - break; - case HAZARDS_SPIKES: - { - enum Ability ability = GetBattlerAbility(battler); - if (ability != ABILITY_MAGIC_GUARD - && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) - { - s32 spikesDmg = GetNonDynamaxMaxHP(battler) / ((5 - gSideTimers[side].spikesAmount) * 2); - SetPassiveDamageAmount(battler, spikesDmg); - SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); - } - break; + if (gBattlerByTurnOrder[i] == battler) + gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; } - case HAZARDS_STICKY_WEB: - if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) - { - gBattleScripting.battler = battler; - SET_STATCHANGER(STAT_SPEED, 1, TRUE); - BattleScriptCall(BattleScript_StickyWebOnSwitchIn); - } - break; - case HAZARDS_TOXIC_SPIKES: - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) - break; - - if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. - { - gBattleStruct->hazardsCounter--; // reduce counter so the next hazard can be applied - gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount = 0; - RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); - gEffectBattler = battler; - BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); - } - else if (IsBattlerAffectedByHazards(battler, TRUE) - && CanBePoisoned(battler, battler, GetBattlerAbility(battler), GetBattlerAbility(battler))) - { - gBattleScripting.battler = battler; - BattleScriptPushCursor(); - if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; - gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; - } - else - { - gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; - gBattleMons[battler].status1 |= STATUS1_POISON; - } - - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - } - break; - case HAZARDS_STEALTH_ROCK: - if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); - if (gBattleStruct->passiveHpUpdate[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); - } - break; - case HAZARDS_STEELSURGE: - if (IsBattlerAffectedByHazards(battler, FALSE) && GetBattlerAbility(battler) != ABILITY_MAGIC_GUARD) - { - gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); - if (gBattleStruct->passiveHpUpdate[battler] != 0) - SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); - } - break; - case HAZARDS_MAX_COUNT: - break; - } -} - -static bool32 DoSwitchInEffectsForBattler(u32 battler) -{ - u32 i = 0; - u32 side = GetBattlerSide(battler); - // Neutralizing Gas announces itself before hazards - if (!gSpecialStatuses[battler].announceNeutralizingGas - && AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN, battler, gBattleMons[battler].ability, 0, 0)) - { - gSpecialStatuses[battler].announceNeutralizingGas = TRUE; - } - // Healing Wish activates before hazards. - // Starting from Gen8 - it heals only pokemon which can be healed. In gens 5,6,7 the effect activates anyways. - else if ((gBattleStruct->battlerState[battler].storedHealingWish || gBattleStruct->battlerState[battler].storedLunarDance) - && (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1 != 0 || GetGenConfig(GEN_CONFIG_HEALING_WISH_SWITCH) < GEN_8)) - { - gBattlerAttacker = battler; - if (gBattleStruct->battlerState[battler].storedHealingWish) - { - BattleScriptCall(BattleScript_HealingWishActivates); - gBattleStruct->battlerState[battler].storedHealingWish = FALSE; - } - else // Lunar Dance - { - BattleScriptCall(BattleScript_LunarDanceActivates); - gBattleStruct->battlerState[battler].storedLunarDance = FALSE; - } - } - else if (EmergencyExitCanBeTriggered(battler)) - { - gBattleScripting.battler = gBattlerAbility = battler; - gSpecialStatuses[battler].switchInItemDone = FALSE; - gBattleStruct->battlerState[battler].forcedSwitch = FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) - BattleScriptCall(BattleScript_EmergencyExit); - else - BattleScriptCall(BattleScript_EmergencyExitWild); - } - else if (!gDisableStructs[battler].hazardsDone) - { - TryHazardsOnSwitchIn(battler, side, gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter]); - gBattleStruct->hazardsCounter++; - // Done once we reach the first element without any hazard type or the array is full - if (gBattleStruct->hazardsQueue[side][gBattleStruct->hazardsCounter] == HAZARDS_NONE - || gBattleStruct->hazardsCounter == HAZARDS_MAX_COUNT) - { - gDisableStructs[battler].hazardsDone = TRUE; - gBattleStruct->hazardsCounter = 0; - } - } - else if (gBattleMons[battler].hp != gBattleMons[battler].maxHP && gBattleStruct->zmove.healReplacement) - { - gBattleStruct->zmove.healReplacement = FALSE; - SetHealAmount(battler, gBattleMons[battler].maxHP); - gBattleScripting.battler = battler; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; - BattleScriptCall(BattleScript_HealReplacementZMove); - } - else - { - enum Ability battlerAbility = GetBattlerAbility(battler); - // There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. - // The truant counter is not updated in the case where a mon switches in after a lost judgment in the battle arena. - if (battlerAbility == ABILITY_TRUANT - && gCurrentActionFuncId != B_ACTION_USE_MOVE - && !gDisableStructs[battler].truantSwitchInHack) - gDisableStructs[battler].truantCounter = 1; - - gDisableStructs[battler].truantSwitchInHack = 0; - - if (DoSwitchInAbilities(battler)) - return TRUE; - - if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnSwitchInActivation)) - return TRUE; - - for (i = 0; i < gBattlersCount; i++) - { - if (i == battler) - continue; - - enum Ability ability = GetBattlerAbility(i); - switch (ability) - { - case ABILITY_TRACE: - case ABILITY_COMMANDER: - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, ability, 0, 0)) - return TRUE; - break; - case ABILITY_FORECAST: - case ABILITY_FLOWER_GIFT: - case ABILITY_PROTOSYNTHESIS: - if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, ability, 0, 0)) - return TRUE; - break; - default: - break; - } - if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN)) - return TRUE; - } - - for (i = 0; i < gBattlersCount; i++) - { - if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsWhiteHerbActivation)) - return TRUE; - } - for (i = 0; i < gBattlersCount; i++) - { - if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, i, GetBattlerAbility(i), 0, 0)) - return TRUE; - } - for (i = 0; i < gBattlersCount; i++) - { - if (ItemBattleEffects(i, 0, GetBattlerHoldEffect(i), IsMirrorHerbActivation)) - return TRUE; - } - - for (i = 0; i < gBattlersCount; i++) - { - if (gBattlerByTurnOrder[i] == battler) - gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; - - gBattleStruct->hpOnSwitchout[GetBattlerSide(i)] = gBattleMons[i].hp; - } - - gSpecialStatuses[battler].switchInItemDone = FALSE; - gBattleStruct->battlerState[battler].forcedSwitch = FALSE; - gBattleStruct->battlerState[battler].wasAboveHalfHp = FALSE; - return FALSE; - } - - return TRUE; // Effect's script plays. } static void Cmd_switchineffects(void) { CMD_ARGS(u8 battler); - u32 i, battler = GetBattlerForBattleScript(cmd->battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); - switch (cmd->battler) + UpdateSentMonFlags(battler); + + if (cmd->battler == BS_FAINTED_MULTIPLE_1) { - // Multiple mons fainted and are being switched-in. Their abilities/hazards will play according to speed ties. - case BS_FAINTED_MULTIPLE_1: // Saves the battlers. - gBattleStruct->battlerState[battler].multipleSwitchInBattlers = TRUE; - UpdateSentMonFlags(battler); - - // Increment fainted battler. - do + do // Increment fainted battler { gBattlerFainted++; if (gBattlerFainted >= gBattlersCount) @@ -8040,55 +5803,20 @@ static void Cmd_switchineffects(void) if (gHitMarker & HITMARKER_FAINTED(gBattlerFainted) && !(gAbsentBattlerFlags & (1u << gBattlerFainted))) break; } while (1); - - gBattlescriptCurrInstr = cmd->nextInstr; - return; - case BS_FAINTED_MULTIPLE_2: // Plays hazards/abilities. - switch (gBattleStruct->multipleSwitchInState) - { - case 0: // Sort battlers by speed - for (i = 0; i < gBattlersCount; i++) - gBattleStruct->multipleSwitchInSortedBattlers[i] = i; - SortBattlersBySpeed(gBattleStruct->multipleSwitchInSortedBattlers, FALSE); - gBattleStruct->multipleSwitchInState++; - gBattleStruct->multipleSwitchInCursor = 0; - // Loop through all available battlers - case 1: - for (; gBattleStruct->multipleSwitchInCursor < gBattlersCount; gBattleStruct->multipleSwitchInCursor++) - { - gBattlerFainted = gBattleStruct->multipleSwitchInSortedBattlers[gBattleStruct->multipleSwitchInCursor]; - if (gBattleStruct->battlerState[gBattlerFainted].multipleSwitchInBattlers) - { - if (DoSwitchInEffectsForBattler(gBattlerFainted)) - return; - } - } - if (TrySwitchInEjectPack(OTHER)) - return; - // All battlers done, end - for (i = 0; i < gBattlersCount; i++) - gBattleStruct->battlerState[i].multipleSwitchInBattlers = FALSE; - - gBattleStruct->multipleSwitchInState = 0; - gBattlescriptCurrInstr = cmd->nextInstr; - } - break; - default: - UpdateSentMonFlags(battler); - if (!DoSwitchInEffectsForBattler(battler) && !TrySwitchInEjectPack(OTHER)) - gBattlescriptCurrInstr = cmd->nextInstr; - break; } + + gBattleStruct->eventState.switchIn = 0; + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_trainerslidein(void) +static void Cmd_switchinevents(void) { - CMD_ARGS(u8 position); - - u32 battler = GetBattlerForBattleScript(cmd->position); - BtlController_EmitTrainerSlide(battler, B_COMM_TO_CONTROLLER); - MarkBattlerForControllerExec(battler); - + CMD_ARGS(); + while (gBattleStruct->eventState.switchIn < SWITCH_IN_EVENTS_COUNT) + { + if (DoSwitchInEvents()) + return; + } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -8153,7 +5881,7 @@ static void Cmd_handlelearnnewmove(void) { CMD_ARGS(const u8 *learnedMovePtr, const u8 *nothingToLearnPtr, bool8 isFirstMove); - u16 learnMove = MOVE_NONE; + enum Move learnMove = MOVE_NONE; u32 monId = gBattleStruct->expGetterMonId; u32 currLvl = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); @@ -8285,7 +6013,7 @@ static void Cmd_yesnoboxlearnmove(void) } else { - u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); + enum Move move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); if (CannotForgetMove(move)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, B_POSITION_PLAYER_LEFT); @@ -8387,11 +6115,11 @@ static void Cmd_hitanimation(void) { u32 battler = GetBattlerForBattleScript(cmd->battler); - if (!(gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT)) + if (!IsBattlerUnaffectedByMove(battler)) { if (gBattleStruct->passiveHpUpdate[battler] > 0 || !(DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove)) - || gDisableStructs[battler].substituteHP == 0) + || gBattleMons[battler].volatiles.substituteHP == 0) { BtlController_EmitHitAnimation(battler, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battler); @@ -8403,12 +6131,11 @@ static void Cmd_hitanimation(void) u32 battlerDef; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { - if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT - || gBattleStruct->noResultString[battlerDef] != CAN_DAMAGE) + if (IsBattlerInvalidForSpreadMove(gBattlerAttacker, battlerDef)) continue; if (!(DoesSubstituteBlockMove(gBattlerAttacker, battlerDef, gCurrentMove)) - || gDisableStructs[battlerDef].substituteHP == 0) + || gBattleMons[battlerDef].volatiles.substituteHP == 0) { BtlController_EmitHitAnimation(battlerDef, B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(battlerDef); @@ -8592,13 +6319,13 @@ static void Cmd_hidepartystatussummary(void) static void ResetValuesForCalledMove(void) { if (gBattlerByTurnOrder[gCurrentTurnActionNumber] != gBattlerAttacker) - gBattleStruct->eventState.atkCanceller = 0; + gBattleStruct->eventState.atkCanceler = 0; else - gBattleStruct->eventState.atkCanceller = CANCELLER_VOLATILE_BLOCKED; + gBattleStruct->eventState.atkCanceler = CANCELER_VOLATILE_BLOCKED; gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; SetTypeBeforeUsingMove(gCurrentMove, gBattlerAttacker); - HandleMoveTargetRedirection(); + DetermineTarget(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), FALSE); ClearDamageCalcResults(); } @@ -8625,7 +6352,7 @@ static void Cmd_statusanimation(void) u32 battler = GetBattlerForBattleScript(cmd->battler), statusFlag = (cmd->isVolatile || cmd->status) ? cmd->status : gBattleMons[battler].status1; if (!IsSemiInvulnerable(battler, CHECK_ALL) - && gDisableStructs[battler].substituteHP == 0 + && gBattleMons[battler].volatiles.substituteHP == 0 && !(gHitMarker & (HITMARKER_NO_ANIMATIONS | HITMARKER_DISABLE_ANIMATION))) { BtlController_EmitStatusAnimation(battler, B_COMM_TO_CONTROLLER, cmd->isVolatile, statusFlag); @@ -8635,12 +6362,60 @@ static void Cmd_statusanimation(void) } } -static void Cmd_unused_0x65(void) +#define DONE_TARGET_FAILURE (gBattleStruct->eventState.atkCanceler == CANCELER_TARGET_FAILURE + 1) +static void Cmd_futuresighttargetfailure(void) { + CMD_ARGS(const u8 *failInstr); + + // Just do CancelerTargetFailure + if (!DONE_TARGET_FAILURE && AtkCanceler_MoveSuccessOrder() != MOVE_STEP_SUCCESS) + return; + + if (IsBattlerUnaffectedByMove(gBattlerTarget)) + gBattlescriptCurrInstr = cmd->failInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_unused_0x66(void) +static u32 GetPossibleNextTarget(void) { + const u8 targetOrder[MAX_BATTLERS_COUNT] = { + gBattlerAttacker, + BATTLE_PARTNER(gBattlerAttacker), + LEFT_FOE(gBattlerAttacker), + RIGHT_FOE(gBattlerAttacker), + }; + + for (u32 i = 0; i < MAX_BATTLERS_COUNT; i++) + { + u32 battler = targetOrder[i]; + + if (!IsBattlerAlive(battler)) + continue; + + if (!gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] + && !IsBattlerUnaffectedByMove(battler)) + return battler; + } + + return MAX_BATTLERS_COUNT; +} + +static void Cmd_getpossiblenexttarget(void) +{ + CMD_ARGS(const u8 *jumpInstr); + + u32 nextTarget = GetPossibleNextTarget(); + if (nextTarget != MAX_BATTLERS_COUNT) + { + gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = nextTarget; + gBattleStruct->battlerState[gBattlerAttacker].targetsDone[gBattlerTarget] = TRUE; + gBattlescriptCurrInstr = cmd->jumpInstr; + } + else + { + gBattlescriptCurrInstr = cmd->nextInstr; + } } static void Cmd_yesnobox(void) @@ -8716,7 +6491,7 @@ static void Cmd_setgravity(void) } } -static bool32 TryCheekPouch(u32 battler, u32 itemId) +static bool32 TryCheekPouch(u32 battler, enum Item itemId, const u8 *nextInstr) { if (GetItemPocket(itemId) == POCKET_BERRIES && GetBattlerAbility(battler) == ABILITY_CHEEK_POUCH @@ -8726,61 +6501,19 @@ static bool32 TryCheekPouch(u32 battler, u32 itemId) { gBattlerAbility = battler; SetHealAmount(battler, GetNonDynamaxMaxHP(battler) / 3); - BattleScriptPush(gBattlescriptCurrInstr + 2); + BattleScriptPush(nextInstr); gBattlescriptCurrInstr = BattleScript_CheekPouchActivates; return TRUE; } return FALSE; } -// Used by Bestow and Symbiosis to take an item from one battler and give to another. -static void BestowItem(u32 battlerAtk, u32 battlerDef) -{ - gLastUsedItem = gBattleMons[battlerAtk].item; - - gBattleMons[battlerAtk].item = ITEM_NONE; - BtlController_EmitSetMonData(battlerAtk, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerAtk].item), &gBattleMons[battlerAtk].item); - MarkBattlerForControllerExec(battlerAtk); - CheckSetUnburden(battlerAtk); - - gBattleMons[battlerDef].item = gLastUsedItem; - BtlController_EmitSetMonData(battlerDef, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item); - MarkBattlerForControllerExec(battlerDef); - gDisableStructs[battlerDef].unburdenActive = FALSE; -} - -// Called by Cmd_removeitem. itemId represents the item that was removed, not being given. -static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd) -{ - if (!gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen - && gBattleStruct->changedItems[battler] == ITEM_NONE - && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON - && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK - && (B_SYMBIOSIS_GEMS < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) - && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. - && !gSpecialStatuses[battler].berryReduced - && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) - { - BestowItem(BATTLE_PARTNER(battler), battler); - gLastUsedAbility = gBattleMons[BATTLE_PARTNER(battler)].ability; - gEffectBattler = battler; - gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(battler); - if (moveEnd) - BattleScriptPushCursor(); - else - BattleScriptPush(gBattlescriptCurrInstr + 2); - gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; - return TRUE; - } - return FALSE; -} - static void Cmd_removeitem(void) { CMD_ARGS(u8 battler); u32 battler; - u16 itemId = 0; + enum Item itemId = 0; if (gBattleScripting.overrideBerryRequirements) { @@ -8806,7 +6539,7 @@ static void Cmd_removeitem(void) MarkBattlerForControllerExec(battler); ClearBattlerItemEffectHistory(battler); - if (!TryCheekPouch(battler, itemId) && !TrySymbiosis(battler, itemId, FALSE)) + if (!TryCheekPouch(battler, itemId, cmd->nextInstr) && !TrySymbiosis(battler, itemId, FALSE)) gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9196,7 +6929,7 @@ static void Cmd_hpthresholds2(void) { u32 battler = GetBattlerForBattleScript(cmd->battler); u32 opposingBattler = BATTLE_OPPOSITE(battler); - u8 hpSwitchout = gBattleStruct->hpOnSwitchout[GetBattlerSide(opposingBattler)]; + u32 hpSwitchout = gBattleStruct->battlerState[opposingBattler].hpOnSwitchout; s32 result = (hpSwitchout - gBattleMons[opposingBattler].hp) * 100 / hpSwitchout; if (gBattleMons[opposingBattler].hp >= hpSwitchout) @@ -9226,12 +6959,12 @@ bool32 CanUseLastResort(u8 battler) u32 moveIndex; for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - u32 move = gBattleMons[battler].moves[moveIndex]; + enum Move move = gBattleMons[battler].moves[moveIndex]; // Assumes that an empty slot cannot have a non-empty slot after it if (move == MOVE_NONE) break; // If not Last Resort and has not been used, can't use Last Resort - if (GetMoveEffect(move) != EFFECT_LAST_RESORT && !(gDisableStructs[battler].usedMoves & (1u << moveIndex))) + if (GetMoveEffect(move) != EFFECT_LAST_RESORT && !(gBattleMons[battler].volatiles.usedMoves & (1u << moveIndex))) return FALSE; } return moveIndex >= 2; // At least two usable moves that are either Last Resort or have been used @@ -9239,7 +6972,7 @@ bool32 CanUseLastResort(u8 battler) static void RemoveAllWeather(void) { - gWishFutureKnock.weatherDuration = 0; + gBattleStruct->weatherDuration = 0; if (gBattleWeather & B_WEATHER_RAIN) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_END_RAIN; @@ -9305,7 +7038,7 @@ static void RemoveAllTerrains(void) } \ } -static bool32 DefogClearHazards(u32 saveBattler, u32 side, bool32 clear) +static bool32 DefogClearHazards(u32 saveBattler, enum BattleSide side, bool32 clear) { if (!AreAnyHazardsOnSide(side)) return FALSE; @@ -9350,7 +7083,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) DEFOG_CLEAR(SIDE_STATUS_AURORA_VEIL, auroraVeilTimer, BattleScript_SideStatusWoreOffReturn, MOVE_AURORA_VEIL); DEFOG_CLEAR(SIDE_STATUS_SAFEGUARD, safeguardTimer, BattleScript_SideStatusWoreOffReturn, MOVE_SAFEGUARD); } - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6) { gBattlerAttacker = i; // For correct battle string. Ally's / Foe's if (DefogClearHazards(saveBattler, i, clear)) @@ -9358,14 +7091,20 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear) } if (gBattleWeather & B_WEATHER_FOG) { - gBattleWeather &= ~B_WEATHER_FOG; - BattleScriptCall(BattleScript_FogEnded_Ret); + if (clear) + { + gBattleWeather &= ~B_WEATHER_FOG; + BattleScriptCall(BattleScript_FogEnded_Ret); + } return TRUE; } - if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) + if (GetConfig(CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY)) { - RemoveAllTerrains(); - BattleScriptCall(BattleScript_TerrainEnds_Ret); + if (clear) + { + RemoveAllTerrains(); + BattleScriptCall(BattleScript_TerrainEnds_Ret); + } return TRUE; } } @@ -9394,7 +7133,7 @@ static bool32 TryTidyUpClear(u32 battlerAtk, bool32 clear) if (clear) { gBattlerTarget = i; - gDisableStructs[i].substituteHP = 0; + gBattleMons[i].volatiles.substituteHP = 0; gBattleMons[i].volatiles.substitute = FALSE; BattleScriptCall(BattleScript_SubstituteFade); } @@ -9436,70 +7175,6 @@ u32 IsAbilityStatusProtected(u32 battler, enum Ability ability) || IsFlowerVeilProtected(battler); } -enum Stat GetHighestStatId(u32 battler) -{ - enum Stat i; - enum Stat highestId = STAT_ATK; - u32 highestStat = gBattleMons[battler].attack; - - for (i = STAT_DEF; i < NUM_STATS; i++) - { - u16 *statVal = &gBattleMons[battler].attack + (i - 1); - if (*statVal > highestStat && i != STAT_SPEED) - { - highestStat = *statVal; - highestId = i; - } - } - if (gBattleMons[battler].speed > highestStat) - highestId = STAT_SPEED; - - return highestId; -} - -static bool32 IsRototillerAffected(u32 battler) -{ - if (!IsBattlerAlive(battler)) - return FALSE; - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) - return FALSE; // Only grounded battlers affected - if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) - return FALSE; // Only grass types affected - if (IsSemiInvulnerable(battler, CHECK_ALL)) - return FALSE; // Rototiller doesn't affected semi-invulnerable battlers - if (BlocksPrankster(MOVE_ROTOTILLER, gBattlerAttacker, battler, FALSE)) - return FALSE; - return TRUE; -} - -static bool32 IsElectricAbilityAffected(u32 battler, enum Ability ability) -{ - u32 moveType; - - if (gBattleStruct->dynamicMoveType == 0) - moveType = GetMoveType(gCurrentMove); - else if (!(gBattleStruct->dynamicMoveType & F_DYNAMIC_TYPE_IGNORE_PHYSICALITY)) - moveType = gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; - else - moveType = GetMoveType(gCurrentMove); - - if (moveType == TYPE_ELECTRIC - && (ability != ABILITY_LIGHTNING_ROD || B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) - && GetBattlerAbility(battler) == ability) - return TRUE; - else - return FALSE; -} - -static bool32 IsTeatimeAffected(u32 battler) -{ - if (GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) - return FALSE; // Only berries - if (IsSemiInvulnerable(battler, CHECK_ALL)) - return FALSE; // Teatime doesn't affected semi-invulnerable battlers - return TRUE; -} - #define COURTCHANGE_SWAP(status, structField, temp) \ { \ temp = gSideStatuses[B_SIDE_PLAYER]; \ @@ -9602,111 +7277,32 @@ static void HandleScriptMegaPrimalBurst(u32 caseId, u32 battler, u32 type) } } -// Return True if the order was changed, and false if the order was not changed(for example because the target would move after the attacker anyway). -static bool32 ChangeOrderTargetAfterAttacker(void) -{ - u32 i; - u8 data[MAX_BATTLERS_COUNT]; - u8 actionsData[MAX_BATTLERS_COUNT]; - u32 attackerTurnOrderNum = GetBattlerTurnOrderNum(gBattlerAttacker); - u32 targetTurnOrderNum = GetBattlerTurnOrderNum(gBattlerTarget); - - if (attackerTurnOrderNum > targetTurnOrderNum) - return FALSE; - if (attackerTurnOrderNum + 1 == targetTurnOrderNum) - return GetGenConfig(GEN_CONFIG_AFTER_YOU_TURN_ORDER) >= GEN_8; - - for (i = 0; i < MAX_BATTLERS_COUNT; i++) - { - data[i] = gBattlerByTurnOrder[i]; - actionsData[i] = gActionsByTurnOrder[i]; - } - if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 2) - { - gBattlerByTurnOrder[1] = gBattlerTarget; - gActionsByTurnOrder[1] = actionsData[2]; - gBattlerByTurnOrder[2] = data[1]; - gActionsByTurnOrder[2] = actionsData[1]; - } - else if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 3) - { - gBattlerByTurnOrder[1] = gBattlerTarget; - gActionsByTurnOrder[1] = actionsData[3]; - gBattlerByTurnOrder[2] = data[1]; - gActionsByTurnOrder[2] = actionsData[1]; - gBattlerByTurnOrder[3] = data[2]; - gActionsByTurnOrder[3] = actionsData[2]; - } - else // attackerTurnOrderNum == 1, targetTurnOrderNum == 3 - { - gBattlerByTurnOrder[2] = gBattlerTarget; - gActionsByTurnOrder[2] = actionsData[3]; - gBattlerByTurnOrder[3] = data[2]; - gActionsByTurnOrder[3] = actionsData[2]; - } - return TRUE; -} - static void Cmd_unused_0x78(void) { } -static void TryResetProtectUseCounter(u32 battler) -{ - u32 lastMove = gLastResultingMoves[battler]; - enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove); - if (lastMove == MOVE_UNAVAILABLE - || (!gBattleMoveEffects[lastEffect].usesProtectCounter - && ((GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH) - || GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) < GEN_9))) - gDisableStructs[battler].protectUses = 0; -} - static void Cmd_setprotectlike(void) { CMD_ARGS(); - - bool32 protectFails = TRUE; - bool32 notLastTurn = TRUE; u32 protectMethod = GetMoveProtectMethod(gCurrentMove); - TryResetProtectUseCounter(gBattlerAttacker); - - if (gCurrentTurnActionNumber == (gBattlersCount - 1)) - notLastTurn = FALSE; - - if ((sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= RandomUniform(RNG_PROTECT_FAIL, 0, USHRT_MAX) && notLastTurn) - || (protectMethod == PROTECT_WIDE_GUARD && B_WIDE_GUARD != GEN_5) - || (protectMethod == PROTECT_QUICK_GUARD && B_QUICK_GUARD != GEN_5)) + if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) { - if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE) - { - gDisableStructs[gBattlerAttacker].endured = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; - } - else if (GetProtectType(protectMethod) == PROTECT_TYPE_SIDE) - { - gProtectStructs[gBattlerAttacker].protected = protectMethod; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_TEAM; - } - else - { - gProtectStructs[gBattlerAttacker].protected = protectMethod; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; - } - - gDisableStructs[gBattlerAttacker].protectUses++; - protectFails = FALSE; - } - - if (protectFails) - { - gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; + gBattleMons[gBattlerAttacker].volatiles.endured = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; + } + else if (GetProtectType(protectMethod) == PROTECT_TYPE_SIDE) + { + gProtectStructs[gBattlerAttacker].protected = protectMethod; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_TEAM; + } + else + { + gProtectStructs[gBattlerAttacker].protected = protectMethod; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } + gBattleMons[gBattlerAttacker].volatiles.consecutiveMoveUses++; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9745,8 +7341,13 @@ static void Cmd_jumpifnexttargetvalid(void) for (gBattlerTarget++; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) - continue; + if (gBattlerTarget == gBattlerAttacker) + { + enum MoveTarget target = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + if (target != TARGET_USER && target != TARGET_ALL_BATTLERS) + continue; + } + if (IsBattlerAlive(gBattlerTarget)) break; } @@ -9784,38 +7385,20 @@ static void Cmd_unused_0x7e(void) static void Cmd_setfieldweather(void) { - CMD_ARGS(u8 weather); + CMD_ARGS(); - u8 battleWeatherId = cmd->weather; - - if (!TryChangeBattleWeather(gBattlerAttacker, battleWeatherId, ABILITY_NONE)) + if (TryChangeBattleWeather(gBattlerAttacker, GetMoveWeatherType(gCurrentMove), ABILITY_NONE)) { - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; gBattlescriptCurrInstr = cmd->nextInstr; return; } - switch (battleWeatherId) - { - case BATTLE_WEATHER_RAIN: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; - break; - case BATTLE_WEATHER_SUN: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; - break; - case BATTLE_WEATHER_SANDSTORM: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; - break; - case BATTLE_WEATHER_HAIL: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; - break; - case BATTLE_WEATHER_SNOW: - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SNOW; - break; - } - + gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; gBattlescriptCurrInstr = cmd->nextInstr; + + if (gBattleWeather & B_WEATHER_PRIMAL_ANY) + BattleScriptCall(BattleScript_FailOnPrimalWeather); } static void Cmd_setreflect(void) @@ -9834,7 +7417,7 @@ static void Cmd_setseeded(void) { CMD_ARGS(); - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gBattleMons[gBattlerTarget].volatiles.leechSeed) + if (IsBattlerUnaffectedByMove(gBattlerTarget) || gBattleMons[gBattlerTarget].volatiles.leechSeed) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; @@ -9853,7 +7436,6 @@ static void Cmd_setseeded(void) gBattlescriptCurrInstr = cmd->nextInstr; } -// TODO: Needs tests for everything static void Cmd_manipulatedamage(void) { CMD_ARGS(u8 mode); @@ -9863,15 +7445,9 @@ static void Cmd_manipulatedamage(void) case DMG_CHANGE_SIGN: gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= -1; break; - case DMG_DOUBLED: - gBattleStruct->moveDamage[gBattlerTarget] *= 2; - break; case DMG_1_8_TARGET_HP: SetPassiveDamageAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 8); break; - case DMG_FULL_ATTACKER_HP: - gBattleStruct->passiveHpUpdate[gBattlerTarget] = GetNonDynamaxMaxHP(gBattlerAttacker); - break; case DMG_BIG_ROOT: gBattleStruct->passiveHpUpdate[gBattlerAttacker] = -1 * GetDrainedBigRootHp(gBattlerAttacker, gBattleStruct->passiveHpUpdate[gBattlerAttacker]); break; @@ -9889,11 +7465,11 @@ static void Cmd_trysetrest(void) enum Ability ability = GetBattlerAbility(gBattlerTarget); enum HoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); - if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsElectricTerrainAffected(gBattlerTarget, ability, holdEffect, gFieldStatuses)) { gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } - else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsMistyTerrainAffected(gBattlerTarget, ability, holdEffect, gFieldStatuses)) { gBattlescriptCurrInstr = BattleScript_MistyTerrainPrevents; } @@ -9959,25 +7535,31 @@ static void Cmd_jumpifuproarwakes(void) static void Cmd_stockpile(void) { - CMD_ARGS(u8 id); + CMD_ARGS(); - switch (cmd->id) + gBattleMons[gBattlerAttacker].volatiles.stockpileCounter++; + + if (B_STOCKPILE_RAISES_DEFS >= GEN_4) { - case 0: - gDisableStructs[gBattlerAttacker].stockpileCounter++; - gDisableStructs[gBattlerAttacker].stockpileBeforeDef = gBattleMons[gBattlerAttacker].statStages[STAT_DEF]; - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef = gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF]; - PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter); - break; - case 1: // Save def/sp def stats. - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) - { - gDisableStructs[gBattlerAttacker].stockpileDef += gBattleMons[gBattlerAttacker].statStages[STAT_DEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeDef; - gDisableStructs[gBattlerAttacker].stockpileSpDef += gBattleMons[gBattlerAttacker].statStages[STAT_SPDEF] - gDisableStructs[gBattlerAttacker].stockpileBeforeSpDef; - } - break; + if (ChangeStatBuffs( + gBattlerAttacker, + SET_STAT_BUFF_VALUE(1), + STAT_DEF, + STAT_CHANGE_ONLY_CHECKING, + 0, 0) != STAT_CHANGE_DIDNT_WORK) + gBattleMons[gBattlerAttacker].volatiles.stockpileDef++; + + if (ChangeStatBuffs( + gBattlerAttacker, + SET_STAT_BUFF_VALUE(1), + STAT_SPDEF, + STAT_CHANGE_ONLY_CHECKING, + 0, 0) != STAT_CHANGE_DIDNT_WORK) + gBattleMons[gBattlerAttacker].volatiles.stockpileSpDef++; + } + PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gBattleMons[gBattlerAttacker].volatiles.stockpileCounter); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9986,7 +7568,7 @@ static void Cmd_stockpiletobasedamage(void) CMD_ARGS(); if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + gBattleScripting.animTurn = gBattleMons[gBattlerAttacker].volatiles.stockpileCounter; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -9999,16 +7581,16 @@ static void Cmd_stockpiletohpheal(void) if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattleMons[gBattlerAttacker].volatiles.stockpileCounter = 0; gBattlescriptCurrInstr = failInstr; gBattlerTarget = gBattlerAttacker; } else { - if (gDisableStructs[gBattlerAttacker].stockpileCounter > 0) + if (gBattleMons[gBattlerAttacker].volatiles.stockpileCounter > 0) { - SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gDisableStructs[gBattlerAttacker].stockpileCounter))); - gBattleScripting.animTurn = gDisableStructs[gBattlerAttacker].stockpileCounter; + SetHealAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / (1 << (3 - gBattleMons[gBattlerAttacker].volatiles.stockpileCounter))); + gBattleScripting.animTurn = gBattleMons[gBattlerAttacker].volatiles.stockpileCounter; } else // Snatched move { @@ -10033,7 +7615,7 @@ void BS_RemoveStockpileCounters(void) } else { - gDisableStructs[gBattlerAttacker].stockpileCounter = 0; + gBattleMons[gBattlerAttacker].volatiles.stockpileCounter = 0; BattleScriptPush(cmd->nextInstr); gBattlescriptCurrInstr = BattleScript_MoveEffectStockpileWoreOff; } @@ -10138,7 +7720,7 @@ static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 st } } else if (!((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC) - && !(GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) + && !(GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC) && !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK) && !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF)) { @@ -10188,7 +7770,7 @@ static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 st if (!gBattleScripting.statAnimPlayed) { - BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, &gDisableStructs[battler], statAnimId); + BtlController_EmitBattleAnimation(battler, B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(battler); if (changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; @@ -10228,8 +7810,9 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St if (statValue <= -1) // Stat decrease. { + enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); if (gSideTimers[GetBattlerSide(battler)].mistTimer - && !flags.certain && gCurrentMove != MOVE_CURSE + && !flags.certain && effect != EFFECT_CURSE && !(battler == gBattlerTarget && GetBattlerAbility(gBattlerAttacker) == ABILITY_INFILTRATOR)) { if (flags.allowPtr) @@ -10248,13 +7831,8 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St } return STAT_CHANGE_DIDNT_WORK; } - else if (gCurrentMove != MOVE_CURSE - && !flags.notProtectAffected && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) - { - return STAT_CHANGE_DIDNT_WORK; - } else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) - && (flags.statDropPrevention || gBattlerAttacker != gBattlerTarget || flags.mirrorArmored) && !flags.certain && gCurrentMove != MOVE_CURSE) + && (flags.statDropPrevention || gBattlerAttacker != gBattlerTarget || flags.mirrorArmored) && !flags.certain && effect != EFFECT_CURSE) { if (flags.allowPtr) { @@ -10307,7 +7885,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St } else if (!flags.certain && (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC) - || (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) + || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC) || (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK) || (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF))) { @@ -10338,7 +7916,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St else // try to decrease { statValue = -GET_STAT_BUFF_VALUE(statValue); - if (gBattleMons[battler].statStages[statId] == 1) + if (gBattleMons[battler].statStages[statId] == (MIN_STAT_STAGE + 1)) statValue = -1; else if (gBattleMons[battler].statStages[statId] == 2 && statValue < -2) statValue = -2; @@ -10365,7 +7943,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St } else if (!flags.onlyChecking) { - gDisableStructs[battler].tryEjectPack = TRUE; + gBattleMons[battler].volatiles.tryEjectPack = TRUE; gProtectStructs[battler].lashOutAffected = TRUE; gBattleScripting.statChanger |= STAT_BUFF_NEGATIVE; } @@ -10374,9 +7952,9 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St else // stat increase { statValue = GET_STAT_BUFF_VALUE(statValue); - if (gBattleMons[battler].statStages[statId] == 11) + if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE - 1) statValue = 1; - else if (gBattleMons[battler].statStages[statId] == 10 && statValue > 2) + else if (gBattleMons[battler].statStages[statId] == MAX_STAT_STAGE - 2 && statValue > 2) statValue = 2; if (statValue == 2) @@ -10442,7 +8020,6 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, enum Stat statId, union St { if (!flags.allowPtr) return STAT_CHANGE_DIDNT_WORK; - gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; return STAT_CHANGE_WORKED; } @@ -10491,8 +8068,8 @@ bool32 TryResetBattlerStatChanges(u8 battler) u32 j; bool32 ret = FALSE; - gDisableStructs[battler].stockpileDef = 0; - gDisableStructs[battler].stockpileSpDef = 0; + gBattleMons[battler].volatiles.stockpileDef = 0; + gBattleMons[battler].volatiles.stockpileSpDef = 0; for (j = 0; j < NUM_BATTLE_STATS; j++) { if (gBattleMons[battler].statStages[j] != DEFAULT_STAT_STAGE) @@ -10731,9 +8308,8 @@ static void Cmd_forcerandomswitch(void) { gBattleStruct->battlerPartyIndexes[gBattlerTarget] = gBattlerPartyIndexes[gBattlerTarget]; gBattlescriptCurrInstr = BattleScript_RoarSuccessSwitch; - gBattleStruct->battlerState[gBattlerTarget].forcedSwitch = TRUE; + gProtectStructs[gBattlerTarget].forcedSwitch = TRUE; gBattleStruct->monToSwitchIntoId[gBattlerTarget] = validMons[RandomUniform(RNG_FORCE_RANDOM_SWITCH, 0, validMonsCount - 1)]; - if (!IsMultiBattle()) SwitchPartyOrder(gBattlerTarget); @@ -10950,13 +8526,11 @@ static void Cmd_tryKO(void) u32 lands = NO_HIT; if (gBattleMons[gBattlerTarget].level > gBattleMons[gBattlerAttacker].level) lands = NO_HIT; - else if ((gBattleMons[gBattlerTarget].volatiles.lockOn && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + else if ((gBattleMons[gBattlerTarget].volatiles.lockOn && gBattleMons[gBattlerTarget].volatiles.battlerWithSureHit == gBattlerAttacker) || IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_NO_GUARD) || IsAbilityAndRecord(gBattlerTarget, targetAbility, ABILITY_NO_GUARD)) lands = SURE_HIT; - else if (IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) - lands = NO_HIT; - else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, cmd->failInstr)) + else lands = CALC_ACC; if (lands == CALC_ACC) @@ -10970,7 +8544,7 @@ static void Cmd_tryKO(void) if (lands == SURE_HIT) { - if (gDisableStructs[gBattlerTarget].endured) + if (gBattleMons[gBattlerTarget].volatiles.endured) { gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].hp - 1; gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_FOE_ENDURED; @@ -11155,8 +8729,8 @@ static void Cmd_setfocusenergy(void) } else { - if (GetGenConfig(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3 - || GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) + if (GetConfig(CONFIG_FOCUS_ENERGY_CRIT_RATIO) >= GEN_3 + || GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) gBattleMons[battler].volatiles.focusEnergy = TRUE; else gBattleMons[battler].volatiles.dragonCheer = TRUE; @@ -11185,15 +8759,16 @@ static void Cmd_transformdataexecution(void) u8 timesGotHit; gBattleMons[gBattlerAttacker].volatiles.transformed = TRUE; - gDisableStructs[gBattlerAttacker].disabledMove = MOVE_NONE; - gDisableStructs[gBattlerAttacker].disableTimer = 0; - gDisableStructs[gBattlerAttacker].transformedMonPersonality = gBattleMons[gBattlerTarget].personality; + gBattleMons[gBattlerAttacker].volatiles.disabledMove = MOVE_NONE; + gBattleMons[gBattlerAttacker].volatiles.disableTimer = 0; + gBattleMons[gBattlerAttacker].volatiles.transformedMonPID = gBattleMons[gBattlerTarget].personality; + if (B_TRANSFORM_SHINY >= GEN_4) - gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerTarget].isShiny; + gBattleMons[gBattlerAttacker].volatiles.isTransformedMonShiny = gBattleMons[gBattlerTarget].isShiny; else - gDisableStructs[gBattlerAttacker].transformedMonShininess = gBattleMons[gBattlerAttacker].isShiny; - gDisableStructs[gBattlerAttacker].mimickedMoves = 0; - gDisableStructs[gBattlerAttacker].usedMoves = 0; + gBattleMons[gBattlerAttacker].volatiles.isTransformedMonShiny = gBattleMons[gBattlerAttacker].isShiny; + gBattleMons[gBattlerAttacker].volatiles.mimickedMoves = 0; + gBattleMons[gBattlerAttacker].volatiles.usedMoves = 0; timesGotHit = GetBattlerPartyState(gBattlerTarget)->timesGotHit; GetBattlerPartyState(gBattlerAttacker)->timesGotHit = timesGotHit; @@ -11206,7 +8781,7 @@ static void Cmd_transformdataexecution(void) for (i = 0; i < offsetof(struct BattlePokemon, pp); i++) battleMonAttacker[i] = battleMonTarget[i]; - gDisableStructs[gBattlerAttacker].overwrittenAbility = GetBattlerAbility(gBattlerTarget); + gBattleMons[gBattlerAttacker].volatiles.overwrittenAbility = GetBattlerAbility(gBattlerTarget); for (i = 0; i < MAX_MON_MOVES; i++) { u32 pp = GetMovePP(gBattleMons[gBattlerAttacker].moves[i]); @@ -11250,11 +8825,10 @@ static void Cmd_setsubstitute(void) { gBattleMons[gBattlerAttacker].volatiles.substitute = TRUE; gBattleMons[gBattlerAttacker].volatiles.wrapped = FALSE; - // gDisableStructs[gBattlerAttacker].substituteHP = (factor == 2) ? (hp / 2) : hp; if (factor == 2) - gDisableStructs[gBattlerAttacker].substituteHP = hp / 2; + gBattleMons[gBattlerAttacker].volatiles.substituteHP = hp / 2; else - gDisableStructs[gBattlerAttacker].substituteHP = hp; + gBattleMons[gBattlerAttacker].volatiles.substituteHP = hp; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; } @@ -11266,10 +8840,10 @@ static void Cmd_mimicattackcopy(void) { CMD_ARGS(const u8 *failInstr); - if ((IsMoveMimicBanned(gLastMoves[gBattlerTarget])) - || (gBattleMons[gBattlerAttacker].volatiles.transformed) - || gLastMoves[gBattlerTarget] == MOVE_NONE - || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) + if (gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gLastMoves[gBattlerTarget] == MOVE_NONE + || gBattleMons[gBattlerAttacker].volatiles.transformed + || IsMoveMimicBanned(gLastMoves[gBattlerTarget])) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -11295,7 +8869,7 @@ static void Cmd_mimicattackcopy(void) PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastMoves[gBattlerTarget]) - gDisableStructs[gBattlerAttacker].mimickedMoves |= 1u << gCurrMovePos; + gBattleMons[gBattlerAttacker].volatiles.mimickedMoves |= 1u << gCurrMovePos; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -11320,56 +8894,12 @@ static void Cmd_unused_0xA0(void) { } -static void Cmd_counterdamagecalculator(void) +static void Cmd_unused_0xA1(void) { - CMD_ARGS(const u8 *failInstr); - - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId); - - if (gProtectStructs[gBattlerAttacker].physicalDmg - && sideAttacker != sideTarget - && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) - { - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; - - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 2; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } } -// A copy of Cmd with the physical -> special field changes -static void Cmd_mirrorcoatdamagecalculator(void) +static void Cmd_unused_0xA2(void) { - CMD_ARGS(const u8 *failInstr); - - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId); - - if (gProtectStructs[gBattlerAttacker].specialDmg - && sideAttacker != sideTarget - && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) - { - - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; - - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 2; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } } static void Cmd_disablelastusedattack(void) @@ -11383,18 +8913,18 @@ static void Cmd_disablelastusedattack(void) if (gBattleMons[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; } - if (gDisableStructs[gBattlerTarget].disabledMove == MOVE_NONE + if (gBattleMons[gBattlerTarget].volatiles.disabledMove == MOVE_NONE && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) { PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerTarget].moves[i]) - gDisableStructs[gBattlerTarget].disabledMove = gBattleMons[gBattlerTarget].moves[i]; + gBattleMons[gBattlerTarget].volatiles.disabledMove = gBattleMons[gBattlerTarget].moves[i]; if (B_DISABLE_TURNS >= GEN_5) - gDisableStructs[gBattlerTarget].disableTimer = 4; + gBattleMons[gBattlerTarget].volatiles.disableTimer = B_DISABLE_TIMER; else if (B_DISABLE_TURNS >= GEN_4) - gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 4; // 4-7 turns + gBattleMons[gBattlerTarget].volatiles.disableTimer = (Random() & 3) + B_DISABLE_TIMER; // 4-7 turns else - gDisableStructs[gBattlerTarget].disableTimer = (Random() & 3) + 2; // 2-5 turns + gBattleMons[gBattlerTarget].volatiles.disableTimer = (Random() & 3) + 2; // 2-5 turns gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -11427,27 +8957,32 @@ static void Cmd_trysetencore(void) } if ((IsMoveEncoreBanned(gLastMoves[gBattlerTarget])) + || i == MAX_MON_MOVES || gLastMoves[gBattlerTarget] == MOVE_NONE - || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) + || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gBattleMons[gBattlerTarget].pp[i] == 0 + || gBattleMons[gBattlerTarget].volatiles.encoredMove != MOVE_NONE + || GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP) { - i = MAX_MON_MOVES; - } - - if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE - && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) - { - gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; - gDisableStructs[gBattlerTarget].encoredMovePos = i; - // Encore always lasts 3 turns, but we need to account for a scenario where Encore changes the move during the same turn. - if (HasBattlerActedThisTurn(gBattlerTarget)) - gDisableStructs[gBattlerTarget].encoreTimer = 4; - else - gDisableStructs[gBattlerTarget].encoreTimer = 3; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->failInstr; } else { - gBattlescriptCurrInstr = cmd->failInstr; + gBattleMons[gBattlerTarget].volatiles.encoredMove = gBattleMons[gBattlerTarget].moves[i]; + gBattleMons[gBattlerTarget].volatiles.encoredMovePos = i; + + // If the target's selected move is not the same as the move being Encored into, + // the target will select a random opposing target + // Redirection such as Follow Me is already covered in HandleAction_UseMove of battle_util.c + if (gBattleMons[gBattlerTarget].volatiles.encoredMove != GetChosenMoveFromPosition(gBattlerTarget)) + gBattleStruct->moveTarget[gBattlerTarget] = SetRandomTarget(gBattlerTarget); + + // Encore always lasts 3 turns, but we need to account for a scenario where Encore changes the move during the same turn. + if (HasBattlerActedThisTurn(gBattlerTarget)) + gBattleMons[gBattlerTarget].volatiles.encoreTimer = B_ENCORE_TIMER; + else + gBattleMons[gBattlerTarget].volatiles.encoreTimer = B_ENCORE_TIMER - 1; + gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -11477,128 +9012,80 @@ static void Cmd_settypetorandomresistance(void) // Before Gen 5 Conversion 2 only worked on a move the attacker was actually hit by. // This changed later to the last move used by the selected target. - if (B_UPDATED_CONVERSION_2 < GEN_5) + enum Move moveToCheck; + enum Type typeToCheck; + + if (GetConfig(CONFIG_UPDATED_CONVERSION_2) < GEN_5) { - if (gLastLandedMoves[gBattlerAttacker] == MOVE_NONE - || gLastLandedMoves[gBattlerAttacker] == MOVE_UNAVAILABLE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gBattleMoveEffects[GetMoveEffect(gLastLandedMoves[gBattlerAttacker])].twoTurnEffect - && gBattleMons[gLastHitBy[gBattlerAttacker]].volatiles.multipleTurns) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gLastHitByType[gBattlerAttacker] == TYPE_STELLAR || gLastHitByType[gBattlerAttacker] == TYPE_MYSTERY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } + moveToCheck = gLastLandedMoves[gBattlerAttacker]; + if (GetMoveEffect(moveToCheck) == EFFECT_STRUGGLE) + typeToCheck = TYPE_NORMAL; else - { - u32 i, resistTypes = 0; - u32 hitByType = gLastHitByType[gBattlerAttacker]; - - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. - { - switch (GetTypeModifier(hitByType, i)) - { - case UQ_4_12(0): - case UQ_4_12(0.5): - resistTypes |= 1u << i; - break; - } - } - - while (resistTypes != 0) - { - i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & 1u << i) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) - { - resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. - } - else - { - SET_BATTLER_TYPE(gBattlerAttacker, i); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - } - } - - gBattlescriptCurrInstr = cmd->failInstr; - } + typeToCheck = gLastHitByType[gBattlerAttacker]; } else { - if (gLastResultingMoves[gBattlerTarget] == MOVE_NONE - || gLastResultingMoves[gBattlerTarget] == MOVE_UNAVAILABLE - || gLastResultingMoves[gBattlerTarget] == MOVE_STRUGGLE) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (!BreaksThroughSemiInvulnerablity(gBattlerTarget, gCurrentMove)) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (gLastUsedMoveType[gBattlerTarget] == TYPE_NONE || gLastUsedMoveType[gBattlerTarget] == TYPE_STELLAR || gLastUsedMoveType[gBattlerTarget] == TYPE_MYSTERY) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - u32 i, resistTypes = 0; + moveToCheck = gLastResultingMoves[gBattlerTarget]; + typeToCheck = gLastUsedMoveType[gBattlerTarget]; + } - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. + if (moveToCheck == MOVE_NONE + || moveToCheck == MOVE_UNAVAILABLE) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_TERA) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else if (typeToCheck == TYPE_NONE || typeToCheck == TYPE_STELLAR || typeToCheck == TYPE_MYSTERY) + { + gBattlescriptCurrInstr = cmd->failInstr; + } + else + { + u32 i, resistTypes = 0; + + for (i = 0; i < NUMBER_OF_MON_TYPES; i++) // Find all types that resist. + { + switch (GetTypeModifier(typeToCheck, i)) { - switch (GetTypeModifier(gLastUsedMoveType[gBattlerTarget], i)) + case UQ_4_12(0): + case UQ_4_12(0.5): + resistTypes |= 1u << i; + break; + } + } + + while (resistTypes != 0) + { + i = Random() % NUMBER_OF_MON_TYPES; + if (resistTypes & 1u << i) + { + if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) { - case UQ_4_12(0): - case UQ_4_12(0.5): - resistTypes |= 1u << i; - break; + resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. + } + else + { + SET_BATTLER_TYPE(gBattlerAttacker, i); + PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); + gBattlescriptCurrInstr = cmd->nextInstr; + return; } } - - while (resistTypes != 0) - { - i = Random() % NUMBER_OF_MON_TYPES; - if (resistTypes & 1u << i) - { - if (IS_BATTLER_OF_TYPE(gBattlerAttacker, i)) - { - resistTypes &= ~(1u << i); // Type resists, but the user is already of this type. - } - else - { - SET_BATTLER_TYPE(gBattlerAttacker, i); - PREPARE_TYPE_BUFFER(gBattleTextBuff1, i); - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - } - } - - gBattlescriptCurrInstr = cmd->failInstr; } + + gBattlescriptCurrInstr = cmd->failInstr; } } + static void Cmd_setalwayshitflag(void) { CMD_ARGS(); gBattleMons[gBattlerTarget].volatiles.lockOn = 2; - gDisableStructs[gBattlerTarget].battlerWithSureHit = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.battlerWithSureHit = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -11690,7 +9177,7 @@ static void Cmd_settailwind(void) if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND)) { gSideStatuses[side] |= SIDE_STATUS_TAILWIND; - gSideTimers[side].tailwindTimer = (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3); + gSideTimers[side].tailwindTimer = (GetConfig(CONFIG_TAILWIND_TURNS) >= GEN_5 ? 4 : 3); gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -11745,7 +9232,7 @@ static void Cmd_tryspiteppreduce(void) gBattleMons[gBattlerTarget].pp[i] -= ppToDeduct; // if (MOVE_IS_PERMANENT(gBattlerTarget, i)), but backwards - if (!(gDisableStructs[gBattlerTarget].mimickedMoves & (1u << i)) + if (!(gBattleMons[gBattlerTarget].volatiles.mimickedMoves & (1u << i)) && !(gBattleMons[gBattlerTarget].volatiles.transformed)) { BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gBattlerTarget].pp[i]), &gBattleMons[gBattlerTarget].pp[i]); @@ -11780,8 +9267,8 @@ static void Cmd_healpartystatus(void) struct Pokemon *party = GetBattlerParty(gBattlerAttacker); bool32 isSoundMove = IsSoundMove(gCurrentMove); - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 || !(isSoundMove && GetBattlerAbility(gBattlerAttacker) == ABILITY_SOUNDPROOF)) { if (isSoundMove) @@ -11801,7 +9288,7 @@ static void Cmd_healpartystatus(void) if (IsBattlerAlive(partner)) { - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || !(isSoundMove && GetBattlerAbility(partner) == ABILITY_SOUNDPROOF)) { gBattleMons[partner].status1 = 0; @@ -11827,10 +9314,10 @@ static void Cmd_healpartystatus(void) bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i; bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner); - if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) + if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 + || (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 && isAttacker)) ability = ABILITY_NONE; - else if (GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) + else if (GetConfig(CONFIG_HEAL_BELL_SOUNDPROOF) > GEN_5 && !isAttacker && !isDoublesPartner) ability = ABILITY_NONE; else if (isAttacker) ability = GetBattlerAbility(gBattlerAttacker); @@ -11842,9 +9329,9 @@ static void Cmd_healpartystatus(void) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(gBattlerAttacker); - if (TestRunner_Battle_GetForcedAbility(side, i)) - ability = TestRunner_Battle_GetForcedAbility(side, i); + enum BattleTrainer trainer = GetBattlerTrainer(gBattlerAttacker); + if (TestRunner_Battle_GetForcedAbility(trainer, i)) + ability = TestRunner_Battle_GetForcedAbility(trainer, i); } #endif } @@ -11913,13 +9400,13 @@ static void Cmd_trysetperishsong(void) { CMD_ARGS(const u8 *failInstr); - s32 i; + s32 i = 0; s32 notAffectedCount = 0; for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].volatiles.perishSong - || GetBattlerAbility(i) == ABILITY_SOUNDPROOF + || IsBattlerUnaffectedByMove(i) || BlocksPrankster(gCurrentMove, gBattlerAttacker, i, TRUE) || gBattleMons[i].volatiles.semiInvulnerable == STATE_COMMANDER) { @@ -11928,7 +9415,7 @@ static void Cmd_trysetperishsong(void) else { gBattleMons[i].volatiles.perishSong = TRUE; - gDisableStructs[i].perishSongTimer = 3; + gBattleMons[i].volatiles.perishSongTimer = 3; } } @@ -11938,31 +9425,8 @@ static void Cmd_trysetperishsong(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_handlerollout(void) +static void Cmd_unused_0xb3(void) { - CMD_ARGS(); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - if (!(gBattleMons[gBattlerAttacker].volatiles.multipleTurns)) // First hit. - { - gDisableStructs[gBattlerAttacker].rolloutTimer = 5; - gDisableStructs[gBattlerAttacker].rolloutTimerStartValue = 5; - gBattleMons[gBattlerAttacker].volatiles.multipleTurns = TRUE; - gLockedMoves[gBattlerAttacker] = gCurrentMove; - } - if (--gDisableStructs[gBattlerAttacker].rolloutTimer == 0) // Last hit. - { - gBattleMons[gBattlerAttacker].volatiles.multipleTurns = FALSE; - } - - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_jumpifconfusedandstatmaxed(void) @@ -11976,32 +9440,8 @@ static void Cmd_jumpifconfusedandstatmaxed(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_handlefurycutter(void) +static void Cmd_unused_0xb5(void) { - CMD_ARGS(); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gDisableStructs[gBattlerAttacker].furyCutterCounter = 0; - gBattlescriptCurrInstr = BattleScript_MoveMissedPause; - } - else - { - u32 max; - - if (B_UPDATED_MOVE_DATA >= GEN_6) - max = 3; - else if (B_UPDATED_MOVE_DATA == GEN_5) - max = 4; - else - max = 5; - - if (gDisableStructs[gBattlerAttacker].furyCutterCounter < max - && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_2ND_HIT) // Don't increment counter on second hit - gDisableStructs[gBattlerAttacker].furyCutterCounter++; - - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void Cmd_setembargo(void) @@ -12015,7 +9455,7 @@ static void Cmd_setembargo(void) else { gBattleMons[gBattlerTarget].volatiles.embargo = TRUE; - gDisableStructs[gBattlerTarget].embargoTimer = 5; + gBattleMons[gBattlerTarget].volatiles.embargoTimer = B_EMBARGO_TIMER; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -12048,6 +9488,9 @@ static void Cmd_presentdamagecalculation(void) } else { + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_OFF; + gSpecialStatuses[gBattlerAttacker].multiHitOn = 0; + gMultiHitCounter = 0; SetHealAmount(gBattlerTarget, GetNonDynamaxMaxHP(gBattlerTarget) / 4); gBattleStruct->presentBasePower = 0; } @@ -12055,7 +9498,7 @@ static void Cmd_presentdamagecalculation(void) if (gBattleStruct->presentBasePower) { - gBattlescriptCurrInstr = BattleScript_HitFromCritCalc; + gBattlescriptCurrInstr = BattleScript_HitFromDamageCalc; } else if (gBattleMons[gBattlerTarget].maxHP == gBattleMons[gBattlerTarget].hp) { @@ -12130,41 +9573,9 @@ static void Cmd_magnitudedamagecalculation(void) } PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 2, magnitude) - - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker) - continue; - if (!(gAbsentBattlerFlags & (1u << gBattlerTarget))) // A valid target was found. - break; - } - gBattlescriptCurrInstr = cmd->nextInstr; } -static bool32 SetTargetToNextPursuiter(u32 battlerDef) -{ - u32 i; - for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount; i++) - { - u32 battler = gBattlerByTurnOrder[i]; - if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE - && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT - && IsBattlerAlive(battlerDef) - && IsBattlerAlive(battler) - && !IsBattlerAlly(battler, battlerDef) - && (B_PURSUIT_TARGET >= GEN_4 || gBattleStruct->moveTarget[battler] == battlerDef) - && !IsGimmickSelected(battler, GIMMICK_Z_MOVE) - && !IsGimmickSelected(battler, GIMMICK_DYNAMAX) - && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) - { - gBattlerTarget = battler; - return TRUE; - } - } - return FALSE; -} - static void Cmd_jumpifnopursuitswitchdmg(void) { CMD_ARGS(const u8 *jumpInstr); @@ -12191,6 +9602,8 @@ static void Cmd_tryactivateitem(void) CMD_ARGS(u8 battler, u8 flag); u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattlescriptCurrInstr = cmd->nextInstr; + switch ((enum ItemActivationState)cmd->flag) { case ACTIVATION_ON_USABLE_AGAIN: @@ -12207,9 +9620,11 @@ static void Cmd_tryactivateitem(void) if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnHpThresholdActivation)) return; break; + case ACTIVATION_ON_STATUS_CHANGE: + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsOnStatusChangeActivation)) + return; + break; } - - gBattlescriptCurrInstr = cmd->nextInstr; } // Belly Drum, Fillet Away @@ -12306,7 +9721,7 @@ static void Cmd_recoverbasedonsunlight(void) else recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; } - else if (GetGenConfig(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) + else if (GetConfig(CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) recoverAmount = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; @@ -12383,7 +9798,7 @@ static void Cmd_selectfirstvalidtarget(void) for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) { - if (gBattlerTarget == gBattlerAttacker && !(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) & MOVE_TARGET_USER)) + if (gBattlerTarget == gBattlerAttacker && GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove) != TARGET_ALL_BATTLERS) continue; if (IsBattlerAlive(gBattlerTarget)) break; @@ -12397,10 +9812,10 @@ static void Cmd_setfutureattack(void) { CMD_ARGS(); - gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove; - gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker; - gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker]; - gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3; + gBattleStruct->futureSight[gBattlerTarget].move = gCurrentMove; + gBattleStruct->futureSight[gBattlerTarget].battlerIndex = gBattlerAttacker; + gBattleStruct->futureSight[gBattlerTarget].partyIndex = gBattlerPartyIndexes[gBattlerAttacker]; + gBattleStruct->futureSight[gBattlerTarget].counter = 3; if (gCurrentMove == MOVE_DOOM_DESIRE) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; @@ -12413,48 +9828,20 @@ static void Cmd_setfutureattack(void) static void Cmd_trydobeatup(void) { CMD_ARGS(const u8 *endInstr, const u8 *failInstr); - struct Pokemon *party = GetBattlerParty(gBattlerAttacker); if (!IsBattlerAlive(gBattlerTarget)) { + gMultiHitCounter = 0; gBattlescriptCurrInstr = cmd->endInstr; } + else if (gBattleStruct->beatUpSlot == 0 && gMultiHitCounter == 0) + { + gBattlescriptCurrInstr = cmd->failInstr; + } else { - u8 beforeLoop = gBattleCommunication[0]; - for (;gBattleCommunication[0] < PARTY_SIZE; gBattleCommunication[0]++) - { - if (GetMonData(&party[gBattleCommunication[0]], MON_DATA_HP) - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG - && !GetMonData(&party[gBattleCommunication[0]], MON_DATA_STATUS)) - break; - } - - if (gBattleCommunication[0] < PARTY_SIZE) - { - PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleCommunication[0]) - - gBattlescriptCurrInstr = cmd->nextInstr; - - gBattleStruct->moveDamage[gBattlerTarget] = GetSpeciesBaseAttack(GetMonData(&party[gBattleCommunication[0]], MON_DATA_SPECIES)); - gBattleStruct->moveDamage[gBattlerTarget] *= GetMovePower(gCurrentMove); - gBattleStruct->moveDamage[gBattlerTarget] *= (GetMonData(&party[gBattleCommunication[0]], MON_DATA_LEVEL) * 2 / 5 + 2); - gBattleStruct->moveDamage[gBattlerTarget] /= GetSpeciesBaseDefense(gBattleMons[gBattlerTarget].species); - gBattleStruct->moveDamage[gBattlerTarget] = (gBattleStruct->moveDamage[gBattlerTarget] / 50) + 2; - if (gProtectStructs[gBattlerAttacker].helpingHand) - gBattleStruct->moveDamage[gBattlerTarget] = gBattleStruct->moveDamage[gBattlerTarget] * 15 / 10; - - gBattleCommunication[0]++; - } - else if (beforeLoop != 0) - { - gBattlescriptCurrInstr = cmd->endInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } + PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerAttacker, gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot]) + gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -12474,37 +9861,8 @@ static void Cmd_setsemiinvulnerablebit(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static bool32 CheckIfCanFireTwoTurnMoveNow(u8 battler, bool8 checkChargeTurnEffects) +static void Cmd_unused_0xC6(void) { - // Semi-invulnerable moves cannot skip their charge turn (except with Power Herb) - if (gBattleMoveEffects[GetMoveEffect(gCurrentMove)].semiInvulnerableEffect == TRUE) - return FALSE; - - // If this move has charge turn effects, it must charge, activate them, then try to fire - if (checkChargeTurnEffects && MoveHasChargeTurnAdditionalEffect(gCurrentMove)) - return FALSE; - - // Insert custom conditions here - - // Certain two-turn moves may fire on the first turn in the right weather (Solar Beam, Electro Shot) - // By default, all two-turn moves have the option of adding weather to their argument - if (IsBattlerWeatherAffected(battler, GetMoveTwoTurnAttackWeather(gCurrentMove))) - return TRUE; - - return FALSE; -} - -static void Cmd_tryfiretwoturnmovenowbyeffect(void) -{ - CMD_ARGS(u8 battler, bool8 checkChargeTurnEffects, const u8 *jumpInstr); - - if (CheckIfCanFireTwoTurnMoveNow(cmd->battler, cmd->checkChargeTurnEffects) == TRUE) - { - gBattleScripting.animTurn = 1; - gBattlescriptCurrInstr = cmd->jumpInstr; - } - else - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_0xC7(void) @@ -12519,11 +9877,7 @@ static void Cmd_trymemento(void) { CMD_ARGS(const u8 *failInstr); - if (B_MEMENTO_FAIL >= GEN_4 - && (gBattleCommunication[MISS_TYPE] == B_MSG_PROTECTED - || IsSemiInvulnerable(gBattlerTarget, CHECK_ALL) - || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) - || DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove))) + if (B_MEMENTO_FAIL >= GEN_5 && DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { // Failed, target was protected. gBattlescriptCurrInstr = cmd->failInstr; @@ -12558,17 +9912,8 @@ static void Cmd_setforcedtarget(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_setcharge(void) +static void Cmd_unused_0xcb(void) { - CMD_ARGS(u8 battler); - - u8 battler = GetBattlerForBattleScript(cmd->battler); - gBattleMons[battler].volatiles.charge = TRUE; - if (B_CHARGE < GEN_9) - gDisableStructs[battler].chargeTimer = 2; - else - gDisableStructs[battler].chargeTimer = 0; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_unused_0xCC(void) @@ -12617,45 +9962,39 @@ static void Cmd_settorment(void) } } -static void Cmd_jumpifnodamage(void) +static void Cmd_unused_0xCF(void) { - CMD_ARGS(const u8 *jumpInstr); - - if (gProtectStructs[gBattlerAttacker].physicalDmg || gProtectStructs[gBattlerAttacker].specialDmg) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; } static void Cmd_settaunt(void) { CMD_ARGS(const u8 *failInstr); - if (GetGenConfig(GEN_CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) + if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS) { gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp; gLastUsedAbility = ABILITY_OBLIVIOUS; RecordAbilityBattle(gBattlerTarget, ABILITY_OBLIVIOUS); } - else if (gDisableStructs[gBattlerTarget].tauntTimer == 0) + else if (gBattleMons[gBattlerTarget].volatiles.tauntTimer == 0) { u8 turns; if (B_TAUNT_TURNS >= GEN_5) { - turns = 4; + turns = B_TAUNT_TIMER - 1; // 4 turns if (!HasBattlerActedThisTurn(gBattlerTarget)) turns--; // If the target hasn't yet moved this turn, Taunt lasts for only three turns (source: Bulbapedia) } else if (B_TAUNT_TURNS >= GEN_4) { - turns = (Random() & 2) + 3; + turns = RandomUniform(RNG_TAUNT, 3, B_TAUNT_TIMER); } else { turns = 2; } - gDisableStructs[gBattlerTarget].tauntTimer = turns; + gBattleMons[gBattlerTarget].volatiles.tauntTimer = turns; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -12688,7 +10027,7 @@ static void Cmd_trysethelpinghand(void) } } -// Trick // TODO: Sticky Hold +// Trick static void Cmd_tryswapitems(void) { CMD_ARGS(const u8 *failInstr); @@ -12708,27 +10047,23 @@ static void Cmd_tryswapitems(void) } else { - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = GetBattlerSide(gBattlerTarget); - // You can't swap items if they were knocked off in regular battles if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_SECRET_BASE | BATTLE_TYPE_RECORDED_LINK)) - && (gWishFutureKnock.knockedOffMons[sideAttacker] & (1u << gBattlerPartyIndexes[gBattlerAttacker]) - || gWishFutureKnock.knockedOffMons[sideTarget] & (1u << gBattlerPartyIndexes[gBattlerTarget]))) + && (GetBattlerPartyState(gBattlerAttacker)->isKnockedOff || GetBattlerPartyState(gBattlerTarget)->isKnockedOff)) { gBattlescriptCurrInstr = cmd->failInstr; } // can't swap if two Pokémon don't have an item // or if either of them is an enigma berry or a mail else if ((gBattleMons[gBattlerAttacker].item == ITEM_NONE && gBattleMons[gBattlerTarget].item == ITEM_NONE) - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerTarget].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerTarget].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item)) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattlerAttacker, gBattleMons[gBattlerTarget].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattlerAttacker, gBattleMons[gBattlerAttacker].item)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -12736,25 +10071,25 @@ static void Cmd_tryswapitems(void) else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) { gBattlescriptCurrInstr = BattleScript_StickyHoldActivates; + gBattlerAbility = gBattlerTarget; gLastUsedAbility = gBattleMons[gBattlerTarget].ability; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } // took a while, but all checks passed and items can be safely swapped else { - u16 oldItemAtk, *newItemAtk; + u16 oldItemAtk, oldItemDef; - newItemAtk = &gBattleStruct->changedItems[gBattlerAttacker]; oldItemAtk = gBattleMons[gBattlerAttacker].item; - *newItemAtk = gBattleMons[gBattlerTarget].item; + oldItemDef = gBattleMons[gBattlerTarget].item; - gBattleMons[gBattlerAttacker].item = ITEM_NONE; + gBattleMons[gBattlerAttacker].item = oldItemDef; gBattleMons[gBattlerTarget].item = oldItemAtk; - RecordItemEffectBattle(gBattlerAttacker, 0); + RecordItemEffectBattle(gBattlerAttacker, GetItemHoldEffect(oldItemDef)); RecordItemEffectBattle(gBattlerTarget, GetItemHoldEffect(oldItemAtk)); - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerAttacker].item), &gBattleMons[gBattlerAttacker].item); MarkBattlerForControllerExec(gBattlerAttacker); BtlController_EmitSetMonData(gBattlerTarget, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); @@ -12762,37 +10097,42 @@ static void Cmd_tryswapitems(void) if (GetBattlerAbility(gBattlerTarget) != ABILITY_GORILLA_TACTICS) gBattleStruct->choicedMove[gBattlerTarget] = MOVE_NONE; - if (GetBattlerAbility(gBattlerTarget) != ABILITY_GORILLA_TACTICS) + + if (GetBattlerAbility(gBattlerAttacker) != ABILITY_GORILLA_TACTICS + && (!IsHoldEffectChoice(GetItemHoldEffect(oldItemDef)) + || (GetConfig(CONFIG_MODERN_TRICK_CHOICE_LOCK) >= GEN_5))) + { gBattleStruct->choicedMove[gBattlerAttacker] = MOVE_NONE; + } gBattlescriptCurrInstr = cmd->nextInstr; - PREPARE_ITEM_BUFFER(gBattleTextBuff1, *newItemAtk) + PREPARE_ITEM_BUFFER(gBattleTextBuff1, oldItemDef) PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) - if (!(sideAttacker == sideTarget && IsPartnerMonFromSameTrainer(gBattlerAttacker))) + if (!(IsBattlerAlly(gBattlerAttacker, gBattlerTarget) && IsPartnerMonFromSameTrainer(gBattlerAttacker))) { // if targeting your own side and you aren't in a multi battle, don't save items as stolen if (IsOnPlayerSide(gBattlerAttacker)) TrySaveExchangedItem(gBattlerAttacker, oldItemAtk); if (IsOnPlayerSide(gBattlerTarget)) - TrySaveExchangedItem(gBattlerTarget, *newItemAtk); + TrySaveExchangedItem(gBattlerTarget, oldItemDef); } - if (oldItemAtk != ITEM_NONE && *newItemAtk != ITEM_NONE) + if (oldItemAtk != ITEM_NONE && oldItemDef != ITEM_NONE) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item } - else if (oldItemAtk == ITEM_NONE && *newItemAtk != ITEM_NONE) + else if (oldItemAtk == ITEM_NONE && oldItemDef != ITEM_NONE) { - if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNBURDEN && gDisableStructs[gBattlerAttacker].unburdenActive) - gDisableStructs[gBattlerAttacker].unburdenActive = FALSE; - + CheckSetUnburden(gBattlerTarget); + gBattleMons[gBattlerAttacker].volatiles.unburdenActive = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item } else { CheckSetUnburden(gBattlerAttacker); + gBattleMons[gBattlerTarget].volatiles.unburdenActive = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing } } @@ -12837,7 +10177,7 @@ static void Cmd_trycopyability(void) { RemoveAbilityFlags(battler); gBattleScripting.abilityPopupOverwrite = gBattleMons[battler].ability; - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = defAbility; + gBattleMons[battler].ability = gBattleMons[battler].volatiles.overwrittenAbility = defAbility; gLastUsedAbility = defAbility; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -12851,10 +10191,10 @@ static void Cmd_trywish(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0) + else if (gBattleStruct->wish[gBattlerAttacker].counter == 0) { - gWishFutureKnock.wishCounter[gBattlerAttacker] = 2; - gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker]; + gBattleStruct->wish[gBattlerAttacker].counter = 2; + gBattleStruct->wish[gBattlerAttacker].partyId = gBattlerPartyIndexes[gBattlerAttacker]; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -12896,7 +10236,7 @@ static void Cmd_setgastroacid(void) } else { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) + if (gBattleMons[gBattlerTarget].volatiles.neutralizingGas) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; gBattleMons[gBattlerTarget].volatiles.gastroAcid = TRUE; @@ -12915,13 +10255,13 @@ static void Cmd_setyawn(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsElectricTerrainAffected(gBattlerTarget, ability, holdEffect, gFieldStatuses)) { // When Yawn is used while Electric Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: // "But it failed" will display first. gBattlescriptCurrInstr = BattleScript_ElectricTerrainPrevents; } - else if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_MISTY_TERRAIN)) + else if (IsMistyTerrainAffected(gBattlerTarget, ability, holdEffect, gFieldStatuses)) { // When Yawn is used while Misty Terrain is set and drowsiness is set from Yawn being used against target in the previous turn: // "But it failed" will display first. @@ -12934,19 +10274,8 @@ static void Cmd_setyawn(void) } } -static void Cmd_setdamagetohealthdifference(void) +static void Cmd_unused0xd8(void) { - CMD_ARGS(const u8 *failInstr); - - if (GetNonDynamaxHP(gBattlerTarget) <= gBattleMons[gBattlerAttacker].hp) - { - gBattlescriptCurrInstr = cmd->failInstr; - } - else - { - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) - gBattleMons[gBattlerAttacker].hp; - gBattlescriptCurrInstr = cmd->nextInstr; - } } static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId) @@ -13004,7 +10333,7 @@ static void Cmd_tryswapabilities(void) } else { - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) + if (IsBattlerUnaffectedByMove(gBattlerTarget) || (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX)) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13015,8 +10344,8 @@ static void Cmd_tryswapabilities(void) gLastUsedAbility = gBattleMons[gBattlerTarget].ability; RemoveAbilityFlags(gBattlerTarget); RemoveAbilityFlags(gBattlerAttacker); - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gLastUsedAbility; + gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerTarget].volatiles.overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerAttacker].volatiles.overwrittenAbility = gLastUsedAbility; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -13102,10 +10431,10 @@ static void Cmd_trysetvolatile(void) switch (cmd->_volatile) { case VOLATILE_MAGNET_RISE: - gDisableStructs[battler].magnetRiseTimer = 5; + gBattleMons[battler].volatiles.magnetRiseTimer = B_MAGNET_RISE_TIMER; break; case VOLATILE_LASER_FOCUS: - gDisableStructs[battler].laserFocusTimer = 2; + gBattleMons[battler].volatiles.laserFocusTimer = B_LASER_FOCUS_TIMER; break; default: break; @@ -13122,7 +10451,7 @@ static void Cmd_trysetmagiccoat(void) { CMD_ARGS(const u8 *failInstr); - if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn + if (IsLastMonToMove(gBattlerAttacker)) // fails if moving last { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13138,7 +10467,7 @@ static void Cmd_trysetsnatch(void) { CMD_ARGS(const u8 *failInstr); - if (gCurrentTurnActionNumber == gBattlersCount - 1) // moves last turn + if (IsLastMonToMove(gBattlerAttacker)) // fails if moving last { gBattlescriptCurrInstr = cmd->failInstr; } @@ -13158,46 +10487,48 @@ static void Cmd_switchoutabilities(void) CMD_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gBattleMons[battler].ability == ABILITY_NEUTRALIZING_GAS) + if (gBattleMons[battler].volatiles.neutralizingGas) { - gBattleMons[battler].ability = ABILITY_NONE; - BattleScriptPush(gBattlescriptCurrInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + gBattleMons[battler].volatiles.neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptPush(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } } - else + + switch (GetBattlerAbility(battler)) { - switch (GetBattlerAbility(battler)) - { - case ABILITY_NATURAL_CURE: - if (gBattleMons[battler].status1 & STATUS1_SLEEP) - TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); + case ABILITY_NATURAL_CURE: + if (gBattleMons[battler].status1 & STATUS1_SLEEP) + TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); - gBattleMons[battler].status1 = 0; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, - 1u << gBattleStruct->battlerPartyIndexes[battler], - sizeof(gBattleMons[battler].status1), - &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - break; - case ABILITY_REGENERATOR: - { - u32 regenerate = GetNonDynamaxMaxHP(battler) / 3; - regenerate += gBattleMons[battler].hp; - if (regenerate > gBattleMons[battler].maxHP) - regenerate = gBattleMons[battler].maxHP; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, - 1u << gBattleStruct->battlerPartyIndexes[battler], - sizeof(regenerate), - ®enerate); - MarkBattlerForControllerExec(battler); - break; - default: - break; - } - } - - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleMons[battler].status1 = 0; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, + 1u << gBattleStruct->battlerPartyIndexes[battler], + sizeof(gBattleMons[battler].status1), + &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + break; + case ABILITY_REGENERATOR: + { + u32 regenerate = GetNonDynamaxMaxHP(battler) / 3; + regenerate += gBattleMons[battler].hp; + if (regenerate > gBattleMons[battler].maxHP) + regenerate = gBattleMons[battler].maxHP; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, + 1u << gBattleStruct->battlerPartyIndexes[battler], + sizeof(regenerate), + ®enerate); + MarkBattlerForControllerExec(battler); + break; } + default: + break; + } + + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_jumpifhasnohp(void) @@ -13293,47 +10624,50 @@ static void Cmd_settypebasedhalvers(void) bool8 worked = FALSE; - if (GetMoveEffect(gCurrentMove) == EFFECT_MUD_SPORT) + if (!gBattleStruct->isSkyBattle) { - if (B_SPORT_TURNS >= GEN_6) + if (GetMoveEffect(gCurrentMove) == EFFECT_MUD_SPORT) { - if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) + if (B_SPORT_TURNS >= GEN_6) { - gFieldStatuses |= STATUS_FIELD_MUDSPORT; - gFieldTimers.mudSportTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; - worked = TRUE; + if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT)) + { + gFieldStatuses |= STATUS_FIELD_MUDSPORT; + gFieldTimers.mudSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } + } + else + { + if (!gBattleMons[gBattlerAttacker].volatiles.mudSport) + { + gBattleMons[gBattlerAttacker].volatiles.mudSport = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; + worked = TRUE; + } } } - else + else // Water Sport { - if (!gBattleMons[gBattlerAttacker].volatiles.waterSport) + if (B_SPORT_TURNS >= GEN_6) { - gBattleMons[gBattlerAttacker].volatiles.waterSport = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; - worked = TRUE; + if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) + { + gFieldStatuses |= STATUS_FIELD_WATERSPORT; + gFieldTimers.waterSportTimer = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } } - } - } - else // Water Sport - { - if (B_SPORT_TURNS >= GEN_6) - { - if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT)) + else { - gFieldStatuses |= STATUS_FIELD_WATERSPORT; - gFieldTimers.waterSportTimer = 5; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; - worked = TRUE; - } - } - else - { - if (!gBattleMons[gBattlerAttacker].volatiles.mudSport) - { - gBattleMons[gBattlerAttacker].volatiles.mudSport = TRUE; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; - worked = TRUE; + if (!gBattleMons[gBattlerAttacker].volatiles.waterSport) + { + gBattleMons[gBattlerAttacker].volatiles.waterSport = TRUE; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; + worked = TRUE; + } } } } @@ -13344,7 +10678,7 @@ static void Cmd_settypebasedhalvers(void) gBattlescriptCurrInstr = cmd->failInstr; } -bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, enum Move move) { if (!gBattleMons[battlerDef].volatiles.substitute) return FALSE; @@ -13356,11 +10690,11 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move) return TRUE; } -bool32 DoesDisguiseBlockMove(u32 battler, u32 move) +bool32 DoesDisguiseBlockMove(u32 battler, enum Move move) { if (!IsMimikyuDisguised(battler) || gBattleMons[battler].volatiles.transformed - || (!gProtectStructs[battler].confusionSelfDmg && IsBattleMoveStatus(move)) + || IsBattleMoveStatus(move) || !IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_DISGUISE)) return FALSE; else @@ -13488,36 +10822,8 @@ static void Cmd_snatchsetbattlers(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_removescreens(void) +static void Cmd_unused_0xee(void) { - CMD_ARGS(); - - u8 side; - bool32 failed; - - if (B_BRICK_BREAK >= GEN_4) - side = GetBattlerSide(gBattlerTarget); // From Gen 4 onwards, Brick Break can remove screens on the user's side if used on an ally - else - side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; - - if (B_BRICK_BREAK >= GEN_5) - failed = gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT; - else - failed = FALSE; - - if (!failed && gSideStatuses[side] & SIDE_STATUS_SCREEN_ANY) - { - gSideStatuses[side] &= ~SIDE_STATUS_SCREEN_ANY; - gBattleScripting.animTurn = 1; - gBattleScripting.animTargetsHit = 1; - } - else - { - gBattleScripting.animTurn = 0; - gBattleScripting.animTargetsHit = 0; - } - - gBattlescriptCurrInstr = cmd->nextInstr; } u8 GetCatchingBattler(void) @@ -13528,13 +10834,359 @@ u8 GetCatchingBattler(void) return GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } +static void FinalizeCapture(void) +{ + u32 ballId = ItemIdToBallId(gLastThrownBall); + enum NationalDexOrder natDexNo = SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species); + if (GetConfig(CONFIG_CRITICAL_CAPTURE_IF_OWNED) >= GEN_9 && GetSetPokedexFlag(natDexNo, FLAG_GET_CAUGHT)) + { + gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; + } + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + MarkBattlerForControllerExec(gBattlerAttacker); + TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); + gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; + struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); + SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); + + if (CalculatePlayerPartyCount() == PARTY_SIZE) + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + else + gBattleCommunication[MULTISTRING_CHOOSER] = 1; + + if (ballId == BALL_HEAL) + { + MonRestorePP(caughtMon); + HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); + gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; + SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); + } + else if (ballId == BALL_FRIEND) + { + u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); + SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); + } +} + +struct BallData +{ + u16 multiplier; + u16 divider; + bool8 guaranteedCapture; + s8 flatBonus; +}; + +#define CAPTURE_GUARANTEED -1 + +static void ComputeBallData(u32 wildMonBattler, u32 playerBattler, struct BallData *ball) +{ + u32 i; + u32 ballId = ItemIdToBallId(gLastUsedItem); + struct BattlePokemon *battleMon = &gBattleMons[wildMonBattler]; + + ball->multiplier = 100; + ball->divider = 100; + ball->flatBonus = 0; + ball->guaranteedCapture = FALSE; + + if (gSpeciesInfo[battleMon->species].isUltraBeast) + { + if (ballId == BALL_BEAST) + ball->multiplier = 500; + else + { + ball->multiplier = 410; + ball->divider = 4096; + } + return; + } + switch (ballId) + { + case BALL_GREAT: + ball->multiplier = 150; + break; + case BALL_ULTRA: + ball->multiplier = 200; + break; + case BALL_MASTER: + ball->guaranteedCapture = TRUE; + break; + case BALL_NET: + if (IS_BATTLER_ANY_TYPE(wildMonBattler, TYPE_WATER, TYPE_BUG)) + ball->multiplier = B_NET_BALL_MODIFIER >= GEN_7 ? 350 : 300; + break; + case BALL_NEST: + ball->multiplier = 100; + if ((B_NEST_BALL_MODIFIER == GEN_5 && battleMon->level < 31) + || (B_NEST_BALL_MODIFIER >= GEN_6 && battleMon->level < 30)) + { + ball->multiplier = (41 - battleMon->level) * 4096 / 10; + ball->divider = 4096; + } + else if (battleMon->level < 30) + { + ball->multiplier = 400 - (battleMon->level * 10); + } + break; + case BALL_DIVE: + if (GetCurrentMapType() == MAP_TYPE_UNDERWATER + || (B_DIVE_BALL_MODIFIER >= GEN_4 && (gIsFishingEncounter || gIsSurfingEncounter))) + { + ball->multiplier = 350; + } + break; + case BALL_DUSK: + i = GetTimeOfDay(); + if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND) + ball->multiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350); + break; + case BALL_TIMER: + if (B_TIMER_BALL_MODIFIER >= GEN_5) + { + ball->multiplier = 4096 + gBattleResults.battleTurnCounter * 1229; + ball->divider = 4096; + } + else + { + ball->multiplier = 100 + gBattleResults.battleTurnCounter * 10; + } + if (ball->multiplier > (4 * ball->divider)) + ball->multiplier = 4 * ball->divider; + break; + case BALL_QUICK: + if (gBattleResults.battleTurnCounter == 0) + ball->multiplier = (B_QUICK_BALL_MODIFIER >= GEN_5 ? 500 : 400); + break; + case BALL_REPEAT: + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(battleMon->species), FLAG_GET_CAUGHT)) + ball->multiplier = (B_REPEAT_BALL_MODIFIER >= GEN_7 ? 350 : 300); + break; + case BALL_LEVEL: + if (gBattleMons[playerBattler].level >= 4 * battleMon->level) + ball->multiplier = 800; + else if (gBattleMons[playerBattler].level > 2 * battleMon->level) + ball->multiplier = 400; + else if (gBattleMons[playerBattler].level > battleMon->level) + ball->multiplier = 200; + break; + case BALL_LURE: + if (gIsFishingEncounter) + { + if (B_LURE_BALL_MODIFIER >= GEN_8) + ball->multiplier = 400; + else if (B_LURE_BALL_MODIFIER >= GEN_7) + ball->multiplier = 500; + else + ball->multiplier = 300; + } + break; + case BALL_MOON: + { + const struct Evolution *evolutions = GetSpeciesEvolutions(battleMon->species); + if (evolutions == NULL) + break; + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (evolutions[i].method == EVO_ITEM + && evolutions[i].param == ITEM_MOON_STONE) + ball->multiplier = 400; + } + break; + } + case BALL_LOVE: + if (battleMon->species == gBattleMons[playerBattler].species) + { + u8 gender1 = GetMonGender(GetBattlerMon(wildMonBattler)); + u8 gender2 = GetMonGender(GetBattlerMon(playerBattler)); + + if (gender1 != gender2 && gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS) + ball->multiplier = 800; + } + break; + case BALL_FAST: + if (GetSpeciesBaseSpeed(battleMon->species) >= 100) + ball->multiplier = 400; + break; + case BALL_HEAVY: + i = GetSpeciesWeight(battleMon->species); + if (B_HEAVY_BALL_MODIFIER >= GEN_7) + { + if (i < 1000) + ball->flatBonus = -20; + else if (i < 2000) + ball->flatBonus = 0; + else if (i < 3000) + ball->flatBonus = 20; + else + ball->flatBonus = 30; + } + else if (B_HEAVY_BALL_MODIFIER >= GEN_4) + { + if (i < 2048) + ball->flatBonus = -20; + else if (i < 3072) + ball->flatBonus = 20; + else if (i < 4096) + ball->flatBonus = 30; + else + ball->flatBonus = 40; + } + else + { + if (i < 1024) + ball->flatBonus = -20; + else if (i < 2048) + ball->flatBonus = 0; + else if (i < 3072) + ball->flatBonus = 20; + else if (i < 4096) + ball->flatBonus = 30; + else + ball->flatBonus = 40; + } + break; + case BALL_DREAM: + if (B_DREAM_BALL_MODIFIER >= GEN_8 && (battleMon->status1 & STATUS1_SLEEP || (GetBattlerAbilityIgnoreMoldBreaker(wildMonBattler) == ABILITY_COMATOSE))) + ball->multiplier = 400; + break; + case BALL_SAFARI: + if (B_SAFARI_BALL_MODIFIER == GEN_1) + ball->multiplier = 200; + else if (B_SAFARI_BALL_MODIFIER <= GEN_7) + ball->multiplier = 150; + break; + case BALL_SPORT: + if (B_SPORT_BALL_MODIFIER <= GEN_7) + ball->multiplier = 150; + break; + case BALL_BEAST: + ball->multiplier = 410; + ball->divider = 4096; + break; + } + +} + +static const u8 sBadgeLevel[] = { + 25, + 30, + 35, + 40, + 45, + 50, + 55, + 60, + 100, +}; + +static u32 ComputeCaptureOdds(u32 wildMonBattler, u32 playerBattler) +{ + struct BallData ball; + ComputeBallData(wildMonBattler, playerBattler, &ball); + + if (ball.guaranteedCapture) + return CAPTURE_GUARANTEED; + struct BattlePokemon *battleMon = &gBattleMons[wildMonBattler]; + u32 odds = (battleMon->maxHP * 3 - battleMon->hp * 2); + s32 catchRate; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; + else + catchRate = gSpeciesInfo[battleMon->species].catchRate; + + catchRate += ball.flatBonus; + if (catchRate <= 0) + catchRate = catchRate + ball.flatBonus; + + odds = odds * catchRate / (battleMon->maxHP * 3); + odds = odds * ball.multiplier / ball.divider; + + u8 badgeCount = 0; + for (u32 i = FLAG_BADGE01_GET; i < FLAG_BADGE01_GET + NUM_BADGES; i++) + { + if (FlagGet(i)) + badgeCount++; + } + if (GetConfig(CONFIG_MISSING_BADGE_CATCH_MALUS) == GEN_8 && badgeCount < NUM_BADGES && gBattleMons[playerBattler].level < battleMon->level) + odds = odds * 410 / 4096; + if (GetConfig(CONFIG_MISSING_BADGE_CATCH_MALUS) == GEN_9 && badgeCount < NUM_BADGES) + { + for (u32 i = badgeCount; i < NUM_BADGES && battleMon->level > sBadgeLevel[i]; i++) + odds = odds * 4 / 5; + } + + if (GetConfig(CONFIG_LOW_LEVEL_CATCH_BONUS) == GEN_8 && battleMon->level <= 20) + odds = odds * (30 - battleMon->level) / 10; + else if (GetConfig(CONFIG_LOW_LEVEL_CATCH_BONUS) >= GEN_9 && battleMon->level <= 13) + odds = odds * (36 - (battleMon->level * 2)) / 10; + + if (battleMon->status1 & STATUS1_INCAPACITATED) + { + if (GetConfig(CONFIG_INCAPACITATED_CATCH_BONUS) >= GEN_5) + odds = (odds * 25) / 10; + else + odds *= 2; + } + if (battleMon->status1 & STATUS1_CAN_MOVE) + odds = odds * 15 / 10; + + return odds; +} + +static bool32 CriticalCapture(u32 odds) +{ + u32 numCaught; + u32 totalDexCount; + u32 charmBoost = 1; + + if (B_CRITICAL_CAPTURE == FALSE) + return FALSE; + + if (B_CRITICAL_CAPTURE_LOCAL_DEX == TRUE) + totalDexCount = KANTO_DEX_COUNT; + else + totalDexCount = NATIONAL_DEX_COUNT; + + if (CheckBagHasItem(ITEM_CATCHING_CHARM, 1)) + charmBoost = (100 + B_CATCHING_CHARM_BOOST) / 100; + + numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); + if (numCaught > (totalDexCount * 600) / 650) + odds = (odds * (250 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 450) / 650) + odds = (odds * (200 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 300) / 650) + odds = (odds * (150 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 150) / 650) + odds = (odds * (100 * charmBoost)) / 100; + else if (numCaught > (totalDexCount * 30) / 650) + odds = (odds * (50 * charmBoost)) / 100; + else + return FALSE; + + if (odds > 255) + odds = 255; + + odds /= 6; + if (RandomUniform(RNG_BALLTHROW_CRITICAL, 0, MAX_u8) < odds) + return TRUE; + + return FALSE; +} + +static u32 ComputeBallShakeOdds(u32 odds) +{ + odds = Sqrt(Sqrt(16711680 / odds)); + odds = 1048560 / odds; + return odds; +} + static void Cmd_handleballthrow(void) { CMD_ARGS(); - u16 ballMultiplier = 100; - s8 ballAddition = 0; - if (gBattleControllerExecFlags) return; @@ -13552,317 +11204,77 @@ static void Cmd_handleballthrow(void) MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } - else if (gBattleTypeFlags & (BATTLE_TYPE_POKEDUDE | BATTLE_TYPE_OLD_MAN_TUTORIAL)) + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL) { BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gBattlerAttacker); - gBattlescriptCurrInstr = BattleScript_OldMan_Pokedude_CaughtMessage; + gBattlescriptCurrInstr = BattleScript_WallyBallThrow; } else { - u32 odds, i; - u32 catchRate; - u32 ballId = ItemIdToBallId(gLastUsedItem); - gBallToDisplay = gLastThrownBall = gLastUsedItem; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; - else - catchRate = gSpeciesInfo[gBattleMons[gBattlerTarget].species].catchRate; - - if (gSpeciesInfo[gBattleMons[gBattlerTarget].species].isUltraBeast) - { - if (ballId == BALL_BEAST) - ballMultiplier = 500; - else - ballMultiplier = 10; - } - else - { - switch (ballId) - { - case BALL_ULTRA: - ballMultiplier = 200; - break; - case BALL_SPORT: - if (B_SPORT_BALL_MODIFIER <= GEN_7) - ballMultiplier = 150; - break; - case BALL_GREAT: - ballMultiplier = 150; - break; - case BALL_SAFARI: - if (B_SAFARI_BALL_MODIFIER <= GEN_7) - ballMultiplier = 150; - break; - case BALL_NET: - if (IS_BATTLER_ANY_TYPE(gBattlerTarget, TYPE_WATER, TYPE_BUG)) - ballMultiplier = B_NET_BALL_MODIFIER >= GEN_7 ? 350 : 300; - break; - case BALL_DIVE: - if (GetCurrentMapType() == MAP_TYPE_UNDERWATER - || (B_DIVE_BALL_MODIFIER >= GEN_4 && (gIsFishingEncounter || gIsSurfingEncounter))) - ballMultiplier = 350; - break; - case BALL_NEST: - if (B_NEST_BALL_MODIFIER >= GEN_6) - { - //((41 - Pokémon's level) ÷ 10)× if Pokémon's level is between 1 and 29, 1× otherwise. - if (gBattleMons[gBattlerTarget].level < 30) - ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); - } - else if (B_NEST_BALL_MODIFIER >= GEN_5) - { - //((41 - Pokémon's level) ÷ 10)×, minimum 1× - if (gBattleMons[gBattlerTarget].level < 31) - ballMultiplier = 410 - (gBattleMons[gBattlerTarget].level * 10); - } - else if (gBattleMons[gBattlerTarget].level < 40) - { - //((40 - Pokémon's level) ÷ 10)×, minimum 1× - ballMultiplier = 400 - (gBattleMons[gBattlerTarget].level * 10); - if (ballMultiplier <= 90) - ballMultiplier = 100; - } - break; - case BALL_REPEAT: - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), FLAG_GET_CAUGHT)) - ballMultiplier = (B_REPEAT_BALL_MODIFIER >= GEN_7 ? 350 : 300); - break; - case BALL_TIMER: - ballMultiplier = 100 + (gBattleResults.battleTurnCounter * (B_TIMER_BALL_MODIFIER >= GEN_5 ? 30 : 10)); - if (ballMultiplier > 400) - ballMultiplier = 400; - break; - case BALL_DUSK: - i = GetTimeOfDay(); - if (i == TIME_EVENING || i == TIME_NIGHT || gMapHeader.cave || gMapHeader.mapType == MAP_TYPE_UNDERGROUND) - ballMultiplier = (B_DUSK_BALL_MODIFIER >= GEN_7 ? 300 : 350); - break; - case BALL_QUICK: - if (gBattleResults.battleTurnCounter == 0) - ballMultiplier = (B_QUICK_BALL_MODIFIER >= GEN_5 ? 500 : 400); - break; - case BALL_LEVEL: - if (gBattleMons[gBattlerAttacker].level >= 4 * gBattleMons[gBattlerTarget].level) - ballMultiplier = 800; - else if (gBattleMons[gBattlerAttacker].level > 2 * gBattleMons[gBattlerTarget].level) - ballMultiplier = 400; - else if (gBattleMons[gBattlerAttacker].level > gBattleMons[gBattlerTarget].level) - ballMultiplier = 200; - break; - case BALL_LURE: - if (gIsFishingEncounter) - { - if (B_LURE_BALL_MODIFIER >= GEN_8) - ballMultiplier = 400; - else if (B_LURE_BALL_MODIFIER >= GEN_7) - ballMultiplier = 500; - else - ballMultiplier = 300; - } - break; - case BALL_MOON: - { - const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerTarget].species); - if (evolutions == NULL) - break; - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (evolutions[i].method == EVO_ITEM - && evolutions[i].param == ITEM_MOON_STONE) - ballMultiplier = 400; - } - } - break; - case BALL_LOVE: - if (gBattleMons[gBattlerTarget].species == gBattleMons[gBattlerAttacker].species) - { - u8 gender1 = GetMonGender(GetBattlerMon(gBattlerTarget)); - u8 gender2 = GetMonGender(GetBattlerMon(gBattlerAttacker)); - - if (gender1 != gender2 && gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS) - ballMultiplier = 800; - } - break; - case BALL_FAST: - if (GetSpeciesBaseSpeed(gBattleMons[gBattlerTarget].species) >= 100) - ballMultiplier = 400; - break; - case BALL_HEAVY: - i = GetSpeciesWeight(gBattleMons[gBattlerTarget].species); - if (B_HEAVY_BALL_MODIFIER >= GEN_7) - { - if (i < 1000) - ballAddition = -20; - else if (i < 2000) - ballAddition = 0; - else if (i < 3000) - ballAddition = 20; - else - ballAddition = 30; - } - else if (B_HEAVY_BALL_MODIFIER >= GEN_4) - { - if (i < 2048) - ballAddition = -20; - else if (i < 3072) - ballAddition = 20; - else if (i < 4096) - ballAddition = 30; - else - ballAddition = 40; - } - else - { - if (i < 1024) - ballAddition = -20; - else if (i < 2048) - ballAddition = 0; - else if (i < 3072) - ballAddition = 20; - else if (i < 4096) - ballAddition = 30; - else - ballAddition = 40; - } - break; - case BALL_DREAM: - if (B_DREAM_BALL_MODIFIER >= GEN_8 && (gBattleMons[gBattlerTarget].status1 & STATUS1_SLEEP || GetBattlerAbility(gBattlerTarget) == ABILITY_COMATOSE)) - ballMultiplier = 400; - break; - case BALL_BEAST: - ballMultiplier = 10; - break; - } - } - - // catchRate is unsigned, which means that it may potentially overflow if sum is applied directly. - if (catchRate < 21 && ballAddition == -20) - catchRate = 1; - else - catchRate = catchRate + ballAddition; - - odds = (catchRate * ballMultiplier / 100) - * (gBattleMons[gBattlerTarget].maxHP * 3 - gBattleMons[gBattlerTarget].hp * 2) - / (3 * gBattleMons[gBattlerTarget].maxHP); - - if (gBattleMons[gBattlerTarget].status1 & STATUS1_INCAPACITATED) - odds *= 2; - if (gBattleMons[gBattlerTarget].status1 & STATUS1_CAN_MOVE) - odds = (odds * 15) / 10; + u32 odds = ComputeCaptureOdds(gBattlerTarget, gBattlerAttacker); + if (gTestRunnerEnabled) + TestRunner_Battle_RecordCatchChance(odds); + u32 ballId = ItemIdToBallId(gLastUsedItem); if (gBattleResults.catchAttempts[ballId] < 255) gBattleResults.catchAttempts[ballId]++; - if (odds > 254) // mon caught + //Master Ball check occurs before critical capture check + if (odds == CAPTURE_GUARANTEED) { - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); - MarkBattlerForControllerExec(gBattlerAttacker); - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); - SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); - - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - - if (ballId == BALL_HEAL) - { - MonRestorePP(caughtMon); - HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); - gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); - } - else if (ballId == BALL_FRIEND) - { - u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); - } + FinalizeCapture(); + return; } - else // mon may be caught, calculate shakes + + u8 shakes; + u8 maxShakes; + + gBattleSpritesDataPtr->animationData->isCriticalCapture = FALSE; + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = FALSE; + + if (CriticalCapture(odds)) { - u8 shakes; - u8 maxShakes; - - gBattleSpritesDataPtr->animationData->isCriticalCapture = FALSE; - gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = FALSE; - - if (CriticalCapture(odds)) - { - maxShakes = BALL_1_SHAKE; // critical capture doesn't guarantee capture - gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; - } - else - { - maxShakes = BALL_3_SHAKES_SUCCESS; - } - - if (ballId == BALL_MASTER) - { - shakes = maxShakes; - } - else - { - odds = Sqrt(Sqrt(16711680 / odds)); - odds = 1048560 / odds; - for (shakes = 0; shakes < maxShakes; shakes++) - { - if (RandomUniform(RNG_BALLTHROW_SHAKE, 0, MAX_u16) >= odds) - break; - } - } - - BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, shakes); - MarkBattlerForControllerExec(gBattlerAttacker); - - if (shakes == maxShakes) // mon caught, copy of the code above - { - enum NationalDexOrder natDexNo = SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species); - if ((B_CRITICAL_CAPTURE_IF_OWNED >= GEN_9 && GetSetPokedexFlag(natDexNo, FLAG_GET_CAUGHT)) - || IsCriticalCapture()) - { - gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; - gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; - } - TryBattleFormChange(gBattlerTarget, FORM_CHANGE_END_BATTLE); - gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; - struct Pokemon *caughtMon = GetBattlerMon(gBattlerTarget); - SetMonData(caughtMon, MON_DATA_POKEBALL, &ballId); - - if (CalculatePlayerPartyCount() == PARTY_SIZE) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; - - if (ballId == BALL_HEAL) - { - MonRestorePP(caughtMon); - HealStatusConditions(caughtMon, STATUS1_ANY, gBattlerTarget); - gBattleMons[gBattlerTarget].hp = gBattleMons[gBattlerTarget].maxHP; - SetMonData(caughtMon, MON_DATA_HP, &gBattleMons[gBattlerTarget].hp); - } - else if (ballId == BALL_FRIEND) - { - u32 friendship = (B_FRIEND_BALL_MODIFIER >= GEN_8 ? 150 : 200); - SetMonData(caughtMon, MON_DATA_FRIENDSHIP, &friendship); - } - } - else // not caught - { - if (!gHasFetchedBall) - gLastUsedBall = gLastUsedItem; - - if (IsCriticalCapture()) - gBattleCommunication[MULTISTRING_CHOOSER] = BALL_3_SHAKES_FAIL; - else - gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - - gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; - } + maxShakes = BALL_1_SHAKE; // critical capture doesn't guarantee capture + gBattleSpritesDataPtr->animationData->isCriticalCapture = TRUE; } + else + { + maxShakes = BALL_3_SHAKES_SUCCESS; + } + + if (odds > 254) + { + FinalizeCapture(); + return; + } + odds = ComputeBallShakeOdds(odds); + for (shakes = 0; shakes < maxShakes; shakes++) + { + if (RandomUniform(RNG_BALLTHROW_SHAKE, 0, MAX_u16) >= odds) + break; + } + + if (shakes == maxShakes) // mon caught, copy of the code above + { + if (IsCriticalCapture()) + gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = TRUE; + FinalizeCapture(); + return; + } + + if (!gHasFetchedBall) + gLastUsedBall = gLastUsedItem; + + if (IsCriticalCapture()) + gBattleCommunication[MULTISTRING_CHOOSER] = BALL_3_SHAKES_FAIL; + else + gBattleCommunication[MULTISTRING_CHOOSER] = shakes; + + BtlController_EmitBallThrowAnim(gBattlerAttacker, B_COMM_TO_CONTROLLER, shakes); + MarkBattlerForControllerExec(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } @@ -13979,7 +11391,7 @@ static void Cmd_givecaughtmon(void) SetMonData(caughtMon, MON_DATA_HELD_ITEM, &lostItem); // Restore non-berry items } - if (GiveMonToPlayer(caughtMon) != MON_GIVEN_TO_PARTY + if (GiveCapturedMonToPlayer(caughtMon) != MON_GIVEN_TO_PARTY && gBattleCommunication[MULTISTRING_CHOOSER] != B_MSG_SWAPPED_INTO_PARTY) { if (!ShouldShowBoxWasFullMessage()) @@ -14001,9 +11413,9 @@ static void Cmd_givecaughtmon(void) gBattleCommunication[MULTISTRING_CHOOSER]++; } - gBattleResults.caughtMonSpecies = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); + gBattleResults.caughtMonSpecies = GetMonData(caughtMon, MON_DATA_SPECIES); GetMonData(caughtMon, MON_DATA_NICKNAME, gBattleResults.caughtMonNick); - gBattleResults.caughtMonBall = GetMonData(caughtMon, MON_DATA_POKEBALL, NULL); + gBattleResults.caughtMonBall = GetMonData(caughtMon, MON_DATA_POKEBALL); gSelectedMonPartyId = PARTY_SIZE; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -14025,8 +11437,8 @@ static void Cmd_trysetcaughtmondexflags(void) CMD_ARGS(const u8 *failInstr); struct Pokemon *caughtMon = GetBattlerMon(GetCatchingBattler()); - u32 species = GetMonData(caughtMon, MON_DATA_SPECIES, NULL); - u32 personality = GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL); + u32 species = GetMonData(caughtMon, MON_DATA_SPECIES); + u32 personality = GetMonData(caughtMon, MON_DATA_PERSONALITY); if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) { @@ -14039,19 +11451,20 @@ static void Cmd_trysetcaughtmondexflags(void) } } - - static void Cmd_displaydexinfo(void) { CMD_ARGS(); - struct Pokemon *mon = GetBattlerMon(GetCatchingBattler()); - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 caughtBattler = GetCatchingBattler(); + struct Pokemon *mon = GetBattlerMon(caughtBattler); + u16 species = GetMonData(mon, MON_DATA_SPECIES); switch (gBattleCommunication[0]) { case 0: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + ClearTemporarySpeciesSpriteData(caughtBattler, FALSE, FALSE); + BattleLoadMonSpriteGfx(mon, caughtBattler); gBattleCommunication[0]++; break; case 1: @@ -14224,7 +11637,7 @@ static void Cmd_trygivecaughtmonnick(void) DoNamingScreen(NAMING_SCREEN_CAUGHT_MON, gBattleStruct->caughtMonNick, GetMonData(caughtMon, MON_DATA_SPECIES), GetMonGender(caughtMon), - GetMonData(caughtMon, MON_DATA_PERSONALITY, NULL), + GetMonData(caughtMon, MON_DATA_PERSONALITY), callback); gBattleCommunication[MULTIUSE_STATE]++; @@ -14244,8 +11657,17 @@ static void Cmd_trygivecaughtmonnick(void) } } -static void Cmd_unused_0xf4(void) +static void Cmd_sortbattlers(void) { + CMD_ARGS(); + if (!gBattleStruct->battlersSorted) + { + for (u32 i = 0; i < gBattlersCount; i++) + gBattlersBySpeed[i] = i; + + SortBattlersBySpeed(gBattlersBySpeed, FALSE); + } + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_removeattackerstatus1(void) @@ -14317,7 +11739,7 @@ static void Cmd_settelekinesis(void) else { gBattleMons[gBattlerTarget].volatiles.telekinesis = TRUE; - gDisableStructs[gBattlerTarget].telekinesisTimer = 3; + gBattleMons[gBattlerTarget].volatiles.telekinesisTimer = B_TELEKINESIS_TIMER; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14418,12 +11840,12 @@ static void Cmd_tryoverwriteability(void) } else { - if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS) + if (gBattleMons[gBattlerTarget].volatiles.neutralizingGas) gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE; RemoveAbilityFlags(gBattlerTarget); gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = GetMoveOverwriteAbility(gCurrentMove); + gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerTarget].volatiles.overwrittenAbility = GetMoveOverwriteAbility(gCurrentMove); gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -14439,18 +11861,22 @@ static void Cmd_callnative(void) void SaveBattlerTarget(u32 battler) { - if (gBattleStruct->savedTargetCount < NELEMS(gBattleStruct->savedBattlerTarget)) - gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount++] = battler; - else - DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerTarget array size!"); + assertf(gBattleStruct->savedTargetCount < ARRAY_COUNT(gBattleStruct->savedBattlerTarget), "Too many savedBattlerTargets") + { + return; + } + + gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount++] = battler; } void SaveBattlerAttacker(u32 battler) { - if (gBattleStruct->savedAttackerCount < NELEMS(gBattleStruct->savedBattlerAttacker)) - gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount++] = battler; - else - DebugPrintfLevel(MGBA_LOG_WARN, "Attempting to exceed savedBattlerAttacker array size!"); + assertf(gBattleStruct->savedAttackerCount < ARRAY_COUNT(gBattleStruct->savedBattlerAttacker), "Too many savedBattlerAttackers") + { + return; + } + + gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount++] = battler; } void BS_SaveTarget(void) @@ -14463,19 +11889,15 @@ void BS_SaveTarget(void) void BS_RestoreTarget(void) { NATIVE_ARGS(); - if (gBattleStruct->savedTargetCount > 0) + assertf(gBattleStruct->savedTargetCount > 0, "No savedBattlerTargets") { - gBattleStruct->savedTargetCount--; - gBattlerTarget = gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount]; - } - else - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreTarget attempting to restore an empty target!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreTarget attempting to restore an empty target!"); - // #endif + gBattlescriptCurrInstr = cmd->nextInstr; + return; } + + gBattleStruct->savedTargetCount--; + gBattlerTarget = gBattleStruct->savedBattlerTarget[gBattleStruct->savedTargetCount]; + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14489,61 +11911,17 @@ void BS_SaveAttacker(void) void BS_RestoreAttacker(void) { NATIVE_ARGS(); - if (gBattleStruct->savedAttackerCount > 0) + assertf(gBattleStruct->savedAttackerCount > 0, "No savedBattlerAttackers") { - gBattleStruct->savedAttackerCount--; - gBattlerAttacker = gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount]; - } - else - { - // #if TESTING - // Test_ExitWithResult(TEST_RESULT_ERROR, "BS_RestoreAttacker attempting to restore an empty attacker!"); - // #else - DebugPrintfLevel(MGBA_LOG_WARN, "BS_RestoreAttacker attempting to restore an empty attacker!"); - // #endif + gBattlescriptCurrInstr = cmd->nextInstr; + return; } + + gBattleStruct->savedAttackerCount--; + gBattlerAttacker = gBattleStruct->savedBattlerAttacker[gBattleStruct->savedAttackerCount]; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_CalcMetalBurstDmg(void) -{ - NATIVE_ARGS(const u8 *failInstr); - - u8 sideAttacker = GetBattlerSide(gBattlerAttacker); - u8 sideTarget = 0; - - if (gProtectStructs[gBattlerAttacker].physicalDmg - && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].physicalBattlerId)) - && gBattleMons[gProtectStructs[gBattlerAttacker].physicalBattlerId].hp) - { - - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].physicalBattlerId; - - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].physicalDmg * 150 / 100; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else if (gProtectStructs[gBattlerAttacker].specialDmg - && sideAttacker != (sideTarget = GetBattlerSide(gProtectStructs[gBattlerAttacker].specialBattlerId)) - && gBattleMons[gProtectStructs[gBattlerAttacker].specialBattlerId].hp) - { - - if (IsAffectedByFollowMe(gBattlerAttacker, sideTarget, gCurrentMove)) - gBattlerTarget = gSideTimers[sideTarget].followmeTarget; - else - gBattlerTarget = gProtectStructs[gBattlerAttacker].specialBattlerId; - - gBattleStruct->moveDamage[gBattlerTarget] = gProtectStructs[gBattlerAttacker].specialDmg * 150 / 100; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } -} - void BS_JumpIfMoreThanHalfHP(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); @@ -14560,16 +11938,16 @@ void BS_DoStockpileStatChangesWearOff(void) NATIVE_ARGS(u8 battler, const u8 *statChangeInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gDisableStructs[battler].stockpileDef != 0) + if (gBattleMons[battler].volatiles.stockpileDef != 0) { - SET_STATCHANGER(STAT_DEF, abs(gDisableStructs[battler].stockpileDef), TRUE); - gDisableStructs[battler].stockpileDef = 0; + SET_STATCHANGER(STAT_DEF, abs(gBattleMons[battler].volatiles.stockpileDef), TRUE); + gBattleMons[battler].volatiles.stockpileDef = 0; BattleScriptCall(cmd->statChangeInstr); } - else if (gDisableStructs[battler].stockpileSpDef) + else if (gBattleMons[battler].volatiles.stockpileSpDef) { - SET_STATCHANGER(STAT_SPDEF, abs(gDisableStructs[battler].stockpileSpDef), TRUE); - gDisableStructs[battler].stockpileSpDef = 0; + SET_STATCHANGER(STAT_SPDEF, abs(gBattleMons[battler].volatiles.stockpileSpDef), TRUE); + gBattleMons[battler].volatiles.stockpileSpDef = 0; BattleScriptCall(cmd->statChangeInstr); } else @@ -14578,80 +11956,6 @@ void BS_DoStockpileStatChangesWearOff(void) } } -static bool32 CriticalCapture(u32 odds) -{ - u32 numCaught; - u32 totalDexCount; - u32 charmBoost = 1; - - if (B_CRITICAL_CAPTURE == FALSE) - return FALSE; - - if (B_CRITICAL_CAPTURE_LOCAL_DEX == TRUE) - totalDexCount = KANTO_DEX_COUNT; - else - totalDexCount = NATIONAL_DEX_COUNT; - - if (CheckBagHasItem(ITEM_CATCHING_CHARM, 1)) - charmBoost = (100 + B_CATCHING_CHARM_BOOST) / 100; - - numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); - if (numCaught > (totalDexCount * 600) / 650) - odds = (odds * (250 * charmBoost)) / 100; - else if (numCaught > (totalDexCount * 450) / 650) - odds = (odds * (200 * charmBoost)) / 100; - else if (numCaught > (totalDexCount * 300) / 650) - odds = (odds * (150 * charmBoost)) / 100; - else if (numCaught > (totalDexCount * 150) / 650) - odds = (odds * (100 * charmBoost)) / 100; - else if (numCaught > (totalDexCount * 30) / 650) - odds = (odds * (50 * charmBoost)) / 100; - else - return FALSE; - - if (odds > 255) - odds = 255; - - odds /= 6; - if (RandomUniform(RNG_BALLTHROW_CRITICAL, 0, MAX_u8) < odds) - return TRUE; - - return FALSE; -} - -bool32 IsMoveAffectedByParentalBond(u32 move, u32 battler) -{ - if (move != MOVE_NONE && move != MOVE_UNAVAILABLE && move != MOVE_STRUGGLE - && !IsMoveParentalBondBanned(move) - && GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS - && GetMoveStrikeCount(move) < 2 - && GetMoveEffect(move) != EFFECT_SEMI_INVULNERABLE - && GetMoveEffect(move) != EFFECT_TWO_TURNS_ATTACK - && GetMoveEffect(move) != EFFECT_MULTI_HIT) - { - if (IsDoubleBattle()) - { - switch (GetBattlerMoveTargetType(battler, move)) - { - // Both foes are alive, spread move strikes once - case MOVE_TARGET_BOTH: - if (CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerTarget) >= 2) - return FALSE; - break; - // Either both foes or one foe and its ally are alive; spread move strikes once - case MOVE_TARGET_FOES_AND_ALLY: - if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker) >= 2) - return FALSE; - break; - default: - break; - } - } - return TRUE; - } - return FALSE; -} - static bool32 IsFinalStrikeEffect(enum MoveEffect moveEffect) { switch (moveEffect) @@ -14681,11 +11985,11 @@ static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef) return FALSE; } -bool32 CanBurnHitThaw(u16 move) +bool32 CanBurnHitThaw(enum Move move) { u8 i; - if (B_BURN_HIT_THAW >= GEN_6) + if (GetConfig(CONFIG_BURN_HIT_THAW) >= GEN_6) { u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); for (i = 0; i < numAdditionalEffects; i++) @@ -14711,11 +12015,10 @@ void BS_CheckParentalBondCounter(void) void BS_JumpIfCantLoseItem(void) { - NATIVE_ARGS(u8 battler, const u8 *jumpInstr); - u8 battler = GetBattlerForBattleScript(cmd->battler); - u16 item = gBattleMons[battler].item; + NATIVE_ARGS(const u8 *jumpInstr); + enum Item item = gBattleMons[gBattlerTarget].item; - if (item == ITEM_NONE || !CanBattlerGetOrLoseItem(battler, item)) + if (item == ITEM_NONE || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattlerAttacker, item)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -14925,12 +12228,14 @@ void BS_ItemRestoreHP(void) hp += healAmount; SetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_HP, &hp); - // Revived battlers on the field need to be brought back. - if (IsDoubleBattle() && battler != MAX_BATTLERS_COUNT) + u32 partner = BATTLE_PARTNER(gBattlerAttacker); + // Absent battlers on the field need to be replaced + if (IsDoubleBattle() && (gAbsentBattlerFlags & (1u << partner))) { - gAbsentBattlerFlags &= ~(1u << battler); - gBattleMons[battler].hp = hp; + gAbsentBattlerFlags &= ~(1u << partner); gBattleCommunication[MULTIUSE_STATE] = TRUE; + gBattleScripting.battler = partner; + BtlController_EmitChosenMonReturnValue(partner, B_COMM_TO_ENGINE, gBattleStruct->itemPartyIndex[gBattlerAttacker], NULL); } gBattlescriptCurrInstr = cmd->nextInstr; } @@ -14939,46 +12244,64 @@ void BS_ItemRestoreHP(void) void BS_ItemCureStatus(void) { - NATIVE_ARGS(const u8 *noStatusInstr); - u32 battler = gBattlerAttacker; + NATIVE_ARGS(const u8 *noStatusInstr, const u8 *restoreBattlerInstr); + u32 targetBattler = MAX_BATTLERS_COUNT; bool32 statusChanged = FALSE; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); // Heal volatile conditions if battler is active. if (gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[gBattlerAttacker]) - statusChanged = ItemHealMonVolatile(battler, gLastUsedItem); + { + statusChanged = ItemHealMonVolatile(gBattlerAttacker, gLastUsedItem); + targetBattler = gBattlerAttacker; + } else if (IsDoubleBattle() && gBattleStruct->itemPartyIndex[gBattlerAttacker] == gBattlerPartyIndexes[BATTLE_PARTNER(gBattlerAttacker)]) + { statusChanged = ItemHealMonVolatile(BATTLE_PARTNER(gBattlerAttacker), gLastUsedItem); + targetBattler = BATTLE_PARTNER(gBattlerAttacker); + } // Heal Status1 conditions. - if (!HealStatusConditions(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], GetItemStatus1Mask(gLastUsedItem), battler)) + if (!HealStatusConditions(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], GetItemStatus1Mask(gLastUsedItem), targetBattler)) { statusChanged = TRUE; if (GetItemStatus1Mask(gLastUsedItem) & STATUS1_SLEEP) - gBattleMons[battler].volatiles.nightmare = FALSE; - if (ItemHasVolatileFlag(gLastUsedItem, VOLATILE_CONFUSION)) - gBattleMons[battler].volatiles.infiniteConfusion = FALSE; + gBattleMons[targetBattler].volatiles.nightmare = FALSE; } - if (statusChanged) + if (!statusChanged) + { + gBattlescriptCurrInstr = cmd->noStatusInstr; + return; + } + + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); + if (targetBattler == MAX_BATTLERS_COUNT) { - gBattleScripting.battler = battler; - PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(&party[gBattleStruct->itemPartyIndex[gBattlerAttacker]], MON_DATA_SPECIES)); gBattlescriptCurrInstr = cmd->nextInstr; } else { - gBattlescriptCurrInstr = cmd->noStatusInstr; + gBattleScripting.battler = targetBattler; + gBattlescriptCurrInstr = cmd->restoreBattlerInstr; } } void BS_ItemIncreaseStat(void) { NATIVE_ARGS(); - u16 statId = GetItemEffect(gLastUsedItem)[1]; - u16 stages = GetItemHoldEffectParam(gLastUsedItem); - SET_STATCHANGER(statId, stages, FALSE); + + if (GetItemBattleUsage(gLastUsedItem) == EFFECT_ITEM_INCREASE_STAT) + { + u16 statId = GetItemEffect(gLastUsedItem)[1]; + u16 stages = GetItemHoldEffectParam(gLastUsedItem); + SET_STATCHANGER(statId, stages, FALSE); + } // else EFFECT_ITEM_INCREASE_ALL_STATS or EFFECT_ITEM_SET_FOCUS_ENERGY + + if (gBattlerPartyIndexes[gBattlerAttacker] != gBattleStruct->itemPartyIndex[gBattlerAttacker]) + gBattlerAttacker = BATTLE_PARTNER(gBattlerAttacker); + gBattlescriptCurrInstr = cmd->nextInstr; } @@ -15012,9 +12335,9 @@ void BS_ItemRestorePP(void) // Heal PP! for (; i < loopEnd; i++) { - pp = GetMonData(mon, MON_DATA_PP1 + i, NULL); - moveId = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); - maxPP = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), i); + pp = GetMonData(mon, MON_DATA_PP1 + i); + moveId = GetMonData(mon, MON_DATA_MOVE1 + i); + maxPP = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES), i); if (pp != maxPP) { pp += effect[6]; @@ -15087,17 +12410,6 @@ void BS_JumpIfShellTrap(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfElectricAbilityAffected(void) -{ - NATIVE_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr); - u32 battler = GetBattlerForBattleScript(cmd->battler); - - if (IsElectricAbilityAffected(battler, cmd->ability)) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SetTerrain(void) { NATIVE_ARGS(const u8 *jumpInstr); @@ -15156,7 +12468,7 @@ void BS_JumpIfTerrainAffected(void) NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), cmd->flags)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), gFieldStatuses, cmd->flags)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -15215,16 +12527,16 @@ void BS_TrySetOctolock(void) { NATIVE_ARGS(const u8 *failInstr); - if (gDisableStructs[gBattlerTarget].octolock) + if (gBattleMons[gBattlerTarget].volatiles.octolock) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gDisableStructs[gBattlerTarget].octolock = TRUE; - gDisableStructs[gBattlerTarget].octolockedBy = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.octolock = TRUE; + gBattleMons[gBattlerTarget].volatiles.octolockedBy = gBattlerAttacker; gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.battlerPreventingEscape = gBattlerAttacker; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15238,7 +12550,7 @@ void BS_SetPledge(void) u32 i = 0; u32 k = 0; - if (gBattleStruct->pledgeMove && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)) + if (gBattleStruct->pledgeMove && !gBattleStruct->unableToUseMove) { if ((gCurrentMove == MOVE_GRASS_PLEDGE && partnerMove == MOVE_WATER_PLEDGE) || (gCurrentMove == MOVE_WATER_PLEDGE && partnerMove == MOVE_GRASS_PLEDGE)) @@ -15265,7 +12577,7 @@ void BS_SetPledge(void) && IsDoubleBattle() && IsBattlerAlive(partner) && !HasBattlerActedThisTurn(partner) - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + && !gBattleStruct->unableToUseMove && gCurrentMove != partnerMove && GetMoveEffect(partnerMove) == EFFECT_PLEDGE) { @@ -15314,7 +12626,7 @@ void BS_SetPledgeStatus(void) NATIVE_ARGS(u8 battler, u32 sideStatus); u32 battler = GetBattlerForBattleScript(cmd->battler); - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); gBattleStruct->pledgeMove = FALSE; if (!(gSideStatuses[side] & cmd->sideStatus)) @@ -15348,7 +12660,21 @@ void BS_TryTrainerSlideZMoveMsg(void) { gBattleScripting.battler = gBattlerAttacker; BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + + switch(gBattlerAttacker) + { + case B_POSITION_OPPONENT_LEFT: + gBattlescriptCurrInstr = BattleScript_TrainerASlideMsgRet; + break; + case B_POSITION_PLAYER_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerPartnerSlideMsgRet; + break; + case B_POSITION_OPPONENT_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerBSlideMsgRet; + break; + default: + break; + } } else gBattlescriptCurrInstr = cmd->nextInstr; @@ -15363,7 +12689,21 @@ void BS_TryTrainerSlideMegaEvolutionMsg(void) { gBattleScripting.battler = gBattlerAttacker; BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + + switch(gBattlerAttacker) + { + case B_POSITION_OPPONENT_LEFT: + gBattlescriptCurrInstr = BattleScript_TrainerASlideMsgRet; + break; + case B_POSITION_PLAYER_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerPartnerSlideMsgRet; + break; + case B_POSITION_OPPONENT_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerBSlideMsgRet; + break; + default: + break; + } } else gBattlescriptCurrInstr = cmd->nextInstr; @@ -15377,7 +12717,21 @@ void BS_TryTrainerSlideDynamaxMsg(void) if ((shouldSlide = ShouldDoTrainerSlide(gBattleScripting.battler, TRAINER_SLIDE_DYNAMAX))) { BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + + switch(gBattleScripting.battler) + { + case B_POSITION_OPPONENT_LEFT: + gBattlescriptCurrInstr = BattleScript_TrainerASlideMsgRet; + break; + case B_POSITION_PLAYER_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerPartnerSlideMsgRet; + break; + case B_POSITION_OPPONENT_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerBSlideMsgRet; + break; + default: + break; + } } else gBattlescriptCurrInstr = cmd->nextInstr; @@ -15426,23 +12780,6 @@ void BS_TryDefog(void) } } -void BS_TryUpperHand(void) -{ - NATIVE_ARGS(const u8 *failInstr); - - enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); - u32 prio = GetChosenMovePriority(gBattlerTarget, abilityDef); - - if (HasBattlerActedThisTurn(gBattlerTarget) - || gChosenMoveByBattler[gBattlerTarget] == MOVE_NONE - || IsBattleMoveStatus(gChosenMoveByBattler[gBattlerTarget]) - || prio < 1 - || prio > 3) // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status - gBattlescriptCurrInstr = cmd->failInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_TryTriggerStatusForm(void) { NATIVE_ARGS(); @@ -15474,18 +12811,19 @@ void BS_TryAllySwitch(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9) + else if (GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9) { - TryResetProtectUseCounter(gBattlerAttacker); - if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] < Random()) + TryResetConsecutiveUseCounter(gBattlerAttacker); + + if (CanUseMoveConsecutively(gBattlerAttacker)) { - gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattlescriptCurrInstr = cmd->failInstr; + gBattleMons[gBattlerAttacker].volatiles.consecutiveMoveUses++; + gBattlescriptCurrInstr = cmd->nextInstr; } else { - gDisableStructs[gBattlerAttacker].protectUses++; - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleMons[gBattlerAttacker].volatiles.consecutiveMoveUses = 0; + gBattlescriptCurrInstr = cmd->failInstr; } } else @@ -15494,61 +12832,6 @@ void BS_TryAllySwitch(void) } } -static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) -{ - u32 i, j; - - if (IsOnPlayerSide(gBattlerAttacker) - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_RECORDED_LINK - | BATTLE_TYPE_TRAINER_HILL - | BATTLE_TYPE_FRONTIER))) - { - const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerAttacker].species); - if (evolutions == NULL) - return; - - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) - continue; - if (evolutions[i].params == NULL) - continue; - - for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - if (evolutions[i].params[j].condition == evolutionCondition) - { - struct Pokemon *monAtk = GetBattlerMon(gBattlerAttacker); - struct Pokemon *monDef = GetBattlerMon(gBattlerTarget); - // We only have 10 bits to use - u16 val = min(1023, GetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER) + upAmount); - // Reset progress if you faint for the recoil method. - switch (evolutionCondition) - { - case IF_USED_MOVE_X_TIMES: - if (evolutions[i].params[j].arg1 == usedMove) - SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); - break; - case IF_RECOIL_DAMAGE_GE: - if (gBattleMons[gBattlerAttacker].hp == 0) - val = 0; - SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); - break; - case IF_DEFEAT_X_WITH_ITEMS: - if (GetMonData(monDef, MON_DATA_SPECIES) == evolutions[i].params[j].arg1 - && GetMonData(monDef, MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) - SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); - break; - } - return; - } - } - } - } -} - void BS_TryTidyUp(void) { NATIVE_ARGS(u8 clear, const u8 *jumpInstr); @@ -15591,7 +12874,7 @@ void BS_TryActivateGulpMissile(void) { NATIVE_ARGS(); - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT @@ -15630,22 +12913,22 @@ void BS_TryQuash(void) // If the above condition is not true, it means we are faster than the foe, so we can set the quash bit gProtectStructs[gBattlerTarget].quash = TRUE; - struct BattleContext ctx = {0}; + struct BattleCalcValues calcValues = {0}; for (i = 0; i < gBattlersCount; i++) { - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); + calcValues.abilities[i] = GetBattlerAbility(i); + calcValues.holdEffects[i] = GetBattlerHoldEffect(i); } // this implementation assumes turn order is correct when using Quash i = GetBattlerTurnOrderNum(gBattlerTarget); for (j = i + 1; j < gBattlersCount; j++) { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; + calcValues.battlerAtk = gBattlerByTurnOrder[i]; + calcValues.battlerDef = gBattlerByTurnOrder[j]; // Gen 7- config makes target go last so that the order of quash targets is kept for the correct turn order // Gen 8+ config alters Turn Order of the target according to speed, dynamic speed should handle the rest - if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(&ctx, FALSE) == -1) + if (B_QUASH_TURN_ORDER < GEN_8 || GetWhichBattlerFaster(&calcValues, FALSE) == -1) SwapTurnOrder(i, j); else break; @@ -15739,13 +13022,13 @@ void BS_FickleBeamDamageCalculation(void) void BS_TryTarShot(void) { NATIVE_ARGS(const u8 *failInstr); - if (gDisableStructs[gBattlerTarget].tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + if (gBattleMons[gBattlerTarget].volatiles.tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gDisableStructs[gBattlerTarget].tarShot = TRUE; + gBattleMons[gBattlerTarget].volatiles.tarShot = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -15753,9 +13036,9 @@ void BS_TryTarShot(void) void BS_CanTarShotWork(void) { NATIVE_ARGS(const u8 *failInstr); - // Tar Shot will fail if it's already been used on the target or if its speed can't be lowered further - if (!gDisableStructs[gBattlerTarget].tarShot - && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) + // Tar Shot fails if the target can't be made weaker to fire and it's speed can't be lowered further + if (!(gBattleMons[gBattlerTarget].volatiles.tarShot || GetActiveGimmick(gBattlerTarget) == GIMMICK_TERA) + || CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, GetBattlerAbility(gBattlerTarget))) gBattlescriptCurrInstr = cmd->nextInstr; else gBattlescriptCurrInstr = cmd->failInstr; @@ -15784,23 +13067,35 @@ void BS_SetMagicCoatTarget(void) gBattleStruct->attackerBeforeBounce = gBattleScripting.battler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gBattleStruct->attackerBeforeBounce; - HandleMoveTargetRedirection(); + DetermineTarget(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove), FALSE); + ClearDamageCalcResults(); + gBattleStruct->eventState.atkCanceler = CANCELER_TARGET_FAILURE; + gBattleStruct->eventState.atkCancelerBattler = 0; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TeatimeInvul(void) +void BS_JumpIfNoBerry(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES && !IsSemiInvulnerable(gBattlerTarget, CHECK_ALL)) + if (GetItemPocket(gBattleMons[battler].item) == POCKET_BERRIES) gBattlescriptCurrInstr = cmd->nextInstr; else gBattlescriptCurrInstr = cmd->jumpInstr; } -void BS_TeatimeTargets(void) +static bool32 IsTeatimeAffected(u32 battler) +{ + if (GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) + return FALSE; // Only berries + if (IsSemiInvulnerable(battler, CHECK_ALL)) + return FALSE; // Teatime doesn't affected semi-invulnerable battlers + return TRUE; +} + +void BS_CheckTeaTimeTargets(void) { NATIVE_ARGS(const u8 *failInstr); u32 count = 0, i; @@ -15842,7 +13137,7 @@ void BS_ActivateWeatherChangeAbilities(void) u32 battler = GetBattlerForBattleScript(cmd->battler); gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, GetBattlerAbility(battler), MOVE_NONE, TRUE); } void BS_ActivateTerrainChangeAbilities(void) @@ -15851,7 +13146,7 @@ void BS_ActivateTerrainChangeAbilities(void) u32 battler = GetBattlerForBattleScript(cmd->battler); gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, GetBattlerAbility(battler), MOVE_NONE, TRUE); } void BS_ResetTerrainAbilityFlags(void) @@ -15859,7 +13154,7 @@ void BS_ResetTerrainAbilityFlags(void) NATIVE_ARGS(); // reset terrain ability checks for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].terrainAbilityDone = 0; + gBattleMons[i].volatiles.terrainAbilityDone = 0; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -15869,7 +13164,7 @@ void BS_StoreHealingWish(void) NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (gCurrentMove == MOVE_LUNAR_DANCE) + if (GetMoveEffect(gCurrentMove) == EFFECT_LUNAR_DANCE) gBattleStruct->battlerState[battler].storedLunarDance = TRUE; else gBattleStruct->battlerState[battler].storedHealingWish = TRUE; @@ -15991,13 +13286,6 @@ void BS_WaitFanfare(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetBeakBlast(void) -{ - NATIVE_ARGS(); - gProtectStructs[gBattlerAttacker].beakBlastCharge = TRUE; - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_RemoveTerrain(void) { NATIVE_ARGS(); @@ -16005,60 +13293,6 @@ void BS_RemoveTerrain(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_TrySpectralThiefSteal(void) -{ - NATIVE_ARGS(const u8 *jumpInstr); - - if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - { - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } - - bool32 contrary = GetBattlerAbility(gBattlerAttacker) == ABILITY_CONTRARY; - gBattleStruct->stolenStats[0] = 0; // Stats to steal. - gBattleScripting.animArg1 = 0; - for (enum Stat stat = STAT_ATK; stat < NUM_BATTLE_STATS; stat++) - { - if (gBattleMons[gBattlerTarget].statStages[stat] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[stat] != MAX_STAT_STAGE) - { - bool32 byTwo = FALSE; - - gBattleStruct->stolenStats[0] |= (1 << (stat)); - // Store by how many stages to raise the stat. - gBattleStruct->stolenStats[stat] = gBattleMons[gBattlerTarget].statStages[stat] - DEFAULT_STAT_STAGE; - - while (gBattleMons[gBattlerAttacker].statStages[stat] + gBattleStruct->stolenStats[stat] > MAX_STAT_STAGE) - gBattleStruct->stolenStats[stat]--; - - gBattleMons[gBattlerTarget].statStages[stat] = DEFAULT_STAT_STAGE; - - if (gBattleStruct->stolenStats[stat] >= 2) - byTwo++; - - if (gBattleScripting.animArg1 == 0) - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS2 : STAT_ANIM_PLUS2) + stat; - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MINUS1 : STAT_ANIM_PLUS1) + stat; - } - else - { - if (byTwo) - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS2 : STAT_ANIM_MULTIPLE_PLUS2); - else - gBattleScripting.animArg1 = (contrary ? STAT_ANIM_MULTIPLE_MINUS1 : STAT_ANIM_MULTIPLE_PLUS1); - } - } - } - - if (gBattleStruct->stolenStats[0] != 0) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SpectralThiefPrintStats(void) { NATIVE_ARGS(); @@ -16087,7 +13321,7 @@ void BS_SpectralThiefPrintStats(void) void BS_SetMoveResultFlags(void) { NATIVE_ARGS(u16 value); - gBattleStruct->moveResultFlags[gBattlerTarget] |= cmd->value; + gBattleStruct->moveResultFlags[gBattlerTarget] = cmd->value; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16115,11 +13349,11 @@ void BS_JumpIfMoveResultFlags(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfCriticalHit(void) +void BS_JumpIfNotCriticalHit(void) { NATIVE_ARGS(const u8 *jumpInstr); - if (gSpecialStatuses[gBattlerTarget].criticalHit) + if (!gSpecialStatuses[gBattlerTarget].criticalHit) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -16229,7 +13463,7 @@ void BS_TrySetConfusion(void) if (CanBeConfused(gBattlerTarget)) { - gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = RandomUniform(RNG_CONFUSION_TURNS, 2, B_CONFUSION_TURNS); // 2-5 turns gBattleCommunication[MULTIUSE_STATE] = 1; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; @@ -16267,7 +13501,7 @@ void BS_TrySetEscapePrevention(void) if (!gBattleMons[gBattlerTarget].volatiles.escapePrevention) { gBattleMons[gBattlerTarget].volatiles.escapePrevention = TRUE; - gDisableStructs[gBattlerTarget].battlerPreventingEscape = gBattlerAttacker; + gBattleMons[gBattlerTarget].volatiles.battlerPreventingEscape = gBattlerAttacker; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16285,7 +13519,7 @@ void BS_TrySetTorment(void) && !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL)) { gBattleMons[gBattlerTarget].volatiles.torment = TRUE; - gDisableStructs[gBattlerTarget].tormentTimer = 3; + gBattleMons[gBattlerTarget].volatiles.tormentTimer = B_TORMENT_TIMER; gEffectBattler = gBattlerTarget; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16359,7 +13593,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void) case ABILITY_SCRAPPY: case ABILITY_OWN_TEMPO: case ABILITY_OBLIVIOUS: - if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8) + if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8) { hasAbility = TRUE; gBattlescriptCurrInstr = BattleScript_IntimidatePrevented; @@ -16402,7 +13636,12 @@ void BS_TryFlingHoldEffect(void) { NATIVE_ARGS(); enum HoldEffect holdEffect = GetItemHoldEffect(gBattleStruct->flingItem); - gBattleStruct->flingItem = ITEM_NONE; + + if (GetItemPocket(gBattleStruct->flingItem) == POCKET_BERRIES) + { + gBattlescriptCurrInstr = BattleScript_EffectFlingConsumeBerry; + return; + } if (IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget))) { @@ -16422,7 +13661,7 @@ void BS_TryFlingHoldEffect(void) SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_PARALYSIS, cmd->nextInstr, NO_FLAGS); break; case HOLD_EFFECT_TYPE_POWER: - if (GetItemSecondaryId(gLastUsedItem) != TYPE_POISON) + if (GetItemSecondaryId(gBattleStruct->flingItem) != TYPE_POISON) gBattlescriptCurrInstr = cmd->nextInstr; else SetMoveEffect(gBattlerAttacker, gBattlerTarget, MOVE_EFFECT_POISON, cmd->nextInstr, NO_FLAGS); @@ -16481,15 +13720,27 @@ void BS_TryBoosterEnergy(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfAbilityCantBeSuppressed(void) +void BS_JumpIfAbilityCantBeReactivated(void) { NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 ability = gBattleMons[battler].ability; - if (gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed) + switch (ability) + { + case ABILITY_IMPOSTER: + case ABILITY_NEUTRALIZING_GAS: + case ABILITY_AIR_LOCK: + case ABILITY_CLOUD_NINE: gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; + break; + default: + if (gAbilitiesInfo[ability].cantBeSuppressed) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; + break; + } } void BS_TryActivateAbilityShield(void) @@ -16512,39 +13763,6 @@ void BS_TryActivateAbilityShield(void) } } -void BS_TrySynchronoise(void) -{ - NATIVE_ARGS(const u8 *jumpInstr); - bool32 atleastOneSharedType = FALSE; - - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_SYNCHRONOISE_AFFECTED - || gBattlerAttacker == battlerDef - || !IsBattlerAlive(battlerDef)) - continue; - - if (DoBattlersShareType(gBattlerAttacker, battlerDef)) - { - atleastOneSharedType = TRUE; - continue; - } - - if (!DoBattlersShareType(gBattlerAttacker, battlerDef)) - { - gBattleScripting.battler = battlerDef; - gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_NO_EFFECT | MOVE_RESULT_SYNCHRONOISE_AFFECTED; - BattleScriptCall(BattleScript_ItDoesntAffectFoe); - return; - } - } - - if (atleastOneSharedType) - gBattlescriptCurrInstr = cmd->nextInstr; - else - gBattlescriptCurrInstr = cmd->jumpInstr; -} - void BS_JumpIfRoarFails(void) { NATIVE_ARGS(const u8 *jumpInstr); @@ -16628,7 +13846,27 @@ void BS_GetStatValue(void) { NATIVE_ARGS(u8 stat); u32 stat = cmd->stat; - gBattleStruct->passiveHpUpdate[gBattlerAttacker] = *(u16 *)(&gBattleMons[gBattlerTarget].attack) + (stat - 1); + switch (stat) + { + case STAT_ATK: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerTarget].attack; + break; + case STAT_DEF: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerTarget].defense; + break; + case STAT_SPATK: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerTarget].spAttack; + break; + case STAT_SPDEF: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerTarget].spDefense; + break; + case STAT_SPEED: + gBattleStruct->passiveHpUpdate[gBattlerAttacker] = gBattleMons[gBattlerTarget].speed; + break; + default: + errorf("Illegal stat requested"); + return; + } gBattleStruct->passiveHpUpdate[gBattlerAttacker] *= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][0]; gBattleStruct->passiveHpUpdate[gBattlerAttacker] /= gStatStageRatios[gBattleMons[gBattlerTarget].statStages[stat]][1]; gBattlescriptCurrInstr = cmd->nextInstr; @@ -16677,25 +13915,19 @@ void BS_SetTracedAbility(void) { NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); - gBattleMons[battler].ability = gDisableStructs[battler].overwrittenAbility = gBattleStruct->tracedAbility[battler]; + gBattleMons[battler].ability = gBattleMons[battler].volatiles.overwrittenAbility = gBattleStruct->tracedAbility[battler]; gBattlescriptCurrInstr = cmd->nextInstr; } void BS_TryIllusionOff(void) { NATIVE_ARGS(u8 battler); - if (TryClearIllusion(GetBattlerForBattleScript(cmd->battler), ABILITYEFFECT_MOVE_END)) + u32 battler = GetBattlerForBattleScript(cmd->battler); + if (TryClearIllusion(battler, GetBattlerAbility(battler))) return; gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_SetSpriteIgnore0Hp(void) -{ - NATIVE_ARGS(bool8 ignore0HP); - gBattleStruct->spriteIgnore0Hp = cmd->ignore0HP; - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_UpdateNick(void) { NATIVE_ARGS(); @@ -16772,7 +14004,7 @@ void BS_IsRunningImpossible(void) void BS_GetMoveTarget(void) { NATIVE_ARGS(); - gBattlerTarget = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(gCurrentMove, TARGET_NONE); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16786,10 +14018,10 @@ void BS_GetBattlerFainted(void) gBattlescriptCurrInstr = cmd->nextInstr; } +// TODO: What is this fixing??? void BS_ResetSwitchInAbilityBits(void) { NATIVE_ARGS(); - gSpecialStatuses[gBattlerAttacker].switchInAbilityDone = FALSE; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -16862,7 +14094,7 @@ void BS_ArenaJudgmentWindow(void) gBattlescriptCurrInstr = cmd->nextInstr; } -static void SetArenMonLostValues(u32 battler, u32 side) +static void SetArenMonLostValues(u32 battler, enum BattleSide side) { // gBattleMons[battler].hp = 0; // gHitMarker |= HITMARKER_FAINTED(battler); @@ -16870,7 +14102,7 @@ static void SetArenMonLostValues(u32 battler, u32 side) // gBattleStruct->arenaLostPlayerMons |= 1u << gBattlerPartyIndexes[battler]; // else // gBattleStruct->arenaLostOpponentMons |= 1u << gBattlerPartyIndexes[battler]; - // gDisableStructs[battler].truantSwitchInHack = TRUE; + // gBattleMons[battler].volatiles.truantSwitchInHack = TRUE; } #define playerMon 0 @@ -16932,7 +14164,7 @@ void BS_ArenaJudgmentString(void) void BS_ArenaWaitMessage(void) { NATIVE_ARGS(); - // if (IsTextPrinterActive(ARENA_WIN_JUDGMENT_TEXT)) + // if (IsTextPrinterActiveOnWindow(ARENA_WIN_JUDGMENT_TEXT)) // return; gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17049,17 +14281,17 @@ void BS_SwitchinAbilities(void) { NATIVE_ARGS(u8 battler); u32 battler = GetBattlerForBattleScript(cmd->battler); + u32 ability = GetBattlerAbility(battler); gBattlescriptCurrInstr = cmd->nextInstr; - AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0); - AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, 0, 0, 0); - - if (gBattleWeather & B_WEATHER_ANY && HasWeatherEffect()) - AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, 0, 0, 0); - - if (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY) - AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, 0, 0, 0); + AbilityBattleEffects(ABILITYEFFECT_TERA_SHIFT, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_UNNERVE, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_COMMANDER, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, ability, MOVE_NONE, TRUE); + AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, ability, MOVE_NONE, TRUE); } void BS_InstantHpDrop(void) @@ -17072,34 +14304,34 @@ void BS_InstantHpDrop(void) void BS_ClearStatus(void) { - NATIVE_ARGS(); - gBattleMons[gBattlerAttacker].status1 = 0; + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + gBattleMons[battler].status1 = 0; BtlController_EmitSetMonData( - gBattlerAttacker, + battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, - sizeof(gBattleMons[gBattlerAttacker].status1), - &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(gBattlerAttacker); + sizeof(gBattleMons[battler].status1), + &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; } -// NEW BATCH - void BS_RestoreMovePp(void) { - NATIVE_ARGS(); + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); u32 moveIndex; u32 data[MAX_MON_MOVES + 1]; for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - gBattleMons[gBattlerAttacker].pp[moveIndex] = CalculatePPWithBonus(gBattleMons[gBattlerAttacker].moves[moveIndex], gBattleMons[gBattlerAttacker].ppBonuses, moveIndex); - data[moveIndex] = gBattleMons[gBattlerAttacker].pp[moveIndex]; + gBattleMons[battler].pp[moveIndex] = CalculatePPWithBonus(gBattleMons[battler].moves[moveIndex], gBattleMons[battler].ppBonuses, moveIndex); + data[moveIndex] = gBattleMons[battler].pp[moveIndex]; } - data[moveIndex] = gBattleMons[gBattlerAttacker].ppBonuses; - BtlController_EmitSetMonData(gBattlerAttacker, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); - MarkBattlerForControllerExec(gBattlerAttacker); + data[moveIndex] = gBattleMons[battler].ppBonuses; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_PP_DATA_BATTLE, 0, 5, data); + MarkBattlerForControllerExec(battler); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17150,15 +14382,19 @@ void BS_TryActivateSoulheart(void) void BS_PlayMoveAnimation(void) { NATIVE_ARGS(u16 move); + + u32 move = cmd->move; + if (move == MOVE_NONE) + move = gCurrentMove; + BtlController_EmitMoveAnimation( gBattlerAttacker, B_COMM_TO_CONTROLLER, - cmd->move, + move, gBattleScripting.animTurn, 0, 0, gBattleMons[gBattlerAttacker].friendship, - &gDisableStructs[gBattlerAttacker], gMultiHitCounter); MarkBattlerForControllerExec(gBattlerAttacker); gBattlescriptCurrInstr = cmd->nextInstr; @@ -17167,7 +14403,7 @@ void BS_PlayMoveAnimation(void) void BS_SetLuckyChant(void) { NATIVE_ARGS(const u8 *failInstr); - u32 side = GetBattlerSide(gBattlerAttacker); + enum BattleSide side = GetBattlerSide(gBattlerAttacker); if (!(gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT)) { gSideStatuses[side] |= SIDE_STATUS_LUCKY_CHANT; @@ -17204,7 +14440,7 @@ void BS_TryEntrainment(void) else { RemoveAbilityFlags(gBattlerTarget); - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gBattleMons[gBattlerAttacker].ability; + gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerTarget].volatiles.overwrittenAbility = gBattleMons[gBattlerAttacker].ability; gBattlescriptCurrInstr = cmd->nextInstr; } } @@ -17290,7 +14526,7 @@ void BS_TryAutotomize(void) NATIVE_ARGS(const u8 *failInstr); if (GetBattlerWeight(gBattlerAttacker) > 1) { - gDisableStructs[gBattlerAttacker].autotomizeCount++; + gBattleMons[gBattlerAttacker].volatiles.autotomizeCount++; gBattlescriptCurrInstr = cmd->nextInstr; } else @@ -17302,7 +14538,7 @@ void BS_TryAutotomize(void) void BS_TryInstruct(void) { NATIVE_ARGS(const u8 *failInstr); - u16 move = gLastPrintedMoves[gBattlerTarget]; + enum Move move = gLastPrintedMoves[gBattlerTarget]; if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || MoveHasAdditionalEffectSelf(move, MOVE_EFFECT_RECHARGE) || IsMoveInstructBanned(move) || gBattleMoveEffects[GetMoveEffect(move)].twoTurnEffect @@ -17322,17 +14558,17 @@ void BS_TryInstruct(void) if (gBattleMons[gBattlerTarget].moves[moveIndex] == gCalledMove) { gCurrMovePos = moveIndex; - moveIndex = 4; + moveIndex = MAX_MON_MOVES; break; } } - if (moveIndex != 4 || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) + if (moveIndex != MAX_MON_MOVES || gBattleMons[gBattlerTarget].pp[gCurrMovePos] == 0) { gBattlescriptCurrInstr = cmd->failInstr; } else { - gEffectBattler = gBattleStruct->lastMoveTarget[gBattlerTarget]; + gEffectBattler = gBattleStruct->battlerState[gBattlerTarget].lastMoveTarget; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget]); gBattlescriptCurrInstr = cmd->nextInstr; } @@ -17456,9 +14692,9 @@ void BS_TryBestow(void) NATIVE_ARGS(const u8 *failInstr); if (gBattleMons[gBattlerAttacker].item == ITEM_NONE || gBattleMons[gBattlerTarget].item != ITEM_NONE - || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattleMons[gBattlerAttacker].item) - || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattleMons[gBattlerAttacker].item) - || gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & (1u << gBattlerPartyIndexes[gBattlerTarget])) + || !CanBattlerGetOrLoseItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerAttacker].item) + || !CanBattlerGetOrLoseItem(gBattlerTarget, gBattlerAttacker, gBattleMons[gBattlerAttacker].item) + || GetBattlerPartyState(gBattlerTarget)->isKnockedOff) { gBattlescriptCurrInstr = cmd->failInstr; } @@ -17504,7 +14740,20 @@ void BS_TryTrainerSlideMsgFirstOff(void) { gBattleScripting.battler = battler; BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + switch(battler) + { + case B_POSITION_OPPONENT_LEFT: + gBattlescriptCurrInstr = BattleScript_TrainerASlideMsgRet; + break; + case B_POSITION_PLAYER_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerPartnerSlideMsgRet; + break; + case B_POSITION_OPPONENT_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerBSlideMsgRet; + break; + default: + break; + } } else { @@ -17521,7 +14770,20 @@ void BS_TryTrainerSlideMsgLastOn(void) { gBattleScripting.battler = battler; BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = (shouldDoTrainerSlide == 1 ? BattleScript_TrainerASlideMsgRet : BattleScript_TrainerBSlideMsgRet); + switch(battler) + { + case B_POSITION_OPPONENT_LEFT: + gBattlescriptCurrInstr = BattleScript_TrainerASlideMsgRet; + break; + case B_POSITION_PLAYER_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerPartnerSlideMsgRet; + break; + case B_POSITION_OPPONENT_RIGHT: + gBattlescriptCurrInstr = BattleScript_TrainerBSlideMsgRet; + break; + default: + break; + } } else { @@ -17533,7 +14795,7 @@ void BS_TryTrainerSlideMsgLastOn(void) void BS_SetAuroraVeil(void) { NATIVE_ARGS(); - u32 side = GetBattlerSide(gBattlerAttacker); + enum BattleSide side = GetBattlerSide(gBattlerAttacker); if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; @@ -17717,12 +14979,12 @@ void BS_SetSkyDrop(void) gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget; gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker; - // End any multiturn effects caused by the target except VOLATILE_LOCK_CONFUSE + // End any multiturn effects caused by the target except VOLATILE_RAMPAGE_TURNS gBattleMons[gBattlerTarget].volatiles.multipleTurns = 0; gBattleMons[gBattlerTarget].volatiles.uproarTurns = 0; gBattleMons[gBattlerTarget].volatiles.bideTurns = 0; - gDisableStructs[gBattlerTarget].rolloutTimer = 0; - gDisableStructs[gBattlerTarget].furyCutterCounter = 0; + gBattleMons[gBattlerTarget].volatiles.rolloutTimer = 0; + gBattleMons[gBattlerTarget].volatiles.furyCutterCounter = 0; // End any Follow Me/Rage Powder effects caused by the target if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget) @@ -17749,7 +15011,7 @@ void BS_ClearSkyDrop(void) } // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted. - if (gBattleMons[gBattlerTarget].volatiles.lockConfusionTurns) + if (gBattleMons[gBattlerTarget].volatiles.rampageTurns) gBattleScripting.moveEffect = MOVE_EFFECT_CONFUSION; } @@ -17766,11 +15028,11 @@ void BS_SkyDropYawn(void) gBattleStruct->skyDropTargets[gEffectBattler] = SKY_DROP_NO_TARGET; // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation - if (gBattleMons[gEffectBattler].volatiles.lockConfusionTurns && CanBeConfused(gEffectBattler)) + if (gBattleMons[gEffectBattler].volatiles.rampageTurns && CanBeConfused(gEffectBattler)) { - gBattleMons[gEffectBattler].volatiles.lockConfusionTurns = 0; + gBattleMons[gEffectBattler].volatiles.rampageTurns = 0; gBattlerAttacker = gEffectBattler; - gBattleMons[gBattlerTarget].volatiles.confusionTurns = ((Random()) % 4) + 2; + gBattleMons[gBattlerTarget].volatiles.confusionTurns = RandomUniform(RNG_CONFUSION_TURNS, 2, B_CONFUSION_TURNS); // 2-5 turns gBattlescriptCurrInstr = BattleScript_ThrashConfuses; } else @@ -17834,27 +15096,40 @@ void BS_TryEndNeutralizingGas(void) if (gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved) { gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = FALSE; - BattleScriptPush(cmd->nextInstr); - gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; - } - else - { - gBattlescriptCurrInstr = cmd->nextInstr; + gBattleMons[gBattlerTarget].volatiles.neutralizingGas = FALSE; + if (!IsNeutralizingGasOnField()) + { + BattleScriptPush(cmd->nextInstr); + gBattlescriptCurrInstr = BattleScript_NeutralizingGasExits; + return; + } } + + gBattlescriptCurrInstr = cmd->nextInstr; +} + +static bool32 IsRototillerAffected(u32 battler, u32 move) +{ + if (IsBattlerUnaffectedByMove(battler)) + return FALSE; + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) + return FALSE; // Only grounded battlers affected + if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + return FALSE; // Only grass types affected + return TRUE; } void BS_GetRototillerTargets(void) { NATIVE_ARGS(const u8 *failInstr); u32 count = 0; + for (u32 battler = 0; battler < gBattlersCount; battler++) { - gSpecialStatuses[battler].rototillerAffected = FALSE; - if (IsRototillerAffected(battler)) - { - gSpecialStatuses[battler].rototillerAffected = TRUE; + if (IsRototillerAffected(battler, gCurrentMove)) count++; - } + else + gBattleStruct->moveResultFlags[battler] = MOVE_RESULT_NO_EFFECT; } if (count == 0) @@ -17863,20 +15138,6 @@ void BS_GetRototillerTargets(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfNotRototillerAffected(void) -{ - NATIVE_ARGS(const u8 *jumpInstr); - if (gSpecialStatuses[gBattlerTarget].rototillerAffected) - { - gSpecialStatuses[gBattlerTarget].rototillerAffected = FALSE; - gBattlescriptCurrInstr = cmd->nextInstr; - } - else - { - gBattlescriptCurrInstr = cmd->jumpInstr; // Unaffected by rototiller - print STRINGID_NOEFFECTONTARGET - } -} - // TODO: There might be a way to do it without a flag void BS_ConsumeBerry(void) { @@ -17886,7 +15147,15 @@ void BS_ConsumeBerry(void) if (cmd->fromBattler) gLastUsedItem = gBattleMons[battler].item; - if (GetItemPocket(gLastUsedItem) != POCKET_BERRIES || gBattleScripting.overrideBerryRequirements == 2) + if (gBattleScripting.overrideBerryRequirements == 2) + { + gBattleScripting.overrideBerryRequirements = 0; + if (!cmd->fromBattler && TryCheekPouch(battler, gLastUsedItem, cmd->nextInstr)) + return; + gBattlescriptCurrInstr = cmd->nextInstr; + return; + } + if (GetItemPocket(gLastUsedItem) != POCKET_BERRIES) { gBattleScripting.overrideBerryRequirements = 0; gBattlescriptCurrInstr = cmd->nextInstr; @@ -17927,7 +15196,7 @@ void BS_JumpIfAbilityPreventsRest(void) NATIVE_ARGS(u8 battler, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); u32 ability = GetBattlerAbility(battler); - if (B_LEAF_GUARD_PREVENTS_REST >= GEN_5 && IsLeafGuardProtected(battler, ability)) + if (GetConfig(CONFIG_LEAF_GUARD_PREVENTS_REST) >= GEN_5 && IsLeafGuardProtected(battler, ability)) gBattlescriptCurrInstr = cmd->jumpInstr; else if (IsShieldsDownProtected(battler, ability)) gBattlescriptCurrInstr = cmd->jumpInstr; @@ -17989,15 +15258,6 @@ void BS_TryResetNegativeStatStages(void) gBattlescriptCurrInstr = cmd->nextInstr; } -void BS_JumpIfLastUsedItemBerry(void) -{ - NATIVE_ARGS(const u8 *jumpInstr); - if (GetItemPocket(gLastUsedItem) == POCKET_BERRIES) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; -} - void BS_SaveBattlerItem(void) { NATIVE_ARGS(); @@ -18022,12 +15282,49 @@ void BS_BattlerItemToLastUsedItem(void) void BS_JumpIfGenConfigLowerThan(void) { NATIVE_ARGS(u16 tag, u8 gen, const u8 *jumpInstr); - if (GetGenConfig(cmd->tag) < cmd->gen) + if (GetConfig(cmd->tag) < cmd->gen) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; } +void BS_TryActivateAbilityWithAbilityShield(void) +{ + NATIVE_ARGS(u8 battler, bool8 switchedItems); + + u32 battler = GetBattlerForBattleScript(cmd->battler); + + gBattlescriptCurrInstr = cmd->nextInstr; + + if (cmd->switchedItems) + { + bool32 attackerHasAbilityShield = GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD; + bool32 targetHasAbilityShield = GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD; + + if (attackerHasAbilityShield == targetHasAbilityShield) // both or neither has Ability Shield + return; + + if (attackerHasAbilityShield) + battler = gBattlerAttacker; + else + battler = gBattlerTarget; + } + else + { + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD) + return; + } + + // check if Ability Shield is protecting battler's ability from being suppressed (no breaking effects) + if (GetBattlerAbilityInternal(battler, TRUE, TRUE) == ABILITY_NONE + && GetBattlerAbility(battler) != ABILITY_NONE) + { + gBattleScripting.battler = battler; + BattleScriptCall(BattleScript_ActivateSwitchInAbility); + } +} + +// firered void BS_GetBattlersForRecall(void) { NATIVE_ARGS(); diff --git a/src/battle_setup.c b/src/battle_setup.c index 29ac16efd..61e33ac22 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -345,7 +345,7 @@ void StartOldManTutorialBattle(void) CreateMaleMon(&gEnemyParty[0], SPECIES_WEEDLE, 5); LockPlayerFieldControls(); gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic; - gBattleTypeFlags = BATTLE_TYPE_OLD_MAN_TUTORIAL; + gBattleTypeFlags = BATTLE_TYPE_CATCH_TUTORIAL; CreateBattleStartTask(B_TRANSITION_SLICE, 0); } @@ -377,14 +377,13 @@ void StartMarowakBattle(void) { LockPlayerFieldControls(); gMain.savedCallback = CB2_EndMarowakBattle; + gBattleTypeFlags = BATTLE_TYPE_GHOST; + if (CheckBagHasItem(ITEM_SILPH_SCOPE, 1)) { - gBattleTypeFlags = BATTLE_TYPE_GHOST | BATTLE_TYPE_GHOST_UNVEILED; - CreateMonWithGenderNatureLetter(gEnemyParty, SPECIES_MAROWAK, 30, 31, MON_FEMALE, NATURE_SERIOUS, 0); - } - else - { - gBattleTypeFlags = BATTLE_TYPE_GHOST; + u32 personality = GetMonPersonality(SPECIES_MAROWAK, MON_FEMALE, NATURE_SERIOUS, RANDOM_UNOWN_LETTER); + + CreateMonWithIVsPersonality(&gEnemyParty[0], SPECIES_MAROWAK, 30, 31, personality); } CreateBattleStartTask(GetWildBattleTransition(), 0); SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, gText_Ghost); @@ -425,10 +424,7 @@ void BattleSetup_StartLegendaryBattle(void) CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_DEOXYS); break; default: - if (gSpeciesInfo[species].isLegendary || gSpeciesInfo[species].isMythical) - CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_LEGEND); - else - CreateBattleStartTask(B_TRANSITION_BLUR, MUS_RS_VS_TRAINER); + CreateBattleStartTask(B_TRANSITION_BLUR, MUS_VS_LEGEND); break; } @@ -971,7 +967,7 @@ void BattleSetup_StartTrainerBattle(void) { gBattleTypeFlags = (BATTLE_TYPE_TRAINER); } - + if (GetTrainerBattleMode() == TRAINER_BATTLE_EARLY_RIVAL && GetRivalBattleFlags() & RIVAL_BATTLE_TUTORIAL) gBattleTypeFlags |= BATTLE_TYPE_FIRST_BATTLE; diff --git a/src/battle_switch_in.c b/src/battle_switch_in.c new file mode 100644 index 000000000..681007b55 --- /dev/null +++ b/src/battle_switch_in.c @@ -0,0 +1,414 @@ +#include "global.h" +#include "battle.h" +#include "battle_hold_effects.h" +#include "battle_util.h" +#include "battle_scripts.h" +#include "battle_switch_in.h" +#include "battle_controllers.h" +#include "generational_changes.h" +#include "constants/battle.h" +#include "constants/moves.h" + +static bool32 FirstEventBlockEvents(struct BattleCalcValues *calcValues); +static bool32 TryHazardsOnSwitchIn(u32 battler, enum Ability ability, enum HoldEffect holdEffect, enum Hazards hazardType); +static bool32 SecondEventBlockEvents(struct BattleCalcValues *calcValues); + +bool32 DoSwitchInEvents(void) +{ + u32 battler; + + struct BattleCalcValues calcValues = {0}; + for (battler = 0; battler < gBattlersCount; battler++) + { + if (!IsBattlerAlive(battler)) + continue; + calcValues.abilities[battler] = GetBattlerAbility(battler); + calcValues.holdEffects[battler] = GetBattlerHoldEffect(battler); + } + + switch (gBattleStruct->eventState.switchIn) + { + case SWITCH_IN_EVENTS_ORDER_BY_SPEED: + for (u32 i = 0; i < gBattlersCount; i++) + gBattlersBySpeed[i] = i; + SortBattlersBySpeed(gBattlersBySpeed, FALSE); + gBattleStruct->battlersSorted = TRUE; + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.battlerSwitchIn = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_TERA_SHIFT: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_TERA_SHIFT, battler, calcValues.abilities[battler], 0, gBattleStruct->battlerState[battler].switchIn)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_NEUTRALIZING_GAS: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, calcValues.abilities[battler], 0, gBattleStruct->battlerState[battler].switchIn)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_UNNERVE: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_UNNERVE, battler, calcValues.abilities[battler], 0, gBattleStruct->battlerState[battler].switchIn)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_FIRST_BLOCK: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter]; + + if (!IsBattlerAlive(battler) && gBattleStruct->eventState.battlerSwitchIn != FIRST_EVENT_BLOCK_HAZARDS) + { + gBattleStruct->switchInBattlerCounter++; + gBattleStruct->eventState.battlerSwitchIn = 0; + continue; + } + + calcValues.battlerAtk = battler; + while (gBattleStruct->eventState.battlerSwitchIn < FIRST_EVENT_BLOCK_COUNT) + { + if (FirstEventBlockEvents(&calcValues)) + return TRUE; + } + + gBattleStruct->switchInBattlerCounter++; + gBattleStruct->eventState.battlerSwitchIn = 0; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_SECOND_BLOCK: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter]; + + if (!IsBattlerAlive(battler)) + { + gBattleStruct->switchInBattlerCounter++; + gBattleStruct->eventState.battlerSwitchIn = 0; + continue; + } + + calcValues.battlerAtk = battler; + while (gBattleStruct->eventState.battlerSwitchIn < SECOND_EVENT_BLOCK_COUNT) + { + if (SecondEventBlockEvents(&calcValues)) + return TRUE; + } + + gBattleStruct->switchInBattlerCounter++; + gBattleStruct->eventState.battlerSwitchIn = 0; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_WHITE_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + u32 battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, calcValues.holdEffects[battler], IsWhiteHerbActivation)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_OPPORTUNIST: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + u32 battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, calcValues.abilities[battler], 0, TRUE)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_MIRROR_HERB: + while (gBattleStruct->switchInBattlerCounter < gBattlersCount) + { + u32 battler = gBattlersBySpeed[gBattleStruct->switchInBattlerCounter++]; + if (ItemBattleEffects(battler, 0, GetBattlerHoldEffect(battler), IsMirrorHerbActivation)) + return TRUE; + } + gBattleStruct->switchInBattlerCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_CLEAR_SET_VALUES: + for (battler = 0; battler < gBattlersCount; battler++) + { + if (gBattleStruct->battlerState[battler].switchIn) + { + gBattleStruct->battlerState[battler].hpOnSwitchout = gBattleMons[battler].hp; + gBattleStruct->battlerState[battler].switchIn = FALSE; + } + } + gBattleStruct->battlersSorted = FALSE; + gBattleStruct->hazardsCounter = 0; + gBattleStruct->eventState.switchIn++; + break; + case SWITCH_IN_EVENTS_EJECT_PACK: + gBattleStruct->eventState.switchIn++; + if (TrySwitchInEjectPack(START_OF_TURN)) + return TRUE; + break; + case SWITCH_IN_EVENTS_COUNT: + break; + } + return FALSE; +} + +static bool32 CanBattlerBeHealed(u32 battler) +{ + if (GetConfig(CONFIG_HEALING_WISH_SWITCH) < GEN_8) + return TRUE; + + if (gBattleMons[battler].hp != gBattleMons[battler].maxHP || gBattleMons[battler].status1) + return TRUE; + + if (gBattleStruct->battlerState[battler].storedLunarDance + && (gBattleMons[battler].pp[0] < CalculatePPWithBonus(gBattleMons[battler].moves[0], gBattleMons[battler].ppBonuses, 0) + || gBattleMons[battler].pp[1] < CalculatePPWithBonus(gBattleMons[battler].moves[1], gBattleMons[battler].ppBonuses, 1) + || gBattleMons[battler].pp[2] < CalculatePPWithBonus(gBattleMons[battler].moves[2], gBattleMons[battler].ppBonuses, 2) + || gBattleMons[battler].pp[3] < CalculatePPWithBonus(gBattleMons[battler].moves[3], gBattleMons[battler].ppBonuses, 3))) + { + return TRUE; + } + + return FALSE; +} + +static bool32 FirstEventBlockEvents(struct BattleCalcValues *calcValues) +{ + bool32 effect = FALSE; + u32 battler = calcValues->battlerAtk; + + switch (gBattleStruct->eventState.battlerSwitchIn) + { + case FIRST_EVENT_BLOCK_HEALING_WISH: + if (!gBattleStruct->battlerState[battler].switchIn || !CanBattlerBeHealed(battler)) + { + effect = FALSE; + } + else if (gBattleStruct->battlerState[battler].storedHealingWish) + { + gBattleStruct->battlerState[battler].storedHealingWish = FALSE; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler)); + gBattleScripting.battler = battler; + BattleScriptCall(BattleScript_HealingWishActivates); + effect = TRUE; + } + else if (gBattleStruct->battlerState[battler].storedLunarDance) + { + gBattleStruct->battlerState[battler].storedLunarDance = FALSE; + SetHealAmount(battler, GetNonDynamaxMaxHP(battler)); + gBattleScripting.battler = battler; + BattleScriptCall(BattleScript_LunarDanceActivates); + effect = TRUE; + } + else if (gBattleStruct->zmove.healReplacement & 1u << battler) + { + gBattleStruct->zmove.healReplacement &= ~(1u << battler); + SetHealAmount(battler, GetNonDynamaxMaxHP(battler)); + gBattleScripting.battler = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_Z_HP_TRAP; + BattleScriptCall(BattleScript_HealReplacementZMove); + effect = TRUE; + } + gBattleStruct->eventState.battlerSwitchIn++; + break; + case FIRST_EVENT_BLOCK_HAZARDS: + if (!gBattleStruct->battlerState[battler].switchIn) + { + gBattleStruct->eventState.battlerSwitchIn++; + } + else if (EmergencyExitCanBeTriggered(battler)) + { + gBattleScripting.battler = gBattlerAbility = battler; + gBattleStruct->battlerState[battler].forcedSwitch = FALSE; + gBattleStruct->eventState.switchIn = 0; + BattleScriptCall(BattleScript_EmergencyExit); + effect = TRUE; + } + else + { + enum Hazards hazard = gBattleStruct->hazardsQueue[GetBattlerSide(battler)][gBattleStruct->hazardsCounter]; + if (hazard == HAZARDS_NONE || gBattleStruct->hazardsCounter >= HAZARDS_MAX_COUNT) + { + gBattleStruct->hazardsCounter = 0; + gBattleStruct->eventState.battlerSwitchIn++; + } + else + { + effect = TryHazardsOnSwitchIn(battler, calcValues->abilities[battler], calcValues->holdEffects[battler], hazard); + } + } + break; + case FIRST_EVENT_BLOCK_GENERAL_ABILITIES: + if (TryPrimalReversion(battler) + || AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, calcValues->abilities[battler], MOVE_NONE, gBattleStruct->battlerState[battler].switchIn) + || TryClearIllusion(battler, calcValues->abilities[battler])) + effect = TRUE; + gBattleStruct->eventState.battlerSwitchIn++; + break; + case FIRST_EVENT_BLOCK_IMMUNITY_ABILITIES: + if (AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, calcValues->abilities[battler], MOVE_NONE, TRUE)) + effect = TRUE; + gBattleStruct->eventState.battlerSwitchIn++; + break; + case FIRST_EVENT_BLOCK_ITEMS: + if (ItemBattleEffects(battler, 0, calcValues->holdEffects[battler], IsOnSwitchInActivation)) + effect = TRUE; + gBattleStruct->eventState.battlerSwitchIn++; + break; + case FIRST_EVENT_BLOCK_COUNT: + gBattleStruct->eventState.battlerSwitchIn++; + break; + } + + return effect; +} + +static void SetDmgHazardsBattlescript(u8 battler, u8 multistringId) +{ + gBattleScripting.battler = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = multistringId; + BattleScriptCall(BattleScript_DmgHazardsOnBattler); +} + +static bool32 TryHazardsOnSwitchIn(u32 battler, enum Ability ability, enum HoldEffect holdEffect, enum Hazards hazardType) +{ + bool32 effect = FALSE; + enum BattleSide side = GetBattlerSide(battler); + bool32 clearedToxicSpikes = FALSE; + + switch (hazardType) + { + case HAZARDS_NONE: + break; + case HAZARDS_SPIKES: + if (!IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD) + && IsBattlerAffectedByHazards(battler, holdEffect, FALSE) + && IsBattlerGrounded(battler, ability, holdEffect)) + { + s32 spikesDmg = GetNonDynamaxMaxHP(battler) / ((5 - gSideTimers[side].spikesAmount) * 2); + SetPassiveDamageAmount(battler, spikesDmg); + SetDmgHazardsBattlescript(battler, B_MSG_PKMNHURTBYSPIKES); + effect = TRUE; + } + break; + case HAZARDS_STICKY_WEB: + if (IsBattlerAffectedByHazards(battler, holdEffect, FALSE) && IsBattlerGrounded(battler, ability, holdEffect)) + { + gBattleScripting.battler = battler; + SET_STATCHANGER(STAT_SPEED, 1, TRUE); + BattleScriptCall(BattleScript_StickyWebOnSwitchIn); + effect = TRUE; + } + break; + case HAZARDS_TOXIC_SPIKES: + if (!IsBattlerGrounded(battler, ability, holdEffect)) + { + effect = FALSE; + } + else if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. + { + gSideTimers[side].toxicSpikesAmount = 0; + RemoveHazardFromField(side, HAZARDS_TOXIC_SPIKES); + gEffectBattler = battler; + BattleScriptCall(BattleScript_ToxicSpikesAbsorbed); + clearedToxicSpikes = TRUE; + effect = TRUE; + } + else if (IsBattlerAffectedByHazards(battler, holdEffect, TRUE) + && CanBePoisoned(battler, battler, ability, ability)) + { + gBattleScripting.battler = battler; + BattleScriptPushCursor(); + if (gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount >= 2) + { + gBattlescriptCurrInstr = BattleScript_ToxicSpikesBadlyPoisoned; + gBattleMons[battler].status1 |= STATUS1_TOXIC_POISON; + } + else + { + gBattlescriptCurrInstr = BattleScript_ToxicSpikesPoisoned; + gBattleMons[battler].status1 |= STATUS1_POISON; + } + + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[battler].status1), &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + effect = TRUE; + } + break; + case HAZARDS_STEALTH_ROCK: + if (IsBattlerAffectedByHazards(battler, holdEffect, FALSE) && ability != ABILITY_MAGIC_GUARD) + { + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_POINTED_STONES, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) + { + SetDmgHazardsBattlescript(battler, B_MSG_STEALTHROCKDMG); + effect = TRUE; + } + } + break; + case HAZARDS_STEELSURGE: + if (IsBattlerAffectedByHazards(battler, holdEffect, FALSE) && ability != ABILITY_MAGIC_GUARD) + { + gBattleStruct->passiveHpUpdate[battler] = GetStealthHazardDamage(TYPE_SIDE_HAZARD_SHARP_STEEL, battler); + if (gBattleStruct->passiveHpUpdate[battler] != 0) + { + SetDmgHazardsBattlescript(battler, B_MSG_SHARPSTEELDMG); + effect = TRUE; + } + } + break; + case HAZARDS_MAX_COUNT: + break; + } + + if (!clearedToxicSpikes) + gBattleStruct->hazardsCounter++; + + return effect; +} + +static bool32 SecondEventBlockEvents(struct BattleCalcValues *calcValues) +{ + bool32 effect = FALSE; + u32 battler = calcValues->battlerAtk; + + switch (gBattleStruct->eventState.battlerSwitchIn) + { + case SECOND_EVENT_ABILITIES: + if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, calcValues->abilities[battler], MOVE_NONE, TRUE) + || AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, calcValues->abilities[battler], MOVE_NONE, TRUE) + || AbilityBattleEffects(ABILITYEFFECT_COMMANDER, battler, calcValues->abilities[battler], MOVE_NONE, gBattleStruct->battlerState[battler].switchIn)) + effect = TRUE; + gBattleStruct->eventState.battlerSwitchIn++; + break; + case SECOND_EVENT_BOOSTER_ENERGY: + if (ItemBattleEffects(battler, 0, calcValues->holdEffects[battler], IsBoosterEnergyActivation)) + effect = TRUE; + gBattleStruct->eventState.battlerSwitchIn++; + break; + case SECOND_EVENT_BLOCK_COUNT: + gBattleStruct->eventState.battlerSwitchIn++; + break; + } + + return effect; +} diff --git a/src/battle_terastal.c b/src/battle_terastal.c index f0e720c93..fa0612c0d 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -35,12 +35,12 @@ void ActivateTera(u32 battler) // Execute battle script. PREPARE_TYPE_BUFFER(gBattleTextBuff1, GetBattlerTeraType(battler)); if (TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_TERASTALLIZATION)) - BattleScriptExecute(BattleScript_TeraFormChange); + BattleScriptPushCursorAndCallback(BattleScript_TeraFormChange); else if (gBattleStruct->illusion[gBattlerAttacker].state == ILLUSION_ON && DoesSpeciesHaveFormChangeMethod(GetIllusionMonSpecies(gBattlerAttacker), FORM_CHANGE_BATTLE_TERASTALLIZATION)) - BattleScriptExecute(BattleScript_IllusionOffAndTerastallization); + BattleScriptPushCursorAndCallback(BattleScript_IllusionOffAndTerastallization); else - BattleScriptExecute(BattleScript_Terastallization); + BattleScriptPushCursorAndCallback(BattleScript_Terastallization); } // Applies palette blend and enables UI indicator after animation has played @@ -131,7 +131,7 @@ bool32 IsTypeStellarBoosted(u32 battler, enum Type type) // Returns the STAB power multiplier to use when Terastallized. // Power multipliers from Smogon Research thread. -uq4_12_t GetTeraMultiplier(struct DamageContext *ctx) +uq4_12_t GetTeraMultiplier(struct BattleContext *ctx) { enum Type teraType = GetBattlerTeraType(ctx->battlerAtk); diff --git a/src/battle_tower.c b/src/battle_tower.c index 48521f5bd..bd0fc2b46 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -291,7 +291,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void) battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - + #if FREE_BATTLE_TOWER_E_READER == FALSE if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) { @@ -475,183 +475,183 @@ void GetBattleTowerTrainerName(u8 *dest) dest[i] = EOS; } -static void FillBattleTowerTrainerParty(void) -{ - s32 partyIndex; - s32 i; - u16 chosenMonIndices[3]; - u8 friendship; - u8 level; - u8 fixedIV; - u8 battleMonsOffset; - u8 monPoolSize; - u8 teamFlags; - const struct BattleTowerPokemonTemplate *battleTowerMons; +// static void FillBattleTowerTrainerParty(void) +// { +// s32 partyIndex; +// s32 i; +// u16 chosenMonIndices[3]; +// u8 friendship; +// u8 level; +// u8 fixedIV; +// u8 battleMonsOffset; +// u8 monPoolSize; +// u8 teamFlags; +// const struct BattleTowerPokemonTemplate *battleTowerMons; - battleMonsOffset = 0; - monPoolSize = 60; - friendship = 255; +// battleMonsOffset = 0; +// monPoolSize = 60; +// friendship = 255; - ZeroEnemyPartyMons(); +// ZeroEnemyPartyMons(); - // Different trainers have access to different sets of pokemon to use in battle. - // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are - // stronger. Additionally, the later trainers' pokemon are granted higher IVs. - if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 20) - { - fixedIV = 6; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 30) - { - fixedIV = 9; - battleMonsOffset = 30; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 40) - { - fixedIV = 12; - battleMonsOffset = 60; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 50) - { - fixedIV = 15; - battleMonsOffset = 90; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 60) - { - fixedIV = 18; - battleMonsOffset = 120; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 70) - { - fixedIV = 21; - battleMonsOffset = 150; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 80) - { - fixedIV = 31; - battleMonsOffset = 180; - } - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - fixedIV = 31; - battleMonsOffset = 200; - monPoolSize = 100; - } -#if FREE_BATTLE_TOWER_E_READER == FALSE - else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - // Load E-Reader trainer's party. - do - { - for (partyIndex = 0; partyIndex < 3; partyIndex++) - CreateBattleTowerMon(&gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[partyIndex]); - return; - } while (0); - } -#endif //FREE_BATTLE_TOWER_E_READER - else - { - // Load a battle tower record's party. (From record mixing) - for (partyIndex = 0; partyIndex < 3; partyIndex++) - { - CreateBattleTowerMon( - &gEnemyParty[partyIndex], - &gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); - } - return; - } +// // Different trainers have access to different sets of pokemon to use in battle. +// // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are +// // stronger. Additionally, the later trainers' pokemon are granted higher IVs. +// if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 20) +// { +// fixedIV = 6; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 30) +// { +// fixedIV = 9; +// battleMonsOffset = 30; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 40) +// { +// fixedIV = 12; +// battleMonsOffset = 60; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 50) +// { +// fixedIV = 15; +// battleMonsOffset = 90; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 60) +// { +// fixedIV = 18; +// battleMonsOffset = 120; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 70) +// { +// fixedIV = 21; +// battleMonsOffset = 150; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 80) +// { +// fixedIV = 31; +// battleMonsOffset = 180; +// } +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) +// { +// fixedIV = 31; +// battleMonsOffset = 200; +// monPoolSize = 100; +// } +// #if FREE_BATTLE_TOWER_E_READER == FALSE +// else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) +// { +// // Load E-Reader trainer's party. +// do +// { +// for (partyIndex = 0; partyIndex < 3; partyIndex++) +// CreateBattleTowerMon(&gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[partyIndex]); +// return; +// } while (0); +// } +// #endif //FREE_BATTLE_TOWER_E_READER +// else +// { +// // Load a battle tower record's party. (From record mixing) +// for (partyIndex = 0; partyIndex < 3; partyIndex++) +// { +// CreateBattleTowerMon( +// &gEnemyParty[partyIndex], +// &gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); +// } +// return; +// } - // Use the appropriate list of pokemon and level depending on the - // current challenge type. (level 50 or level 100 challenge) - if (gSaveBlock2Ptr->battleTower.battleTowerLevelType != 0) - { - battleTowerMons = gBattleTowerLevel100Mons; - level = 100; - } - else - { - battleTowerMons = gBattleTowerLevel50Mons; - level = 50; - } +// // Use the appropriate list of pokemon and level depending on the +// // current challenge type. (level 50 or level 100 challenge) +// if (gSaveBlock2Ptr->battleTower.battleTowerLevelType != 0) +// { +// battleTowerMons = gBattleTowerLevel100Mons; +// level = 100; +// } +// else +// { +// battleTowerMons = gBattleTowerLevel50Mons; +// level = 50; +// } - teamFlags = sBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].teamFlags; +// teamFlags = sBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].teamFlags; - // Attempt to fill the trainer's party with random Pokemon until 3 have been - // successfully chosen. The trainer's party may not have duplicate pokemon species - // or duplicate held items. Each pokemon must have all of the trainer's team flags - // set, as well. If any of those conditions are not met, then the loop starts over - // and another pokemon is chosen at random. - partyIndex = 0; - while (partyIndex != 3) - { - // Pick a random pokemon index based on the number of pokemon available to choose from - // and the starting offset in the battle tower pokemon array. - s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; +// // Attempt to fill the trainer's party with random Pokemon until 3 have been +// // successfully chosen. The trainer's party may not have duplicate pokemon species +// // or duplicate held items. Each pokemon must have all of the trainer's team flags +// // set, as well. If any of those conditions are not met, then the loop starts over +// // and another pokemon is chosen at random. +// partyIndex = 0; +// while (partyIndex != 3) +// { +// // Pick a random pokemon index based on the number of pokemon available to choose from +// // and the starting offset in the battle tower pokemon array. +// s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; - // Ensure the chosen pokemon has compatible team flags with the trainer. - if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) - { - // Ensure this pokemon species isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) - break; - } +// // Ensure the chosen pokemon has compatible team flags with the trainer. +// if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) +// { +// // Ensure this pokemon species isn't a duplicate. +// for (i = 0; i < partyIndex; i++) +// { +// if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) +// break; +// } - if (i != partyIndex) - continue; +// if (i != partyIndex) +// continue; - // Ensure this pokemon's held item isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE - && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) - break; - } +// // Ensure this pokemon's held item isn't a duplicate. +// for (i = 0; i < partyIndex; i++) +// { +// if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE +// && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) +// break; +// } - if (i != partyIndex) - continue; +// if (i != partyIndex) +// continue; - // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary - // because the species and held items were already checked directly above. Perhaps this - // is leftover code before the logic for duplicate species and held items was added. - //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); - for (i = 0; i < partyIndex; i++) - { - if (chosenMonIndices[i] == battleMonIndex) - break; - } +// // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary +// // because the species and held items were already checked directly above. Perhaps this +// // is leftover code before the logic for duplicate species and held items was added. +// //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); +// for (i = 0; i < partyIndex; i++) +// { +// if (chosenMonIndices[i] == battleMonIndex) +// break; +// } - if (i != partyIndex) - continue; +// if (i != partyIndex) +// continue; - chosenMonIndices[partyIndex] = battleMonIndex; +// chosenMonIndices[partyIndex] = battleMonIndex; - // Place the chosen pokemon into the trainer's party. - CreateMonWithEVSpread( - &gEnemyParty[partyIndex], - battleTowerMons[battleMonIndex].species, - level, - fixedIV, - battleTowerMons[battleMonIndex].evSpread); +// // Place the chosen pokemon into the trainer's party. +// CreateMonWithEVSpread( +// &gEnemyParty[partyIndex], +// battleTowerMons[battleMonIndex].species, +// level, +// fixedIV, +// battleTowerMons[battleMonIndex].evSpread); - // Give the chosen pokemon its specified moves. - for (i = 0; i < 4; i++) - { - SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); - if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) - friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. - } +// // Give the chosen pokemon its specified moves. +// for (i = 0; i < 4; i++) +// { +// SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); +// if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) +// friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. +// } - SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); +// SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); +// SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); - // The pokemon was successfully added to the trainer's party, so it's safe to move on to - // the next party slot. - partyIndex++; - } - } -} +// // The pokemon was successfully added to the trainer's party, so it's safe to move on to +// // the next party slot. +// partyIndex++; +// } +// } +// } static u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count) { @@ -845,15 +845,15 @@ void StartSpecialBattle(void) switch (sSpecialVar_0x8004_Copy) { case 0: // battle tower battle - gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); - TRAINER_BATTLE_PARAM.opponentA = 0; + // gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); + // TRAINER_BATTLE_PARAM.opponentA = 0; - FillBattleTowerTrainerParty(); + // FillBattleTowerTrainerParty(); - CreateTask(Task_WaitBT, 1); - PlayMapChosenOrBattleBGM(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); + // CreateTask(Task_WaitBT, 1); + // PlayMapChosenOrBattleBGM(0); + // transition = BattleSetup_GetBattleTowerBattleTransition(); + // BattleTransition_StartOnField(transition); break; case 1: // secret base battle for (i = 0; i < PARTY_SIZE; i++) @@ -1391,7 +1391,7 @@ static void FillPartnerParty(u16 trainerId) else if (partyData[i].gender == TRAINER_MON_FEMALE) personality = (personality & 0xFFFFFF00) | GeneratePersonalityForGender(MON_FEMALE, partyData[i].species); ModifyPersonalityForNature(&personality, partyData[i].nature); - CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, 0, TRUE, personality, OT_ID_PRESET, otID); + CreateMon(&gPlayerParty[i + 3], partyData[i].species, partyData[i].lvl, personality, OTID_STRUCT_PRESET(otID)); j = partyData[i].isShiny; SetMonData(&gPlayerParty[i + 3], MON_DATA_IS_SHINY, &j); SetMonData(&gPlayerParty[i + 3], MON_DATA_HELD_ITEM, &partyData[i].heldItem); @@ -1433,7 +1433,7 @@ static void FillPartnerParty(u16 trainerId) StringCopy(trainerName, gBattlePartners[difficulty][trainerId - TRAINER_PARTNER(PARTNER_NONE)].trainerName); SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_NAME, trainerName); - j = gBattlePartners[difficulty][SanitizeTrainerId(trainerId - TRAINER_PARTNER(PARTNER_NONE))].encounterMusic_gender >> 7; + j = gBattlePartners[difficulty][SanitizeTrainerId(trainerId - TRAINER_PARTNER(PARTNER_NONE))].gender; SetMonData(&gPlayerParty[i + 3], MON_DATA_OT_GENDER, &j); } } diff --git a/src/battle_util.c b/src/battle_util.c index 0eb54fd58..d3a7c2994 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -53,29 +53,31 @@ #include "constants/weather.h" #include "constants/pokemon.h" -/* -NOTE: The data and functions in this file up until (but not including) sSoundMovesTable -are actually part of battle_main.c. They needed to be moved to this file in order to -match the ROM; this is also why sSoundMovesTable's declaration is in the middle of -functions instead of at the top of the file with the other declarations. -*/ - static bool32 TryRemoveScreens(u32 battler); static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler); -static u32 GetFlingPowerFromItemId(u32 itemId); +static u32 GetFlingPowerFromItemId(enum Item itemId); static void SetRandomMultiHitCounter(); -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option); -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option); +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, bool32 abilityAffected, const u8 *battleScript, enum ResultOption option); +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum ResultOption option); static bool32 IsOpposingSideEmpty(u32 battler); +static void ResetParadoxWeatherStat(u32 battler); +static void ResetParadoxTerrainStat(u32 battler); static bool32 CanBattlerFormChange(u32 battler, enum FormChanges method); +static bool32 CanBattlerBounceBackMove(struct BattleContext *ctx); +static bool32 IsPowderMoveBlocked(struct BattleContext *ctx); +const u8 *AbsorbedByDrainHpAbility(u32 battlerDef); +const u8 *AbsorbedByStatIncreaseAbility(u32 battlerDef, enum Ability abilityDef, enum Stat statId, u32 statAmount); +const u8 *AbsorbedByFlashFire(u32 battlerDef); +static bool32 TryMagicBounce(struct BattleContext *ctx); +static bool32 TryMagicCoat(struct BattleContext *ctx); // Submoves -static u32 GetMirrorMoveMove(void); -static u32 GetMetronomeMove(void); -static u32 GetAssistMove(void); -static u32 GetSleepTalkMove(void); -static u32 GetCopyCatMove(void); -static u32 GetMeFirstMove(void); +static enum Move GetMirrorMoveMove(void); +static enum Move GetMetronomeMove(void); +static enum Move GetAssistMove(void); +static enum Move GetSleepTalkMove(void); +static enum Move GetCopycatMove(void); +static enum Move GetMeFirstMove(void); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent); ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent); @@ -91,17 +93,20 @@ struct BattleWeatherInfo { u16 flag; u8 rock; + u8 abilityStartMessage; + u8 moveStartMessage; u8 endMessage; u8 continuesMessage; u8 animation; }; -static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = -{ +static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { [BATTLE_WEATHER_RAIN] = { .flag = B_WEATHER_RAIN_NORMAL, .rock = HOLD_EFFECT_DAMP_ROCK, + .abilityStartMessage = B_MSG_STARTED_DRIZZLE, + .moveStartMessage = B_MSG_STARTED_RAIN, .endMessage = B_MSG_WEATHER_END_RAIN, .continuesMessage = B_MSG_WEATHER_TURN_RAIN, .animation = B_ANIM_RAIN_CONTINUES, @@ -111,6 +116,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_RAIN_PRIMAL, .rock = HOLD_EFFECT_DAMP_ROCK, + .abilityStartMessage = B_MSG_STARTED_PRIMORDIAL_SEA, + .moveStartMessage = B_MSG_STARTED_RAIN, // Placeholder .endMessage = B_MSG_WEATHER_END_RAIN, .continuesMessage = B_MSG_WEATHER_TURN_RAIN, .animation = B_ANIM_RAIN_CONTINUES, @@ -120,6 +127,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_RAIN_NORMAL, .rock = HOLD_EFFECT_DAMP_ROCK, + .abilityStartMessage = B_MSG_STARTED_DRIZZLE, + .moveStartMessage = B_MSG_STARTED_RAIN, .endMessage = B_MSG_WEATHER_END_RAIN, .continuesMessage = B_MSG_WEATHER_TURN_DOWNPOUR, .animation = B_ANIM_RAIN_CONTINUES, @@ -129,6 +138,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_SUN_NORMAL, .rock = HOLD_EFFECT_HEAT_ROCK, + .abilityStartMessage = B_MSG_STARTED_DROUGHT, + .moveStartMessage = B_MSG_STARTED_SUNLIGHT, .endMessage = B_MSG_WEATHER_END_SUN, .continuesMessage = B_MSG_WEATHER_TURN_SUN, .animation = B_ANIM_SUN_CONTINUES, @@ -138,6 +149,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_SUN_PRIMAL, .rock = HOLD_EFFECT_HEAT_ROCK, + .abilityStartMessage = B_MSG_STARTED_DESOLATE_LAND, + .moveStartMessage = B_MSG_STARTED_SUNLIGHT, // Placeholder .endMessage = B_MSG_WEATHER_END_SUN, .continuesMessage = B_MSG_WEATHER_TURN_SUN, .animation = B_ANIM_SUN_CONTINUES, @@ -147,6 +160,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_SANDSTORM, .rock = HOLD_EFFECT_SMOOTH_ROCK, + .abilityStartMessage = B_MSG_STARTED_SAND_STREAM, + .moveStartMessage = B_MSG_STARTED_SANDSTORM, .endMessage = B_MSG_WEATHER_END_SANDSTORM, .continuesMessage = B_MSG_WEATHER_TURN_SANDSTORM, .animation = B_ANIM_SANDSTORM_CONTINUES, @@ -156,6 +171,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_HAIL, .rock = HOLD_EFFECT_ICY_ROCK, + .abilityStartMessage = B_MSG_STARTED_HAIL_WARNING, + .moveStartMessage = B_MSG_STARTED_HAIL, .endMessage = B_MSG_WEATHER_END_HAIL, .continuesMessage = B_MSG_WEATHER_TURN_HAIL, .animation = B_ANIM_HAIL_CONTINUES, @@ -165,6 +182,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_SNOW, .rock = HOLD_EFFECT_ICY_ROCK, + .abilityStartMessage = B_MSG_STARTED_SNOW_WARNING, + .moveStartMessage = B_MSG_STARTED_SNOW, .endMessage = B_MSG_WEATHER_END_SNOW, .continuesMessage = B_MSG_WEATHER_TURN_SNOW, .animation = B_ANIM_SNOW_CONTINUES, @@ -174,6 +193,8 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_FOG, .rock = HOLD_EFFECT_NONE, + .abilityStartMessage = B_MSG_STARTED_DRIZZLE, // Placeholder + .moveStartMessage = B_MSG_STARTED_RAIN, // Placeholder .endMessage = B_MSG_WEATHER_END_FOG, .continuesMessage = B_MSG_WEATHER_TURN_FOG, .animation = B_ANIM_FOG_CONTINUES, @@ -183,30 +204,14 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] = { .flag = B_WEATHER_STRONG_WINDS, .rock = HOLD_EFFECT_NONE, + .abilityStartMessage = B_MSG_STARTED_STRONG_WINDS, + .moveStartMessage = B_MSG_STARTED_RAIN, // Placeholder .endMessage = B_MSG_WEATHER_END_STRONG_WINDS, .continuesMessage = B_MSG_WEATHER_TURN_STRONG_WINDS, .animation = B_ANIM_STRONG_WINDS, }, }; -// Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly -// This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI -static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, enum Type moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities) -{ - struct DamageContext ctx = {0}; - ctx.battlerAtk = battlerAtk; - ctx.battlerDef = battlerDef; - ctx.move = ctx.chosenMove = move; - ctx.moveType = moveType; - ctx.updateFlags = recordAbilities; - ctx.abilityAtk = abilityAtk; - ctx.abilityDef = abilityDef; - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); - - return CalcTypeEffectivenessMultiplier(&ctx); -} - u32 GetCurrentBattleWeather(void) { u32 currBattleWeather = 0xFF; @@ -230,11 +235,14 @@ bool32 EndOrContinueWeather(void) if (currBattleWeather == 0xFF) return FALSE; - if (gWishFutureKnock.weatherDuration > 0 && --gWishFutureKnock.weatherDuration == 0) + if (gBattleStruct->weatherDuration > 0 && --gBattleStruct->weatherDuration == 0) { gBattleWeather = B_WEATHER_NONE; for (u32 battler = 0; battler < gBattlersCount; battler++) - gDisableStructs[battler].weatherAbilityDone = FALSE; + { + gBattleMons[battler].volatiles.weatherAbilityDone = FALSE; + ResetParadoxWeatherStat(battler); + } gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[currBattleWeather].endMessage; BattleScriptExecute(BattleScript_WeatherFaded); return TRUE; @@ -250,13 +258,55 @@ bool32 EndOrContinueWeather(void) return FALSE; } +// Gen5+ static u32 CalcBeatUpPower(void) { u32 species = gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot++]; + // FIXME: Why call CalcBeatUpPower when 'beatUpSlot' is OOB? + if (species == 0xFFFF) + return 0; return (GetSpeciesBaseAttack(species) / 10) + 5; } -static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, enum Ability abilityDef) +// Gen 3/4 +static s32 CalcBeatUpDamage(struct BattleContext *ctx) +{ + u32 partyIndex = gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot++]; + struct Pokemon *party = GetBattlerParty(ctx->battlerAtk); + u32 species = GetMonData(&party[partyIndex], MON_DATA_SPECIES); + u32 levelFactor = GetMonData(&party[partyIndex], MON_DATA_LEVEL) * 2 / 5 + 2; + s32 dmg = GetSpeciesBaseAttack(species); + + dmg *= GetMovePower(ctx->move); + dmg *= levelFactor; + dmg /= GetSpeciesBaseDefense(gBattleMons[ctx->battlerDef].species); + dmg = (dmg / 50) + 2; + + if (gProtectStructs[ctx->battlerAtk].helpingHand) + dmg = dmg * 15 / 10; + if (ctx->isCrit) + dmg *= 2; + + return dmg; +} + +static enum DamageCategory GetReflectDamageMoveDamageCategory(u32 battler, enum Move move) +{ + u32 damageCategories = GetMoveReflectDamage_DamageCategories(move); + + if (damageCategories == 1u << DAMAGE_CATEGORY_PHYSICAL) // Counter + return DAMAGE_CATEGORY_PHYSICAL; + if (damageCategories == 1u << DAMAGE_CATEGORY_SPECIAL) // Mirror Coat + return DAMAGE_CATEGORY_SPECIAL; + + // Metal Burst / Comeuppance + if (gProtectStructs[battler].lastHitBySpecialMove) + return DAMAGE_CATEGORY_SPECIAL; + else + return DAMAGE_CATEGORY_PHYSICAL; +} + +static bool32 ShouldTeraShellDistortTypeMatchups(enum Move move, u32 battlerDef, enum Ability abilityDef) { if (!gSpecialStatuses[battlerDef].distortedTypeMatchups && gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL @@ -268,18 +318,7 @@ static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, enum return FALSE; } -static inline bool32 IsDragonDartsSecondHit(u32 effect) -{ - if (effect != EFFECT_DRAGON_DARTS) - return FALSE; - - if (gMultiHitCounter == 1) - return TRUE; - - return FALSE; -} - -bool32 IsUnnerveBlocked(u32 battler, u32 itemId) +bool32 IsUnnerveBlocked(u32 battler, enum Item itemId) { if (GetItemPocket(itemId) != POCKET_BERRIES) return FALSE; @@ -318,13 +357,24 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler) return FALSE; } -bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) +static inline bool32 IsDragonDartsSecondHit(u32 battlerAtk, enum Move move) +{ + if (GetBattlerMoveTargetType(battlerAtk, move) != TARGET_SMART) + return FALSE; + + if (gMultiHitCounter < GetMoveStrikeCount(move)) + return TRUE; + + return FALSE; +} + +bool32 IsAffectedByFollowMe(u32 battlerAtk, enum BattleSide defSide, enum Move move) { enum Ability ability = GetBattlerAbility(battlerAtk); enum BattleMoveEffects effect = GetMoveEffect(move); if (gSideTimers[defSide].followmeTimer == 0 - || (!IsBattlerAlive(gSideTimers[defSide].followmeTarget) && !IsDragonDartsSecondHit(effect)) + || (!IsBattlerAlive(gSideTimers[defSide].followmeTarget) && !IsDragonDartsSecondHit(battlerAtk, move)) || effect == EFFECT_SNIPE_SHOT || effect == EFFECT_SKY_DROP || IsAbilityAndRecord(battlerAtk, ability, ABILITY_PROPELLER_TAIL) @@ -340,27 +390,42 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) return TRUE; } -bool32 HandleMoveTargetRedirection(void) +static bool32 HandleMoveTargetRedirection(void) { u32 redirectorOrderNum = MAX_BATTLERS_COUNT; - u16 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); - enum Type moveType = GetBattleMoveType(gCurrentMove); + enum MoveTarget moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); - enum Ability ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); + enum BattleSide side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); + + if (moveEffect == EFFECT_REFLECT_DAMAGE) + { + enum DamageCategory reflectCategory = GetReflectDamageMoveDamageCategory(gBattlerAttacker, gCurrentMove); + + if (reflectCategory == DAMAGE_CATEGORY_PHYSICAL) + gBattleStruct->moveTarget[gBattlerAttacker] = gProtectStructs[gBattlerAttacker].physicalBattlerId; + else + gBattleStruct->moveTarget[gBattlerAttacker] = gProtectStructs[gBattlerAttacker].specialBattlerId; + } if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove) - && moveTarget == MOVE_TARGET_SELECTED + && (moveTarget == TARGET_SELECTED || moveTarget == TARGET_SMART || moveEffect == EFFECT_REFLECT_DAMAGE) && !IsBattlerAlly(gBattlerAttacker, gSideTimers[side].followmeTarget)) { gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix return TRUE; } - else if (IsDoubleBattle() - && gSideTimers[side].followmeTimer == 0 - && (!IsBattleMoveStatus(gCurrentMove) || (moveTarget != MOVE_TARGET_USER && moveTarget != MOVE_TARGET_ALL_BATTLERS)) - && ((ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) - || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) + + enum Type moveType = GetBattleMoveType(gCurrentMove); + enum Ability ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]); + bool32 currTargetCantAbsorb = ((ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) + || (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER)); + + if (currTargetCantAbsorb + && IsDoubleBattle() + && gSideTimers[side].followmeTimer == 0 + && moveTarget != TARGET_USER + && moveTarget != TARGET_ALL_BATTLERS + && moveTarget != TARGET_FIELD) { // Find first battler that redirects the move (in turn order) enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); @@ -382,7 +447,7 @@ bool32 HandleMoveTargetRedirection(void) redirectorOrderNum = GetBattlerTurnOrderNum(battler); } } - if (redirectorOrderNum != MAX_BATTLERS_COUNT && gCurrentMove != MOVE_TEATIME) + if (redirectorOrderNum != MAX_BATTLERS_COUNT && moveEffect != EFFECT_TEATIME) { enum Ability battlerAbility; battler = gBattlerByTurnOrder[redirectorOrderNum]; @@ -396,6 +461,65 @@ bool32 HandleMoveTargetRedirection(void) return FALSE; } +void DetermineTarget(enum MoveTarget moveTarget, bool32 overwriteTarget) +{ + if (HandleMoveTargetRedirection()) + return; + + if (IsDoubleBattle() && moveTarget == TARGET_RANDOM) + { + gBattlerTarget = SetRandomTarget(gBattlerAttacker); + if (gAbsentBattlerFlags & (1u << gBattlerTarget) + && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) + { + gBattlerTarget = GetPartnerBattler(gBattlerTarget); + } + } + else if (moveTarget == TARGET_ALLY) + { + if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) && !gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch) + gBattlerTarget = BATTLE_PARTNER(gBattlerAttacker); + else + gBattlerTarget = gBattlerAttacker; + } + else if (IsDoubleBattle() && moveTarget == TARGET_FOES_AND_ALLY) + { + for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) + { + if (gBattlerTarget == gBattlerAttacker) + continue; + if (IsBattlerAlive(gBattlerTarget)) + break; + } + } + else if (moveTarget == TARGET_USER || moveTarget == TARGET_USER_AND_ALLY) + { + gBattlerTarget = gBattlerAttacker; + } + else if (overwriteTarget) + { + gBattlerTarget = gBattleStruct->moveTarget[gBattlerAttacker]; + if (!IsBattlerAlive(gBattlerTarget) + && moveTarget != TARGET_OPPONENTS_FIELD + && IsDoubleBattle() + && (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget))) + { + gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + } + } +} + +static bool32 WasOriginalTargetAlly(enum MoveTarget target) +{ + if (!gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch) + return FALSE; + + if ((target == TARGET_ALLY || target == TARGET_USER_OR_ALLY) && gBattlerAttacker == gBattlerTarget) + return TRUE; + + return FALSE; +} + // Functions void HandleAction_UseMove(void) { @@ -410,12 +534,6 @@ void HandleAction_UseMove(void) return; } - gBattleStruct->eventState.atkCanceller = 0; - ClearDamageCalcResults(); - gMultiHitCounter = 0; - gBattleScripting.savedDmg = 0; - gBattleCommunication[MISS_TYPE] = 0; - gBattleScripting.savedMoveEffect = 0; gCurrMovePos = gChosenMovePos = gBattleStruct->chosenMovePositions[gBattlerAttacker]; // choose move @@ -423,36 +541,36 @@ void HandleAction_UseMove(void) { gProtectStructs[gBattlerAttacker].noValidMoves = FALSE; gCurrentMove = gChosenMove = MOVE_STRUGGLE; - gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(MOVE_STRUGGLE, TARGET_NONE); } - else if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns || gDisableStructs[gBattlerAttacker].rechargeTimer > 0) + else if (gBattleMons[gBattlerAttacker].volatiles.multipleTurns || gBattleMons[gBattlerAttacker].volatiles.rechargeTimer > 0) { gCurrentMove = gChosenMove = gLockedMoves[gBattlerAttacker]; } // encore forces you to use the same move - else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE - && gDisableStructs[gBattlerAttacker].encoredMove == gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) + else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gBattleMons[gBattlerAttacker].volatiles.encoredMove != MOVE_NONE + && gBattleMons[gBattlerAttacker].volatiles.encoredMove == gBattleMons[gBattlerAttacker].moves[gBattleMons[gBattlerAttacker].volatiles.encoredMovePos]) { - gCurrentMove = gChosenMove = gDisableStructs[gBattlerAttacker].encoredMove; - gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; - if (GetGenConfig(GEN_CONFIG_ENCORE_TARGET) < GEN_5) - gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].volatiles.encoredMove; + gCurrMovePos = gChosenMovePos = gBattleMons[gBattlerAttacker].volatiles.encoredMovePos; + if (GetConfig(CONFIG_ENCORE_TARGET) < GEN_5) + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, TARGET_NONE); } // check if the encored move wasn't overwritten - else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gDisableStructs[gBattlerAttacker].encoredMove != MOVE_NONE - && gDisableStructs[gBattlerAttacker].encoredMove != gBattleMons[gBattlerAttacker].moves[gDisableStructs[gBattlerAttacker].encoredMovePos]) + else if (GetActiveGimmick(gBattlerAttacker) != GIMMICK_Z_MOVE && gBattleMons[gBattlerAttacker].volatiles.encoredMove != MOVE_NONE + && gBattleMons[gBattlerAttacker].volatiles.encoredMove != gBattleMons[gBattlerAttacker].moves[gBattleMons[gBattlerAttacker].volatiles.encoredMovePos]) { - gCurrMovePos = gChosenMovePos = gDisableStructs[gBattlerAttacker].encoredMovePos; + gCurrMovePos = gChosenMovePos = gBattleMons[gBattlerAttacker].volatiles.encoredMovePos; gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - gDisableStructs[gBattlerAttacker].encoredMove = MOVE_NONE; - gDisableStructs[gBattlerAttacker].encoredMovePos = 0; - gDisableStructs[gBattlerAttacker].encoreTimer = 0; - gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleMons[gBattlerAttacker].volatiles.encoredMove = MOVE_NONE; + gBattleMons[gBattlerAttacker].volatiles.encoredMovePos = 0; + gBattleMons[gBattlerAttacker].volatiles.encoreTimer = 0; + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, TARGET_NONE); } else if (gBattleMons[gBattlerAttacker].moves[gCurrMovePos] != gChosenMoveByBattler[gBattlerAttacker]) { gCurrentMove = gChosenMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; - gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, NO_TARGET_OVERRIDE); + gBattleStruct->moveTarget[gBattlerAttacker] = GetBattleMoveTarget(gCurrentMove, TARGET_NONE); } else { @@ -483,52 +601,14 @@ void HandleAction_UseMove(void) gCurrentMove = gChosenMove = GetMaxMove(gBattlerAttacker, gCurrentMove); } - moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + gBattleStruct->eventState.atkCanceler = 0; + ClearDamageCalcResults(); + gMultiHitCounter = 0; + gBattleCommunication[MISS_TYPE] = 0; + + moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); + DetermineTarget(moveTarget, TRUE); - if (!HandleMoveTargetRedirection()) - { - if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) - { - gBattlerTarget = SetRandomTarget(gBattlerAttacker); - if (gAbsentBattlerFlags & (1u << gBattlerTarget) - && !IsBattlerAlly(gBattlerAttacker, gBattlerTarget)) - { - gBattlerTarget = GetPartnerBattler(gBattlerTarget); - } - } - else if (moveTarget == MOVE_TARGET_ALLY) - { - if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) && !gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch) - gBattlerTarget = BATTLE_PARTNER(gBattlerAttacker); - else - gBattlerTarget = gBattlerAttacker; - } - else if (IsDoubleBattle() && moveTarget == MOVE_TARGET_FOES_AND_ALLY) - { - for (gBattlerTarget = 0; gBattlerTarget < gBattlersCount; gBattlerTarget++) - { - if (gBattlerTarget == gBattlerAttacker) - continue; - if (IsBattlerAlive(gBattlerTarget)) - break; - } - } - else if (moveTarget == MOVE_TARGET_USER) - { - gBattlerTarget = gBattlerAttacker; - } - else - { - gBattlerTarget = gBattleStruct->moveTarget[gBattlerAttacker]; - if (!IsBattlerAlive(gBattlerTarget) - && moveTarget != MOVE_TARGET_OPPONENTS_FIELD - && IsDoubleBattle() - && (!IsBattlerAlly(gBattlerAttacker, gBattlerTarget))) - { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); - } - } - } // if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gProtectStructs[gBattlerAttacker].palaceUnableToUseMove) // { @@ -554,9 +634,7 @@ void HandleAction_UseMove(void) { gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler; } - // If originally targetting an ally but now targetting user due to Ally Switch - else if (moveTarget & MOVE_TARGET_ALLY && gBattlerAttacker == gBattlerTarget - && gProtectStructs[BATTLE_PARTNER(gBattlerAttacker)].usedAllySwitch) + else if (WasOriginalTargetAlly(moveTarget)) { gBattlescriptCurrInstr = BattleScript_FailedFromAtkCanceler; } @@ -645,7 +723,7 @@ bool32 TryRunFromBattle(u32 battler) gProtectStructs[battler].fleeType = FLEE_ITEM; effect++; } - else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + else if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) { effect++; } @@ -665,9 +743,9 @@ bool32 TryRunFromBattle(u32 battler) // } // else // { - gLastUsedAbility = ABILITY_RUN_AWAY; - gProtectStructs[battler].fleeType = FLEE_ABILITY; - effect++; + gLastUsedAbility = ABILITY_RUN_AWAY; + gProtectStructs[battler].fleeType = FLEE_ABILITY; + effect++; // } } else if (IsGhostBattleWithoutScope()) @@ -759,7 +837,9 @@ void HandleAction_Run(void) } else { - if (!CanBattlerEscape(gBattlerAttacker)) + if (GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_CAN_ALWAYS_RUN + && GetBattlerAbility(gBattlerAttacker) != ABILITY_RUN_AWAY + && !CanBattlerEscape(gBattlerAttacker)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ATTACKER_CANT_ESCAPE; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; @@ -909,7 +989,6 @@ void HandleAction_NothingIsFainted(void) gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; - gHitMarker &= ~(HITMARKER_OBEYS); } void HandleAction_ActionFinished(void) @@ -920,10 +999,9 @@ void HandleAction_ActionFinished(void) gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; memset(&gSpecialStatuses, 0, sizeof(gSpecialStatuses)); - gHitMarker &= ~(HITMARKER_OBEYS); - ClearDamageCalcResults(); - gCurrentMove = 0; + gCurrentMove = MOVE_NONE; + ClearDamageCalcResults(); // Relies on gCurrentMove gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; gBattleStruct->dynamicMoveType = 0; @@ -935,38 +1013,38 @@ void HandleAction_ActionFinished(void) gBattleResources->battleScriptsStack->size = 0; gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; - if (GetGenConfig(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) + if (GetConfig(CONFIG_RECALC_TURN_AFTER_ACTIONS) >= GEN_8 && !afterYouActive && !gBattleStruct->pledgeMove && !IsPursuitTargetSet()) { // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action - struct BattleContext ctx = {0}; + struct BattleCalcValues calcValues = {0}; for (i = 0; i < gBattlersCount; i++) { - ctx.abilities[i] = GetBattlerAbility(i); - ctx.holdEffects[i] = GetBattlerHoldEffect(i); + calcValues.abilities[i] = GetBattlerAbility(i); + calcValues.holdEffects[i] = GetBattlerHoldEffect(i); } for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - ctx.battlerAtk = gBattlerByTurnOrder[i]; - ctx.battlerDef = gBattlerByTurnOrder[j]; + calcValues.battlerAtk = gBattlerByTurnOrder[i]; + calcValues.battlerDef = gBattlerByTurnOrder[j]; - if (gProtectStructs[ctx.battlerAtk].quash || gProtectStructs[ctx.battlerDef].quash - || gProtectStructs[ctx.battlerAtk].shellTrap || gProtectStructs[ctx.battlerDef].shellTrap) + if (gProtectStructs[calcValues.battlerAtk].quash || gProtectStructs[calcValues.battlerDef].quash + || gProtectStructs[calcValues.battlerAtk].shellTrap || gProtectStructs[calcValues.battlerDef].shellTrap) continue; // We recalculate order only for action of the same priority. If any action other than switch/move has been taken, they should // have been executed before. The only recalculation needed is for moves/switch. Mega evolution is handled in src/battle_main.c/TryChangeOrder if ((gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE)) { - if (GetWhichBattlerFaster(&ctx, FALSE) == -1) + if (GetWhichBattlerFaster(&calcValues, FALSE) == -1) SwapTurnOrder(i, j); } else if ((gActionsByTurnOrder[i] == B_ACTION_SWITCH && gActionsByTurnOrder[j] == B_ACTION_SWITCH)) { - if (GetWhichBattlerFaster(&ctx, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves + if (GetWhichBattlerFaster(&calcValues, TRUE) == -1) // If the actions chosen are switching, we recalc order but ignoring the moves SwapTurnOrder(i, j); } } @@ -986,6 +1064,11 @@ ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12_Floored(u32 percent) return (4096 * percent) / 100; } +static inline uq4_12_t PercentToUQ4_12AddOne(u32 percent) +{ + return uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(percent)); +} + u8 GetBattlerForBattleScript(u8 caseId) { u8 ret = 0; @@ -1015,8 +1098,10 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_FAINTED_MULTIPLE_1: ret = gBattlerFainted; break; - case BS_ATTACKER_WITH_PARTNER: case BS_FAINTED_MULTIPLE_2: + ret = BATTLE_PARTNER(gBattlerFainted); + break; + case BS_ATTACKER_WITH_PARTNER: case BS_ATTACKER_SIDE: case BS_TARGET_SIDE: case BS_PLAYER1: @@ -1094,21 +1179,19 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance, // confuse them upon release and display "confused by fatigue" message & animation. // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn. - if (gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns && skyDropState != SKY_DROP_STATUS_YAWN) + if (gBattleMons[otherSkyDropper].volatiles.rampageTurns && skyDropState != SKY_DROP_STATUS_YAWN) { - gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns = 0; + gBattleMons[otherSkyDropper].volatiles.rampageTurns = 0; // If the target can be confused, confuse them. // Don't use CanBeConfused, can cause issues in edge cases. enum Ability ability = GetBattlerAbility(otherSkyDropper); if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) + || IsMistyTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), gFieldStatuses))) { - // Set confused status - gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; - - if (skyDropState == SKY_DROP_ATTACKCANCELLER_CHECK) + gBattleMons[otherSkyDropper].volatiles.confusionTurns = RandomUniform(RNG_CONFUSION_TURNS, 2, B_CONFUSION_TURNS); // 2-5 turns + if (skyDropState == SKY_DROP_ATTACKCANCELER_CHECK) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_RELEASED_TARGET; } @@ -1133,7 +1216,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) } // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS - if (!(gBattleMons[otherSkyDropper].volatiles.lockConfusionTurns) && gBattleStruct->skyDropTargets[battler] < 4) + if (!(gBattleMons[otherSkyDropper].volatiles.rampageTurns) && gBattleStruct->skyDropTargets[battler] < 4) { gBattleStruct->skyDropTargets[battler] = SKY_DROP_NO_TARGET; gBattleStruct->skyDropTargets[otherSkyDropper] = SKY_DROP_NO_TARGET; @@ -1151,10 +1234,10 @@ const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState) if (B_RAMPAGE_CANCELLING < GEN_5) { gBattleMons[battler].volatiles.multipleTurns = 0; - gBattleMons[battler].volatiles.lockConfusionTurns = 0; + gBattleMons[battler].volatiles.rampageTurns = 0; } - else if (!gBattleMons[battler].volatiles.lockConfusionTurns - || gBattleMons[battler].volatiles.lockConfusionTurns > 1) + else if (!gBattleMons[battler].volatiles.rampageTurns + || gBattleMons[battler].volatiles.rampageTurns > 1) { gBattleMons[battler].volatiles.multipleTurns = 0; } @@ -1166,31 +1249,43 @@ const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState) if (gBattleStruct->skyDropTargets[battler] != SKY_DROP_NO_TARGET && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) result = CheckSkyDropState(battler, skyDropState); - gDisableStructs[battler].rolloutTimer = 0; - gDisableStructs[battler].furyCutterCounter = 0; + gBattleMons[battler].volatiles.rolloutTimer = 0; + gBattleMons[battler].volatiles.furyCutterCounter = 0; return result; } -bool32 WasUnableToUseMove(u32 battler) + +// Returns TRUE if no other battler after this one in turn order will use a move +bool32 IsLastMonToMove(u32 battler) { - if (gProtectStructs[battler].nonVolatileStatusImmobility - || gProtectStructs[battler].unableToUseMove - || gProtectStructs[battler].confusionSelfDmg) + u32 i; + u32 battlerTurnOrderNum = GetBattlerTurnOrderNum(battler); + + if (battlerTurnOrderNum >= gBattlersCount - 1) return TRUE; - return FALSE; + + for (i = battlerTurnOrderNum + 1; i < gBattlersCount; i++) + { + u32 otherBattler = gBattlerByTurnOrder[i]; + if (!IsBattlerAlive(otherBattler)) + continue; + if (gActionsByTurnOrder[i] == B_ACTION_USE_MOVE) + return FALSE; + } + return TRUE; } bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); if (ability != ABILITY_DEFIANT && ability != ABILITY_COMPETITIVE) return FALSE; // if an ally dropped the stats (except for Sticky Web), don't activate if (IsBattlerAlly(gSpecialStatuses[battler].changedStatsBattlerId, battler) && !gBattleScripting.stickyWebStatDrop) return FALSE; - if (GetGenConfig(GEN_CONFIG_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) + if (GetConfig(CONFIG_DEFIANT_STICKY_WEB) >= GEN_9 || !gBattleScripting.stickyWebStatDrop) return TRUE; // only activate Defiant/Competitive if Web was setup by foe return gSideTimers[side].stickyWebBattlerSide != side; @@ -1228,7 +1323,7 @@ void PrepareStringBattle(enum StringID stringId, u32 battler) stringId = STRINGID_STATSWONTINCREASE2; break; case STRINGID_PKMNCUTSATTACKWITH: - if (GetGenConfig(GEN_CONFIG_UPDATED_INTIMIDATE) >= GEN_8 + if (GetConfig(CONFIG_UPDATED_INTIMIDATE) >= GEN_8 && targetAbility == ABILITY_RATTLED && CompareStat(gBattlerTarget, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, targetAbility)) { @@ -1334,7 +1429,7 @@ void BattleScriptPop(void) gBattlescriptCurrInstr = gBattleResources->battleScriptsStack->ptr[--gBattleResources->battleScriptsStack->size]; } -static bool32 IsGravityPreventingMove(u32 move) +static bool32 IsGravityPreventingMove(enum Move move) { if (!(gFieldStatuses & STATUS_FIELD_GRAVITY)) return FALSE; @@ -1342,7 +1437,7 @@ static bool32 IsGravityPreventingMove(u32 move) return IsMoveGravityBanned(move); } -bool32 IsHealBlockPreventingMove(u32 battler, u32 move) +bool32 IsHealBlockPreventingMove(u32 battler, enum Move move) { if (!gBattleMons[battler].volatiles.healBlock) return FALSE; @@ -1350,7 +1445,7 @@ bool32 IsHealBlockPreventingMove(u32 battler, u32 move) return IsHealingMove(move); } -bool32 IsBelchPreventingMove(u32 battler, u32 move) +bool32 IsBelchPreventingMove(u32 battler, enum Move move) { if (GetMoveEffect(move) != EFFECT_BELCH) return FALSE; @@ -1365,16 +1460,16 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) { u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; - u32 move = gBattleMons[battler].moves[moveId]; + enum Move move = gBattleMons[battler].moves[moveId]; enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - if (GetGenConfig(GEN_CONFIG_ENCORE_TARGET) >= GEN_5 - && DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].encoredMove != move && gDisableStructs[battler].encoredMove != MOVE_NONE) + if (GetConfig(CONFIG_ENCORE_TARGET) >= GEN_5 + && DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gBattleMons[battler].volatiles.encoredMove != move && gBattleMons[battler].volatiles.encoredMove != MOVE_NONE) { gBattleScripting.battler = battler; - gCurrentMove = gDisableStructs[battler].encoredMove; + gCurrentMove = gBattleMons[battler].volatiles.encoredMove; // if (gBattleTypeFlags & BATTLE_TYPE_PALACE) // { // gPalaceSelectionBattleScripts[battler] = BattleScript_EncoredMoveInPalace; @@ -1382,13 +1477,13 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_EncoredMove; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_EncoredMove; + limitations++; // } return limitations; } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].disabledMove == move && move != MOVE_NONE) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gBattleMons[battler].volatiles.disabledMove == move && move != MOVE_NONE) { gBattleScripting.battler = battler; gCurrentMove = move; @@ -1399,8 +1494,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingDisabledMove; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingDisabledMove; + limitations++; // } } @@ -1414,12 +1509,12 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingTormentedMove; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingTormentedMove; + limitations++; // } } - if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].tauntTimer != 0 && IsBattleMoveStatus(move)) + if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gBattleMons[battler].volatiles.tauntTimer != 0 && IsBattleMoveStatus(move)) { if ((GetActiveGimmick(battler) == GIMMICK_DYNAMAX)) gCurrentMove = MOVE_MAX_GUARD; @@ -1432,12 +1527,12 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveTaunt; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveTaunt; + limitations++; // } } - if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move)) + if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gBattleMons[battler].volatiles.throatChopTimer > 0 && IsSoundMove(move)) { gCurrentMove = move; // if (gBattleTypeFlags & BATTLE_TYPE_PALACE) @@ -1447,8 +1542,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveThroatChop; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveThroatChop; + limitations++; // } } @@ -1462,8 +1557,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingImprisonedMove; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingImprisonedMove; + limitations++; // } } @@ -1477,8 +1572,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveGravity; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveGravity; + limitations++; // } } @@ -1492,8 +1587,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveHealBlock; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveHealBlock; + limitations++; // } } @@ -1507,8 +1602,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedBelch; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedBelch; + limitations++; // } } @@ -1522,8 +1617,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedStuffCheeks; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedStuffCheeks; + limitations++; // } } @@ -1538,8 +1633,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedCurrentMove; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedCurrentMove; + limitations++; // } } @@ -1555,8 +1650,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveChoiceItem; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveChoiceItem; + limitations++; // } } else if (holdEffect == HOLD_EFFECT_ASSAULT_VEST && IsBattleMoveStatus(move) && moveEffect != EFFECT_ME_FIRST) @@ -1573,8 +1668,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveAssaultVest; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveAssaultVest; + limitations++; // } } if (DYNAMAX_BYPASS_CHECK && (GetBattlerAbility(battler) == ABILITY_GORILLA_TACTICS) && *choicedMove != MOVE_NONE @@ -1589,8 +1684,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveGorillaTactics; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedMoveGorillaTactics; + limitations++; // } } @@ -1602,8 +1697,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingMoveWithNoPP; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingMoveWithNoPP; + limitations++; // } } @@ -1616,8 +1711,8 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) // } // else // { - gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedPlaceholder; - limitations++; + gSelectionBattleScripts[battler] = BattleScript_SelectingNotAllowedPlaceholder; + limitations++; // } } @@ -1626,7 +1721,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { - u32 move; + enum Move move; enum BattleMoveEffects moveEffect; enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; @@ -1648,19 +1743,19 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_PLACEHOLDER && moveEffect == EFFECT_PLACEHOLDER) unusableMoves |= 1u << i; // Disable - else if (check & MOVE_LIMITATION_DISABLED && move == gDisableStructs[battler].disabledMove) + else if (check & MOVE_LIMITATION_DISABLED && move == gBattleMons[battler].volatiles.disabledMove) unusableMoves |= 1u << i; // Torment else if (check & MOVE_LIMITATION_TORMENTED && move == gLastMoves[battler] && gBattleMons[battler].volatiles.torment == TRUE) unusableMoves |= 1u << i; // Taunt - else if (check & MOVE_LIMITATION_TAUNT && gDisableStructs[battler].tauntTimer && IsBattleMoveStatus(move)) + else if (check & MOVE_LIMITATION_TAUNT && gBattleMons[battler].volatiles.tauntTimer && IsBattleMoveStatus(move)) unusableMoves |= 1u << i; // Imprison else if (check & MOVE_LIMITATION_IMPRISON && GetImprisonedMovesCount(battler, move)) unusableMoves |= 1u << i; // Encore - else if (check & MOVE_LIMITATION_ENCORE && gDisableStructs[battler].encoreTimer && gDisableStructs[battler].encoredMove != move) + else if (check & MOVE_LIMITATION_ENCORE && gBattleMons[battler].volatiles.encoreTimer && gBattleMons[battler].volatiles.encoredMove != move) unusableMoves |= 1u << i; // Choice Items else if (check & MOVE_LIMITATION_CHOICE_ITEM && IsHoldEffectChoice(holdEffect) && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != move) @@ -1678,7 +1773,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move)) unusableMoves |= 1u << i; // Throat Chop - else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move)) + else if (check & MOVE_LIMITATION_THROAT_CHOP && gBattleMons[battler].volatiles.throatChopTimer > 0 && IsSoundMove(move)) unusableMoves |= 1u << i; // Stuff Cheeks else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES) @@ -1711,7 +1806,7 @@ bool32 AreAllMovesUnusable(u32 battler) return (unusable == ALL_MOVES_MASK); } -u8 GetImprisonedMovesCount(u32 battler, u16 move) +u8 GetImprisonedMovesCount(u32 battler, enum Move move) { s32 i; u8 imprisonedMoves = 0; @@ -1769,7 +1864,8 @@ void TryToRevertMimicryAndFlags(void) { for (u32 battler = 0; battler < gBattlersCount; battler++) { - gDisableStructs[battler].terrainAbilityDone = FALSE; + gBattleMons[battler].volatiles.terrainAbilityDone = FALSE; + ResetParadoxTerrainStat(battler); if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_MIMICRY)) RESTORE_BATTLER_TYPE(battler); } @@ -1816,6 +1912,7 @@ bool32 HandleFaintedMonActions(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) return FALSE; + do { s32 i; @@ -1839,18 +1936,18 @@ bool32 HandleFaintedMonActions(void) && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_GiveExp); - gBattleStruct->eventState.faintedAction = 2; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_SET_ABSENT_FLAGS; return TRUE; } } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); - gBattleStruct->eventState.faintedAction = 3; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; break; case FAINTED_ACTIONS_SET_ABSENT_FLAGS: OpponentSwitchInResetSentPokesToOpponentValue(gBattlerFainted); if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) - gBattleStruct->eventState.faintedAction = 3; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_WAIT_STATE; else - gBattleStruct->eventState.faintedAction = 1; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_GIVE_EXP; // Don't switch mons until all pokemon performed their actions or the battle's over. if (B_FAINT_SWITCH_IN >= GEN_4 && gBattleOutcome == 0 @@ -1858,7 +1955,7 @@ bool32 HandleFaintedMonActions(void) && gCurrentTurnActionNumber != gBattlersCount) { gAbsentBattlerFlags |= 1u << gBattlerFainted; - if (gBattleStruct->eventState.faintedAction != 1) + if (gBattleStruct->eventState.faintedAction != FAINTED_ACTIONS_GIVE_EXP) return FALSE; } break; @@ -1882,7 +1979,7 @@ bool32 HandleFaintedMonActions(void) && !(gAbsentBattlerFlags & (1u << gBattleStruct->eventState.faintedActionBattler))) { BattleScriptExecute(BattleScript_HandleFaintedMon); - gBattleStruct->eventState.faintedAction = 5; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_NEXT_BATTLER; return TRUE; } } while (++gBattleStruct->eventState.faintedActionBattler != gBattlersCount); @@ -1892,7 +1989,7 @@ bool32 HandleFaintedMonActions(void) if (++gBattleStruct->eventState.faintedActionBattler == gBattlersCount) gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_MAX_CASE; else - gBattleStruct->eventState.faintedAction = 4; + gBattleStruct->eventState.faintedAction = FAINTED_ACTIONS_HANDLE_FAINTED_MON; break; case FAINTED_ACTIONS_MAX_CASE: break; @@ -1906,10 +2003,8 @@ void TryClearRageAndFuryCutter(void) s32 i; for (i = 0; i < gBattlersCount; i++) { - if (gBattleMons[i].volatiles.rage && gChosenMoveByBattler[i] != MOVE_RAGE) + if (!MoveHasAdditionalEffect(gChosenMoveByBattler[i], MOVE_EFFECT_RAGE)) gBattleMons[i].volatiles.rage = FALSE; - if (gDisableStructs[i].furyCutterCounter != 0 && gChosenMoveByBattler[i] != MOVE_FURY_CUTTER) - gDisableStructs[i].furyCutterCounter = 0; } } @@ -1926,7 +2021,7 @@ static inline bool32 TryFormChangeBeforeMove(void) return TRUE; } -static inline bool32 TryActivatePowderStatus(u32 move) +static inline bool32 TryActivatePowderStatus(enum Move move) { u32 partnerMove = GetChosenMoveFromPosition(BATTLE_PARTNER(gBattlerAttacker)); if (!gBattleMons[gBattlerAttacker].volatiles.powder) @@ -1940,46 +2035,69 @@ static inline bool32 TryActivatePowderStatus(u32 move) return FALSE; } -static enum MoveCanceller CancellerClearFlags(struct BattleContext *ctx) +static void RequestNonVolatileChangee(u32 battlerAtk) +{ + BtlController_EmitSetMonData( + battlerAtk, + B_COMM_TO_CONTROLLER, + REQUEST_STATUS_BATTLE, + 0, + 4, + &gBattleMons[battlerAtk].status1); + MarkBattlerForControllerExec(battlerAtk); +} + +static enum MoveCanceler CancelerClearFlags(struct BattleContext *ctx) { gBattleMons[ctx->battlerAtk].volatiles.grudge = FALSE; gBattleMons[ctx->battlerAtk].volatiles.glaiveRush = FALSE; + gBattleStruct->eventState.atkCancelerBattler = 0; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerStanceChangeOne(struct BattleContext *ctx) +static enum MoveCanceler CancelerStanceChangeOne(struct BattleContext *ctx) { - if (B_STANCE_CHANGE_FAIL < GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL < GEN_7 && ctx->chosenMove == ctx->move && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerSkyDrop(struct BattleContext *ctx) +static enum MoveCanceler CancelerSkyDrop(struct BattleContext *ctx) { // If Pokemon is being held in Sky Drop if (gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable == STATE_SKY_DROP) { gBattlescriptCurrInstr = BattleScript_MoveEnd; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerRecharge(struct BattleContext *ctx) +static enum MoveCanceler CancelerRecharge(struct BattleContext *ctx) { - if (gDisableStructs[ctx->battlerAtk].rechargeTimer > 0) + if (gBattleMons[ctx->battlerAtk].volatiles.rechargeTimer > 0) { - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedMustRecharge; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) +static enum MoveCanceler CancelerChillyReception(struct BattleContext *ctx) { + if (GetMoveEffect(ctx->move) == EFFECT_WEATHER_AND_SWITCH) + { + BattleScriptCall(BattleScript_ChillyReceptionMessage); + return MOVE_STEP_BREAK; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerAsleepOrFrozen(struct BattleContext *ctx) +{ + enum MoveCanceler effect = MOVE_STEP_BREAK; + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(ctx->battlerAtk)) @@ -1989,30 +2107,33 @@ static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; gEffectBattler = ctx->battlerAtk; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; + effect = MOVE_STEP_BREAK; BattleScriptCall(BattleScript_MoveUsedWokeUp); - return MOVE_STEP_REMOVES_STATUS; } else { - u8 toSub; - if (IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_EARLY_BIRD)) + u32 toSub; + if (IsAbilityAndRecord(ctx->battlerAtk, ctx->abilityAtk, ABILITY_EARLY_BIRD)) toSub = 2; else toSub = 1; + if ((gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) < toSub) gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_SLEEP; else gBattleMons[ctx->battlerAtk].status1 -= toSub; - enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->currentMove); + enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->move); if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) { - if (moveEffect != EFFECT_SNORE && moveEffect != EFFECT_SLEEP_TALK) + if (!IsUsableWhileAsleepEffect(moveEffect)) { - gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; + effect = MOVE_STEP_FAILURE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_REMOVES_STATUS; + } + else + { + effect = MOVE_STEP_BREAK; } } else @@ -2020,31 +2141,33 @@ static enum MoveCanceller CancellerAsleepOrFrozen(struct BattleContext *ctx) TryDeactivateSleepClause(GetBattlerSide(ctx->battlerAtk), gBattlerPartyIndexes[ctx->battlerAtk]); gBattleMons[ctx->battlerAtk].volatiles.nightmare = FALSE; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; + effect = MOVE_STEP_BREAK; BattleScriptCall(BattleScript_MoveUsedWokeUp); - return MOVE_STEP_REMOVES_STATUS; } } + RequestNonVolatileChangee(ctx->battlerAtk); } - else if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE && !MoveThawsUser(ctx->currentMove)) + else if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE && !MoveThawsUser(ctx->move)) { if (!RandomPercentage(RNG_FROZEN, 20)) { - gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; + effect = MOVE_STEP_FAILURE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; } else // unfreeze { gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; + effect = MOVE_STEP_BREAK; BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } - return MOVE_STEP_REMOVES_STATUS; // Move failure but also removes status + RequestNonVolatileChangee(ctx->battlerAtk); } - return MOVE_STEP_SUCCESS; + + return effect; } -static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) +static enum MoveCanceler CancelerObedience(struct BattleContext *ctx) { if (!gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { @@ -2052,7 +2175,6 @@ static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) switch (obedienceResult) { case OBEYS: - gHitMarker |= HITMARKER_OBEYS; return MOVE_STEP_SUCCESS; case DISOBEYS_LOAFS: // Randomly select, then print a disobedient string @@ -2063,18 +2185,17 @@ static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) return MOVE_STEP_FAILURE; case DISOBEYS_HITS_SELF: gBattlerTarget = ctx->battlerAtk; - struct DamageContext dmgCtx = {0}; + struct BattleContext dmgCtx = {0}; dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE; dmgCtx.moveType = TYPE_MYSTERY; dmgCtx.isCrit = FALSE; dmgCtx.randomFactor = FALSE; dmgCtx.updateFlags = TRUE; + dmgCtx.isSelfInflicted = TRUE; dmgCtx.fixedBasePower = 40; gBattleStruct->moveDamage[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); gBattlescriptCurrInstr = BattleScript_IgnoresAndHitsItself; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gHitMarker |= HITMARKER_OBEYS; return MOVE_STEP_FAILURE; // Move doesn't fail but mon hits itself case DISOBEYS_FALL_ASLEEP: if (IsSleepClauseEnabled()) @@ -2090,19 +2211,17 @@ static enum MoveCanceller CancellerObedience(struct BattleContext *ctx) case DISOBEYS_RANDOM_MOVE: gCurrentMove = gCalledMove = gBattleMons[ctx->battlerAtk].moves[gCurrMovePos]; BattleScriptCall(BattleScript_IgnoresAndUsesRandomMove); - gBattlerTarget = GetBattleMoveTarget(gCalledMove, NO_TARGET_OVERRIDE); - gHitMarker |= HITMARKER_OBEYS; + gBattlerTarget = GetBattleMoveTarget(gCalledMove, TARGET_NONE); return MOVE_STEP_BREAK; } } - gHitMarker |= HITMARKER_OBEYS; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowerPoints(struct BattleContext *ctx) +static enum MoveCanceler CancelerPowerPoints(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].pp[gCurrMovePos] == 0 - && ctx->currentMove != MOVE_STRUGGLE + && ctx->move != MOVE_STRUGGLE && !gSpecialStatuses[ctx->battlerAtk].dancerUsedMove && !gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) { @@ -2114,12 +2233,11 @@ static enum MoveCanceller CancellerPowerPoints(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTruant(struct BattleContext *ctx) +static enum MoveCanceler CancelerTruant(struct BattleContext *ctx) { - if (GetBattlerAbility(ctx->battlerAtk) == ABILITY_TRUANT && gDisableStructs[ctx->battlerAtk].truantCounter) + if (GetBattlerAbility(ctx->battlerAtk) == ABILITY_TRUANT && gBattleMons[ctx->battlerAtk].volatiles.truantCounter) { - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; gBattlerAbility = ctx->battlerAtk; gBattlescriptCurrInstr = BattleScript_TruantLoafingAround; @@ -2129,95 +2247,114 @@ static enum MoveCanceller CancellerTruant(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerFlinch(struct BattleContext *ctx) +static enum MoveCanceler CancelerFocus(struct BattleContext *ctx) +{ + u32 focusPunchFailureConfig = GetConfig(CONFIG_FOCUS_PUNCH_FAILURE); + + // In Gens 3-4, only check if is using Focus Punch. + // In Gens 5-6, only check if the chosen move is Focus Punch. + // In Gens 7+, check if chose and is using Focus Punch. + if ((gProtectStructs[ctx->battlerAtk].physicalDmg || gProtectStructs[ctx->battlerAtk].specialDmg) + && (focusPunchFailureConfig < GEN_5 || GetMoveEffect(gChosenMoveByBattler[ctx->battlerAtk]) == EFFECT_FOCUS_PUNCH) + && (focusPunchFailureConfig == GEN_5 || focusPunchFailureConfig == GEN_6 || GetMoveEffect(ctx->move) == EFFECT_FOCUS_PUNCH) + && !gProtectStructs[ctx->battlerAtk].survivedOHKO) + { + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + gBattlescriptCurrInstr = BattleScript_FocusPunchLostFocus; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerFocusPreGen5(struct BattleContext *ctx) +{ + if (GetConfig(CONFIG_FOCUS_PUNCH_FAILURE) < GEN_5) + return CancelerFocus(ctx); + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerFocusGen5(struct BattleContext *ctx) +{ + if (GetConfig(CONFIG_FOCUS_PUNCH_FAILURE) >= GEN_5) + return CancelerFocus(ctx); + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerFlinch(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.flinched) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedFlinched; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerDisabled(struct BattleContext *ctx) +static enum MoveCanceler CancelerDisabled(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE - && gDisableStructs[ctx->battlerAtk].disabledMove == ctx->currentMove - && gDisableStructs[ctx->battlerAtk].disabledMove != MOVE_NONE) + && gBattleMons[ctx->battlerAtk].volatiles.disabledMove == ctx->move + && gBattleMons[ctx->battlerAtk].volatiles.disabledMove != MOVE_NONE) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsDisabled; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx) +static enum MoveCanceler CancelerVolatileBlocked(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gBattleMons[ctx->battlerAtk].volatiles.healBlock - && IsHealBlockPreventingMove(ctx->battlerAtk, ctx->currentMove)) + && IsHealBlockPreventingMove(ctx->battlerAtk, ctx->move)) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } - else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(ctx->currentMove)) + else if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(ctx->move)) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; gBattleScripting.battler = ctx->battlerAtk; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } - else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > 0 && IsSoundMove(ctx->currentMove)) + else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gBattleMons[ctx->battlerAtk].volatiles.throatChopTimer > 0 && IsSoundMove(ctx->move)) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsThroatChopPrevented; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerTaunted(struct BattleContext *ctx) +static enum MoveCanceler CancelerTaunted(struct BattleContext *ctx) { - if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].tauntTimer && IsBattleMoveStatus(ctx->currentMove)) + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gBattleMons[ctx->battlerAtk].volatiles.tauntTimer && IsBattleMoveStatus(ctx->move)) { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsTaunted; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; - } - return MOVE_STEP_SUCCESS; -} - -static enum MoveCanceller CancellerImprisoned(struct BattleContext *ctx) -{ - if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(ctx->battlerAtk, ctx->currentMove)) - { - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); - gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) +static enum MoveCanceler CancelerImprisoned(struct BattleContext *ctx) +{ + if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && GetImprisonedMovesCount(ctx->battlerAtk, ctx->move)) + { + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + gBattlescriptCurrInstr = BattleScript_MoveUsedIsImprisoned; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerConfused(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { @@ -2226,38 +2363,39 @@ static enum MoveCanceller CancellerConfused(struct BattleContext *ctx) if (gBattleMons[ctx->battlerAtk].volatiles.confusionTurns) { // confusion dmg - if (RandomPercentage(RNG_CONFUSION, (GetGenConfig(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) + if (RandomPercentage(RNG_CONFUSION, (GetConfig(CONFIG_CONFUSION_SELF_DMG_CHANCE) >= GEN_7 ? 33 : 50))) { gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; - struct DamageContext dmgCtx = {0}; + struct BattleContext dmgCtx = {0}; dmgCtx.battlerAtk = dmgCtx.battlerDef = ctx->battlerAtk; dmgCtx.move = dmgCtx.chosenMove = MOVE_NONE; dmgCtx.moveType = TYPE_MYSTERY; dmgCtx.isCrit = FALSE; dmgCtx.randomFactor = FALSE; dmgCtx.updateFlags = TRUE; + dmgCtx.isSelfInflicted = TRUE; dmgCtx.fixedBasePower = 40; gBattleStruct->passiveHpUpdate[ctx->battlerAtk] = CalculateMoveDamage(&dmgCtx); - gProtectStructs[ctx->battlerAtk].confusionSelfDmg = TRUE; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfused; + return MOVE_STEP_FAILURE; } else { gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; BattleScriptCall(BattleScript_MoveUsedIsConfused); + return MOVE_STEP_BREAK; } } else // snapped out of confusion { BattleScriptCall(BattleScript_MoveUsedIsConfusedNoMore); + return MOVE_STEP_BREAK; } - return MOVE_STEP_BREAK; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerGhost(struct BattleContext *ctx) // GHOST in pokemon tower +static enum MoveCanceler CancelerGhost(struct BattleContext *ctx) // GHOST in pokemon tower { if (IsGhostBattleWithoutScope()) { @@ -2271,23 +2409,20 @@ static enum MoveCanceller CancellerGhost(struct BattleContext *ctx) // GHOST in return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerParalysed(struct BattleContext *ctx) +static enum MoveCanceler CancelerParalyzed(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_PARALYSIS - && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + && !(B_MAGIC_GUARD == GEN_4 && IsAbilityAndRecord(ctx->battlerAtk, ctx->abilityAtk, ABILITY_MAGIC_GUARD)) && !RandomPercentage(RNG_PARALYSIS, 75)) { - gProtectStructs[ctx->battlerAtk].nonVolatileStatusImmobility = TRUE; - // This is removed in FRLG and Emerald for some reason - //CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsParalyzed; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) +static enum MoveCanceler CancelerInfatuation(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.infatuation) { @@ -2300,9 +2435,7 @@ static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) else { BattleScriptPush(BattleScript_MoveUsedIsInLoveCantAttack); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_MoveUsedIsInLove; return MOVE_STEP_FAILURE; } @@ -2310,7 +2443,7 @@ static enum MoveCanceller CancellerInfatuation(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerBide(struct BattleContext *ctx) +static enum MoveCanceler CancelerBide(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.bideTurns) { @@ -2326,8 +2459,8 @@ static enum MoveCanceller CancellerBide(struct BattleContext *ctx) { gCurrentMove = MOVE_BIDE; gBattlerTarget = gBideTarget[ctx->battlerAtk]; - if (gAbsentBattlerFlags & (1u << ctx->battlerDef)) - gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, MOVE_TARGET_SELECTED + 1); + if (!IsBattlerAlive(ctx->battlerDef)) + gBattlerTarget = GetBattleMoveTarget(MOVE_BIDE, TARGET_SELECTED); gBattlescriptCurrInstr = BattleScript_BideAttack; return MOVE_STEP_BREAK; // Jumps to a different script but no failure } @@ -2341,7 +2474,7 @@ static enum MoveCanceller CancellerBide(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) +static enum MoveCanceler CancelerZMoves(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE) { @@ -2350,7 +2483,7 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) SetGimmickAsActivated(ctx->battlerAtk, GIMMICK_Z_MOVE); gBattleScripting.battler = ctx->battlerAtk; - if (GetMoveCategory(ctx->currentMove) == DAMAGE_CATEGORY_STATUS) + if (GetMoveCategory(ctx->move) == DAMAGE_CATEGORY_STATUS) BattleScriptCall(BattleScript_ZMoveActivateStatus); else BattleScriptCall(BattleScript_ZMoveActivateDamaging); @@ -2360,14 +2493,14 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) +static enum MoveCanceler CancelerChoiceLock(struct BattleContext *ctx) { u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; enum HoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) - && (IsHoldEffectChoice(holdEffect) || ctx->abilities[ctx->battlerAtk] == ABILITY_GORILLA_TACTICS)) + && (IsHoldEffectChoice(holdEffect) || ctx->abilityAtk == ABILITY_GORILLA_TACTICS)) *choicedMoveAtk = gChosenMove; u32 moveIndex; @@ -2383,14 +2516,14 @@ static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) +static enum MoveCanceler CancelerCallSubmove(struct BattleContext *ctx) { bool32 noEffect = FALSE; - u32 calledMove = MOVE_NONE; + enum Move calledMove = MOVE_NONE; const u8 *battleScript = NULL; battleScript = BattleScript_SubmoveAttackstring; - switch(GetMoveEffect(ctx->currentMove)) + switch(GetMoveEffect(ctx->move)) { case EFFECT_MIRROR_MOVE: calledMove = GetMirrorMoveMove(); @@ -2411,7 +2544,7 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) battleScript = BattleScript_SleepTalkAttackstring; break; case EFFECT_COPYCAT: - calledMove = GetCopyCatMove(); + calledMove = GetCopycatMove(); break; case EFFECT_ME_FIRST: calledMove = GetMeFirstMove(); @@ -2431,7 +2564,7 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE && !IsBattleMoveStatus(calledMove)) calledMove = GetTypeBasedZMove(calledMove); - if (GetMoveEffect(ctx->currentMove) == EFFECT_COPYCAT && IsMaxMove(calledMove)) + if (GetMoveEffect(ctx->move) == EFFECT_COPYCAT && IsMaxMove(calledMove)) calledMove = gBattleStruct->dynamax.lastUsedBaseMove; gBattleStruct->submoveAnnouncement = SUBMOVE_SUCCESS; @@ -2444,39 +2577,51 @@ static enum MoveCanceller CancellerCallSubmove(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerThaw(struct BattleContext *ctx) +static enum MoveCanceler CancelerThaw(struct BattleContext *ctx) { + enum MoveCanceler effect = MOVE_STEP_BREAK; + if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FREEZE) { - if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) + if (!(IsMoveEffectRemoveSpeciesType(ctx->move, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) { gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FREEZE; + effect = MOVE_STEP_BREAK; BattleScriptCall(BattleScript_MoveUsedUnfroze); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } - return MOVE_STEP_REMOVES_STATUS; + else + { + effect = MOVE_STEP_FAILURE; + } + RequestNonVolatileChangee(ctx->battlerAtk); } - if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && MoveThawsUser(ctx->currentMove)) + else if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && MoveThawsUser(ctx->move)) { - if (!(IsMoveEffectRemoveSpeciesType(ctx->currentMove, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) + if (!(IsMoveEffectRemoveSpeciesType(ctx->move, MOVE_EFFECT_REMOVE_ARG_TYPE, TYPE_FIRE) && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_FIRE))) { gBattleMons[ctx->battlerAtk].status1 &= ~STATUS1_FROSTBITE; + effect = MOVE_STEP_BREAK; BattleScriptCall(BattleScript_MoveUsedUnfrostbite); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FROSTBITE_HEALED_BY_MOVE; } - return MOVE_STEP_REMOVES_STATUS; + else + { + effect = MOVE_STEP_FAILURE; + } + RequestNonVolatileChangee(ctx->battlerAtk); } - return MOVE_STEP_SUCCESS; + return effect; } -static enum MoveCanceller CancellerStanceChangeTwo(struct BattleContext *ctx) +static enum MoveCanceler CancelerStanceChangeTwo(struct BattleContext *ctx) { - if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == ctx->currentMove && TryFormChangeBeforeMove()) + if (B_STANCE_CHANGE_FAIL >= GEN_7 && gChosenMove == ctx->move && TryFormChangeBeforeMove()) return MOVE_STEP_BREAK; return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerAttackstring(struct BattleContext *ctx) +static enum MoveCanceler CancelerAttackstring(struct BattleContext *ctx) { BattleScriptCall(BattleScript_Attackstring); if (!gSpecialStatuses[gBattlerAttacker].dancerUsedMove) @@ -2484,24 +2629,24 @@ static enum MoveCanceller CancellerAttackstring(struct BattleContext *ctx) return MOVE_STEP_BREAK; } -static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) +static enum MoveCanceler CancelerPPDeduction(struct BattleContext *ctx) { if (gBattleMons[ctx->battlerAtk].volatiles.multipleTurns || gSpecialStatuses[ctx->battlerAtk].dancerUsedMove - || ctx->currentMove == MOVE_STRUGGLE) + || ctx->move == MOVE_STRUGGLE) return MOVE_STEP_SUCCESS; s32 ppToDeduct = 1; - u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); + u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move); u32 movePosition = gCurrMovePos; if (gBattleStruct->submoveAnnouncement == SUBMOVE_SUCCESS) movePosition = gChosenMovePos; - if (moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_FOES_AND_ALLY - || moveTarget == MOVE_TARGET_ALL_BATTLERS - || MoveForcesPressure(ctx->currentMove)) + if (IsSpreadMove(moveTarget) + || moveTarget == TARGET_ALL_BATTLERS + || moveTarget == TARGET_FIELD + || MoveForcesPressure(ctx->move)) { for (u32 i = 0; i < gBattlersCount; i++) { @@ -2509,15 +2654,15 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) ppToDeduct += (GetBattlerAbility(i) == ABILITY_PRESSURE); } } - else if (moveTarget != MOVE_TARGET_OPPONENTS_FIELD) + else if (moveTarget != TARGET_OPPONENTS_FIELD) { - if (ctx->battlerAtk != ctx->battlerDef && ctx->abilities[ctx->battlerDef] == ABILITY_PRESSURE) + if (ctx->battlerAtk != ctx->battlerDef && GetBattlerAbility(ctx->battlerDef) == ABILITY_PRESSURE) ppToDeduct++; } // For item Metronome, echoed voice - if (ctx->currentMove != gLastResultingMoves[ctx->battlerAtk] || WasUnableToUseMove(ctx->battlerAtk)) - gBattleStruct->metronomeItemCounter[ctx->battlerAtk] = 0; + if (ctx->move != gLastResultingMoves[ctx->battlerAtk] || gBattleStruct->unableToUseMove) + gBattleMons[ctx->battlerAtk].volatiles.metronomeItemCounter = 0; if (gBattleMons[ctx->battlerAtk].pp[movePosition] > ppToDeduct) gBattleMons[ctx->battlerAtk].pp[movePosition] -= ppToDeduct; @@ -2544,7 +2689,7 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) gBattlescriptCurrInstr = BattleScript_ButItFailed; return MOVE_STEP_FAILURE; } - else if (CancellerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove + else if (CancelerVolatileBlocked(ctx) == MOVE_STEP_FAILURE) // Check Gravity/Heal Block/Throat Chop for Submove { gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; return MOVE_STEP_FAILURE; @@ -2552,14 +2697,15 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) else { gBattleStruct->submoveAnnouncement = SUBMOVE_NO_EFFECT; - gBattlerTarget = GetBattleMoveTarget(ctx->currentMove, NO_TARGET_OVERRIDE); + gBattlerTarget = GetBattleMoveTarget(ctx->move, TARGET_NONE); gBattleScripting.animTurn = 0; gBattleScripting.animTargetsHit = 0; - // Possibly better to just move type setting and redirection to attackcanceller as a new case at this point - SetTypeBeforeUsingMove(ctx->currentMove, ctx->battlerAtk); - HandleMoveTargetRedirection(); - gBattlescriptCurrInstr = GetMoveBattleScript(ctx->currentMove); + // Possibly better to just move type setting and redirection to attackcanceler as a new case at this point + SetTypeBeforeUsingMove(ctx->move, ctx->battlerAtk); + DetermineTarget(moveTarget, FALSE); + ClearDamageCalcResults(); + gBattlescriptCurrInstr = GetMoveBattleScript(ctx->move); return MOVE_STEP_BREAK; } } @@ -2567,18 +2713,30 @@ static enum MoveCanceller CancellerPPDeduction(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) +// We don't have clear data on where this belongs to but I assume it should at least be checked before Protean +static enum MoveCanceler CancelerSkyBattle(struct BattleContext *ctx) { - enum MoveCanceller effect = MOVE_STEP_SUCCESS; - if (HasWeatherEffect() && GetMovePower(ctx->currentMove) > 0) + if (gBattleStruct->isSkyBattle && IsMoveSkyBattleBanned(gCurrentMove)) { - enum Type moveType = GetBattleMoveType(ctx->currentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (GetGenConfig(GEN_CONFIG_POWDER_RAIN) >= GEN_7 || !TryActivatePowderStatus(ctx->currentMove))) + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return MOVE_STEP_FAILURE; + } + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerWeatherPrimal(struct BattleContext *ctx) +{ + enum MoveCanceler effect = MOVE_STEP_SUCCESS; + if (HasWeatherEffect() && GetMovePower(ctx->move) > 0) + { + enum Type moveType = GetBattleMoveType(ctx->move); + if (moveType == TYPE_FIRE && gBattleWeather & B_WEATHER_RAIN_PRIMAL && (GetConfig(CONFIG_POWDER_STATUS_HEAVY_RAIN) >= GEN_7 || !TryActivatePowderStatus(ctx->move))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; effect = MOVE_STEP_FAILURE; } - else if (moveType == TYPE_WATER && (gBattleWeather & B_WEATHER_SUN_PRIMAL)) + else if (moveType == TYPE_WATER && gBattleWeather & B_WEATHER_SUN_PRIMAL) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_EVAPORATED_IN_SUN; effect = MOVE_STEP_FAILURE; @@ -2586,22 +2744,21 @@ static enum MoveCanceller CancellerWeatherPrimal(struct BattleContext *ctx) if (effect == MOVE_STEP_FAILURE) { gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; - CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); gBattlescriptCurrInstr = BattleScript_PrimalWeatherBlocksMove; } } return effect; } -static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) +static enum MoveCanceler CancelerMoveFailure(struct BattleContext *ctx) { const u8 *battleScript = NULL; - switch (GetMoveEffect(ctx->currentMove)) + switch (GetMoveEffect(ctx->move)) { case EFFECT_FAIL_IF_NOT_ARG_TYPE: - if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->currentMove))) + if (!IS_BATTLER_OF_TYPE(ctx->battlerAtk, GetMoveArgType(ctx->move))) battleScript = BattleScript_ButItFailed; break; case EFFECT_AURA_WHEEL: @@ -2610,40 +2767,56 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) battleScript = BattleScript_PokemonCantUseTheMove; break; case EFFECT_AURORA_VEIL: - if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW) && HasWeatherEffect())) + if (!(gBattleWeather & B_WEATHER_ICY_ANY && HasWeatherEffect())) battleScript = BattleScript_ButItFailed; break; case EFFECT_CLANGOROUS_SOUL: if (gBattleMons[ctx->battlerAtk].hp <= max(1, GetNonDynamaxMaxHP(ctx->battlerAtk) / 3)) battleScript = BattleScript_ButItFailed; break; - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: - case EFFECT_METAL_BURST: - // TODO: Needs a refactor because the moves currently don't work according to new gens + case EFFECT_REFLECT_DAMAGE: + { + enum DamageCategory reflectCategory = GetReflectDamageMoveDamageCategory(ctx->battlerAtk, ctx->move); + if (IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) + battleScript = BattleScript_ButItFailed; + // Counter / Metal Burst and took physical damage + else if (reflectCategory == DAMAGE_CATEGORY_PHYSICAL + && gProtectStructs[ctx->battlerAtk].physicalDmg > 0 + && (GetConfig(CONFIG_COUNTER_TRY_HIT_PARTNER) >= GEN_5 || gBattleMons[gProtectStructs[ctx->battlerAtk].physicalBattlerId].hp)) + break; + // Mirror Coat / Metal Burst and took special damage + else if (reflectCategory == DAMAGE_CATEGORY_SPECIAL + && gProtectStructs[ctx->battlerAtk].specialDmg > 0 + && (GetConfig(CONFIG_COUNTER_TRY_HIT_PARTNER) >= GEN_5 || gBattleMons[gProtectStructs[ctx->battlerAtk].specialBattlerId].hp)) + break; + else + battleScript = BattleScript_ButItFailed; break; + } case EFFECT_DESTINY_BOND: if (DoesDestinyBondFail(ctx->battlerAtk)) battleScript = BattleScript_ButItFailed; break; case EFFECT_FIRST_TURN_ONLY: - if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + if (!gBattleStruct->battlerState[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) battleScript = BattleScript_ButItFailed; break; case EFFECT_MAT_BLOCK: - if (!gDisableStructs[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) + if (!gBattleStruct->battlerState[ctx->battlerAtk].isFirstTurn || gSpecialStatuses[ctx->battlerAtk].instructedChosenTarget) battleScript = BattleScript_ButItFailed; break; case EFFECT_FLING: - if (!CanFling(ctx->battlerAtk)) + if (!CanFling(ctx->battlerAtk, ctx->battlerDef)) battleScript = BattleScript_ButItFailed; + else if (!IsBattlerAlive(ctx->battlerDef)) // Edge case for removing a mon's item when there is no target available after using Fling. + battleScript = BattleScript_FlingFailConsumeItem; break; case EFFECT_FOLLOW_ME: if (B_UPDATED_MOVE_DATA >= GEN_8 && !(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) battleScript = BattleScript_ButItFailed; break; case EFFECT_FUTURE_SIGHT: - if (gWishFutureKnock.futureSightCounter[ctx->battlerDef] > 0) + if (gBattleStruct->futureSight[ctx->battlerDef].counter > 0) battleScript = BattleScript_ButItFailed; break; case EFFECT_LAST_RESORT: @@ -2657,21 +2830,41 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) case EFFECT_POLTERGEIST: if (gBattleMons[ctx->battlerDef].item == ITEM_NONE || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || ctx->abilities[ctx->battlerDef] == ABILITY_KLUTZ) + || ctx->abilityDef == ABILITY_KLUTZ) battleScript = BattleScript_ButItFailed; break; case EFFECT_PROTECT: - // TODO + case EFFECT_ENDURE: + TryResetConsecutiveUseCounter(gBattlerAttacker); + if (IsLastMonToMove(ctx->battlerAtk)) + { + battleScript = BattleScript_ButItFailed; + } + else + { + u32 protectMethod = GetMoveProtectMethod(ctx->move); + bool32 canUseProtectSecondTime = CanUseMoveConsecutively(ctx->battlerAtk); + bool32 canUseWideGuard = (GetConfig(CONFIG_WIDE_GUARD) >= GEN_6 && protectMethod == PROTECT_WIDE_GUARD); + bool32 canUseQuickGuard = (GetConfig(CONFIG_QUICK_GUARD) >= GEN_6 && protectMethod == PROTECT_QUICK_GUARD); + + if (!canUseProtectSecondTime && !canUseWideGuard && !canUseQuickGuard) + battleScript = BattleScript_ButItFailed; + } + if (battleScript != NULL) + { + gBattleMons[gBattlerAttacker].volatiles.consecutiveMoveUses = 0; + gBattleStruct->battlerState[gBattlerAttacker].stompingTantrumTimer = 2; + } break; case EFFECT_REST: if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP - || ctx->abilities[ctx->battlerAtk] == ABILITY_COMATOSE) + || ctx->abilityAtk == ABILITY_COMATOSE) battleScript = BattleScript_RestIsAlreadyAsleep; else if (gBattleMons[ctx->battlerAtk].hp == gBattleMons[ctx->battlerAtk].maxHP) battleScript = BattleScript_AlreadyAtFullHp; - else if (ctx->abilities[ctx->battlerAtk] == ABILITY_INSOMNIA - || ctx->abilities[ctx->battlerAtk] == ABILITY_VITAL_SPIRIT - || ctx->abilities[ctx->battlerAtk] == ABILITY_PURIFYING_SALT) + else if (ctx->abilityAtk == ABILITY_INSOMNIA + || ctx->abilityAtk == ABILITY_VITAL_SPIRIT + || ctx->abilityAtk == ABILITY_PURIFYING_SALT) battleScript = BattleScript_InsomniaProtects; break; case EFFECT_SUCKER_PUNCH: @@ -2679,9 +2872,19 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) || (IsBattleMoveStatus(GetChosenMoveFromPosition(ctx->battlerDef)) && !gProtectStructs[ctx->battlerDef].noValidMoves)) battleScript = BattleScript_ButItFailed; break; + case EFFECT_UPPER_HAND: + { + u32 prio = GetChosenMovePriority(ctx->battlerDef, GetBattlerAbility(ctx->battlerDef)); + if (prio < 1 || prio > 3 // Fails if priority is less than 1 or greater than 3, if target already moved, or if using a status + || HasBattlerActedThisTurn(ctx->battlerDef) + || gChosenMoveByBattler[ctx->battlerDef] == MOVE_NONE + || IsBattleMoveStatus(gChosenMoveByBattler[ctx->battlerDef])) + battleScript = BattleScript_ButItFailed; + break; + } case EFFECT_SNORE: if (!(gBattleMons[ctx->battlerAtk].status1 & STATUS1_SLEEP) - && ctx->abilities[ctx->battlerAtk] != ABILITY_COMATOSE) + && ctx->abilityAtk != ABILITY_COMATOSE) battleScript = BattleScript_ButItFailed; break; case EFFECT_STEEL_ROLLER: @@ -2689,7 +2892,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) battleScript = BattleScript_ButItFailed; break; case EFFECT_STOCKPILE: - if (gDisableStructs[ctx->battlerAtk].stockpileCounter >= 3) + if (gBattleMons[ctx->battlerAtk].volatiles.stockpileCounter >= 3) battleScript = BattleScript_ButItFailed; break; case EFFECT_STUFF_CHEEKS: @@ -2698,7 +2901,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) break; case EFFECT_SWALLOW: case EFFECT_SPIT_UP: - if (gDisableStructs[ctx->battlerAtk].stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) + if (gBattleMons[ctx->battlerAtk].volatiles.stockpileCounter == 0 && !gBattleStruct->snatchedMoveIsUsed) battleScript = BattleScript_ButItFailed; break; case EFFECT_TELEPORT: @@ -2715,7 +2918,6 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) if (battleScript != NULL) { - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gBattlescriptCurrInstr = battleScript; return MOVE_STEP_FAILURE; } @@ -2723,19 +2925,18 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx) +static enum MoveCanceler CancelerPowderStatus(struct BattleContext *ctx) { - if (TryActivatePowderStatus(ctx->currentMove)) + if (TryActivatePowderStatus(ctx->move)) { - if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ABILITY_MAGIC_GUARD)) + if (!IsAbilityAndRecord(ctx->battlerAtk, ctx->abilityAtk, ABILITY_MAGIC_GUARD)) SetPassiveDamageAmount(ctx->battlerAtk, GetNonDynamaxMaxHP(ctx->battlerAtk) / 4); // This might be incorrect if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE || HasTrainerUsedGimmick(ctx->battlerAtk, GIMMICK_Z_MOVE)) gBattlescriptCurrInstr = BattleScript_MoveUsedPowder; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - return MOVE_STEP_BREAK; + return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } @@ -2752,52 +2953,51 @@ bool32 IsDazzlingAbility(enum Ability ability) return FALSE; } -static enum MoveCanceller CancellerPriorityBlock(struct BattleContext *ctx) +static enum MoveCanceler CancelerPriorityBlock(struct BattleContext *ctx) { bool32 effect = FALSE; - s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk]); - u32 blockAbility = ABILITY_NONE; // ability of battler who is blocking - u32 blockedByBattler = ctx->battlerDef; + s32 priority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilityAtk); - if (priority <= 0 || IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef)) + if (priority <= 0) return MOVE_STEP_SUCCESS; - if (IsDazzlingAbility(ctx->abilities[ctx->battlerDef])) + u32 battler; + u32 ability = ABILITY_NONE; // ability of battler who is blocking + bool32 isSpreadMove = IsSpreadMove(GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move)); + for (battler = 0; battler < gBattlersCount; battler++) { - blockAbility = ctx->abilities[ctx->battlerDef]; - effect = TRUE; - } - else if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(ctx->battlerDef))) - { - blockAbility = GetBattlerAbility(BATTLE_PARTNER(ctx->battlerDef)); - if (IsDazzlingAbility(blockAbility)) + if (!IsBattlerAlive(battler) || IsBattlerAlly(ctx->battlerAtk, battler)) + continue; + if (!isSpreadMove && !IsBattlerAlly(battler, ctx->battlerDef)) + continue; + + ability = GetBattlerAbility(battler); + if (IsDazzlingAbility(ability)) { - blockedByBattler = BATTLE_PARTNER(ctx->battlerDef); effect = TRUE; + break; } } if (effect) { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - gLastUsedAbility = blockAbility; - RecordAbilityBattle(blockedByBattler, blockAbility); - gBattleScripting.battler = gBattlerAbility = blockedByBattler; + gLastUsedAbility = ability; + RecordAbilityBattle(battler, ability); + gBattleScripting.battler = gBattlerAbility = battler; gBattlescriptCurrInstr = BattleScript_DazzlingProtected; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) +static enum MoveCanceler CancelerProtean(struct BattleContext *ctx) { - enum Type moveType = GetBattleMoveType(ctx->currentMove); - if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilities[ctx->battlerAtk], ctx->currentMove, moveType)) + enum Type moveType = GetBattleMoveType(ctx->move); + if (ProteanTryChangeType(ctx->battlerAtk, ctx->abilityAtk, ctx->move, moveType)) { - if (GetGenConfig(GEN_PROTEAN_LIBERO) >= GEN_9) - gDisableStructs[ctx->battlerAtk].usedProteanLibero = TRUE; + if (GetConfig(CONFIG_PROTEAN_LIBERO) >= GEN_9) + gBattleMons[ctx->battlerAtk].volatiles.usedProteanLibero = TRUE; PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType); gBattlerAbility = ctx->battlerAtk; PrepareStringBattle(STRINGID_EMPTYSTRING3, ctx->battlerAtk); @@ -2808,34 +3008,473 @@ static enum MoveCanceller CancellerProtean(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerExplodingDamp(struct BattleContext *ctx) +static enum MoveCanceler CancelerExplodingDamp(struct BattleContext *ctx) { u32 dampBattler = IsAbilityOnField(ABILITY_DAMP); - if (dampBattler && IsMoveDampBanned(ctx->currentMove)) + if (dampBattler && IsMoveDampBanned(ctx->move)) { gBattleScripting.battler = dampBattler - 1; gBattlescriptCurrInstr = BattleScript_DampStopsExplosion; - gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; return MOVE_STEP_FAILURE; } return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) +static enum MoveCanceler CancelerExplosion(struct BattleContext *ctx) { - if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT) + // KO user of Explosion; for Final Gambit doesn't happen if target is immune or if it missed + if (IsExplosionMove(ctx->move) + && (GetMoveEffect(ctx->move) != EFFECT_FINAL_GAMBIT || !IsBattlerUnaffectedByMove(ctx->battlerDef))) { - enum Ability ability = ctx->abilities[ctx->battlerAtk]; + BattleScriptCall(BattleScript_Explosion); + return MOVE_STEP_BREAK; + } + + return MOVE_STEP_SUCCESS; +} + +static bool32 CanTwoTurnMoveFireThisTurn(struct BattleContext *ctx) +{ + if (gBattleMoveEffects[GetMoveEffect(ctx->move)].semiInvulnerableEffect + || GetMoveEffect(ctx->move) == EFFECT_GEOMANCY + || !IsBattlerWeatherAffected(ctx->battlerAtk, GetMoveTwoTurnAttackWeather(ctx->move))) + return FALSE; + return TRUE; +} + +static enum MoveCanceler CancelerCharging(struct BattleContext *ctx) +{ + if (!gBattleMoveEffects[GetMoveEffect(ctx->move)].twoTurnEffect + || GetMoveEffect(ctx->move) == EFFECT_SKY_DROP) + return MOVE_STEP_SUCCESS; + + enum MoveCanceler step = MOVE_STEP_SUCCESS; + + if (gBattleMons[ctx->battlerAtk].volatiles.multipleTurns) // Second turn + { + gBattleScripting.animTurn = 1; + gBattleScripting.animTargetsHit = 0; + gBattleMons[ctx->battlerAtk].volatiles.multipleTurns = FALSE; + if (gBattleMoveEffects[GetMoveEffect(ctx->move)].semiInvulnerableEffect) + gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable = STATE_NONE; + step = MOVE_STEP_SUCCESS; + } + else if (!gProtectStructs[ctx->battlerAtk].chargingTurn) // First turn charge + { + gLockedMoves[ctx->battlerAtk] = ctx->move; + gProtectStructs[ctx->battlerAtk].chargingTurn = TRUE; + if (gBattleMoveEffects[GetMoveEffect(ctx->move)].semiInvulnerableEffect) + gBattleMons[ctx->battlerAtk].volatiles.semiInvulnerable = GetMoveTwoTurnAttackStatus(ctx->move); + BattleScriptCall(BattleScript_TwoTurnMoveCharging); + step = MOVE_STEP_PAUSE; + } + else // Try move this turn. Otherwise use next turn + { + if (CanTwoTurnMoveFireThisTurn(ctx)) + { + gBattleScripting.animTurn = 1; + gBattleScripting.animTargetsHit = 0; + gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; + step = MOVE_STEP_SUCCESS; + } + else if (ctx->holdEffectAtk == HOLD_EFFECT_POWER_HERB) + { + gBattleScripting.animTurn = 1; + gBattleScripting.animTargetsHit = 0; + gProtectStructs[ctx->battlerAtk].chargingTurn = FALSE; + gLastUsedItem = gBattleMons[ctx->battlerAtk].item; + BattleScriptCall(BattleScript_PowerHerbActivation); + step = MOVE_STEP_BREAK; + } + else // Use move next turn + { + gBattleMons[ctx->battlerAtk].volatiles.multipleTurns = TRUE; + gBattlescriptCurrInstr = BattleScript_MoveEnd; + step = MOVE_STEP_BREAK; + } + + } + + return step; +} + +static bool32 NoTargetPresent(u32 battler, u32 move, u32 moveTarget) +{ + switch (moveTarget) + { + case TARGET_USER_AND_ALLY: + return FALSE; // At least user is present + case TARGET_ALLY: + if (!IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) // Seems like TARGET_ALLY is retargeting if no ally + return TRUE; + break; + case TARGET_SELECTED: + case TARGET_DEPENDS: + case TARGET_RANDOM: + if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(GetBattleMoveTarget(move, TARGET_NONE))) + return TRUE; + break; + case TARGET_BOTH: + case TARGET_SMART: + if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget))) + return TRUE; + break; + case TARGET_FOES_AND_ALLY: + if (!IsBattlerAlive(gBattlerTarget) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerTarget)) && !IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) + return TRUE; + break; + } + + return FALSE; +} + +static enum MoveCanceler CancelerNoTarget(struct BattleContext *ctx) +{ + enum MoveTarget moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move); + + if (NoTargetPresent(gBattlerAttacker, gCurrentMove, moveTarget)) + { + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return MOVE_STEP_FAILURE; + } + + if (ctx->battlerAtk == ctx->battlerDef + && moveTarget == TARGET_ALLY + && gProtectStructs[BATTLE_PARTNER(ctx->battlerAtk)].usedAllySwitch) + { + gBattlescriptCurrInstr = BattleScript_ButItFailed; + return MOVE_STEP_FAILURE; + } + + return MOVE_STEP_SUCCESS; +} + +static enum MoveCanceler CancelerTookAttack(struct BattleContext *ctx) +{ + if (gSpecialStatuses[gBattlerTarget].abilityRedirected) + { + gSpecialStatuses[gBattlerTarget].abilityRedirected = FALSE; + BattleScriptCall(BattleScript_TookAttack); + return MOVE_STEP_BREAK; + } + return MOVE_STEP_SUCCESS; +} + +#define checkFailure FALSE +#define skipFailure TRUE +static bool32 IsSingleTarget(u32 battlerAtk, u32 battlerDef) +{ + if (battlerDef != gBattlerTarget) + return skipFailure; + return checkFailure; +} + +static bool32 IsSmartTarget(u32 battlerAtk, u32 battlerDef) +{ + if (battlerAtk == BATTLE_PARTNER(battlerDef)) + return skipFailure; + return checkFailure; +} + +static bool32 IsTargetingBothFoes(u32 battlerAtk, u32 battlerDef) +{ + if (battlerDef == BATTLE_PARTNER(battlerAtk) || battlerAtk == battlerDef) + { + // Because of Magic Bounce and Magic Coat we don't want to set MOVE_RESULT_NO_EFFECT + if (GetMoveCategory(gCurrentMove) != DAMAGE_CATEGORY_STATUS) + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; + return skipFailure; + } + return checkFailure; +} + +static bool32 IsTargetingSelf(u32 battlerAtk, u32 battlerDef) +{ + if (battlerAtk != battlerDef) + return skipFailure; + return skipFailure; // In Gen3 the user checks it's own failure. Unclear because no such moves exists +} + +static bool32 IsTargetingAlly(u32 battlerAtk, u32 battlerDef) +{ + if (battlerDef != BATTLE_PARTNER(battlerAtk)) + { + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; + return skipFailure; + } + return checkFailure; +} + +static bool32 IsTargetingSelfAndAlly(u32 battlerAtk, u32 battlerDef) +{ + if (battlerDef != BATTLE_PARTNER(battlerAtk)) + { + if (battlerDef != battlerAtk) // Don't set result flags for user + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; + return skipFailure; + } + return checkFailure; // In Gen3 the user checks it's own failure. Unclear because no such moves exists +} + +static bool32 IsTargetingSelfOrAlly(u32 battlerAtk, u32 battlerDef) +{ + if (battlerDef == battlerAtk) + return skipFailure; + + if (battlerDef != BATTLE_PARTNER(battlerAtk)) + { + gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; + return skipFailure; + } + + return checkFailure; // In Gen3 the user checks it's own failure. Unclear because no such move exists +} + +static bool32 IsTargetingFoesAndAlly(u32 battlerAtk, u32 battlerDef) +{ + if (battlerAtk == battlerDef) + return skipFailure; // Don't set result flags for user + return checkFailure; +} + +static bool32 IsTargetingField(u32 battlerAtk, u32 battlerDef) +{ + return skipFailure; +} + +static bool32 IsTargetingOpponentsField(u32 battlerAtk, u32 battlerDef) +{ + return checkFailure; // Bounce failure only +} + +static bool32 IsTargetingAllBattlers(u32 battlerAtk, u32 battlerDef) +{ + if (GetConfig(CONFIG_CHECK_USER_FAILURE) >= GEN_5 && battlerAtk == battlerDef) + return skipFailure; + return checkFailure; +} + +// ShouldCheckFailureOnTarget +static bool32 (*const sShouldCheckTargetMoveFailure[])(u32 battlerAtk, u32 battlerDef) = +{ + [TARGET_NONE] = IsTargetingField, + [TARGET_SELECTED] = IsSingleTarget, + [TARGET_DEPENDS] = IsSingleTarget, + [TARGET_OPPONENT] = IsSingleTarget, + [TARGET_RANDOM] = IsSingleTarget, + [TARGET_BOTH] = IsTargetingBothFoes, + [TARGET_USER] = IsTargetingSelf, + [TARGET_SMART] = IsSmartTarget, + [TARGET_ALLY] = IsTargetingAlly, + [TARGET_USER_AND_ALLY] = IsTargetingSelfAndAlly, + [TARGET_USER_OR_ALLY] = IsTargetingSelfOrAlly, + [TARGET_FOES_AND_ALLY] = IsTargetingFoesAndAlly, + [TARGET_FIELD] = IsTargetingField, + [TARGET_OPPONENTS_FIELD] = IsTargetingOpponentsField, + [TARGET_ALL_BATTLERS] = IsTargetingAllBattlers, +}; + +static bool32 ShouldCheckTargetMoveFailure(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTarget) +{ + // For Bounced moves + if (IsBattlerUnaffectedByMove(battlerDef)) + return skipFailure; + + return sShouldCheckTargetMoveFailure[moveTarget](battlerAtk, battlerDef); +} +#undef checkFailure +#undef skipFailure + + +static enum MoveCanceler CancelerTargetFailure(struct BattleContext *ctx) +{ + bool32 targetAvoidedAttack = FALSE; + enum MoveTarget moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move); + s32 movePriority = GetChosenMovePriority(ctx->battlerAtk, ctx->abilityAtk); + ctx->moveType = GetBattleMoveType(ctx->move); + ctx->updateFlags = TRUE; + ctx->runScript = TRUE; + + while (gBattleStruct->eventState.atkCancelerBattler < gBattlersCount) + { + ctx->battlerDef = gBattleStruct->eventState.atkCancelerBattler++; + + if (ShouldCheckTargetMoveFailure(ctx->battlerAtk, ctx->battlerDef, ctx->move, moveTarget)) + continue; + + ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); + + if (moveTarget == TARGET_OPPONENTS_FIELD) + { + if (CanBattlerBounceBackMove(ctx)) + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_FAILED; + continue; + } + + if (!IsBattlerAlive(ctx->battlerDef)) + { + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_FAILED; + continue; + } + else if (!BreaksThroughSemiInvulnerablity(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, ctx->abilityDef, ctx->move)) + { + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_FAILED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_AVOIDED_ATK; + if (GetMoveEffect(ctx->move) == EFFECT_FLING) + BattleScriptCall(BattleScript_TargetAvoidsAttackConsumeFlingItem); + else + BattleScriptCall(BattleScript_TargetAvoidsAttack); + targetAvoidedAttack = TRUE; + } + else if (IsBattlerProtected(ctx)) + { + SetOrClearRageVolatile(); + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED; + if (GetMoveEffect(ctx->move) == EFFECT_FLING) + BattleScriptCall(BattleScript_TargetAvoidsAttackConsumeFlingItem); + else + BattleScriptCall(BattleScript_TargetAvoidsAttack); + targetAvoidedAttack = TRUE; + } + else if (CanBattlerBounceBackMove(ctx)) + { + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_FAILED; + } + else if (CanMoveBeBlockedByTarget(ctx, movePriority)) + { + + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; + targetAvoidedAttack = TRUE; + } + else if (GetMoveEffect(ctx->move) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, ctx->battlerDef)) + { + gBattleStruct->moveResultFlags[ctx->battlerDef] = MOVE_RESULT_NO_EFFECT; + BattleScriptCall(BattleScript_ItDoesntAffectFoe); + targetAvoidedAttack = TRUE; + } + else + { + CalcTypeEffectivenessMultiplier(ctx); + + if (ctx->abilityBlocked) + { + ctx->abilityBlocked = FALSE; + gBattleStruct->moveResultFlags[ctx->battlerDef] = MOVE_RESULT_FAILED; + gBattlerAbility = ctx->battlerDef; + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + BattleScriptCall(BattleScript_AbilityPopUp); + targetAvoidedAttack = TRUE; + } + else if (ctx->airBalloonBlocked) + { + ctx->airBalloonBlocked = FALSE; + gBattleStruct->moveResultFlags[ctx->battlerDef] = MOVE_RESULT_FAILED; + BattleScriptCall(BattleScript_DoesntAffectScripting); + targetAvoidedAttack = TRUE; + } + } + + if (targetAvoidedAttack) + { + gLastLandedMoves[gBattlerTarget] = 0; // Might need investigation on what exactly clears is + gLastHitByType[gBattlerTarget] = 0; + gBattleScripting.battler = ctx->battlerDef; + gBattleStruct->pledgeMove = FALSE; + CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELER_CHECK); + return MOVE_STEP_PAUSE; + } + } + + if (IsDoubleBattle()) + { + if (moveTarget == TARGET_BOTH) + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, gBattlerAttacker); + else if (moveTarget == TARGET_FOES_AND_ALLY) + gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, gBattlerAttacker); + } + + ctx->battlerDef = gBattlerTarget; + gBattleStruct->eventState.atkCancelerBattler = 0; + return MOVE_STEP_SUCCESS; +} + +static bool32 CantFullyProtectFromMove(u32 battlerDef) +{ + if (MoveIgnoresProtect(gCurrentMove)) + return FALSE; + if (!IsZMove(gCurrentMove) && !IsMaxMove(gCurrentMove)) + return FALSE; + return GetProtectType(gProtectStructs[battlerDef].protected) == PROTECT_TYPE_SINGLE + && gProtectStructs[battlerDef].protected != PROTECT_MAX_GUARD; +} + +static enum MoveCanceler CancelerNotFullyProtected(struct BattleContext *ctx) +{ + while (gBattleStruct->eventState.atkCancelerBattler < gBattlersCount) + { + u32 battlerDef = gBattleStruct->eventState.atkCancelerBattler++; + + if (CantFullyProtectFromMove(battlerDef)) + { + BattleScriptCall(BattleScript_CouldntFullyProtect); + gBattleScripting.battler = battlerDef; + return MOVE_STEP_PAUSE; + } + } + + gBattleStruct->eventState.atkCancelerBattler = 0; + return MOVE_STEP_SUCCESS; +} + +static bool32 IsMoveParentalBondAffected(struct BattleContext *ctx) +{ + if (ctx->abilityAtk != ABILITY_PARENTAL_BOND + || gBattleStruct->numSpreadTargets > 1 + || IsMoveParentalBondBanned(ctx->move) + || GetMoveCategory(ctx->move) == DAMAGE_CATEGORY_STATUS + || GetMoveEffect(ctx->move) == EFFECT_SEMI_INVULNERABLE + || GetMoveEffect(ctx->move) == EFFECT_TWO_TURNS_ATTACK + || GetActiveGimmick(ctx->battlerAtk) == GIMMICK_Z_MOVE + || ctx->move == MOVE_STRUGGLE) + return FALSE; + return TRUE; +} + +static void SetPossibleNewSmartTarget(u32 move) +{ + if (!IsBattlerUnaffectedByMove(gBattlerTarget) + || !CanTargetPartner(gBattlerAttacker, gBattlerTarget) + || IsAffectedByFollowMe(gBattlerAttacker, GetBattlerSide(gBattlerTarget), move) + || GetBattlerMoveTargetType(gBattlerAttacker, move) != TARGET_SMART) + return; + + u32 partner = BATTLE_PARTNER(gBattlerTarget); + if (!IsBattlerUnaffectedByMove(partner)) + gBattlerTarget = partner; +} + +static enum MoveCanceler CancelerMultihitMoves(struct BattleContext *ctx) +{ + SetPossibleNewSmartTarget(ctx->move); + + if (IsBattlerUnaffectedByMove(gBattlerTarget)) // Dragon Darts can still hit partner + { + gMultiHitCounter = 0; + } + else if (IsMultiHitMove(ctx->move)) + { + enum Ability ability = ctx->abilityAtk; if (ability == ABILITY_SKILL_LINK) { gMultiHitCounter = 5; } - else if (ability == ABILITY_BATTLE_BOND - && ctx->currentMove == MOVE_WATER_SHURIKEN - && gBattleMons[ctx->battlerAtk].species == SPECIES_GRENINJA_ASH) + else if (GetMoveEffect(ctx->move) == EFFECT_SPECIES_POWER_OVERRIDE + && gBattleMons[ctx->battlerAtk].species == GetMoveSpeciesPowerOverride_Species(ctx->move)) { - gMultiHitCounter = 3; + gMultiHitCounter = GetMoveSpeciesPowerOverride_NumOfHits(ctx->move); } else { @@ -2844,30 +3483,26 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } - else if (GetMoveStrikeCount(ctx->currentMove) > 1) + else if (GetMoveStrikeCount(ctx->move) > 1) { - if (GetMoveEffect(ctx->currentMove) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) + if (GetMoveEffect(ctx->move) == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } else { - gMultiHitCounter = GetMoveStrikeCount(ctx->currentMove); - - if (GetMoveEffect(ctx->currentMove) == EFFECT_DRAGON_DARTS - && !IsAffectedByFollowMe(ctx->battlerAtk, GetBattlerSide(ctx->battlerDef), ctx->currentMove) - && CanTargetPartner(ctx->battlerAtk, ctx->battlerDef) - && TargetFullyImmuneToCurrMove(ctx->battlerAtk, ctx->battlerDef)) - gBattlerTarget = BATTLE_PARTNER(ctx->battlerDef); + gMultiHitCounter = GetMoveStrikeCount(ctx->move); } PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 3, 0) } - else if (B_BEAT_UP >= GEN_5 && GetMoveEffect(ctx->currentMove) == EFFECT_BEAT_UP) + else if (GetMoveEffect(ctx->move) == EFFECT_BEAT_UP) { struct Pokemon* party = GetBattlerParty(ctx->battlerAtk); int i; gBattleStruct->beatUpSlot = 0; + gMultiHitCounter = 0; + memset(gBattleStruct->beatUpSpecies, 0xFF, sizeof(gBattleStruct->beatUpSpecies)); for (i = 0; i < PARTY_SIZE; i++) { @@ -2877,12 +3512,20 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) && !GetMonData(&party[i], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_STATUS)) { - gBattleStruct->beatUpSpecies[gBattleStruct->beatUpSlot++] = species; + if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) + gBattleStruct->beatUpSpecies[gMultiHitCounter] = species; + else + gBattleStruct->beatUpSpecies[gMultiHitCounter] = i; gMultiHitCounter++; } } - gBattleStruct->beatUpSlot = 0; + PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) + } + else if (IsMoveParentalBondAffected(ctx)) + { + gSpecialStatuses[gBattlerAttacker].parentalBondState = PARENTAL_BOND_1ST_HIT; + gMultiHitCounter = 2; PREPARE_BYTE_NUMBER_BUFFER(gBattleScripting.multihitString, 1, 0) } else @@ -2893,110 +3536,70 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) return MOVE_STEP_SUCCESS; } -static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx) +static enum MoveCanceler (*const sMoveSuccessOrderCancelers[])(struct BattleContext *ctx) = { - u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove); - enum Ability abilityAtk = ctx->abilities[ctx->battlerAtk]; - - if (IsSpreadMove(moveTarget)) - { - for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) - { - if (gBattleStruct->bouncedMoveIsUsed && !IsOnPlayerSide(battlerDef)) - continue; - - enum Ability abilityDef = GetBattlerAbility(battlerDef); - - if (ctx->battlerAtk == battlerDef - || !IsBattlerAlive(battlerDef) - || (GetMoveEffect(ctx->currentMove) == EFFECT_SYNCHRONOISE && !DoBattlersShareType(ctx->battlerAtk, battlerDef)) - || (moveTarget == MOVE_TARGET_BOTH && ctx->battlerAtk == BATTLE_PARTNER(battlerDef)) - || IsBattlerProtected(ctx->battlerAtk, battlerDef, ctx->currentMove)) // Missing Invulnerable check - { - gBattleStruct->moveResultFlags[battlerDef] = MOVE_RESULT_NO_EFFECT; - gBattleStruct->noResultString[battlerDef] = WILL_FAIL; - } - else if (CanAbilityBlockMove(ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, ctx->currentMove, CHECK_TRIGGER)) - { - gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = WILL_FAIL; - } - else if (CanAbilityAbsorbMove(ctx->battlerAtk, battlerDef, abilityDef, ctx->currentMove, GetBattleMoveType(gCurrentMove), CHECK_TRIGGER)) - { - gBattleStruct->moveResultFlags[battlerDef] = 0; - gBattleStruct->noResultString[battlerDef] = CHECK_ACCURACY; - } - else - { - CalcTypeEffectivenessMultiplierHelper(ctx->currentMove, GetBattleMoveType(ctx->currentMove), ctx->battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE); // Sets moveResultFlags - gBattleStruct->noResultString[battlerDef] = CAN_DAMAGE; - } - } - if (moveTarget == MOVE_TARGET_BOTH) - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER_SIDE, ctx->battlerAtk); - else - gBattleStruct->numSpreadTargets = CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_BATTLER, ctx->battlerAtk); - } - return MOVE_STEP_SUCCESS; -} - -static enum MoveCanceller (*const sMoveSuccessOrderCancellers[])(struct BattleContext *ctx) = -{ - [CANCELLER_CLEAR_FLAGS] = CancellerClearFlags, - [CANCELLER_STANCE_CHANGE_1] = CancellerStanceChangeOne, - [CANCELLER_SKY_DROP] = CancellerSkyDrop, - [CANCELLER_RECHARGE] = CancellerRecharge, - [CANCELLER_ASLEEP_OR_FROZEN] = CancellerAsleepOrFrozen, - [CANCELLER_OBEDIENCE] = CancellerObedience, - [CANCELLER_POWER_POINTS] = CancellerPowerPoints, - [CANCELLER_TRUANT] = CancellerTruant, - [CANCELLER_FLINCH] = CancellerFlinch, - [CANCELLER_DISABLED] = CancellerDisabled, - [CANCELLER_VOLATILE_BLOCKED] = CancellerVolatileBlocked, - [CANCELLER_TAUNTED] = CancellerTaunted, - [CANCELLER_IMPRISONED] = CancellerImprisoned, - [CANCELLER_CONFUSED] = CancellerConfused, - [CANCELLER_GHOST] = CancellerGhost, - [CANCELLER_PARALYSED] = CancellerParalysed, - [CANCELLER_INFATUATION] = CancellerInfatuation, - [CANCELLER_BIDE] = CancellerBide, - [CANCELLER_Z_MOVES] = CancellerZMoves, - [CANCELLER_CHOICE_LOCK] = CancellerChoiceLock, - [CANCELLER_CALLSUBMOVE] = CancellerCallSubmove, - [CANCELLER_THAW] = CancellerThaw, - [CANCELLER_STANCE_CHANGE_2] = CancellerStanceChangeTwo, - [CANCELLER_ATTACKSTRING] = CancellerAttackstring, - [CANCELLER_PPDEDUCTION] = CancellerPPDeduction, - [CANCELLER_WEATHER_PRIMAL] = CancellerWeatherPrimal, - [CANCELLER_MOVE_FAILURE] = CancellerMoveFailure, - [CANCELLER_POWDER_STATUS] = CancellerPowderStatus, - [CANCELLER_PRIORITY_BLOCK] = CancellerPriorityBlock, - [CANCELLER_PROTEAN] = CancellerProtean, - [CANCELLER_EXPLODING_DAMP] = CancellerExplodingDamp, - [CANCELLER_MULTIHIT_MOVES] = CancellerMultihitMoves, - [CANCELLER_MULTI_TARGET_MOVES] = CancellerMultiTargetMoves, + [CANCELER_CLEAR_FLAGS] = CancelerClearFlags, + [CANCELER_STANCE_CHANGE_1] = CancelerStanceChangeOne, + [CANCELER_SKY_DROP] = CancelerSkyDrop, + [CANCELER_RECHARGE] = CancelerRecharge, + [CANCELER_CHILLY_RECEPTION] = CancelerChillyReception, + [CANCELER_ASLEEP_OR_FROZEN] = CancelerAsleepOrFrozen, + [CANCELER_OBEDIENCE] = CancelerObedience, + [CANCELER_POWER_POINTS] = CancelerPowerPoints, + [CANCELER_TRUANT] = CancelerTruant, + [CANCELER_FOCUS_GEN5] = CancelerFocusGen5, + [CANCELER_FLINCH] = CancelerFlinch, + [CANCELER_DISABLED] = CancelerDisabled, + [CANCELER_VOLATILE_BLOCKED] = CancelerVolatileBlocked, + [CANCELER_TAUNTED] = CancelerTaunted, + [CANCELER_IMPRISONED] = CancelerImprisoned, + [CANCELER_CONFUSED] = CancelerConfused, + [CANCELER_GHOST] = CancelerGhost, + [CANCELER_PARALYZED] = CancelerParalyzed, + [CANCELER_INFATUATION] = CancelerInfatuation, + [CANCELER_BIDE] = CancelerBide, + [CANCELER_Z_MOVES] = CancelerZMoves, + [CANCELER_CHOICE_LOCK] = CancelerChoiceLock, + [CANCELER_CALLSUBMOVE] = CancelerCallSubmove, + [CANCELER_THAW] = CancelerThaw, + [CANCELER_STANCE_CHANGE_2] = CancelerStanceChangeTwo, + [CANCELER_ATTACKSTRING] = CancelerAttackstring, + [CANCELER_PPDEDUCTION] = CancelerPPDeduction, + [CANCELER_SKY_BATTLE] = CancelerSkyBattle, + [CANCELER_WEATHER_PRIMAL] = CancelerWeatherPrimal, + [CANCELER_FOCUS_PRE_GEN5] = CancelerFocusPreGen5, + [CANCELER_MOVE_FAILURE] = CancelerMoveFailure, + [CANCELER_POWDER_STATUS] = CancelerPowderStatus, + [CANCELER_PRIORITY_BLOCK] = CancelerPriorityBlock, + [CANCELER_PROTEAN] = CancelerProtean, + [CANCELER_EXPLODING_DAMP] = CancelerExplodingDamp, + [CANCELER_EXPLOSION] = CancelerExplosion, + [CANCELER_CHARGING] = CancelerCharging, + [CANCELER_NO_TARGET] = CancelerNoTarget, + [CANCELER_TOOK_ATTACK] = CancelerTookAttack, + [CANCELER_TARGET_FAILURE] = CancelerTargetFailure, + [CANCELER_NOT_FULLY_PROTECTED] = CancelerNotFullyProtected, + [CANCELER_MULTIHIT_MOVES] = CancelerMultihitMoves, }; -enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx) +enum MoveCanceler AtkCanceler_MoveSuccessOrder(void) { - enum MoveCanceller effect = MOVE_STEP_SUCCESS; + enum MoveCanceler effect = MOVE_STEP_SUCCESS; - while (gBattleStruct->eventState.atkCanceller < CANCELLER_END && effect == MOVE_STEP_SUCCESS) - { - effect = sMoveSuccessOrderCancellers[gBattleStruct->eventState.atkCanceller](ctx); - gBattleStruct->eventState.atkCanceller++; - } + struct BattleContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = gCurrentMove; + ctx.chosenMove = gChosenMove; + ctx.abilityAtk = GetBattlerAbility(ctx.battlerAtk); + ctx.holdEffectAtk = GetBattlerHoldEffect(ctx.battlerAtk); - if (effect == MOVE_STEP_REMOVES_STATUS) + while (gBattleStruct->eventState.atkCanceler < CANCELER_END && effect == MOVE_STEP_SUCCESS) { - BtlController_EmitSetMonData( - ctx->battlerAtk, - B_COMM_TO_CONTROLLER, - REQUEST_STATUS_BATTLE, - 0, - 4, - &gBattleMons[gBattlerAttacker].status1); - MarkBattlerForControllerExec(ctx->battlerAtk); + effect = sMoveSuccessOrderCancelers[gBattleStruct->eventState.atkCanceler](&ctx); + gBattleStruct->unableToUseMove = (effect == MOVE_STEP_FAILURE); + if (effect != MOVE_STEP_PAUSE) + gBattleStruct->eventState.atkCanceler++; } return effect; @@ -3160,12 +3763,11 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2 } } -bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability) +bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, enum Ability ability) { if (gBattleWeather & sBattleWeatherInfo[battleWeatherId].flag) - { return FALSE; - } + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && ability != ABILITY_DESOLATE_LAND && ability != ABILITY_PRIMORDIAL_SEA @@ -3173,29 +3775,41 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, u32 ability) { return FALSE; } - else if (GetGenConfig(GEN_CONFIG_ABILITY_WEATHER) < GEN_6 && ability != ABILITY_NONE) + + if (GetConfig(CONFIG_ABILITY_WEATHER) < GEN_6 && ability != ABILITY_NONE) { gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; - for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].weatherAbilityDone = FALSE; - return TRUE; } else { u32 rock = sBattleWeatherInfo[battleWeatherId].rock; gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; + if (gBattleWeather & B_WEATHER_PRIMAL_ANY) - gWishFutureKnock.weatherDuration = 0; + gBattleStruct->weatherDuration = 0; else if (rock != 0 && GetBattlerHoldEffect(battler) == rock) - gWishFutureKnock.weatherDuration = 8; + gBattleStruct->weatherDuration = 8; else - gWishFutureKnock.weatherDuration = 5; - for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].weatherAbilityDone = FALSE; - return TRUE; + gBattleStruct->weatherDuration = 5; } - return FALSE; + if (ability != ABILITY_NONE) // Weather started by Ability + { + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[battleWeatherId].abilityStartMessage; + gBattleScripting.animArg1 = sBattleWeatherInfo[battleWeatherId].animation; + } + else // Weather started by Move + { + gBattleCommunication[MULTISTRING_CHOOSER] = sBattleWeatherInfo[battleWeatherId].moveStartMessage; + } + + for (u32 i = 0; i < gBattlersCount; i++) + { + gBattleMons[i].volatiles.weatherAbilityDone = FALSE; + ResetParadoxWeatherStat(i); + } + + return TRUE; } bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag) @@ -3208,7 +3822,10 @@ bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag) gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].terrainAbilityDone = FALSE; + { + gBattleMons[i].volatiles.terrainAbilityDone = FALSE; + ResetParadoxTerrainStat(i); + } if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_EXTENDER) gFieldTimers.terrainTimer = 8; else @@ -3247,9 +3864,7 @@ static void ForewarnChooseMove(u32 battler) case EFFECT_SHEER_COLD: data[count].power = 150; break; - case EFFECT_COUNTER: - case EFFECT_MIRROR_COAT: - case EFFECT_METAL_BURST: + case EFFECT_REFLECT_DAMAGE: data[count].power = 120; break; default: @@ -3325,6 +3940,22 @@ bool32 HadMoreThanHalfHpNowDoesnt(u32 battler) && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2; } +u32 NumFaintedBattlersByAttacker(u32 battlerAtk) +{ + u32 battler, numMonsFainted = 0; + + for (battler = 0; battler < gBattlersCount; battler++) + { + if (battler == battlerAtk) + continue; + + if (IsBattlerTurnDamaged(battler) && !IsBattlerAlive(battler)) + numMonsFainted++; + } + + return numMonsFainted; +} + #define ANIM_STAT_HP 0 #define ANIM_STAT_ATK 1 #define ANIM_STAT_DEF 2 @@ -3373,229 +4004,241 @@ void ChooseStatBoostAnimation(u32 battler) #undef ANIM_STAT_ACC #undef ANIM_STAT_EVASION -bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) +bool32 CanMoveBeBlockedByTarget(struct BattleContext *ctx, s32 movePriority) { - const u8 *battleScriptBlocksMove = NULL; + return CanPsychicTerrainProtectTarget(ctx, movePriority) + || CanTargetBlockPranksterMove(ctx, movePriority) + || IsPowderMoveBlocked(ctx) + || CanAbilityAbsorbMove(ctx); +} - switch (abilityDef) - { - case ABILITY_SOUNDPROOF: - if (IsSoundMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - battleScriptBlocksMove = BattleScript_SoundproofProtected; - break; - case ABILITY_BULLETPROOF: - if (IsBallisticMove(move)) - battleScriptBlocksMove = BattleScript_SoundproofProtected; - break; - case ABILITY_GOOD_AS_GOLD: - if (IsBattleMoveStatus(move)) - { - if (!(GetBattlerMoveTargetType(battlerAtk, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_ALL_BATTLERS))) - battleScriptBlocksMove = BattleScript_GoodAsGoldActivates; - } - break; - default: - break; - } - - if (battleScriptBlocksMove == NULL) - { - s32 atkPriority = 0; - if (option == AI_CHECK) - atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); - else - atkPriority = GetChosenMovePriority(battlerAtk, abilityAtk); - - if (atkPriority <= 0) - { - // Not a priority move - } - else if (IsBattleMoveStatus(move) - && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) - && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) - { - if (option == RUN_SCRIPT && !IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected - battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; - } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions - && !IsBattlerAlly(battlerAtk, battlerDef) - && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS - && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) - { - battleScriptBlocksMove = BattleScript_MoveUsedPsychicTerrainPrevents; - if (option == RUN_SCRIPT) - { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - if (!IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) - CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattlescriptCurrInstr = BattleScript_MoveUsedPsychicTerrainPrevents; - return TRUE; // Early return since we don't want to set remaining values - } - } - } - - if (battleScriptBlocksMove == NULL) +bool32 CanPsychicTerrainProtectTarget(struct BattleContext *ctx, s32 movePriority) +{ + if (movePriority <= 0 + || !IsPsychicTerrainAffected(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef, gFieldStatuses) + || IsBattlerAlly(ctx->battlerAtk, ctx->battlerDef) + || GetMoveTarget(ctx->move) == TARGET_ALL_BATTLERS + || GetMoveTarget(ctx->move) == TARGET_OPPONENTS_FIELD) return FALSE; - if (option == RUN_SCRIPT) + if (ctx->runScript) + BattleScriptCall(BattleScript_MoveUsedPsychicTerrainPrevents); + + return TRUE; +} + +bool32 CanTargetBlockPranksterMove(struct BattleContext *ctx, s32 movePriority) +{ + if (movePriority <= 0 + || !IsBattleMoveStatus(ctx->move) + || !BlocksPrankster(ctx->move, ctx->battlerAtk, ctx->battlerDef, TRUE) + || (IsBattleMoveStatus(ctx->move) && (ctx->abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[ctx->battlerDef].bounceMove))) + return FALSE; + + if (ctx->runScript) + BattleScriptCall(BattleScript_DoesntAffectScripting); + + return TRUE; +} + +static bool32 IsPowderMoveBlocked(struct BattleContext *ctx) +{ + if (!IsPowderMove(ctx->move) + || ctx->battlerAtk == ctx->battlerDef + || IsAffectedByPowderMove(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef)) + return FALSE; + + if (ctx->runScript) { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - gLastUsedAbility = abilityDef; - RecordAbilityBattle(battlerDef, abilityDef); - gBattleScripting.battler = gBattlerAbility = battlerDef; - gBattlescriptCurrInstr = battleScriptBlocksMove; + gLastUsedAbility = ctx->abilityDef; + gBattlerAbility = ctx->battlerDef; + BattleScriptCall(BattleScript_PowderMoveNoEffect); } return TRUE; } -bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, enum Type moveType, enum FunctionCallOption option) +bool32 CanAbilityAbsorbMove(struct BattleContext *ctx) { - enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY; const u8 *battleScript = NULL; - enum Stat statId = 0; - u32 statAmount = 1; - switch (abilityDef) + switch (ctx->abilityDef) { - default: - effect = MOVE_ABSORBED_BY_NO_ABILITY; - break; case ABILITY_VOLT_ABSORB: - if (moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) - effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + if (ctx->moveType == TYPE_ELECTRIC) + battleScript = AbsorbedByDrainHpAbility(ctx->battlerDef); break; case ABILITY_WATER_ABSORB: case ABILITY_DRY_SKIN: - if (moveType == TYPE_WATER) - effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + if (ctx->moveType == TYPE_WATER) + battleScript = AbsorbedByDrainHpAbility(ctx->battlerDef); break; case ABILITY_EARTH_EATER: - if (moveType == TYPE_GROUND) - effect = MOVE_ABSORBED_BY_DRAIN_HP_ABILITY; + if (ctx->moveType == TYPE_GROUND) + battleScript = AbsorbedByDrainHpAbility(ctx->battlerDef); break; case ABILITY_MOTOR_DRIVE: - if (moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statId = STAT_SPEED; - } + if (ctx->moveType == TYPE_ELECTRIC) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_SPEED, 1); break; case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_ELECTRIC && GetBattlerMoveTargetType(battlerAtk, move) != MOVE_TARGET_ALL_BATTLERS) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statId = STAT_SPATK; - } + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && ctx->moveType == TYPE_ELECTRIC) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_SPATK, 1); break; case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 && moveType == TYPE_WATER) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statId = STAT_SPATK; - } + if (GetConfig(CONFIG_REDIRECT_ABILITY_IMMUNITY) >= GEN_5 && ctx->moveType == TYPE_WATER) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_SPATK, 1); break; case ABILITY_SAP_SIPPER: - if (moveType == TYPE_GRASS) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statId = STAT_ATK; - } + if (ctx->moveType == TYPE_GRASS) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_ATK, 1); break; case ABILITY_WELL_BAKED_BODY: - if (moveType == TYPE_FIRE) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statAmount = 2; - statId = STAT_DEF; - } + if (ctx->moveType == TYPE_FIRE) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_DEF, 2); break; case ABILITY_WIND_RIDER: - if (IsWindMove(move) && !(GetBattlerMoveTargetType(battlerAtk, move) & MOVE_TARGET_USER)) - { - effect = MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY; - statId = STAT_ATK; - } + if (IsWindMove(ctx->move)) + battleScript = AbsorbedByStatIncreaseAbility(ctx->battlerDef, ctx->abilityDef, STAT_ATK, 1); break; case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[battlerDef].status1 & STATUS1_FREEZE))) - effect = MOVE_ABSORBED_BY_BOOST_FLASH_FIRE; + if (ctx->moveType == TYPE_FIRE && (B_FLASH_FIRE_FROZEN >= GEN_5 || !(gBattleMons[ctx->battlerDef].status1 & STATUS1_FREEZE))) + battleScript = AbsorbedByFlashFire(ctx->battlerDef); + break; + case ABILITY_SOUNDPROOF: + if (IsSoundMove(ctx->move)) + battleScript = BattleScript_SoundproofProtected; + break; + case ABILITY_BULLETPROOF: + if (IsBallisticMove(ctx->move)) + battleScript = BattleScript_SoundproofProtected; + break; + case ABILITY_GOOD_AS_GOLD: + if (IsBattleMoveStatus(ctx->move)) + { + enum MoveTarget target = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move); + if (target != TARGET_OPPONENTS_FIELD && target != TARGET_ALL_BATTLERS) + battleScript = BattleScript_GoodAsGoldActivates; + } break; - } - - if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option != RUN_SCRIPT) - return effect; - - switch (effect) - { default: + break; + } + + if (battleScript == NULL) return FALSE; - case MOVE_ABSORBED_BY_DRAIN_HP_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) - { - battleScript = BattleScript_MonMadeMoveUseless; - } - else - { - battleScript = BattleScript_MoveHPDrain; - SetHealAmount(battlerDef, GetNonDynamaxMaxHP(battlerDef) / 4); - } - break; - case MOVE_ABSORBED_BY_STAT_INCREASE_ABILITY: - gBattleStruct->pledgeMove = FALSE; - if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN, abilityDef)) - { - battleScript = BattleScript_MonMadeMoveUseless; - } - else - { - battleScript = BattleScript_MoveStatDrain; - SET_STATCHANGER(statId, statAmount, FALSE); - if (B_ABSORBING_ABILITY_STRING < GEN_5) - PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - } - break; - case MOVE_ABSORBED_BY_BOOST_FLASH_FIRE: - gBattleStruct->pledgeMove = FALSE; - if (!gDisableStructs[battlerDef].flashFireBoosted) - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; - battleScript = BattleScript_FlashFireBoost; - gDisableStructs[battlerDef].flashFireBoosted = TRUE; - } - else - { - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; - battleScript = BattleScript_FlashFireBoost; - } - break; - } - if (battleScript != NULL) + if (ctx->runScript) { - gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. - gLastUsedAbility = abilityDef; - RecordAbilityBattle(battlerDef, abilityDef); - gBattleScripting.battler = gBattlerAbility = battlerDef; - gBattlescriptCurrInstr = battleScript; + gLastUsedAbility = ctx->abilityDef; + gBattleScripting.battler = gBattlerAbility = ctx->battlerDef; + BattleScriptCall(battleScript); } - return effect; + return TRUE; } -static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer) +const u8 *AbsorbedByDrainHpAbility(u32 battlerDef) +{ + if (IsBattlerAtMaxHp(battlerDef) || (B_HEAL_BLOCKING >= GEN_5 && gBattleMons[battlerDef].volatiles.healBlock)) + { + return BattleScript_MonMadeMoveUseless; + } + else + { + SetHealAmount(battlerDef, GetNonDynamaxMaxHP(battlerDef) / 4); + return BattleScript_MoveHPDrain; + } +} + +const u8 *AbsorbedByStatIncreaseAbility(u32 battlerDef, enum Ability abilityDef, enum Stat statId, u32 statAmount) +{ + if (!CompareStat(battlerDef, statId, MAX_STAT_STAGE, CMP_LESS_THAN, abilityDef)) + { + return BattleScript_MonMadeMoveUseless; + } + else + { + SET_STATCHANGER(statId, statAmount, FALSE); + return BattleScript_MoveStatDrain; + } +} + +const u8 *AbsorbedByFlashFire(u32 battlerDef) +{ + if (!gBattleMons[battlerDef].volatiles.flashFireBoosted) + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; + gBattleMons[battlerDef].volatiles.flashFireBoosted = TRUE; + return BattleScript_FlashFireBoost; + } + else + { + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; + return BattleScript_FlashFireBoost; + } +} + +static bool32 CanBattlerBounceBackMove(struct BattleContext *ctx) +{ + return TryMagicBounce(ctx) || TryMagicCoat(ctx); +} + +static bool32 TryMagicBounce(struct BattleContext *ctx) +{ + if (!MoveCanBeBouncedBack(ctx->move)) + return FALSE; + + if (gBattleStruct->magicBounceActive || gBattleStruct->bouncedMoveIsUsed) + return FALSE; + + if (ctx->abilityDef != ABILITY_MAGIC_BOUNCE) + return FALSE; + + gBattleStruct->magicBounceActive = TRUE; + gBattleStruct->moveBouncer = ctx->battlerDef; + + return TRUE; +} + +static bool32 TryMagicCoat(struct BattleContext *ctx) +{ + if (!MoveCanBeBouncedBack(ctx->move) || gBattleStruct->magicBounceActive) // Magic Bounce has precedence over magic coat + return FALSE; + + if (gBattleStruct->magicCoatActive || gBattleStruct->bouncedMoveIsUsed) + return FALSE; + + if (!gProtectStructs[ctx->battlerDef].bounceMove) + return FALSE; + + gBattleStruct->magicCoatActive = TRUE; + gBattleStruct->moveBouncer = ctx->battlerDef; + + return TRUE; +} + +static u32 GetFirstBattlerOnSide(enum BattleSide side) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerSide(battler) == side && !IsBattlerAlive(battler)) + return battler; + } + + return GetBattlerAtPosition(side == B_SIDE_PLAYER ? B_POSITION_PLAYER_LEFT : B_POSITION_OPPONENT_LEFT); +} + +static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 *timer, u16 time) { if (!(gFieldStatuses & flag)) { gBattleCommunication[MULTISTRING_CHOOSER] = message; + if (STATUS_FIELD_TERRAIN_ANY & flag) + gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= flag; gBattleScripting.animArg1 = anim; - if (gBattleStruct->startingStatusTimer) - *timer = gBattleStruct->startingStatusTimer; - else - *timer = 0; // Infinite + *timer = time; return TRUE; } @@ -3603,7 +4246,7 @@ static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16 return FALSE; } -static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 anim, u16 *timer) +static inline bool32 SetStartingSideStatus(u32 flag, enum BattleSide side, u32 message, u32 anim, u16 *timer, u16 time) { if (!(gSideStatuses[side] & flag)) { @@ -3611,10 +4254,7 @@ static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 gBattleCommunication[MULTISTRING_CHOOSER] = message; gSideStatuses[side] |= flag; gBattleScripting.animArg1 = anim; - if (gBattleStruct->startingStatusTimer) - *timer = gBattleStruct->startingStatusTimer; - else - *timer = 0; // Infinite + *timer = time; return TRUE; } @@ -3622,138 +4262,360 @@ static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 return FALSE; } +static bool32 SetStartingHazardStatus(enum Hazards hazard, u32 targetSide, u8 layers, enum StartingStatusStringID messageId) +{ + bool32 effect = FALSE; + u32 setterSide = (targetSide == B_SIDE_PLAYER) ? B_SIDE_OPPONENT : B_SIDE_PLAYER; + + switch (hazard) + { + case HAZARDS_SPIKES: + if (layers != 0) + { + if (!IsHazardOnSide(targetSide, HAZARDS_SPIKES)) + PushHazardTypeToQueue(targetSide, HAZARDS_SPIKES); + gSideTimers[targetSide].spikesAmount = layers; + effect = TRUE; + } + break; + case HAZARDS_TOXIC_SPIKES: + if (layers != 0) + { + if (!IsHazardOnSide(targetSide, HAZARDS_TOXIC_SPIKES)) + PushHazardTypeToQueue(targetSide, HAZARDS_TOXIC_SPIKES); + gSideTimers[targetSide].toxicSpikesAmount = layers; + effect = TRUE; + } + break; + case HAZARDS_STICKY_WEB: + if (!IsHazardOnSide(targetSide, HAZARDS_STICKY_WEB)) + { + PushHazardTypeToQueue(targetSide, HAZARDS_STICKY_WEB); + gSideTimers[targetSide].stickyWebBattlerId = 0xFF; + gSideTimers[targetSide].stickyWebBattlerSide = setterSide; + effect = TRUE; + } + break; + case HAZARDS_STEALTH_ROCK: + if (!IsHazardOnSide(targetSide, HAZARDS_STEALTH_ROCK)) + { + PushHazardTypeToQueue(targetSide, HAZARDS_STEALTH_ROCK); + effect = TRUE; + } + break; + case HAZARDS_STEELSURGE: + if (!IsHazardOnSide(targetSide, HAZARDS_STEELSURGE)) + { + PushHazardTypeToQueue(targetSide, HAZARDS_STEELSURGE); + effect = TRUE; + } + break; + case HAZARDS_NONE: + case HAZARDS_MAX_COUNT: + break; + } + + if (effect) + { + gBattlerAttacker = GetFirstBattlerOnSide(setterSide); + gBattleScripting.battler = gBattlerAttacker; + gBattlerTarget = GetFirstBattlerOnSide(targetSide); + gBattleCommunication[MULTISTRING_CHOOSER] = messageId; + BattleScriptPushCursorAndCallback(BattleScript_OverworldHazard); + } + + return effect; +} + bool32 TryFieldEffects(enum FieldEffectCases caseId) { bool32 effect = FALSE; bool32 isTerrain = FALSE; - if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_OLD_MAN_TUTORIAL)) + if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_CATCH_TUTORIAL)) return FALSE; switch (caseId) { case FIELD_EFFECT_TRAINER_STATUSES: // starting field/side/etc statuses with a variable - switch ((enum StartingStatus) gBattleStruct->startingStatus) + if (gStartingStatuses.electricTerrain || gStartingStatuses.electricTerrainTemporary) { - case STARTING_STATUS_NONE: - break; - case STARTING_STATUS_ELECTRIC_TERRAIN: effect = SetStartingFieldStatus( STATUS_FIELD_ELECTRIC_TERRAIN, B_MSG_TERRAIN_SET_ELECTRIC, 0, - &gFieldTimers.terrainTimer); + &gFieldTimers.terrainTimer, gStartingStatuses.electricTerrain ? 0 : 5); + gStartingStatuses.electricTerrainTemporary = gStartingStatuses.electricTerrain = FALSE; isTerrain = TRUE; - break; - case STARTING_STATUS_MISTY_TERRAIN: + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + return TRUE; + } + } + else if (gStartingStatuses.mistyTerrain || gStartingStatuses.mistyTerrainTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_MISTY_TERRAIN, B_MSG_TERRAIN_SET_MISTY, 0, - &gFieldTimers.terrainTimer); + &gFieldTimers.terrainTimer, gStartingStatuses.mistyTerrain ? 0 : 5); + gStartingStatuses.mistyTerrainTemporary = gStartingStatuses.mistyTerrain = FALSE; isTerrain = TRUE; - break; - case STARTING_STATUS_GRASSY_TERRAIN: + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + return TRUE; + } + } + else if (gStartingStatuses.grassyTerrain || gStartingStatuses.grassyTerrainTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_GRASSY_TERRAIN, B_MSG_TERRAIN_SET_GRASSY, 0, - &gFieldTimers.terrainTimer); + &gFieldTimers.terrainTimer, gStartingStatuses.grassyTerrain ? 0 : 5); + gStartingStatuses.grassyTerrainTemporary = gStartingStatuses.grassyTerrain = FALSE; isTerrain = TRUE; - break; - case STARTING_STATUS_PSYCHIC_TERRAIN: + if (effect) + { + BattleScriptPushCursorAndCallback(BattleScript_OverworldTerrain); + return TRUE; + } + } + else if (gStartingStatuses.psychicTerrain || gStartingStatuses.psychicTerrainTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_PSYCHIC_TERRAIN, B_MSG_TERRAIN_SET_PSYCHIC, 0, - &gFieldTimers.terrainTimer); + &gFieldTimers.terrainTimer, gStartingStatuses.psychicTerrain ? 0 : 5); + gStartingStatuses.psychicTerrainTemporary = gStartingStatuses.psychicTerrain = FALSE; isTerrain = TRUE; - break; - case STARTING_STATUS_TRICK_ROOM: + } + else if (gStartingStatuses.trickRoom || gStartingStatuses.trickRoomTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_TRICK_ROOM, B_MSG_SET_TRICK_ROOM, B_ANIM_TRICK_ROOM, - &gFieldTimers.trickRoomTimer); - break; - case STARTING_STATUS_MAGIC_ROOM: + &gFieldTimers.trickRoomTimer, gStartingStatuses.trickRoom ? 0 : 5); + gStartingStatuses.trickRoomTemporary = gStartingStatuses.trickRoom = FALSE; + } + else if (gStartingStatuses.magicRoom || gStartingStatuses.magicRoomTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_MAGIC_ROOM, B_MSG_SET_MAGIC_ROOM, B_ANIM_MAGIC_ROOM, - &gFieldTimers.magicRoomTimer); - break; - case STARTING_STATUS_WONDER_ROOM: + &gFieldTimers.magicRoomTimer, gStartingStatuses.magicRoom ? 0 : 5); + gStartingStatuses.magicRoomTemporary = gStartingStatuses.magicRoom = FALSE; + } + else if (gStartingStatuses.wonderRoom || gStartingStatuses.wonderRoomTemporary) + { effect = SetStartingFieldStatus( STATUS_FIELD_WONDER_ROOM, B_MSG_SET_WONDER_ROOM, B_ANIM_WONDER_ROOM, - &gFieldTimers.wonderRoomTimer); - break; - case STARTING_STATUS_TAILWIND_PLAYER: + &gFieldTimers.wonderRoomTimer, gStartingStatuses.wonderRoom ? 0 : 5); + gStartingStatuses.wonderRoomTemporary = gStartingStatuses.wonderRoom = FALSE; + } + else if (gStartingStatuses.tailwindPlayer || gStartingStatuses.tailwindPlayerTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_TAILWIND, B_SIDE_PLAYER, B_MSG_SET_TAILWIND, B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_PLAYER].tailwindTimer); - break; - case STARTING_STATUS_TAILWIND_OPPONENT: + &gSideTimers[B_SIDE_PLAYER].tailwindTimer, gStartingStatuses.tailwindPlayer ? 0 : (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3)); + gStartingStatuses.tailwindPlayerTemporary = gStartingStatuses.tailwindPlayer = FALSE; + } + else if (gStartingStatuses.tailwindOpponent || gStartingStatuses.tailwindOpponentTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_TAILWIND, B_SIDE_OPPONENT, B_MSG_SET_TAILWIND, B_ANIM_TAILWIND, - &gSideTimers[B_SIDE_OPPONENT].tailwindTimer); - break; - case STARTING_STATUS_RAINBOW_PLAYER: + &gSideTimers[B_SIDE_OPPONENT].tailwindTimer, gStartingStatuses.tailwindOpponent ? 0 : (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3)); + gStartingStatuses.tailwindOpponentTemporary = gStartingStatuses.tailwindOpponent = FALSE; + } + else if (gStartingStatuses.rainbowPlayer || gStartingStatuses.rainbowPlayerTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_RAINBOW, B_SIDE_PLAYER, B_MSG_SET_RAINBOW, B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_PLAYER].rainbowTimer); - break; - case STARTING_STATUS_RAINBOW_OPPONENT: + &gSideTimers[B_SIDE_PLAYER].rainbowTimer, gStartingStatuses.rainbowPlayer ? 0 : 4); + gStartingStatuses.rainbowPlayerTemporary = gStartingStatuses.rainbowPlayer = FALSE; + } + else if (gStartingStatuses.rainbowOpponent || gStartingStatuses.rainbowOpponentTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_RAINBOW, B_SIDE_OPPONENT, B_MSG_SET_RAINBOW, B_ANIM_RAINBOW, - &gSideTimers[B_SIDE_OPPONENT].rainbowTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_PLAYER: + &gSideTimers[B_SIDE_OPPONENT].rainbowTimer, gStartingStatuses.rainbowOpponent ? 0 : 4); + gStartingStatuses.rainbowOpponentTemporary = gStartingStatuses.rainbowOpponent = FALSE; + } + else if (gStartingStatuses.seaOfFirePlayer || gStartingStatuses.seaOfFirePlayerTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_SEA_OF_FIRE, B_SIDE_PLAYER, B_MSG_SET_SEA_OF_FIRE, B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer); - break; - case STARTING_STATUS_SEA_OF_FIRE_OPPONENT: + &gSideTimers[B_SIDE_PLAYER].seaOfFireTimer, gStartingStatuses.seaOfFirePlayer ? 0 : 4); + gStartingStatuses.seaOfFirePlayerTemporary = gStartingStatuses.seaOfFirePlayer = FALSE; + } + else if (gStartingStatuses.seaOfFireOpponent || gStartingStatuses.seaOfFireOpponentTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_SEA_OF_FIRE, B_SIDE_OPPONENT, B_MSG_SET_SEA_OF_FIRE, B_ANIM_SEA_OF_FIRE, - &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer); - break; - case STARTING_STATUS_SWAMP_PLAYER: + &gSideTimers[B_SIDE_OPPONENT].seaOfFireTimer, gStartingStatuses.seaOfFireOpponent ? 0 : 4); + gStartingStatuses.seaOfFireOpponentTemporary = gStartingStatuses.seaOfFireOpponent = FALSE; + } + else if (gStartingStatuses.swampPlayer || gStartingStatuses.swampPlayerTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_SWAMP, B_SIDE_PLAYER, B_MSG_SET_SWAMP, B_ANIM_SWAMP, - &gSideTimers[B_SIDE_PLAYER].swampTimer); - break; - case STARTING_STATUS_SWAMP_OPPONENT: + &gSideTimers[B_SIDE_PLAYER].swampTimer, gStartingStatuses.swampPlayer ? 0 : 4); + gStartingStatuses.swampPlayerTemporary = gStartingStatuses.swampPlayer = FALSE; + } + else if (gStartingStatuses.swampOpponent || gStartingStatuses.swampOpponentTemporary) + { effect = SetStartingSideStatus( SIDE_STATUS_SWAMP, B_SIDE_OPPONENT, B_MSG_SET_SWAMP, B_ANIM_SWAMP, - &gSideTimers[B_SIDE_OPPONENT].swampTimer); - break; + &gSideTimers[B_SIDE_OPPONENT].swampTimer, gStartingStatuses.swampOpponent ? 0 : 4); + gStartingStatuses.swampOpponentTemporary = gStartingStatuses.swampOpponent = FALSE; + } + // Hazards - Spikes + else if (gStartingStatuses.spikesPlayerL1) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_PLAYER, 1, B_MSG_SET_SPIKES); + gStartingStatuses.spikesPlayerL1 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.spikesPlayerL2) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_PLAYER, 2, B_MSG_SET_SPIKES); + gStartingStatuses.spikesPlayerL2 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.spikesPlayerL3) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_PLAYER, 3, B_MSG_SET_SPIKES); + gStartingStatuses.spikesPlayerL3 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.spikesOpponentL1) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_OPPONENT, 1, B_MSG_SET_SPIKES); + gStartingStatuses.spikesOpponentL1 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.spikesOpponentL2) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_OPPONENT, 2, B_MSG_SET_SPIKES); + gStartingStatuses.spikesOpponentL2 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.spikesOpponentL3) + { + effect = SetStartingHazardStatus(HAZARDS_SPIKES, B_SIDE_OPPONENT, 3, B_MSG_SET_SPIKES); + gStartingStatuses.spikesOpponentL3 = FALSE; + if (effect) + return TRUE; + } + // Hazards - Toxic Spikes + else if (gStartingStatuses.toxicSpikesPlayerL1) + { + effect = SetStartingHazardStatus(HAZARDS_TOXIC_SPIKES, B_SIDE_PLAYER, 1, B_MSG_SET_POISON_SPIKES); + gStartingStatuses.toxicSpikesPlayerL1 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.toxicSpikesPlayerL2) + { + effect = SetStartingHazardStatus(HAZARDS_TOXIC_SPIKES, B_SIDE_PLAYER, 2, B_MSG_SET_POISON_SPIKES); + gStartingStatuses.toxicSpikesPlayerL2 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.toxicSpikesOpponentL1) + { + effect = SetStartingHazardStatus(HAZARDS_TOXIC_SPIKES, B_SIDE_OPPONENT, 1, B_MSG_SET_POISON_SPIKES); + gStartingStatuses.toxicSpikesOpponentL1 = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.toxicSpikesOpponentL2) + { + effect = SetStartingHazardStatus(HAZARDS_TOXIC_SPIKES, B_SIDE_OPPONENT, 2, B_MSG_SET_POISON_SPIKES); + gStartingStatuses.toxicSpikesOpponentL2 = FALSE; + if (effect) + return TRUE; + } + // Hazards - Sticky Web + else if (gStartingStatuses.stickyWebPlayer) + { + effect = SetStartingHazardStatus(HAZARDS_STICKY_WEB, B_SIDE_PLAYER, 1, B_MSG_SET_STICKY_WEB); + gStartingStatuses.stickyWebPlayer = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.stickyWebOpponent) + { + effect = SetStartingHazardStatus(HAZARDS_STICKY_WEB, B_SIDE_OPPONENT, 1, B_MSG_SET_STICKY_WEB); + gStartingStatuses.stickyWebOpponent = FALSE; + if (effect) + return TRUE; + } + // Hazards - Stealth Rock + else if (gStartingStatuses.stealthRockPlayer) + { + effect = SetStartingHazardStatus(HAZARDS_STEALTH_ROCK, B_SIDE_PLAYER, 1, B_MSG_SET_STEALTH_ROCK); + gStartingStatuses.stealthRockPlayer = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.stealthRockOpponent) + { + effect = SetStartingHazardStatus(HAZARDS_STEALTH_ROCK, B_SIDE_OPPONENT, 1, B_MSG_SET_STEALTH_ROCK); + gStartingStatuses.stealthRockOpponent = FALSE; + if (effect) + return TRUE; + } + // Hazards - Steelsurge + else if (gStartingStatuses.sharpSteelPlayer) + { + effect = SetStartingHazardStatus(HAZARDS_STEELSURGE, B_SIDE_PLAYER, 1, B_MSG_SET_SHARP_STEEL); + gStartingStatuses.sharpSteelPlayer = FALSE; + if (effect) + return TRUE; + } + else if (gStartingStatuses.sharpSteelOpponent) + { + effect = SetStartingHazardStatus(HAZARDS_STEELSURGE, B_SIDE_OPPONENT, 1, B_MSG_SET_SHARP_STEEL); + gStartingStatuses.sharpSteelOpponent = FALSE; + if (effect) + return TRUE; } if (effect) { @@ -3762,6 +4624,7 @@ bool32 TryFieldEffects(enum FieldEffectCases caseId) else BattleScriptPushCursorAndCallback(BattleScript_OverworldStatusStarts); } + break; case FIELD_EFFECT_OVERWORLD_TERRAIN: // terrain starting from overworld weather if (B_THUNDERSTORM_TERRAIN == TRUE @@ -3818,7 +4681,7 @@ bool32 TryFieldEffects(enum FieldEffectCases caseId) } break; case WEATHER_SNOW: - if (!(gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW))) + if (!(gBattleWeather & B_WEATHER_ICY_ANY)) { if (B_OVERWORLD_SNOW >= GEN_9) { @@ -3855,31 +4718,26 @@ bool32 TryFieldEffects(enum FieldEffectCases caseId) return effect; } -u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg) +u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ability, enum Move move, bool32 shouldAbilityTrigger) { u32 effect = 0; enum Type moveType = 0; - u32 move = 0; u32 side = 0; u32 i = 0, j = 0; u32 partner = 0; - if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_OLD_MAN_TUTORIAL)) + if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_CATCH_TUTORIAL)) return 0; if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; - if (special) - gLastUsedAbility = special; - else if (ability) + if (ability) gLastUsedAbility = ability; else gLastUsedAbility = GetBattlerAbility(battler); - if (moveArg) - move = moveArg; - else + if (move == MOVE_NONE) move = gCurrentMove; moveType = GetBattleMoveType(move); @@ -3896,8 +4754,6 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab u32 target1; u32 target2; - if (gSpecialStatuses[battler].switchInAbilityDone) - break; if (GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD) break; @@ -3922,7 +4778,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (effect != 0) { - BattleScriptPushCursorAndCallback(BattleScript_TraceActivates); + BattleScriptCall(BattleScript_TraceActivates); gBattleStruct->tracedAbility[battler] = gLastUsedAbility = gBattleMons[chosenTarget].ability; RecordAbilityBattle(chosenTarget, gLastUsedAbility); // Record the opposing battler has this ability PREPARE_MON_NICK_WITH_PREFIX_LOWER_BUFFER(gBattleTextBuff1, chosenTarget, gBattlerPartyIndexes[chosenTarget]) @@ -3931,14 +4787,14 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_IMPOSTER: + if (gBattleStruct->battlerState[battler].switchIn) { u32 diagonalBattler = BATTLE_OPPOSITE(battler); if (IsDoubleBattle()) diagonalBattler = BATTLE_PARTNER(diagonalBattler); // Imposter only activates when the battler first switches in - if (gDisableStructs[battler].isFirstTurn == 2 - && !gDisableStructs[battler].overwrittenAbility + if (!gBattleMons[battler].volatiles.overwrittenAbility && IsBattlerAlive(diagonalBattler) && !gBattleMons[diagonalBattler].volatiles.substitute && !gBattleMons[diagonalBattler].volatiles.transformed @@ -3950,97 +4806,70 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab SaveBattlerTarget(gBattlerTarget); gBattlerAttacker = battler; gBattlerTarget = diagonalBattler; - BattleScriptPushCursorAndCallback(BattleScript_ImposterActivates); + BattleScriptCall(BattleScript_ImposterActivates); effect++; } } break; case ABILITY_MOLD_BREAKER: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_MOLDBREAKER; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_TERAVOLT: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_TERAVOLT; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_TURBOBLAZE: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_TURBOBLAZE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_SLOW_START: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { - gDisableStructs[battler].slowStartTimer = 5; + gBattleMons[battler].volatiles.slowStartTimer = B_SLOW_START_TIMER; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SLOWSTART; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - effect++; - } - break; - case ABILITY_UNNERVE: - if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) - { - gEffectBattler = GetOppositeBattler(battler); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; - gDisableStructs[battler].unnerveActivated = TRUE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - effect++; - } - break; - case ABILITY_AS_ONE_ICE_RIDER: - case ABILITY_AS_ONE_SHADOW_RIDER: - if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) - { - gEffectBattler = GetOppositeBattler(battler); - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; - gDisableStructs[battler].unnerveActivated = TRUE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_CURIOUS_MEDICINE: - if (!gSpecialStatuses[battler].switchInAbilityDone && IsDoubleBattle() - && IsBattlerAlive(BATTLE_PARTNER(battler)) && TryResetBattlerStatChanges(BATTLE_PARTNER(battler))) + if (shouldAbilityTrigger + && IsDoubleBattle() + && IsBattlerAlive(BATTLE_PARTNER(battler)) + && TryResetBattlerStatChanges(BATTLE_PARTNER(battler))) { gEffectBattler = BATTLE_PARTNER(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_CURIOUS_MEDICINE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_PASTEL_VEIL: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { SaveBattlerTarget(gBattlerTarget); gBattlerTarget = battler; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PASTEL_VEIL; - BattleScriptPushCursorAndCallback(BattleScript_PastelVeilActivates); + BattleScriptCall(BattleScript_PastelVeilActivates); effect++; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; } break; case ABILITY_ANTICIPATION: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; uq4_12_t modifier = UQ_4_12(1.0); for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -4073,31 +4902,28 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (effect != 0) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ANTICIPATION; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); } } break; case ABILITY_FRISK: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_FriskActivates); // Try activate + BattleScriptCall(BattleScript_FriskActivates); effect++; } return effect; // Note: It returns effect as to not record the ability if Frisk does not activate. case ABILITY_FOREWARN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { ForewarnChooseMove(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FOREWARN; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_DOWNLOAD: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { enum Stat statId; u32 opposingBattler; @@ -4122,199 +4948,196 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab else statId = STAT_SPATK; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { SET_STATCHANGER(statId, 1, FALSE); SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; PREPARE_STAT_BUFFER(gBattleTextBuff1, statId); - BattleScriptPushCursorAndCallback(BattleScript_AttackerAbilityStatRaiseEnd3); + BattleScriptCall(BattleScript_AttackerAbilityStatRaiseEnd3); effect++; } } break; case ABILITY_PRESSURE: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_PRESSURE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_DARK_AURA: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_DARKAURA; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_FAIRY_AURA: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_FAIRYAURA; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_AURA_BREAK: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_AURABREAK; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_COMATOSE: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_COMATOSE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_SCREEN_CLEANER: - if (!gSpecialStatuses[battler].switchInAbilityDone && TryRemoveScreens(battler)) + if (shouldAbilityTrigger && TryRemoveScreens(battler)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SCREENCLEANER; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); + BattleScriptCall(BattleScript_SwitchInAbilityMsg); effect++; } break; case ABILITY_DRIZZLE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + BattleScriptCall(BattleScript_BlockedByPrimalWeather); effect++; } break; case ABILITY_SAND_STREAM: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + BattleScriptCall(BattleScript_BlockedByPrimalWeather); effect++; } break; case ABILITY_ORICHALCUM_PULSE: case ABILITY_DROUGHT: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); + BattleScriptCall(BattleScript_BlockedByPrimalWeather); effect++; } break; case ABILITY_SNOW_WARNING: - if (GetGenConfig(GEN_SNOW_WARNING) >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, gLastUsedAbility)) + if (!shouldAbilityTrigger) + break; { - BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesSnow); - effect++; - } - else if (GetGenConfig(GEN_SNOW_WARNING) < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, gLastUsedAbility)) - { - BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesHail); - effect++; - } - else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect() && !gSpecialStatuses[battler].switchInAbilityDone) - { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BlockedByPrimalWeatherEnd3); - effect++; + u32 weather = (GetConfig(CONFIG_SNOW_WARNING) >= GEN_9 ? BATTLE_WEATHER_SNOW : BATTLE_WEATHER_HAIL); + if (TryChangeBattleWeather(battler, weather, gLastUsedAbility)) + { + BattleScriptCall(BattleScript_WeatherAbilityActivates); + effect++; + } + else if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) + { + BattleScriptCall(BattleScript_BlockedByPrimalWeather); + effect++; + } } break; case ABILITY_ELECTRIC_SURGE: case ABILITY_HADRON_ENGINE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) { - BattleScriptPushCursorAndCallback(BattleScript_ElectricSurgeActivates); + BattleScriptCall(BattleScript_ElectricSurgeActivates); effect++; } break; case ABILITY_GRASSY_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_GRASSY_TERRAIN)) { - BattleScriptPushCursorAndCallback(BattleScript_GrassySurgeActivates); + BattleScriptCall(BattleScript_GrassySurgeActivates); effect++; } break; case ABILITY_MISTY_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_MISTY_TERRAIN)) { - BattleScriptPushCursorAndCallback(BattleScript_MistySurgeActivates); + BattleScriptCall(BattleScript_MistySurgeActivates); effect++; } break; case ABILITY_PSYCHIC_SURGE: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleTerrain(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) { - BattleScriptPushCursorAndCallback(BattleScript_PsychicSurgeActivates); + BattleScriptCall(BattleScript_PsychicSurgeActivates); effect++; } break; case ABILITY_INTIMIDATE: - if (!gSpecialStatuses[battler].switchInAbilityDone && !IsOpposingSideEmpty(battler)) + if (shouldAbilityTrigger && !IsOpposingSideEmpty(battler)) { SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, TRUE); - BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivates); + BattleScriptCall(BattleScript_IntimidateActivates); effect++; } break; case ABILITY_SUPERSWEET_SYRUP: - if (!gSpecialStatuses[battler].switchInAbilityDone + if (shouldAbilityTrigger && !GetBattlerPartyState(battler)->supersweetSyrup && !IsOpposingSideEmpty(battler)) { SaveBattlerAttacker(gBattlerAttacker); gBattlerAttacker = battler; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; GetBattlerPartyState(battler)->supersweetSyrup = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_SupersweetSyrupActivates); + BattleScriptCall(BattleScript_SupersweetSyrupActivates); effect++; } break; case ABILITY_CLOUD_NINE: case ABILITY_AIR_LOCK: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_AnnounceAirLockCloudNine); + BattleScriptCall(BattleScript_AnnounceAirLockCloudNine); effect++; } break; case ABILITY_TERAFORM_ZERO: - if (!gSpecialStatuses[battler].switchInAbilityDone - && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) + if (gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_ActivateTeraformZero); + BattleScriptCall(BattleScript_ActivateTeraformZero); effect++; } break; @@ -4326,162 +5149,128 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_SHIELDS_DOWN: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeEnd3); + BattleScriptCall(BattleScript_BattlerFormChange); effect++; } break; case ABILITY_INTREPID_SWORD: - if (!gSpecialStatuses[battler].switchInAbilityDone - && !GetBattlerPartyState(battler)->intrepidSwordBoost) + if (shouldAbilityTrigger && !GetBattlerPartyState(battler)->intrepidSwordBoost) { - if (GetGenConfig(GEN_INTREPID_SWORD) == GEN_9) + if (GetConfig(CONFIG_INTREPID_SWORD) == GEN_9) GetBattlerPartyState(battler)->intrepidSwordBoost = TRUE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; + if (CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + BattleScriptCall(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; } } break; case ABILITY_DAUNTLESS_SHIELD: - if (!gSpecialStatuses[battler].switchInAbilityDone - && !GetBattlerPartyState(battler)->dauntlessShieldBoost) + if (shouldAbilityTrigger && !GetBattlerPartyState(battler)->dauntlessShieldBoost) { - if (GetGenConfig(GEN_DAUNTLESS_SHIELD) == GEN_9) + if (GetConfig(CONFIG_DAUNTLESS_SHIELD) == GEN_9) GetBattlerPartyState(battler)->dauntlessShieldBoost = TRUE; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; + if (CompareStat(battler, STAT_DEF, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility)) { SET_STATCHANGER(STAT_DEF, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + BattleScriptCall(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; } } break; case ABILITY_WIND_RIDER: - if (!gSpecialStatuses[battler].switchInAbilityDone + if (shouldAbilityTrigger && CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(STAT_ATK, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); + BattleScriptCall(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; } break; case ABILITY_DESOLATE_LAND: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SUN_PRIMAL, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_DesolateLandActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } break; case ABILITY_PRIMORDIAL_SEA: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_RAIN_PRIMAL, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_PrimordialSeaActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } break; case ABILITY_DELTA_STREAM: + if (!shouldAbilityTrigger) + break; if (TryChangeBattleWeather(battler, BATTLE_WEATHER_STRONG_WINDS, gLastUsedAbility)) { - BattleScriptPushCursorAndCallback(BattleScript_DeltaStreamActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } break; case ABILITY_VESSEL_OF_RUIN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleMons[battler].volatiles.vesselOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); + BattleScriptCall(BattleScript_RuinAbilityActivates); effect++; } break; case ABILITY_SWORD_OF_RUIN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleMons[battler].volatiles.swordOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); + BattleScriptCall(BattleScript_RuinAbilityActivates); effect++; } break; case ABILITY_TABLETS_OF_RUIN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleMons[battler].volatiles.tabletsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); + BattleScriptCall(BattleScript_RuinAbilityActivates); effect++; } break; case ABILITY_BEADS_OF_RUIN: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { gBattleMons[battler].volatiles.beadsOfRuin = TRUE; PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_RuinAbilityActivates); + BattleScriptCall(BattleScript_RuinAbilityActivates); effect++; } break; case ABILITY_SUPREME_OVERLORD: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; gBattleStruct->supremeOverlordCounter[battler] = min(5, GetBattlerSideFaintCounter(battler)); if (gBattleStruct->supremeOverlordCounter[battler] > 0) { - BattleScriptPushCursorAndCallback(BattleScript_SupremeOverlordActivates); + BattleScriptCall(BattleScript_SupremeOverlordActivates); effect++; } } break; - case ABILITY_COSTAR: - if (!gSpecialStatuses[battler].switchInAbilityDone - && IsDoubleBattle() - && IsBattlerAlive(BATTLE_PARTNER(battler)) - && CountBattlerStatIncreases(BATTLE_PARTNER(battler), FALSE)) - { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[battler].statStages[i] = gBattleMons[BATTLE_PARTNER(battler)].statStages[i]; - gEffectBattler = BATTLE_PARTNER(battler); - BattleScriptPushCursorAndCallback(BattleScript_CostarActivates); - effect++; - } - break; case ABILITY_ZERO_TO_HERO: - if (!gSpecialStatuses[battler].switchInAbilityDone - && GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO + if (GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES) == SPECIES_PALAFIN_HERO && !GetBattlerPartyState(battler)->transformZeroToHero) { - gSpecialStatuses[battler].switchInAbilityDone = TRUE; GetBattlerPartyState(battler)->transformZeroToHero = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_ZeroToHeroActivates); - effect++; - } - break; - case ABILITY_HOSPITALITY: - partner = BATTLE_PARTNER(battler); - - if (!gSpecialStatuses[battler].switchInAbilityDone - && IsDoubleBattle() - && !gBattleMons[partner].volatiles.healBlock - && gBattleMons[partner].hp < gBattleMons[partner].maxHP - && IsBattlerAlive(partner)) - { - gEffectBattler = partner; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - SetHealAmount(partner, GetNonDynamaxMaxHP(partner) / 4); - BattleScriptPushCursorAndCallback(BattleScript_HospitalityActivates); + BattleScriptCall(BattleScript_ZeroToHeroActivates); effect++; } break; @@ -4489,7 +5278,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK: case ABILITY_EMBODY_ASPECT_WELLSPRING_MASK: case ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (shouldAbilityTrigger) { enum Stat stat; @@ -4505,43 +5294,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (CompareStat(battler, stat, MAX_STAT_STAGE, CMP_EQUAL, gLastUsedAbility)) break; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; SET_STATCHANGER(stat, 1, FALSE); - BattleScriptPushCursorAndCallback(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); - effect++; - } - break; - case ABILITY_TERA_SHIFT: - if (!gSpecialStatuses[battler].switchInAbilityDone - && gBattleMons[battler].species == SPECIES_TERAPAGOS_NORMAL - && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_SWITCH)) - { - gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_TERA_SHIFT; - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); - effect++; - } - break; - case ABILITY_COMMANDER: - partner = BATTLE_PARTNER(battler); - if (!gSpecialStatuses[battler].switchInAbilityDone - && IsBattlerAlive(partner) - && IsBattlerAlive(battler) - && gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE - && gBattleMons[partner].species == SPECIES_DONDOZO - && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) - { - SaveBattlerAttacker(gBattlerAttacker); - gSpecialStatuses[battler].switchInAbilityDone = TRUE; - gBattlerAttacker = partner; - gBattleStruct->battlerState[battler].commandingDondozo = TRUE; - gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species; - gBattleMons[battler].volatiles.semiInvulnerable = STATE_COMMANDER; - if (gBattleMons[battler].volatiles.confusionTurns > 0 && !gBattleMons[battler].volatiles.infiniteConfusion) - gBattleMons[battler].volatiles.confusionTurns--; - BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); - MarkBattlerForControllerExec(battler); - BattleScriptPushCursorAndCallback(BattleScript_CommanderActivates); + BattleScriptCall(BattleScript_BattlerAbilityStatRaiseOnSwitchIn); effect++; } break; @@ -4578,7 +5332,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_ICE_BODY: - if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) + if (IsBattlerWeatherAffected(battler, B_WEATHER_ICY_ANY) && !IsBattlerAtMaxHp(battler) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER @@ -4613,7 +5367,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_SHED_SKIN: if ((gBattleMons[battler].status1 & STATUS1_ANY) - && (B_ABILITY_TRIGGER_CHANCE == GEN_4 ? RandomPercentage(RNG_SHED_SKIN, 30) : RandomChance(RNG_SHED_SKIN, 1, 3))) + && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) == GEN_4 ? RandomPercentage(RNG_SHED_SKIN, 30) : RandomChance(RNG_SHED_SKIN, 1, 3))) { ABILITY_HEAL_MON_STATUS: if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON)) @@ -4628,7 +5382,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); if (gBattleMons[battler].status1 & STATUS1_BURN) StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - if (gBattleMons[battler].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) + if (gBattleMons[battler].status1 & STATUS1_ICY_ANY) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[battler].status1 = 0; @@ -4641,7 +5395,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SPEED_BOOST: - if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && gDisableStructs[battler].isFirstTurn != 2) + if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, gLastUsedAbility) && gBattleStruct->battlerState[battler].isFirstTurn != 2) { SaveBattlerAttacker(gBattlerAttacker); SET_STATCHANGER(STAT_SPEED, 1, FALSE); @@ -4651,10 +5405,10 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_MOODY: - if (gDisableStructs[battler].isFirstTurn != 2) + if (gBattleStruct->battlerState[battler].isFirstTurn != 2) { u32 validToRaise = 0, validToLower = 0; - u32 statsNum = GetGenConfig(GEN_CONFIG_MOODY_STATS) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; + u32 statsNum = GetConfig(CONFIG_MOODY_ACC_EVASION) >= GEN_8 ? NUM_STATS : NUM_BATTLE_STATS; for (i = STAT_ATK; i < statsNum; i++) { @@ -4682,10 +5436,10 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_TRUANT: - gDisableStructs[gBattlerAttacker].truantCounter ^= 1; + gBattleMons[gBattlerAttacker].volatiles.truantCounter ^= 1; break; case ABILITY_SLOW_START: - if (gDisableStructs[battler].slowStartTimer > 0 && --gDisableStructs[battler].slowStartTimer == 0) + if (gBattleMons[battler].volatiles.slowStartTimer > 0 && --gBattleMons[battler].volatiles.slowStartTimer == 0) { BattleScriptExecute(BattleScript_SlowStartEnds); effect++; @@ -4736,7 +5490,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_BALL_FETCH: - if (gBattleMons[battler].item == ITEM_NONE + if (!(gBattleTypeFlags & BATTLE_TYPE_RAID) + && gBattleMons[battler].item == ITEM_NONE && gBattleResults.catchAttempts[ItemIdToBallId(gLastUsedBall)] >= 1 && !gHasFetchedBall) { @@ -4761,18 +5516,18 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_CUD_CHEW: - if (gDisableStructs[battler].cudChew == TRUE) + if (gBattleMons[battler].volatiles.cudChew == TRUE) { gBattleScripting.battler = battler; - gDisableStructs[battler].cudChew = FALSE; + gBattleMons[battler].volatiles.cudChew = FALSE; gLastUsedItem = GetBattlerPartyState(battler)->usedHeldItem; GetBattlerPartyState(battler)->usedHeldItem = ITEM_NONE; BattleScriptExecute(BattleScript_CudChewActivates); effect++; } - else if (!gDisableStructs[battler].cudChew && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) + else if (!gBattleMons[battler].volatiles.cudChew && GetItemPocket(GetBattlerPartyState(battler)->usedHeldItem) == POCKET_BERRIES) { - gDisableStructs[battler].cudChew = TRUE; + gBattleMons[battler].volatiles.cudChew = TRUE; } break; default: @@ -4891,14 +5646,14 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_CURSED_BODY: if (IsBattlerTurnDamaged(gBattlerTarget) - && gDisableStructs[gBattlerAttacker].disabledMove == MOVE_NONE + && gBattleMons[gBattlerAttacker].volatiles.disabledMove == MOVE_NONE && IsBattlerAlive(gBattlerAttacker) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL) && gChosenMove != MOVE_STRUGGLE && RandomPercentage(RNG_CURSED_BODY, 30)) { - gDisableStructs[gBattlerAttacker].disabledMove = gChosenMove; - gDisableStructs[gBattlerAttacker].disableTimer = 4; + gBattleMons[gBattlerAttacker].volatiles.disabledMove = gChosenMove; + gBattleMons[gBattlerAttacker].volatiles.disableTimer = B_DISABLE_TIMER; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gChosenMove); BattleScriptCall(BattleScript_CursedBodyActivates); effect++; @@ -4909,7 +5664,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) - && gDisableStructs[gBattlerAttacker].overwrittenAbility != GetBattlerAbility(gBattlerTarget) + && gBattleMons[gBattlerAttacker].volatiles.overwrittenAbility != GetBattlerAbility(gBattlerTarget) && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) @@ -4922,7 +5677,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerAttacker].volatiles.overwrittenAbility = gBattleMons[gBattlerTarget].ability; BattleScriptCall(BattleScript_MummyActivates); effect++; break; @@ -4948,8 +5703,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab RemoveAbilityFlags(gBattlerAttacker); gLastUsedAbility = gBattleMons[gBattlerAttacker].ability; - gBattleMons[gBattlerAttacker].ability = gDisableStructs[gBattlerAttacker].overwrittenAbility = gBattleMons[gBattlerTarget].ability; - gBattleMons[gBattlerTarget].ability = gDisableStructs[gBattlerTarget].overwrittenAbility = gLastUsedAbility; + gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerAttacker].volatiles.overwrittenAbility = gBattleMons[gBattlerTarget].ability; + gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerTarget].volatiles.overwrittenAbility = gLastUsedAbility; BattleScriptCall(BattleScript_WanderingSpiritActivates); effect++; break; @@ -4970,7 +5725,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_TANGLING_HAIR: if (IsBattlerAlive(gBattlerAttacker) && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN, gLastUsedAbility) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { @@ -4983,7 +5738,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab case ABILITY_ROUGH_SKIN: case ABILITY_IRON_BARBS: if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { @@ -4994,7 +5749,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_AFTERMATH: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + if (!IsBattlerUnaffectedByMove(gBattlerTarget) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) @@ -5014,7 +5769,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_INNARDS_OUT: - if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + if (!IsBattlerUnaffectedByMove(gBattlerTarget) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker)) { @@ -5036,7 +5791,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab { u32 poison, paralysis, sleep; - if (B_ABILITY_TRIGGER_CHANCE >= GEN_5) + if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_5) { poison = 9; paralysis = 19; @@ -5048,7 +5803,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } sleep = 30; - i = RandomUniform(RNG_EFFECT_SPORE, 0, B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? 99 : 299); + i = RandomUniform(RNG_EFFECT_SPORE, 0, GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? 99 : 299); if (i < poison) goto POISON_POINT; if (i < paralysis) @@ -5056,7 +5811,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab // Sleep if (i < sleep && IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && CanBeSlept(gBattlerTarget, gBattlerAttacker, abilityAtk, NOT_BLOCKED_BY_SLEEP_CLAUSE) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, holdEffectAtk, move)) @@ -5074,13 +5829,13 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_POISON_POINT: - if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) + if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_POISON_POINT, 30) : RandomChance(RNG_POISON_POINT, 1, 3)) { POISON_POINT: { enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, abilityAtk) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) @@ -5096,13 +5851,13 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_STATIC: - if (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) + if (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_STATIC, 30) : RandomChance(RNG_STATIC, 1, 3)) { STATIC: { enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, abilityAtk) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) @@ -5119,11 +5874,11 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_FLAME_BODY: if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) - && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) + && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5135,10 +5890,10 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_CUTE_CHARM: if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) - && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) + && (GetConfig(CONFIG_ABILITY_TRIGGER_CHANCE) >= GEN_4 ? RandomPercentage(RNG_CUTE_CHARM, 30) : RandomChance(RNG_CUTE_CHARM, 1, 3)) && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) @@ -5160,7 +5915,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_COTTON_DOWN: if (IsBattlerAlive(gBattlerAttacker) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget)) { gEffectBattler = gBattlerTarget; @@ -5181,25 +5936,25 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SAND_SPIT: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleWeather & B_WEATHER_SANDSTORM && HasWeatherEffect())) { if (gBattleWeather & B_WEATHER_PRIMAL_ANY && HasWeatherEffect()) { - BattleScriptCall(BattleScript_BlockedByPrimalWeatherRet); + BattleScriptCall(BattleScript_BlockedByPrimalWeather); effect++; } - else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, gLastUsedAbility)) + else if (TryChangeBattleWeather(battler, BATTLE_WEATHER_SANDSTORM, ABILITY_SAND_STREAM)) { gBattleScripting.battler = battler; - BattleScriptCall(BattleScript_SandSpitActivates); + BattleScriptCall(BattleScript_WeatherAbilityActivates); effect++; } } break; case ABILITY_PERISH_BODY: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) @@ -5208,16 +5963,16 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (!gBattleMons[battler].volatiles.perishSong) { gBattleMons[battler].volatiles.perishSong = TRUE; - gDisableStructs[battler].perishSongTimer = 3; + gBattleMons[battler].volatiles.perishSongTimer = 3; } gBattleMons[gBattlerAttacker].volatiles.perishSong = TRUE; - gDisableStructs[gBattlerAttacker].perishSongTimer = 3; + gBattleMons[gBattlerAttacker].volatiles.perishSongTimer = 3; BattleScriptCall(BattleScript_PerishBodyActivates); effect++; } break; case ABILITY_GULP_MISSILE: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerTarget].species != SPECIES_CRAMORANT) @@ -5225,7 +5980,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (!IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) SetPassiveDamageAmount(gBattlerAttacker, GetNonDynamaxMaxHP(gBattlerAttacker) / 4); - switch(gBattleMons[gBattlerTarget].species) + switch (gBattleMons[gBattlerTarget].species) { case SPECIES_CRAMORANT_GORGING: TryBattleFormChange(battler, FORM_CHANGE_HIT_BY_MOVE); @@ -5241,7 +5996,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_SEED_SOWER: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && TryChangeBattleTerrain(gBattlerTarget, STATUS_FIELD_GRASSY_TERRAIN)) @@ -5267,7 +6022,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; // fall through case ABILITY_ELECTROMORPHOSIS: - if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg + if (!gBattleStruct->unableToUseMove && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget)) { @@ -5277,7 +6032,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_TOXIC_DEBRIS: if (!gBattleStruct->isSkyBattle - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && IsBattleMovePhysical(gCurrentMove) && IsBattlerTurnDamaged(gBattlerTarget) && (gSideTimers[GetBattlerSide(gBattlerAttacker)].toxicSpikesAmount != 2)) @@ -5299,7 +6054,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab { case ABILITY_POISON_TOUCH: if (IsBattlerAlive(gBattlerTarget) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target @@ -5327,7 +6082,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; case ABILITY_STENCH: if (IsBattlerAlive(gBattlerTarget) - && !gProtectStructs[gBattlerAttacker].confusionSelfDmg + && !gBattleStruct->unableToUseMove && RandomChance(RNG_STENCH, 1, 10) && IsBattlerTurnDamaged(gBattlerTarget) && !MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_FLINCH)) @@ -5391,8 +6146,153 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; } break; + case ABILITYEFFECT_MOVE_END_FOES_FAINTED: + switch (ability) + { + case ABILITY_MAGICIAN: + if (GetMoveEffect(move) != EFFECT_FLING + && GetMoveEffect(move) != EFFECT_NATURAL_GIFT + && gBattleMons[battler].item == ITEM_NONE + && IsBattlerAlive(battler) + && !gSpecialStatuses[battler].gemBoost) // In base game, gems are consumed after magician would activate. + { + u32 numMagicianTargets = 0; + u32 magicianTargets = 0; + + for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) + { + if (gBattleMons[battlerDef].item != ITEM_NONE + && battlerDef != battler + && IsBattlerTurnDamaged(battlerDef) + && CanStealItem(battler, battlerDef, gBattleMons[battlerDef].item) + && !GetBattlerPartyState(battlerDef)->isKnockedOff + && !DoesSubstituteBlockMove(battler, battlerDef, move) + && (GetBattlerAbility(battlerDef) != ABILITY_STICKY_HOLD || !IsBattlerAlive(battlerDef))) + { + magicianTargets |= 1u << battlerDef; + numMagicianTargets++; + } + } + + if (numMagicianTargets == 0) + { + effect = FALSE; + break; + } + + u8 battlers[4] = {0, 1, 2, 3}; + if (numMagicianTargets > 1) + SortBattlersBySpeed(battlers, FALSE); + + for (u32 i = 0; i < gBattlersCount; i++) + { + u32 targetBattler = battlers[i]; + + if (!(magicianTargets & 1u << targetBattler)) + continue; + + StealTargetItem(battler, targetBattler); + gBattlerAbility = battler; + gEffectBattler = targetBattler; + BattleScriptCall(BattleScript_MagicianActivates); + effect = TRUE; + break; // found target to steal from + } + } + break; + case ABILITY_MOXIE: + case ABILITY_CHILLING_NEIGH: + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_GRIM_NEIGH: + case ABILITY_AS_ONE_SHADOW_RIDER: + case ABILITY_BEAST_BOOST: + { + if (!IsBattlerAlive(battler) || NoAliveMonsForEitherParty()) + break; + + enum Stat stat = STAT_ATK; + u32 numMonsFainted = NumFaintedBattlersByAttacker(battler); + + if (ability == ABILITY_BEAST_BOOST) + stat = GetHighestStatId(battler); + else if (ability == ABILITY_GRIM_NEIGH || ability == ABILITY_AS_ONE_SHADOW_RIDER) + stat = STAT_SPATK; + + if (numMonsFainted && CompareStat(battler, stat, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + gLastUsedAbility = ability; + if (ability == ABILITY_AS_ONE_ICE_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH; + else if (ability == ABILITY_AS_ONE_SHADOW_RIDER) + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH; + + SET_STATCHANGER(stat, numMonsFainted, FALSE); + PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(stat) + (numMonsFainted > 1 ? STAT_ANIM_PLUS2 : STAT_ANIM_PLUS1); + BattleScriptCall(BattleScript_RaiseStatOnFaintingTarget); + effect = TRUE; + } + } + break; + case ABILITY_BATTLE_BOND: + { + if (!IsBattlerAlive(battler) + || NoAliveMonsForEitherParty() + || NumFaintedBattlersByAttacker(battler) == 0) + break; + + if (GetBattlerPartyState(battler)->battleBondBoost || gBattleMons[battler].species != SPECIES_GRENINJA_BATTLE_BOND) + break; + + if (GetConfig(CONFIG_BATTLE_BOND) < GEN_9) + { + // TODO: Convert this to a proper FORM_CHANGE type. + gLastUsedAbility = ability; + GetBattlerPartyState(battler)->battleBondBoost = TRUE; + PREPARE_SPECIES_BUFFER(gBattleTextBuff1, gBattleMons[battler].species); + GetBattlerPartyState(battler)->changedSpecies = gBattleMons[battler].species; + gBattleMons[battler].species = SPECIES_GRENINJA_ASH; + BattleScriptCall(BattleScript_BattleBondActivatesOnMoveEndAttacker); + effect = TRUE; + } + else + { + u32 numStatBuffs = 0; + if (CompareStat(battler, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_ATK) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + if (CompareStat(battler, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPATK) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + if (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN, ability)) + { + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(STAT_SPEED) + STAT_ANIM_PLUS1; + numStatBuffs++; + } + + if (numStatBuffs > 0) + { + if (numStatBuffs > 1) + gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1; + + gLastUsedAbility = ability; + gBattlerAbility = battler; + GetBattlerPartyState(battler)->battleBondBoost = TRUE; + BattleScriptCall(BattleScript_EffectBattleBondStatIncrease); + effect = TRUE; + } + } + } + break; + default: + break; + } + break; case ABILITYEFFECT_OPPORTUNIST: - case ABILITYEFFECT_OPPORTUNIST_FIRST_TURN: switch (ability) { case ABILITY_OPPORTUNIST: @@ -5401,10 +6301,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab gBattleScripting.battler = battler; gProtectStructs[battler].activateOpportunist--; ChooseStatBoostAnimation(battler); - if (caseID == ABILITYEFFECT_OPPORTUNIST_FIRST_TURN) - BattleScriptPushCursorAndCallback(BattleScript_OpportunistCopyStatChangeEnd3); - else - BattleScriptCall(BattleScript_OpportunistCopyStatChange); + BattleScriptCall(BattleScript_OpportunistCopyStatChange); effect = 1; } break; @@ -5413,20 +6310,17 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITYEFFECT_IMMUNITY: - effect = TryImmunityAbilityHealStatus(battler, caseID); + effect = TryImmunityAbilityHealStatus(battler); if (effect) return effect; break; - case ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES: - effect = TryImmunityAbilityHealStatus(battler, caseID); - break; case ABILITYEFFECT_SYNCHRONIZE: if (gLastUsedAbility == ABILITY_SYNCHRONIZE && gBattleStruct->synchronizeMoveEffect != MOVE_EFFECT_NONE) { gBattleScripting.battler = gBattlerAbility = gBattlerTarget; RecordAbilityBattle(gBattlerTarget, ABILITY_SYNCHRONIZE); - if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; if (CanSetNonVolatileStatus( @@ -5456,7 +6350,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab gBattleScripting.battler = gBattlerAbility = gBattlerAttacker; RecordAbilityBattle(gBattlerAttacker, ABILITY_SYNCHRONIZE); - if (B_SYNCHRONIZE_TOXIC < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) + if (GetConfig(CONFIG_SYNCHRONIZE_TOXIC) < GEN_5 && gBattleStruct->synchronizeMoveEffect == MOVE_EFFECT_TOXIC) gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_POISON; if (CanSetNonVolatileStatus( @@ -5483,23 +6377,119 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab gBattleStruct->synchronizeMoveEffect = MOVE_EFFECT_NONE; } break; - - case ABILITYEFFECT_NEUTRALIZINGGAS: - case ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN: - // Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards - if (ability == ABILITY_NEUTRALIZING_GAS && !gDisableStructs[battler].neutralizingGas) + case ABILITYEFFECT_TERA_SHIFT: + if (ability == ABILITY_TERA_SHIFT + && gBattleMons[battler].species == SPECIES_TERAPAGOS_NORMAL + && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_SWITCH)) { - gDisableStructs[battler].neutralizingGas = TRUE; - gBattlerAbility = battler; - gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; - if (caseID == ABILITYEFFECT_NEUTRALIZINGGAS_FIRST_TURN) - BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); - else - BattleScriptCall(BattleScript_SwitchInAbilityMsgRet); + gBattleScripting.battler = battler; + gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_TERA_SHIFT; + BattleScriptCall(BattleScript_BattlerFormChangeWithString); effect++; } break; + case ABILITYEFFECT_NEUTRALIZINGGAS: + if (ability == ABILITY_NEUTRALIZING_GAS && !gBattleMons[battler].volatiles.neutralizingGas) + { + gBattleMons[battler].volatiles.neutralizingGas = TRUE; + gBattlerAbility = battler; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_NEUTRALIZING_GAS; + BattleScriptCall(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITYEFFECT_UNNERVE: + switch (ability) + { + case ABILITY_UNNERVE: + if (shouldAbilityTrigger && !gBattleMons[battler].volatiles.unnerveActivated) + { + gBattleScripting.battler = battler; + gEffectBattler = GetOppositeBattler(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; + gBattleMons[battler].volatiles.unnerveActivated = TRUE; + BattleScriptCall(BattleScript_SwitchInAbilityMsg); + effect++; + } + break; + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_AS_ONE_SHADOW_RIDER: + if (shouldAbilityTrigger && !gBattleMons[battler].volatiles.unnerveActivated) + { + gBattleScripting.battler = battler; + gEffectBattler = GetOppositeBattler(battler); + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; + gBattleMons[battler].volatiles.unnerveActivated = TRUE; + BattleScriptCall(BattleScript_ActivateAsOne); + effect++; + } + break; + default: + break; + } + break; + case ABILITYEFFECT_COMMANDER: + gBattleScripting.battler = battler; + partner = BATTLE_PARTNER(battler); + switch (ability) + { + case ABILITY_COMMANDER: + if (IsBattlerAlive(partner) + && IsBattlerAlive(battler) + && gBattleStruct->battlerState[partner].commanderSpecies == SPECIES_NONE + && gBattleMons[partner].species == SPECIES_DONDOZO + && GET_BASE_SPECIES_ID(GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)) == SPECIES_TATSUGIRI) + { + SaveBattlerAttacker(gBattlerAttacker); + gBattlerAttacker = partner; + gBattleStruct->battlerState[battler].commandingDondozo = TRUE; + gBattleStruct->battlerState[partner].commanderSpecies = gBattleMons[battler].species; + gBattleMons[battler].volatiles.semiInvulnerable = STATE_COMMANDER; + if (gBattleMons[battler].volatiles.confusionTurns > 0 && !gBattleMons[battler].volatiles.infiniteConfusion) + gBattleMons[battler].volatiles.confusionTurns--; + BtlController_EmitSpriteInvisibility(battler, B_COMM_TO_CONTROLLER, TRUE); + MarkBattlerForControllerExec(battler); + BattleScriptCall(BattleScript_CommanderActivates); + effect++; + } + break; + case ABILITY_HOSPITALITY: + if (shouldAbilityTrigger + && IsDoubleBattle() + && !gBattleMons[partner].volatiles.healBlock + && gBattleMons[partner].hp < gBattleMons[partner].maxHP + && IsBattlerAlive(partner)) + { + gEffectBattler = partner; + SetHealAmount(partner, GetNonDynamaxMaxHP(partner) / 4); + BattleScriptCall(BattleScript_HospitalityActivates); + effect++; + } + break; + case ABILITY_COSTAR: + if (shouldAbilityTrigger + && IsDoubleBattle() + && IsBattlerAlive(partner) + && BattlerHasCopyableChanges(partner)) + { + for (i = 0; i < NUM_BATTLE_STATS; i++) + gBattleMons[battler].statStages[i] = gBattleMons[partner].statStages[i]; + // Copy crit boosts (Focus Energy, Dragon Cheer, G-Max Chi Strike) + gBattleMons[battler].volatiles.focusEnergy = gBattleMons[partner].volatiles.focusEnergy; + gBattleMons[battler].volatiles.dragonCheer = gBattleMons[partner].volatiles.dragonCheer; + gBattleMons[battler].volatiles.bonusCritStages = gBattleMons[partner].volatiles.bonusCritStages; + gEffectBattler = partner; + BattleScriptCall(BattleScript_CostarActivates); + effect++; + } + break; + default: + break; + } + break; case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. + if (!IsBattlerAlive(battler)) + return effect; gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) { @@ -5511,31 +6501,32 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab if (battlerWeatherAffected && !CanBattlerFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { // If Hail/Snow activates when in Eiscue is in base, prevent reversion when Eiscue Noice gets broken - gDisableStructs[battler].weatherAbilityDone = TRUE; + gBattleMons[battler].volatiles.weatherAbilityDone = TRUE; } - if (((!gDisableStructs[battler].weatherAbilityDone && battlerWeatherAffected) + if (((!gBattleMons[battler].volatiles.weatherAbilityDone && battlerWeatherAffected) || gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) // Air Lock active && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) { gBattleScripting.battler = battler; - gDisableStructs[battler].weatherAbilityDone = TRUE; - BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); + gBattleMons[battler].volatiles.weatherAbilityDone = TRUE; + BattleScriptCall(BattleScript_BattlerFormChangeWithString); effect++; } break; } case ABILITY_PROTOSYNTHESIS: - if (!gDisableStructs[battler].weatherAbilityDone + if (!gBattleMons[battler].volatiles.weatherAbilityDone && (gBattleWeather & B_WEATHER_SUN) && HasWeatherEffect() && !gBattleMons[battler].volatiles.transformed - && !gDisableStructs[battler].boosterEnergyActivated) + && !gBattleMons[battler].volatiles.boosterEnergyActivated) { - gDisableStructs[battler].weatherAbilityDone = TRUE; - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gBattleMons[battler].volatiles.weatherAbilityDone = TRUE; + gBattleMons[battler].volatiles.paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleMons[battler].volatiles.paradoxBoostedStat); gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates); + BattleScriptCall(BattleScript_ProtosynthesisActivates); effect++; } break; @@ -5544,29 +6535,32 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITYEFFECT_ON_TERRAIN: // For ability effects that activate when the field terrain changes. + if (!IsBattlerAlive(battler)) + return effect; gLastUsedAbility = GetBattlerAbility(battler); switch (gLastUsedAbility) { case ABILITY_MIMICRY: - if (!gDisableStructs[battler].terrainAbilityDone && ChangeTypeBasedOnTerrain(battler)) + if (!gBattleMons[battler].volatiles.terrainAbilityDone && ChangeTypeBasedOnTerrain(battler)) { - gDisableStructs[battler].terrainAbilityDone = TRUE; + gBattleMons[battler].volatiles.terrainAbilityDone = TRUE; ChangeTypeBasedOnTerrain(battler); gBattlerAbility = gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_MimicryActivates); + BattleScriptCall(BattleScript_MimicryActivates); effect++; } break; case ABILITY_QUARK_DRIVE: - if (!gDisableStructs[battler].terrainAbilityDone + if (!gBattleMons[battler].volatiles.terrainAbilityDone && gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && !gBattleMons[battler].volatiles.transformed - && !gDisableStructs[battler].boosterEnergyActivated) + && !gBattleMons[battler].volatiles.boosterEnergyActivated) { - gDisableStructs[battler].terrainAbilityDone = TRUE; - PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); + gBattleMons[battler].volatiles.terrainAbilityDone = TRUE; + gBattleMons[battler].volatiles.paradoxBoostedStat = GetParadoxHighestStatId(battler); + PREPARE_STAT_BUFFER(gBattleTextBuff1, gBattleMons[battler].volatiles.paradoxBoostedStat); gBattlerAbility = gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates); + BattleScriptCall(BattleScript_QuarkDriveActivates); effect++; } break; @@ -5576,10 +6570,11 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab break; } - if (effect && gLastUsedAbility != 0xFFFF) + if (effect) + { RecordAbilityBattle(battler, gLastUsedAbility); - if (effect && caseID <= ABILITYEFFECT_MOVE_END) gBattlerAbility = battler; + } return effect; } @@ -5590,7 +6585,7 @@ bool32 TryPrimalReversion(u32 battler) && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != gBattleMons[battler].species) { gBattleScripting.battler = battler; - BattleScriptPushCursorAndCallback(BattleScript_PrimalReversion); + BattleScriptCall(BattleScript_PrimalReversion); return TRUE; } return FALSE; @@ -5602,7 +6597,7 @@ bool32 IsNeutralizingGasOnField(void) for (i = 0; i < gBattlersCount; i++) { - if (IsBattlerAlive(i) && gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !gBattleMons[i].volatiles.gastroAcid) + if (gBattleMons[i].volatiles.neutralizingGas && !gBattleMons[i].volatiles.gastroAcid) return TRUE; } @@ -5626,25 +6621,19 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability) return FALSE; } -static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability, u32 hasAbilityShield, u32 ignoreMoldBreaker) +static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, bool32 hasAbilityShield, bool32 ignoreMoldBreaker) { - if (hasAbilityShield || ignoreMoldBreaker) + if (hasAbilityShield || ignoreMoldBreaker || battlerDef == battlerAtk) return FALSE; - - return ((IsMoldBreakerTypeAbility(battlerAtk, ability) || MoveIgnoresTargetAbility(gCurrentMove)) - && battlerDef != battlerAtk - && gAbilitiesInfo[gBattleMons[battlerDef].ability].breakable - && gBattlerByTurnOrder[gCurrentTurnActionNumber] == battlerAtk - && gActionsByTurnOrder[gCurrentTurnActionNumber] == B_ACTION_USE_MOVE - && gCurrentTurnActionNumber < gBattlersCount); + return gBattleStruct->moldBreakerActive && gAbilitiesInfo[gBattleMons[battlerDef].ability].breakable; } -u32 GetBattlerAbilityNoAbilityShield(u32 battler) +enum Ability GetBattlerAbilityNoAbilityShield(u32 battler) { return GetBattlerAbilityInternal(battler, FALSE, TRUE); } -u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler) +enum Ability GetBattlerAbilityIgnoreMoldBreaker(u32 battler) { return GetBattlerAbilityInternal(battler, TRUE, FALSE); } @@ -5654,7 +6643,7 @@ enum Ability GetBattlerAbility(u32 battler) return GetBattlerAbilityInternal(battler, FALSE, FALSE); } -u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield) +enum Ability GetBattlerAbilityInternal(u32 battler, bool32 ignoreMoldBreaker, bool32 noAbilityShield) { bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; @@ -5667,7 +6656,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS && gBattleMons[battler].ability == ABILITY_COMATOSE) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield, ignoreMoldBreaker)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; @@ -5678,10 +6667,10 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS if (!hasAbilityShield && IsNeutralizingGasOnField() - && gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS) + && (gBattleMons[battler].ability != ABILITY_NEUTRALIZING_GAS || gBattleMons[battler].volatiles.gastroAcid)) return ABILITY_NONE; - if (CanBreakThroughAbility(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, hasAbilityShield, ignoreMoldBreaker)) + if (CanBreakThroughAbility(gBattlerAttacker, battler, hasAbilityShield, ignoreMoldBreaker)) return ABILITY_NONE; return gBattleMons[battler].ability; @@ -5730,7 +6719,7 @@ u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability) u32 IsAbilityPreventingEscape(u32 battler) { - if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); @@ -5758,9 +6747,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check { if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; - else if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SHED_SHELL) - return TRUE; - else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + else if (GetConfig(CONFIG_GHOSTS_ESCAPE) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; else if (gBattleMons[battler].volatiles.escapePrevention) return FALSE; @@ -5791,9 +6778,34 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr) gBattleMainFunc = RunBattleScriptCommands; } -bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 terrainFlag) +bool32 IsPsychicTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses) { - if (!(gFieldStatuses & terrainFlag)) + return IsBattlerTerrainAffected(battler, ability, holdEffect, fieldStatuses, STATUS_FIELD_PSYCHIC_TERRAIN); +} + +bool32 IsMistyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses) +{ + return IsBattlerTerrainAffected(battler, ability, holdEffect, fieldStatuses, STATUS_FIELD_MISTY_TERRAIN); +} + +bool32 IsGrassyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses) +{ + return IsBattlerTerrainAffected(battler, ability, holdEffect, fieldStatuses, STATUS_FIELD_GRASSY_TERRAIN); +} + +bool32 IsElectricTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses) +{ + return IsBattlerTerrainAffected(battler, ability, holdEffect, fieldStatuses, STATUS_FIELD_ELECTRIC_TERRAIN); +} + +bool32 IsAnyTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatuses) +{ + return IsBattlerTerrainAffected(battler, ability, holdEffect, fieldStatuses, STATUS_FIELD_TERRAIN_ANY); +} + +bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffect holdEffect, u32 fieldStatus, u32 terrainFlag) +{ + if (!(fieldStatus & terrainFlag)) return FALSE; if (IsSemiInvulnerable(battler, CHECK_ALL)) return FALSE; @@ -5801,6 +6813,127 @@ bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffe return IsBattlerGrounded(battler, ability, holdEffect); } +enum Stat GetHighestStatId(u32 battler) +{ + enum Stat highestId = STAT_ATK; + bool32 wonderRoom = (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) != 0; + u32 highestStat = gBattleMons[battler].attack; + + for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++) + { + if (stat == STAT_SPEED) + continue; + + u32 statVal; + switch (stat) + { + case STAT_ATK: + statVal = gBattleMons[battler].attack; + break; + case STAT_DEF: + statVal = wonderRoom ? gBattleMons[battler].spDefense : gBattleMons[battler].defense; + break; + case STAT_SPATK: + statVal = gBattleMons[battler].spAttack; + break; + case STAT_SPDEF: + statVal = wonderRoom ? gBattleMons[battler].defense : gBattleMons[battler].spDefense; + break; + default: + continue; + } + + if (statVal > highestStat) + { + highestStat = statVal; + highestId = stat; + } + } + + if (gBattleMons[battler].speed > highestStat) + highestId = STAT_SPEED; + + return highestId; +} + +static u32 GetStatValueWithStages(u32 battler, enum Stat stat) +{ + u32 statValue; + + switch (stat) + { + case STAT_ATK: + statValue = gBattleMons[battler].attack; + break; + case STAT_DEF: + statValue = gBattleMons[battler].defense; + break; + case STAT_SPATK: + statValue = gBattleMons[battler].spAttack; + break; + case STAT_SPDEF: + statValue = gBattleMons[battler].spDefense; + break; + case STAT_SPEED: + statValue = gBattleMons[battler].speed; + break; + default: + return 0; + } + + statValue *= gStatStageRatios[gBattleMons[battler].statStages[stat]][0]; + statValue /= gStatStageRatios[gBattleMons[battler].statStages[stat]][1]; + + return statValue; +} + +enum Stat GetParadoxHighestStatId(u32 battler) +{ + enum Stat highestId = STAT_ATK; + u32 highestStat = GetStatValueWithStages(battler, STAT_ATK); + + for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++) + { + if (stat == STAT_SPEED) + continue; + + u32 statValue = GetStatValueWithStages(battler, stat); + if (statValue > highestStat) + { + highestStat = statValue; + highestId = stat; + } + } + + u32 speed = GetStatValueWithStages(battler, STAT_SPEED); + if (speed > highestStat) + highestId = STAT_SPEED; + + return highestId; +} + +static void ResetParadoxWeatherStat(u32 battler) +{ + if (gBattleMons[battler].ability == ABILITY_PROTOSYNTHESIS + && !gBattleMons[battler].volatiles.boosterEnergyActivated) + gBattleMons[battler].volatiles.paradoxBoostedStat = 0; +} + +static void ResetParadoxTerrainStat(u32 battler) +{ + if (gBattleMons[battler].ability == ABILITY_QUARK_DRIVE + && !gBattleMons[battler].volatiles.boosterEnergyActivated) + gBattleMons[battler].volatiles.paradoxBoostedStat = 0; +} + +enum Stat GetParadoxBoostedStatId(u32 battler) +{ + if (gBattleMons[battler].volatiles.paradoxBoostedStat == 0) + gBattleMons[battler].volatiles.paradoxBoostedStat = GetParadoxHighestStatId(battler); + + return gBattleMons[battler].volatiles.paradoxBoostedStat; +} + bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause) { if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause != NOT_BLOCKED_BY_SLEEP_CLAUSE) @@ -5889,10 +7022,10 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef) return FALSE; } -bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option) +bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum ResultOption option) { const u8 *battleScript = NULL; - u32 sideBattler = ABILITY_NONE; + u32 sideBattler = 0; bool32 abilityAffected = FALSE; // Move specific checks @@ -5926,13 +7059,11 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil { battleScript = BattleScript_AlreadyParalyzed; } - else if (GetGenConfig(GEN_CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) + else if (GetConfig(CONFIG_PARALYZE_ELECTRIC) >= GEN_6 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ELECTRIC)) { battleScript = BattleScript_NotAffected; } - else if (option == RUN_SCRIPT // Check only important during battle execution for moves - && CalcTypeEffectivenessMultiplierHelper(gCurrentMove, GetBattleMoveType(gCurrentMove), battlerAtk, battlerDef, abilityAtk, abilityDef, TRUE) - && gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT) + else if (option == RUN_SCRIPT && IsBattlerUnaffectedByMove(battlerDef)) { battleScript = BattleScript_ButItFailed; } @@ -5975,7 +7106,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil { battleScript = BattleScript_SleepClauseBlocked; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsElectricTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), gFieldStatuses)) { battleScript = BattleScript_ElectricTerrainPrevents; } @@ -5994,7 +7125,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil break; case MOVE_EFFECT_FREEZE: case MOVE_EFFECT_FROSTBITE: - if (gBattleMons[battlerDef].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) + if (gBattleMons[battlerDef].status1 & STATUS1_ICY_ANY) { battleScript = BattleScript_AlreadyBurned; } @@ -6022,7 +7153,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_MISTY_TERRAIN)) + else if (IsMistyTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), gFieldStatuses)) { battleScript = BattleScript_MistyTerrainPrevents; } @@ -6058,7 +7189,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abil return TRUE; } -static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option) +static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, bool32 abilityAffected, const u8 *battleScript, enum ResultOption option) { if (battleScript != NULL) { @@ -6083,7 +7214,7 @@ static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef return FALSE; } -static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option) +static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum ResultOption option) { // Can freely sleep own partner if (IsDoubleBattle() && IsSleepClauseEnabled() && IsBattlerAlly(battlerAtk, battlerDef)) @@ -6106,14 +7237,14 @@ bool32 CanBeConfused(u32 battler) { enum Ability ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.confusionTurns > 0 - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) + || IsMistyTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), gFieldStatuses) || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) return FALSE; return TRUE; } // second argument is 1/X of current hp compared to max hp -bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, u32 itemId) +bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, enum Item itemId) { if (!IsBattlerAlive(battler)) return FALSE; @@ -6132,7 +7263,7 @@ bool32 HasEnoughHpToEatBerry(u32 battler, enum Ability ability, u32 hpFraction, void ClearVariousBattlerFlags(u32 battler) { - gDisableStructs[battler].furyCutterCounter = 0; + gBattleMons[battler].volatiles.furyCutterCounter = 0; gBattleMons[battler].volatiles.destinyBond = 0; gBattleMons[battler].volatiles.glaiveRush = FALSE; gBattleMons[battler].volatiles.grudge = FALSE; @@ -6167,21 +7298,20 @@ u32 SetRandomTarget(u32 battlerAtk) return target; } -u32 GetBattleMoveTarget(u16 move, u8 setTarget) +u32 GetBattleMoveTarget(enum Move move, enum MoveTarget moveTarget) { - u8 targetBattler = 0; - u32 moveTarget, side; + u32 targetBattler = 0; + enum BattleSide side; enum Type moveType = GetBattleMoveType(move); - if (setTarget != NO_TARGET_OVERRIDE) - moveTarget = setTarget - 1; - else + if (moveTarget == TARGET_NONE) moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, move); switch (moveTarget) { - case MOVE_TARGET_SELECTED: - case MOVE_TARGET_OPPONENT: + case TARGET_SELECTED: + case TARGET_SMART: + case TARGET_OPPONENT: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) { @@ -6222,30 +7352,30 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) } } break; - case MOVE_TARGET_DEPENDS: - case MOVE_TARGET_BOTH: - case MOVE_TARGET_FOES_AND_ALLY: + case TARGET_DEPENDS: + case TARGET_BOTH: + case TARGET_FOES_AND_ALLY: targetBattler = GetOpposingSideBattler(gBattlerAttacker); if (IsDoubleBattle() && !IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; break; - case MOVE_TARGET_OPPONENTS_FIELD: + case TARGET_OPPONENTS_FIELD: targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; - case MOVE_TARGET_RANDOM: + case TARGET_RANDOM: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); if (IsAffectedByFollowMe(gBattlerAttacker, side, move)) targetBattler = gSideTimers[side].followmeTarget; - else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) + else if (IsDoubleBattle()) targetBattler = SetRandomTarget(gBattlerAttacker); else targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; - case MOVE_TARGET_USER: + case TARGET_USER: default: targetBattler = gBattlerAttacker; break; - case MOVE_TARGET_ALLY: + case TARGET_ALLY: if (IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker))) targetBattler = BATTLE_PARTNER(gBattlerAttacker); else @@ -6258,7 +7388,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) return targetBattler; } -u8 GetAttackerObedienceForAction() +enum Obedience GetAttackerObedienceForAction(void) { s32 rnd; s32 calc; @@ -6315,9 +7445,9 @@ u8 GetAttackerObedienceForAction() // is not obedient enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); - if (moveEffect == EFFECT_RAGE) + if (MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_RAGE)) gBattleMons[gBattlerAttacker].volatiles.rage = FALSE; - if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) + if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && IsUsableWhileAsleepEffect(moveEffect)) return DISOBEYS_WHILE_ASLEEP; calc = (levelReferenced + obedienceLevel) * ((rnd >> 8) & 255) >> 8; @@ -6365,7 +7495,7 @@ enum HoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) return GetBattlerHoldEffectInternal(battler, ABILITY_NONE); } -enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) +enum HoldEffect GetBattlerHoldEffectInternal(u32 battler, enum Ability ability) { if (gBattleMons[battler].volatiles.embargo) return HOLD_EFFECT_NONE; @@ -6399,7 +7529,7 @@ u32 GetBattlerHoldEffectParam(u32 battler) return GetItemHoldEffectParam(gBattleMons[battler].item); } -bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) +bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, enum Move move) { if (holdEffectAtk == HOLD_EFFECT_PROTECTIVE_PADS) { @@ -6410,7 +7540,7 @@ bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Abilit return !IsMoveMakingContact(battlerAtk, battlerDef, abilityAtk, holdEffectAtk, move); } -bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, u32 move) +bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum HoldEffect holdEffectAtk, enum Move move) { if (!(MoveMakesContact(move) || (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM && gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL))) @@ -6436,61 +7566,64 @@ static inline bool32 IsSideProtected(u32 battler, enum ProtectMethod method) || gProtectStructs[BATTLE_PARTNER(battler)].protected == method; } -bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsBattlerProtected(struct BattleContext *ctx) { - if (gProtectStructs[battlerDef].protected == PROTECT_NONE - && gProtectStructs[BATTLE_PARTNER(battlerDef)].protected == PROTECT_NONE) + if (gProtectStructs[ctx->battlerDef].protected == PROTECT_NONE + && gProtectStructs[BATTLE_PARTNER(ctx->battlerDef)].protected == PROTECT_NONE) return FALSE; - if (gProtectStructs[battlerDef].protected != PROTECT_MAX_GUARD && !MoveIgnoresProtect(move)) + if (GetMoveEffect(ctx->move) == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(ctx->battlerAtk, TYPE_GHOST)) + return FALSE; + + if (gProtectStructs[ctx->battlerDef].protected != PROTECT_MAX_GUARD && !MoveIgnoresProtect(ctx->move)) { - if (IsZMove(move) || IsMaxMove(move)) + if (IsZMove(ctx->move) || IsMaxMove(ctx->move)) return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). - if (GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST - && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk), move)) + if (ctx->abilityAtk == ABILITY_UNSEEN_FIST + && IsMoveMakingContact(ctx->battlerAtk, ctx->battlerDef, ctx->abilityAtk, ctx->holdEffectAtk, ctx->move)) return FALSE; } + if (GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move) == TARGET_ALL_BATTLERS) + return FALSE; + bool32 isProtected = FALSE; - if (IsSideProtected(battlerDef, PROTECT_CRAFTY_SHIELD) - && IsBattleMoveStatus(move) - && GetMoveEffect(move) != EFFECT_COACHING) + if (IsSideProtected(ctx->battlerDef, PROTECT_CRAFTY_SHIELD) + && IsBattleMoveStatus(ctx->move) + && GetMoveEffect(ctx->move) != EFFECT_COACHING) isProtected = TRUE; - else if (MoveIgnoresProtect(move)) + else if (MoveIgnoresProtect(ctx->move)) isProtected = FALSE; - else if (IsSideProtected(battlerDef, PROTECT_WIDE_GUARD) && IsSpreadMove(GetBattlerMoveTargetType(battlerAtk, move))) + else if (IsSideProtected(ctx->battlerDef, PROTECT_WIDE_GUARD) && IsSpreadMove(GetBattlerMoveTargetType(ctx->battlerAtk, ctx->move))) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_NORMAL) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_NORMAL) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_SPIKY_SHIELD) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_SPIKY_SHIELD) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_MAX_GUARD) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_MAX_GUARD) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_BANEFUL_BUNKER) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_BANEFUL_BUNKER) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_BURNING_BULWARK) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_BURNING_BULWARK) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_OBSTRUCT && !IsBattleMoveStatus(move)) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_OBSTRUCT && !IsBattleMoveStatus(ctx->move)) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_SILK_TRAP && !IsBattleMoveStatus(move)) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_SILK_TRAP && !IsBattleMoveStatus(ctx->move)) isProtected = TRUE; - else if (gProtectStructs[battlerDef].protected == PROTECT_KINGS_SHIELD && !IsBattleMoveStatus(move)) + else if (gProtectStructs[ctx->battlerDef].protected == PROTECT_KINGS_SHIELD && !IsBattleMoveStatus(ctx->move)) isProtected = TRUE; - else if (IsSideProtected(battlerDef, PROTECT_QUICK_GUARD) && GetChosenMovePriority(battlerAtk, GetBattlerAbility(battlerAtk)) > 0) + else if (IsSideProtected(ctx->battlerDef, PROTECT_QUICK_GUARD) && GetChosenMovePriority(ctx->battlerAtk, GetBattlerAbility(ctx->battlerAtk)) > 0) isProtected = TRUE; - else if (IsSideProtected(battlerDef, PROTECT_MAT_BLOCK) && !IsBattleMoveStatus(move)) + else if (IsSideProtected(ctx->battlerDef, PROTECT_MAT_BLOCK) && !IsBattleMoveStatus(ctx->move)) isProtected = TRUE; else isProtected = FALSE; - if (isProtected) - gBattleStruct->missStringId[battlerDef] = gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; - return isProtected; } -u32 GetProtectType(enum ProtectMethod method) +enum ProtectType GetProtectType(enum ProtectMethod method) { switch (method) { @@ -6556,7 +7689,7 @@ bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum HoldEffect hold return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE, FALSE); } -u32 GetMoveSlot(u16 *moves, u32 move) +u32 GetMoveSlot(u16 *moves, enum Move move) { u32 i; @@ -6583,7 +7716,7 @@ u32 GetBattlerWeight(u32 battler) if (holdEffect == HOLD_EFFECT_FLOAT_STONE) weight /= 2; - for (i = 0; i < gDisableStructs[battler].autotomizeCount; i++) + for (i = 0; i < gBattleMons[battler].volatiles.autotomizeCount; i++) { if (weight > 1000) { @@ -6618,29 +7751,47 @@ u32 CountBattlerStatIncreases(u32 battler, bool32 countEvasionAcc) return count; } -u32 GetMoveTargetCount(struct DamageContext *ctx) +bool32 BattlerHasCopyableChanges(u32 battler) +{ + u32 i; + + for (i = 0; i < NUM_BATTLE_STATS; i++) + { + if (gBattleMons[battler].statStages[i] != DEFAULT_STAT_STAGE) + return TRUE; + } + + if (gBattleMons[battler].volatiles.focusEnergy + || gBattleMons[battler].volatiles.dragonCheer + || gBattleMons[battler].volatiles.bonusCritStages != 0) + return TRUE; + + return FALSE; +} + +u32 GetMoveTargetCount(struct BattleContext *ctx) { u32 battlerAtk = ctx->battlerAtk; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; switch (GetBattlerMoveTargetType(battlerAtk, move)) { - case MOVE_TARGET_BOTH: + case TARGET_BOTH: return !(gAbsentBattlerFlags & (1u << battlerDef)) + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerDef))); - case MOVE_TARGET_FOES_AND_ALLY: + case TARGET_FOES_AND_ALLY: return !(gAbsentBattlerFlags & (1u << battlerDef)) + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerDef))) + !(gAbsentBattlerFlags & (1u << BATTLE_PARTNER(battlerAtk))); - case MOVE_TARGET_OPPONENTS_FIELD: + case TARGET_OPPONENTS_FIELD: return 1; - case MOVE_TARGET_DEPENDS: - case MOVE_TARGET_SELECTED: - case MOVE_TARGET_RANDOM: - case MOVE_TARGET_OPPONENT: + case TARGET_DEPENDS: + case TARGET_SELECTED: + case TARGET_RANDOM: + case TARGET_OPPONENT: return IsBattlerAlive(battlerDef); - case MOVE_TARGET_USER: + case TARGET_USER: return IsBattlerAlive(battlerAtk); default: return 0; @@ -6743,27 +7894,46 @@ const struct TypePower gNaturalGiftTable[] = [ITEM_TO_BERRY(ITEM_MARANGA_BERRY)] = {TYPE_DARK, 100}, }; -u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer) +static inline u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower) { u32 i; - for (i = 1; i < (5 - rolloutTimer); i++) + for (i = 0; i < gBattleMons[battlerAtk].volatiles.rolloutTimer; i++) basePower *= 2; if (gBattleMons[battlerAtk].volatiles.defenseCurl) basePower *= 2; return basePower; } -u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter) +static inline u32 CalcFuryCutterBasePower(u32 battlerAtk, u32 basePower) { - u32 i; - for (i = 1; i < furyCutterCounter; i++) + for (u32 i = 0; i < gBattleMons[battlerAtk].volatiles.furyCutterCounter; i++) basePower *= 2; + return min(basePower, 160); // The duration to reach 160 depends on a gen +} + +static inline u32 CalcTerrainBoostedPower(struct BattleContext *ctx, u32 basePower) +{ + bool32 isTerrainAffected = FALSE; + + if (GetMoveTerrainBoost_GroundCheck(ctx->move) == GROUND_CHECK_USER) + isTerrainAffected = IsBattlerTerrainAffected(ctx->battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, ctx->fieldStatuses, GetMoveTerrainBoost_Terrain(ctx->move)); + else if (GetMoveTerrainBoost_GroundCheck(ctx->move) == GROUND_CHECK_TARGET) + isTerrainAffected = IsBattlerTerrainAffected(ctx->battlerDef, ctx->abilityDef, ctx->holdEffectDef, ctx->fieldStatuses, GetMoveTerrainBoost_Terrain(ctx->move)); + else if (ctx->fieldStatuses & GetMoveTerrainBoost_Terrain(ctx->move)) // no ground check (Psyblade) + isTerrainAffected = TRUE; + + if (isTerrainAffected) + basePower = uq4_12_multiply(basePower, PercentToUQ4_12AddOne(GetMoveTerrainBoost_Percent(ctx->move))); + return basePower; } static inline u32 IsFieldMudSportAffected(enum Type moveType) { - if (moveType == TYPE_ELECTRIC && (gFieldStatuses & STATUS_FIELD_MUDSPORT)) + if (moveType != TYPE_ELECTRIC) + return FALSE; + + if (gFieldStatuses & STATUS_FIELD_MUDSPORT) return TRUE; if (B_SPORT_TURNS < GEN_6) @@ -6780,7 +7950,10 @@ static inline u32 IsFieldMudSportAffected(enum Type moveType) static inline u32 IsFieldWaterSportAffected(enum Type moveType) { - if (moveType == TYPE_FIRE && (gFieldStatuses & STATUS_FIELD_WATERSPORT)) + if (moveType != TYPE_FIRE) + return FALSE; + + if (gFieldStatuses & STATUS_FIELD_WATERSPORT) return TRUE; if (B_SPORT_TURNS < GEN_6) @@ -6795,11 +7968,11 @@ static inline u32 IsFieldWaterSportAffected(enum Type moveType) return FALSE; } -static inline u32 CalcMoveBasePower(struct DamageContext *ctx) +static inline u32 CalcMoveBasePower(struct BattleContext *ctx) { u32 battlerAtk = ctx->battlerAtk; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; u32 i; u32 basePower = GetMovePower(move); @@ -6840,10 +8013,10 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower = 10 * (MAX_FRIENDSHIP - gBattleMons[battlerAtk].friendship) / 25; break; case EFFECT_FURY_CUTTER: - basePower = CalcFuryCutterBasePower(basePower, gDisableStructs[battlerAtk].furyCutterCounter); + basePower = CalcFuryCutterBasePower(battlerAtk, basePower); break; case EFFECT_ROLLOUT: - basePower = CalcRolloutBasePower(battlerAtk, basePower, gDisableStructs[battlerAtk].rolloutTimer); + basePower = CalcRolloutBasePower(battlerAtk, basePower); break; case EFFECT_MAGNITUDE: basePower = gBattleStruct->magnitudeBasePower; @@ -6855,13 +8028,10 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) basePower *= 1 + GetMoveStrikeCount(move) - gMultiHitCounter; break; case EFFECT_SPIT_UP: - basePower = 100 * gDisableStructs[battlerAtk].stockpileCounter; + basePower = 100 * gBattleMons[battlerAtk].volatiles.stockpileCounter; break; case EFFECT_REVENGE: - if ((gProtectStructs[battlerAtk].physicalDmg - && gProtectStructs[battlerAtk].physicalBattlerId == battlerDef) - || (gProtectStructs[battlerAtk].specialDmg - && gProtectStructs[battlerAtk].specialBattlerId == battlerDef)) + if (gProtectStructs[battlerAtk].revengeDoubled & 1u << battlerDef) basePower *= 2; break; case EFFECT_WEATHER_BALL: @@ -6963,12 +8133,12 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) break; case EFFECT_PAYBACK: if (HasBattlerActedThisTurn(battlerDef) - && (B_PAYBACK_SWITCH_BOOST < GEN_5 || gDisableStructs[battlerDef].isFirstTurn != 2)) + && (B_PAYBACK_SWITCH_BOOST < GEN_5 || gBattleStruct->battlerState[battlerDef].isFirstTurn != 2)) basePower *= 2; break; case EFFECT_BOLT_BEAK: if (!HasBattlerActedThisTurn(battlerDef) - || gDisableStructs[battlerDef].isFirstTurn == 2) + || gBattleStruct->battlerState[battlerDef].isFirstTurn == 2) basePower *= 2; break; case EFFECT_FUSION_COMBO: @@ -6986,9 +8156,8 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) if (gProtectStructs[battlerAtk].lashOutAffected) basePower *= 2; break; - case EFFECT_MISTY_EXPLOSION: - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_MISTY_TERRAIN)) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); + case EFFECT_TERRAIN_BOOST: + basePower = CalcTerrainBoostedPower(ctx, basePower); break; case EFFECT_DYNAMAX_DOUBLE_DMG: if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) @@ -7010,29 +8179,17 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) break; } case EFFECT_GRAV_APPLE: - if (gFieldStatuses & STATUS_FIELD_GRAVITY) + if (ctx->fieldStatuses & STATUS_FIELD_GRAVITY) basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); break; case EFFECT_TERRAIN_PULSE: - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_TERRAIN_ANY)) - basePower *= 2; - break; - case EFFECT_EXPANDING_FORCE: - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN)) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); - break; - case EFFECT_RISING_VOLTAGE: - if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_ELECTRIC_TERRAIN)) + if (IsAnyTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, ctx->fieldStatuses)) basePower *= 2; break; case EFFECT_BEAT_UP: - if (B_BEAT_UP >= GEN_5) + if (GetConfig(CONFIG_BEAT_UP) >= GEN_5) basePower = CalcBeatUpPower(); break; - case EFFECT_PSYBLADE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) - basePower = uq4_12_multiply(basePower, UQ_4_12(1.5)); - break; case EFFECT_MAX_MOVE: basePower = GetMaxMovePower(GetChosenMoveFromPosition(battlerAtk)); break; @@ -7051,31 +8208,25 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) case EFFECT_LAST_RESPECTS: basePower += (basePower * min(100, GetBattlerSideFaintCounter(battlerAtk))); break; + case EFFECT_SPECIES_POWER_OVERRIDE: + if (gBattleMons[battlerAtk].species == GetMoveSpeciesPowerOverride_Species(ctx->move)) + basePower = GetMoveSpeciesPowerOverride_Power(ctx->move); default: break; } - // Move-specific base power changes - switch (move) - { - case MOVE_WATER_SHURIKEN: - if (gBattleMons[battlerAtk].species == SPECIES_GRENINJA_ASH) - basePower = 20; - break; - } - if (basePower == 0) basePower = 1; return basePower; } -static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) +static inline u32 CalcMoveBasePowerAfterModifiers(struct BattleContext *ctx) { u32 holdEffectParamAtk; u32 basePower = CalcMoveBasePower(ctx); u32 battlerAtk = ctx->battlerAtk; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; enum Type moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -7099,7 +8250,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); break; case EFFECT_SOLAR_BEAM: - if (IsBattlerWeatherAffected(battlerAtk, (B_WEATHER_HAIL | B_WEATHER_SANDSTORM | B_WEATHER_RAIN | B_WEATHER_SNOW | B_WEATHER_FOG))) + if ((GetConfig(CONFIG_SANDSTORM_SOLAR_BEAM) >= GEN_3 && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_LOW_LIGHT)) + || IsBattlerWeatherAffected(battlerAtk, (B_WEATHER_RAIN | B_WEATHER_ICY_ANY | B_WEATHER_FOG))) // Excludes Sandstorm modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_STOMPING_TANTRUM: @@ -7108,13 +8260,13 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) break; case EFFECT_MAGNITUDE: case EFFECT_EARTHQUAKE: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) + if (ctx->fieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && !IsSemiInvulnerable(battlerDef, CHECK_ALL)) modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); break; case EFFECT_KNOCK_OFF: if (B_KNOCK_OFF_DMG >= GEN_6 && gBattleMons[battlerDef].item != ITEM_NONE - && CanBattlerGetOrLoseItem(battlerDef, gBattleMons[battlerDef].item)) + && CanBattlerGetOrLoseItem(battlerDef, battlerAtk, gBattleMons[battlerDef].item)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; default: @@ -7126,23 +8278,23 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); if (gSpecialStatuses[battlerAtk].gemBoost) - modifier = uq4_12_multiply(modifier, uq4_12_add(UQ_4_12(1.0), PercentToUQ4_12(gSpecialStatuses[battlerAtk].gemParam))); - if (gBattleMons[battlerAtk].volatiles.charge && moveType == TYPE_ELECTRIC) + modifier = uq4_12_multiply(modifier, PercentToUQ4_12AddOne(gSpecialStatuses[battlerAtk].gemParam)); + if (moveType == TYPE_ELECTRIC && gBattleMons[battlerAtk].volatiles.chargeTimer > 0) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (GetMoveEffect(ctx->chosenMove) == EFFECT_ME_FIRST) modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_GRASSY_TERRAIN) && moveType == TYPE_GRASS) + if (IsGrassyTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, ctx->fieldStatuses) && moveType == TYPE_GRASS) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, STATUS_FIELD_MISTY_TERRAIN) && moveType == TYPE_DRAGON) + if (IsMistyTerrainAffected(battlerDef, ctx->abilityDef, ctx->holdEffectDef, ctx->fieldStatuses) && moveType == TYPE_DRAGON) modifier = uq4_12_multiply(modifier, UQ_4_12(0.5)); - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_ELECTRIC_TERRAIN) && moveType == TYPE_ELECTRIC) + if (IsElectricTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, ctx->fieldStatuses) && moveType == TYPE_ELECTRIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); - if (IsBattlerTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && moveType == TYPE_PSYCHIC) + if (IsPsychicTerrainAffected(battlerAtk, ctx->abilityAtk, ctx->holdEffectAtk, ctx->fieldStatuses) && moveType == TYPE_PSYCHIC) modifier = uq4_12_multiply(modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8 ? UQ_4_12(1.3) : UQ_4_12(1.5))); if (IsFieldMudSportAffected(ctx->moveType)) - modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); if (IsFieldWaterSportAffected(ctx->moveType)) - modifier = uq4_12_multiply(modifier, UQ_4_12(B_SPORT_DMG_REDUCTION >= GEN_5 ? 0.33 : 0.5)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_SPORT_DMG_REDUCTION) >= GEN_5 ? 0.33 : 0.5)); // attacker's abilities switch (ctx->abilityAtk) @@ -7183,7 +8335,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) modifier = uq4_12_multiply(modifier, UQ_4_12(0.75)); break; case ABILITY_ANALYTIC: - if (GetBattlerTurnOrderNum(battlerAtk) == gBattlersCount - 1 && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE) + if (IsLastMonToMove(battlerAtk) && moveEffect != EFFECT_FUTURE_SIGHT) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); break; case ABILITY_TOUGH_CLAWS: @@ -7208,22 +8360,22 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) break; case ABILITY_PIXILATE: if (moveType == TYPE_FAIRY && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_GALVANIZE: if (moveType == TYPE_ELECTRIC && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_REFRIGERATE: if (moveType == TYPE_ICE && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_AERILATE: if (moveType == TYPE_FLYING && gBattleStruct->battlerState[battlerAtk].ateBoost) - modifier = uq4_12_multiply(modifier, UQ_4_12(GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); + modifier = uq4_12_multiply(modifier, UQ_4_12(GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7 ? 1.2 : 1.3)); break; case ABILITY_NORMALIZE: - if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetGenConfig(GEN_CONFIG_ATE_MULTIPLIER) >= GEN_7) + if (moveType == TYPE_NORMAL && gBattleStruct->battlerState[battlerAtk].ateBoost && GetConfig(CONFIG_ATE_MULTIPLIER) >= GEN_7) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_PUNK_ROCK: @@ -7292,24 +8444,6 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) if (moveType == TYPE_FIRE) modifier = uq4_12_multiply(modifier, UQ_4_12(1.25)); break; - case ABILITY_PROTOSYNTHESIS: - { - enum Stat defHighestStat = GetHighestStatId(battlerDef); - if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gDisableStructs[battlerDef].boosterEnergyActivated) - && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].volatiles.transformed)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); - } - break; - case ABILITY_QUARK_DRIVE: - { - u8 defHighestStat = GetHighestStatId(battlerDef); - if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerDef].boosterEnergyActivated) - && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) - && !(gBattleMons[battlerDef].volatiles.transformed)) - modifier = uq4_12_multiply(modifier, UQ_4_12(0.7)); - } - break; default: break; } @@ -7373,9 +8507,9 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx) && uq4_12_multiply_by_int_half_down(modifier, basePower) < 60 && GetMovePower(move) > 1 && GetMoveStrikeCount(move) < 2 + && !IsMultiHitMove(move) && moveEffect != EFFECT_POWER_BASED_ON_USER_HP && moveEffect != EFFECT_POWER_BASED_ON_TARGET_HP - && moveEffect != EFFECT_MULTI_HIT && GetMovePriority(move) == 0) { return 60; @@ -7404,7 +8538,25 @@ static bool32 IsRuinStatusActive(u32 fieldEffect) return FALSE; } -static inline u32 CalcAttackStat(struct DamageContext *ctx) +static inline uq4_12_t ApplyOffensiveBadgeBoost(uq4_12_t modifier, u32 battler, enum Move move) +{ + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_ATTACK, battler) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPATK, battler) && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + return modifier; +} + +static inline uq4_12_t ApplyDefensiveBadgeBoost(uq4_12_t modifier, u32 battler, enum Move move) +{ + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_DEFENSE, battler) && IsBattleMovePhysical(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPDEF, battler) && IsBattleMoveSpecial(move)) + modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + return modifier; +} + +static inline u32 CalcAttackStat(struct BattleContext *ctx) { u8 atkStage; u32 atkStat; @@ -7412,7 +8564,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) u16 atkBaseSpeciesId; u32 battlerAtk = ctx->battlerAtk; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; enum Type moveType = ctx->moveType; enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -7437,7 +8589,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) { atkStat = gBattleMons[battlerAtk].defense; // Edge case: Body Press used during Wonder Room. For some reason, it still uses Defense over Sp.Def, but uses Sp.Def stat changes - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) + if (ctx->fieldStatuses & STATUS_FIELD_WONDER_ROOM) atkStage = gBattleMons[battlerAtk].statStages[STAT_SPDEF]; else atkStage = gBattleMons[battlerAtk].statStages[STAT_DEF]; @@ -7475,6 +8627,9 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) // apply attack stat modifiers modifier = UQ_4_12(1.0); + if (ctx->isSelfInflicted) + return uq4_12_multiply_by_int_half_down(ApplyOffensiveBadgeBoost(modifier, battlerAtk, move), atkStat); + // attacker's abilities switch (ctx->abilityAtk) { @@ -7484,7 +8639,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case ABILITY_SLOW_START: - if (gDisableStructs[battlerAtk].slowStartTimer > 0) + if (gBattleMons[battlerAtk].volatiles.slowStartTimer > 0) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; case ABILITY_SOLAR_POWER: @@ -7496,7 +8651,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5)); break; case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE && gDisableStructs[battlerAtk].flashFireBoosted) + if (moveType == TYPE_FIRE && gBattleMons[battlerAtk].volatiles.flashFireBoosted) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_SWARM: @@ -7542,7 +8697,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; case ABILITY_STAKEOUT: - if (gDisableStructs[battlerDef].isFirstTurn == 2) // just switched in + if (gBattleStruct->battlerState[battlerDef].isFirstTurn == 2) // just switched in modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case ABILITY_GUTS: @@ -7552,7 +8707,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_TRANSISTOR: if (moveType == TYPE_ELECTRIC) { - if (GetGenConfig(GEN_CONFIG_TRANSISTOR_BOOST) >= GEN_9) + if (GetConfig(CONFIG_TRANSISTOR_BOOST) >= GEN_9) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); else modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); @@ -7573,8 +8728,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_PROTOSYNTHESIS: if (!(gBattleMons[battlerAtk].volatiles.transformed)) { - enum Stat atkHighestStat = GetHighestStatId(battlerAtk); - if (((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect()) || gDisableStructs[battlerAtk].boosterEnergyActivated) + enum Stat atkHighestStat = GetParadoxBoostedStatId(battlerAtk); + if (ctx->weather & B_WEATHER_SUN || gBattleMons[battlerAtk].volatiles.boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); @@ -7584,8 +8739,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) case ABILITY_QUARK_DRIVE: if (!(gBattleMons[battlerAtk].volatiles.transformed)) { - enum Stat atkHighestStat = GetHighestStatId(battlerAtk); - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battlerAtk].boosterEnergyActivated) + enum Stat atkHighestStat = GetParadoxBoostedStatId(battlerAtk); + if (ctx->fieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleMons[battlerAtk].volatiles.boosterEnergyActivated) { if ((IsBattleMovePhysical(move) && atkHighestStat == STAT_ATK) || (IsBattleMoveSpecial(move) && atkHighestStat == STAT_SPATK)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); @@ -7593,11 +8748,12 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) } break; case ABILITY_ORICHALCUM_PULSE: - if ((ctx->weather & B_WEATHER_SUN) && HasWeatherEffect() && IsBattleMovePhysical(move)) + if (ctx->weather & B_WEATHER_SUN && IsBattleMovePhysical(move) + && ctx->holdEffectAtk != HOLD_EFFECT_UTILITY_UMBRELLA) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; case ABILITY_HADRON_ENGINE: - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) + if (ctx->fieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move)) modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333)); break; default: @@ -7660,7 +8816,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_LIGHT_BALL: - if (atkBaseSpeciesId == SPECIES_PIKACHU && (B_LIGHT_BALL_ATTACK_BOOST >= GEN_4 || IsBattleMoveSpecial(move))) + if (atkBaseSpeciesId == SPECIES_PIKACHU && (GetConfig(CONFIG_LIGHT_BALL_ATTACK_BOOST) >= GEN_4 || IsBattleMoveSpecial(move))) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0)); break; case HOLD_EFFECT_CHOICE_BAND: @@ -7675,11 +8831,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx) break; } - // The offensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_ATTACK, battlerAtk) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPATK, battlerAtk) && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + modifier = ApplyOffensiveBadgeBoost(modifier, battlerAtk, move); return uq4_12_multiply_by_int_half_down(modifier, atkStat); } @@ -7701,14 +8853,14 @@ static bool32 CanEvolve(u32 species) return FALSE; } -static inline u32 CalcDefenseStat(struct DamageContext *ctx) +static inline u32 CalcDefenseStat(struct BattleContext *ctx) { bool32 usesDefStat; u8 defStage; u32 defStat, def, spDef; uq4_12_t modifier; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; enum BattleMoveEffects moveEffect = GetMoveEffect(move); def = gBattleMons[battlerDef].defense; @@ -7716,7 +8868,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) if (moveEffect == EFFECT_PSYSHOCK || IsBattleMovePhysical(move)) // uses defense stat instead of sp.def { - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + if (ctx->fieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped { defStat = spDef; usesDefStat = FALSE; @@ -7730,7 +8882,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } else // is special { - if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped + if (ctx->fieldStatuses & STATUS_FIELD_WONDER_ROOM) // the defense stats are swapped { defStat = def; usesDefStat = TRUE; @@ -7744,8 +8896,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } // Self-destruct / Explosion cut defense in half - if (B_EXPLOSION_DEFENSE < GEN_5 && (moveEffect == EFFECT_EXPLOSION - || moveEffect == EFFECT_MISTY_EXPLOSION)) + if (GetConfig(CONFIG_EXPLOSION_DEFENSE) < GEN_5 && IsExplosionMove(ctx->move)) defStat /= 2; // critical hits ignore positive stat changes @@ -7764,6 +8915,9 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) // apply defense stat modifiers modifier = UQ_4_12(1.0); + if (ctx->isSelfInflicted) + return uq4_12_multiply_by_int_half_down(ApplyDefensiveBadgeBoost(modifier, battlerDef, move), defStat); + // target's abilities switch (ctx->abilityDef) { @@ -7784,7 +8938,7 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } break; case ABILITY_GRASS_PELT: - if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) + if (ctx->fieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) { modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); if (ctx->updateFlags) @@ -7795,6 +8949,24 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + case ABILITY_PROTOSYNTHESIS: + { + enum Stat defHighestStat = GetParadoxBoostedStatId(battlerDef); + if (((ctx->weather & B_WEATHER_SUN && HasWeatherEffect()) || gBattleMons[battlerDef].volatiles.boosterEnergyActivated) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].volatiles.transformed)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + } + break; + case ABILITY_QUARK_DRIVE: + { + u32 defHighestStat = GetParadoxBoostedStatId(battlerDef); + if ((gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gBattleMons[battlerDef].volatiles.boosterEnergyActivated) + && ((IsBattleMovePhysical(move) && defHighestStat == STAT_DEF) || (IsBattleMoveSpecial(move) && defHighestStat == STAT_SPDEF)) + && !(gBattleMons[battlerDef].volatiles.transformed)) + modifier = uq4_12_multiply(modifier, UQ_4_12(1.3)); + } + break; default: break; } @@ -7851,17 +9023,13 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx) } // sandstorm sp.def boost for rock types - if (B_SANDSTORM_SPDEF_BOOST >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) + if (GetConfig(CONFIG_SANDSTORM_SPDEF_BOOST) >= GEN_4 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ROCK) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SANDSTORM) && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); // snow def boost for ice types if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SNOW) && usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); - // The defensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the corresponding flags set (eg. Badges) - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_DEFENSE, battlerDef) && IsBattleMovePhysical(move)) - modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); - if (ShouldGetStatBadgeBoost(B_FLAG_BADGE_BOOST_SPDEF, battlerDef) && IsBattleMoveSpecial(move)) - modifier = uq4_12_multiply_half_down(modifier, GetBadgeBoostModifier()); + modifier = ApplyDefensiveBadgeBoost(modifier, battlerDef, move); return uq4_12_multiply_by_int_half_down(modifier, defStat); } @@ -7872,10 +9040,15 @@ static inline s32 CalculateBaseDamage(u32 power, u32 userFinalAttack, u32 level, return power * userFinalAttack * (2 * level / 5 + 2) / targetFinalDefense / 50 + 2; } -static inline uq4_12_t GetTargetDamageModifier(struct DamageContext *ctx) +static inline uq4_12_t GetTargetDamageModifier(struct BattleContext *ctx) { - if (IsDoubleBattle() && GetMoveTargetCount(ctx) >= 2) - return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(0.5); + if (IsDoubleBattle()) + { + if (GetMoveTargetCount(ctx) == 2) + return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(0.5); + else if (GetMoveTargetCount(ctx) >= 3) + return B_MULTIPLE_TARGETS_DMG >= GEN_4 ? UQ_4_12(0.75) : UQ_4_12(1.0); + } return UQ_4_12(1.0); } @@ -7886,7 +9059,7 @@ static inline uq4_12_t GetParentalBondModifier(u32 battlerAtk) return B_PARENTAL_BOND_DMG >= GEN_7 ? UQ_4_12(0.25) : UQ_4_12(0.5); } -static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageContext *ctx) +static inline uq4_12_t GetSameTypeAttackBonusModifier(struct BattleContext *ctx) { if (ctx->moveType == TYPE_MYSTERY) return UQ_4_12(1.0); @@ -7898,7 +9071,7 @@ static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageContext *ctx) } // Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. -static uq4_12_t GetWeatherDamageModifier(struct DamageContext *ctx) +static uq4_12_t GetWeatherDamageModifier(struct BattleContext *ctx) { if (ctx->weather == B_WEATHER_NONE) return UQ_4_12(1.0); @@ -7922,18 +9095,18 @@ static uq4_12_t GetWeatherDamageModifier(struct DamageContext *ctx) return UQ_4_12(1.0); } -static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) +static inline uq4_12_t GetBurnOrFrostBiteModifier(struct BattleContext *ctx) { enum BattleMoveEffects moveEffect = GetMoveEffect(ctx->move); if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_BURN && IsBattleMovePhysical(ctx->move) - && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE) + && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE) && ctx->abilityAtk != ABILITY_GUTS) return UQ_4_12(0.5); if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE && IsBattleMoveSpecial(ctx->move) - && (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE)) + && (GetConfig(CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE)) return UQ_4_12(0.5); return UQ_4_12(1.0); } @@ -7941,7 +9114,7 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx) static inline uq4_12_t GetCriticalModifier(bool32 isCrit) { if (isCrit) - return GetGenConfig(GEN_CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); + return GetConfig(CONFIG_CRIT_MULTIPLIER) >= GEN_6 ? UQ_4_12(1.5) : UQ_4_12(2.0); return UQ_4_12(1.0); } @@ -7952,7 +9125,7 @@ static inline uq4_12_t GetGlaiveRushModifier(u32 battlerDef) return UQ_4_12(1.0); } -static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageContext *ctx) +static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct BattleContext *ctx) { if (!IsZMove(ctx->move) && !IsMaxMove(ctx->move)) return UQ_4_12(1.0); @@ -7963,42 +9136,42 @@ static inline uq4_12_t GetZMaxMoveAgainstProtectionModifier(struct DamageContext return UQ_4_12(1.0); } -static inline uq4_12_t GetMinimizeModifier(u32 move, u32 battlerDef) +static inline uq4_12_t GetMinimizeModifier(enum Move move, u32 battlerDef) { if (MoveIncreasesPowerToMinimizedTargets(move) && gBattleMons[battlerDef].volatiles.minimize) return UQ_4_12(2.0); return UQ_4_12(1.0); } -static inline uq4_12_t GetUndergroundModifier(u32 move, u32 battlerDef) +static inline uq4_12_t GetUndergroundModifier(enum Move move, u32 battlerDef) { if (MoveDamagesUnderground(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERGROUND) return UQ_4_12(2.0); return UQ_4_12(1.0); } -static inline uq4_12_t GetDiveModifier(u32 move, u32 battlerDef) +static inline uq4_12_t GetDiveModifier(enum Move move, u32 battlerDef) { if (MoveDamagesUnderWater(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_UNDERWATER) return UQ_4_12(2.0); return UQ_4_12(1.0); } -static inline uq4_12_t GetAirborneModifier(u32 move, u32 battlerDef) +static inline uq4_12_t GetAirborneModifier(enum Move move, u32 battlerDef) { if (MoveDamagesAirborneDoubleDamage(move) && gBattleMons[battlerDef].volatiles.semiInvulnerable == STATE_ON_AIR) return UQ_4_12(2.0); return UQ_4_12(1.0); } -static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) +static inline uq4_12_t GetScreensModifier(struct BattleContext *ctx) { u32 sideStatus = gSideStatuses[GetBattlerSide(ctx->battlerDef)]; bool32 lightScreen = (sideStatus & SIDE_STATUS_LIGHTSCREEN) && IsBattleMoveSpecial(ctx->move); bool32 reflect = (sideStatus & SIDE_STATUS_REFLECT) && IsBattleMovePhysical(ctx->move); bool32 auroraVeil = sideStatus & SIDE_STATUS_AURORA_VEIL; - if (ctx->isCrit || gProtectStructs[ctx->battlerAtk].confusionSelfDmg) + if (ctx->isCrit || ctx->isSelfInflicted) { return UQ_4_12(1.0); } @@ -8015,7 +9188,7 @@ static inline uq4_12_t GetScreensModifier(struct DamageContext *ctx) return UQ_4_12(1.0); } -static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t typeEffectivenessModifier) +static inline uq4_12_t GetCollisionCourseElectroDriftModifier(enum Move move, uq4_12_t typeEffectivenessModifier) { if (GetMoveEffect(move) == EFFECT_COLLISION_COURSE && typeEffectivenessModifier >= UQ_4_12(2.0)) return UQ_4_12(1.3333); @@ -8044,7 +9217,7 @@ static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typ return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx) +static inline uq4_12_t GetDefenderAbilitiesModifier(struct BattleContext *ctx) { bool32 recordAbility = FALSE; uq4_12_t modifier = UQ_4_12(1.0); @@ -8128,7 +9301,7 @@ static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEff { case HOLD_EFFECT_METRONOME: metronomeBoostBase = PercentToUQ4_12(GetBattlerHoldEffectParam(battlerAtk)); - metronomeTurns = min(gBattleStruct->metronomeItemCounter[battlerAtk], 5); + metronomeTurns = min(gBattleMons[battlerAtk].volatiles.metronomeItemCounter, 5); // according to bulbapedia this is the "correct" way to calculate the metronome boost // due to the limited domain of damage numbers it will never really matter whether this is off by one return uq4_12_add(UQ_4_12(1.0), metronomeBoostBase * metronomeTurns); @@ -8146,7 +9319,7 @@ static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEff return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) +static inline uq4_12_t GetDefenderItemsModifier(struct BattleContext *ctx) { switch (ctx->holdEffectDef) { @@ -8157,6 +9330,8 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) { if (ctx->updateFlags) gSpecialStatuses[ctx->battlerDef].berryReduced = TRUE; + if (ctx->aiCalc && AI_DAMAGES_THROUGH_BERRIES) + ctx->aiCheckBerryModifier = TRUE; return (ctx->abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); } break; @@ -8176,7 +9351,7 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageContext *ctx) // https://bulbapedia.bulbagarden.net/wiki/Damage#Generation_V_onward // Please Note: Fixed Point Multiplication is not associative. // The order of operations is relevant. -static inline uq4_12_t GetOtherModifiers(struct DamageContext *ctx) +static inline uq4_12_t GetOtherModifiers(struct BattleContext *ctx) { uq4_12_t finalModifier = UQ_4_12(1.0); u32 battlerDefPartner = BATTLE_PARTNER(ctx->battlerDef); @@ -8216,7 +9391,7 @@ static inline uq4_12_t GetOtherModifiers(struct DamageContext *ctx) dmg = uq4_12_multiply_by_int_half_down(modifier, dmg); \ } while (0) -static inline s32 DoMoveDamageCalcVars(struct DamageContext *ctx) +static inline s32 DoMoveDamageCalcVars(struct BattleContext *ctx) { s32 dmg; u32 userFinalAttack; @@ -8256,7 +9431,7 @@ static inline s32 DoMoveDamageCalcVars(struct DamageContext *ctx) return dmg; } -s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) +s32 ApplyModifiersAfterDmgRoll(struct BattleContext *ctx, s32 dmg) { if (GetActiveGimmick(ctx->battlerAtk) == GIMMICK_TERA) DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(ctx)); @@ -8270,9 +9445,9 @@ s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg) return dmg; } -s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) +s32 DoFixedDamageMoveCalc(struct BattleContext *ctx) { - s32 dmg = 0; + s32 dmg = INT32_MAX; s32 randDamage; switch (GetMoveEffect(ctx->move)) @@ -8281,8 +9456,20 @@ s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) dmg = gBattleMons[ctx->battlerAtk].level; break; case EFFECT_PSYWAVE: - randDamage = B_PSYWAVE_DMG >= GEN_5 ? (Random() % 101) : ((Random() % 11) * 10); - dmg = gBattleMons[ctx->battlerAtk].level * (randDamage + 50) / 100; + if (B_PSYWAVE_DMG >= GEN_5) + { + randDamage = Random() % 101; + dmg = gBattleMons[ctx->battlerAtk].level * (randDamage + 50) / 100; + } + else if (B_PSYWAVE_DMG >= GEN_3) + { + randDamage = Random() % 11; + dmg = gBattleMons[ctx->battlerAtk].level * ((randDamage * 10) + 50) / 100; + } + else + { + dmg = Random() % ((gBattleMons[ctx->battlerAtk].level + (gBattleMons[ctx->battlerAtk].level / 2)) + 1); + } break; case EFFECT_FIXED_HP_DAMAGE: dmg = GetMoveFixedHPDamage(ctx->move); @@ -8293,10 +9480,43 @@ s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) case EFFECT_FINAL_GAMBIT: dmg = GetNonDynamaxHP(ctx->battlerAtk); break; + case EFFECT_BEAT_UP: + if (GetConfig(CONFIG_BEAT_UP) < GEN_5) + dmg = CalcBeatUpDamage(ctx); + break; + case EFFECT_REFLECT_DAMAGE: + if (!ctx->aiCalc) + { + u32 percentMultiplier = GetMoveReflectDamage_DamagePercent(ctx->move); + enum DamageCategory reflectCategory = GetReflectDamageMoveDamageCategory(ctx->battlerAtk, ctx->move); + s32 baseDamage; + + if (reflectCategory == DAMAGE_CATEGORY_PHYSICAL) + baseDamage = gProtectStructs[ctx->battlerAtk].physicalDmg; + else + baseDamage = gProtectStructs[ctx->battlerAtk].specialDmg; + + dmg = (baseDamage - 1) * percentMultiplier / 100; + } + break; + case EFFECT_ENDEAVOR: + if (GetNonDynamaxHP(ctx->battlerDef) <= gBattleMons[ctx->battlerAtk].hp) + { + dmg = 0; + gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_DOESNT_AFFECT_FOE; + } + else + { + dmg = GetNonDynamaxHP(ctx->battlerDef) - gBattleMons[ctx->battlerAtk].hp; + } + break; default: - return INT32_MAX; + break; } + if (dmg == INT32_MAX) + return dmg; + gBattleStruct->moveResultFlags[ctx->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); if (dmg == 0) @@ -8305,7 +9525,7 @@ s32 DoFixedDamageMoveCalc(struct DamageContext *ctx) return dmg; } -static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) +static inline s32 DoMoveDamageCalc(struct BattleContext *ctx) { if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return 0; @@ -8314,34 +9534,29 @@ static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) if (dmg != INT32_MAX) return dmg; - ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); - ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); - return DoMoveDamageCalcVars(ctx); } -static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageContext *ctx) +static inline s32 DoFutureSightAttackDamageCalcVars(struct BattleContext *ctx) { s32 dmg; u32 userFinalAttack; u32 targetFinalDefense; u32 battlerAtk = ctx->battlerAtk; u32 battlerDef = ctx->battlerDef; - u32 move = ctx->move; + enum Move move = ctx->move; enum Type moveType = ctx->moveType; struct Pokemon *party = GetBattlerParty(battlerAtk); - struct Pokemon *partyMon = &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]]; - u32 partyMonLevel = GetMonData(partyMon, MON_DATA_LEVEL, NULL); - u32 partyMonSpecies = GetMonData(partyMon, MON_DATA_SPECIES, NULL); + struct Pokemon *partyMon = &party[gBattleStruct->futureSight[battlerDef].partyIndex]; + u32 partyMonLevel = GetMonData(partyMon, MON_DATA_LEVEL); + u32 partyMonSpecies = GetMonData(partyMon, MON_DATA_SPECIES); gBattleMovePower = GetMovePower(move); if (IsBattleMovePhysical(move)) - userFinalAttack = GetMonData(partyMon, MON_DATA_ATK, NULL); + userFinalAttack = GetMonData(partyMon, MON_DATA_ATK); else - userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK, NULL); + userFinalAttack = GetMonData(partyMon, MON_DATA_SPATK); targetFinalDefense = CalcDefenseStat(ctx); dmg = CalculateBaseDamage(gBattleMovePower, userFinalAttack, partyMonLevel, targetFinalDefense); @@ -8367,7 +9582,7 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageContext *ctx) return dmg; } -static inline s32 DoFutureSightAttackDamageCalc(struct DamageContext *ctx) +static inline s32 DoFutureSightAttackDamageCalc(struct BattleContext *ctx) { if (ctx->typeEffectivenessModifier == UQ_4_12(0.0)) return 0; @@ -8375,17 +9590,7 @@ static inline s32 DoFutureSightAttackDamageCalc(struct DamageContext *ctx) return DoFutureSightAttackDamageCalcVars(ctx); } -#undef DAMAGE_APPLY_MODIFIER - -static u32 GetWeather(void) -{ - if (gBattleWeather == B_WEATHER_NONE || !HasWeatherEffect()) - return B_WEATHER_NONE; - else - return gBattleWeather; -} - -bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move) +bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, enum Move move) { if (GetMoveEffect(move) != EFFECT_FUTURE_SIGHT) return FALSE; @@ -8393,22 +9598,215 @@ bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move) struct Pokemon *party = GetBattlerParty(battlerAtk); if (IsDoubleBattle()) { - return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]] - && &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[BATTLE_PARTNER(battlerAtk)]]; + return &party[gBattleStruct->futureSight[battlerDef].partyIndex] != &party[gBattlerPartyIndexes[battlerAtk]] + && &party[gBattleStruct->futureSight[battlerDef].partyIndex] != &party[gBattlerPartyIndexes[BATTLE_PARTNER(battlerAtk)]]; } - return &party[gWishFutureKnock.futureSightPartyIndex[battlerDef]] != &party[gBattlerPartyIndexes[battlerAtk]]; + return &party[gBattleStruct->futureSight[battlerDef].partyIndex] != &party[gBattlerPartyIndexes[battlerAtk]]; } -s32 CalculateMoveDamage(struct DamageContext *ctx) +#undef DAMAGE_APPLY_MODIFIER + +// The chance is 1/N for each stage. +static const u32 sGen7CriticalHitOdds[] = {24, 8, 2, 1, 1}; // 1/X +static const u32 sGen6CriticalHitOdds[] = {16, 8, 2, 1, 1}; // 1/X +static const u32 sCriticalHitOdds[] = {16, 8, 4, 3, 2}; // 1/X, Gens 3,4,5 +static const u32 sGen2CriticalHitOdds[] = {17, 32, 64, 85, 128}; // X/256 + +static inline u32 GetCriticalHitOdds(u32 critChance) +{ + if (GetConfig(CONFIG_CRIT_CHANCE) >= GEN_7) + return sGen7CriticalHitOdds[critChance]; + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_6) + return sGen6CriticalHitOdds[critChance]; + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) + return sGen2CriticalHitOdds[critChance]; + + return sCriticalHitOdds[critChance]; +} + +static inline u32 IsBattlerLeekAffected(u32 battler, enum HoldEffect holdEffect) +{ + if (holdEffect == HOLD_EFFECT_LEEK) + { + return GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_FARFETCHD + || gBattleMons[battler].species == SPECIES_SIRFETCHD; + } + return FALSE; +} + +static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum HoldEffect holdEffect) +{ + u32 critStageIncrease = 0; + + switch (holdEffect) + { + case HOLD_EFFECT_SCOPE_LENS: + critStageIncrease = 1; + break; + case HOLD_EFFECT_LUCKY_PUNCH: + if (gBattleMons[battler].species == SPECIES_CHANSEY) + critStageIncrease = 2; + break; + case HOLD_EFFECT_LEEK: + if (IsBattlerLeekAffected(battler, holdEffect)) + critStageIncrease = 2; + break; + default: + critStageIncrease = 0; + break; + } + + return critStageIncrease; +} + +s32 CalcCritChanceStage(struct BattleContext *ctx) +{ + s32 critChance = 0; + + if (gSideStatuses[GetBattlerSide(ctx->battlerDef)] & SIDE_STATUS_LUCKY_CHANT) + { + critChance = CRITICAL_HIT_BLOCKED; + } + else if (gBattleMons[ctx->battlerAtk].volatiles.laserFocus + || MoveAlwaysCrits(ctx->move) + || (ctx->abilityAtk == ABILITY_MERCILESS && gBattleMons[ctx->battlerDef].status1 & STATUS1_PSN_ANY)) + { + critChance = CRITICAL_HIT_ALWAYS; + } + else + { + critChance = (gBattleMons[ctx->battlerAtk].volatiles.focusEnergy != 0 ? 2 : 0) + + (gBattleMons[ctx->battlerAtk].volatiles.dragonCheer != 0 ? 1 : 0) + + GetMoveCriticalHitStage(ctx->move) + + GetHoldEffectCritChanceIncrease(ctx->battlerAtk, ctx->holdEffectAtk) + + ((B_AFFECTION_MECHANICS == TRUE && GetBattlerAffectionHearts(ctx->battlerAtk) == AFFECTION_FIVE_HEARTS) ? 2 : 0) + + (ctx->abilityAtk == ABILITY_SUPER_LUCK ? 1 : 0) + + gBattleMons[ctx->battlerAtk].volatiles.bonusCritStages; + + if (critChance >= ARRAY_COUNT(sCriticalHitOdds)) + critChance = ARRAY_COUNT(sCriticalHitOdds) - 1; + } + + if (critChance != CRITICAL_HIT_BLOCKED && (ctx->abilityDef == ABILITY_BATTLE_ARMOR || ctx->abilityDef == ABILITY_SHELL_ARMOR)) + { + // Record ability only if move had 100% chance to get a crit + if (ctx->updateFlags) + { + if (critChance == CRITICAL_HIT_ALWAYS) + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + else if (GetCriticalHitOdds(critChance) == 1) + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + } + critChance = CRITICAL_HIT_BLOCKED; + } + + return critChance; +} + +// Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Critical_hit#Generation_I +// Crit chance = Threshold / 256, Threshold maximum of 255 +// Threshold = Base Speed / 2 +// High crit move = 8 * (Base Speed / 2) +// Focus Energy = 4 * (Base Speed / 2) +s32 CalcCritChanceStageGen1(struct BattleContext *ctx) +{ + s32 critChance = 0; + s32 moveCritStage = GetMoveCriticalHitStage(ctx->move); + s32 bonusCritStage = gBattleMons[ctx->battlerAtk].volatiles.bonusCritStages; // G-Max Chi Strike + u32 holdEffectCritStage = GetHoldEffectCritChanceIncrease(ctx->battlerAtk, ctx->holdEffectAtk); + u16 baseSpeed = GetSpeciesBaseSpeed(gBattleMons[ctx->battlerAtk].species); + + critChance = baseSpeed / 2; + + // Crit scaling + if (moveCritStage > 0) + critChance *= 8 * moveCritStage; + + if (bonusCritStage > 0) + critChance *= bonusCritStage; + + if (gBattleMons[ctx->battlerAtk].volatiles.focusEnergy) + critChance *= 4; + else if (gBattleMons[ctx->battlerAtk].volatiles.dragonCheer) + critChance *= 2; + + if (holdEffectCritStage > 0) + critChance *= 4 * holdEffectCritStage; + + if (ctx->abilityAtk == ABILITY_SUPER_LUCK) + critChance *= 4; + + if (critChance > 255) + critChance = 255; + + // Prevented crits + if (gSideStatuses[ctx->battlerDef] & SIDE_STATUS_LUCKY_CHANT) + critChance = CRITICAL_HIT_BLOCKED; + else if (ctx->abilityDef == ABILITY_BATTLE_ARMOR || ctx->abilityDef == ABILITY_SHELL_ARMOR) + { + if (ctx->updateFlags) + RecordAbilityBattle(ctx->battlerDef, ctx->abilityDef); + critChance = CRITICAL_HIT_BLOCKED; + } + + // Guaranteed crits + else if (gBattleMons[ctx->battlerAtk].volatiles.laserFocus + || MoveAlwaysCrits(ctx->move) + || (ctx->abilityAtk == ABILITY_MERCILESS && gBattleMons[ctx->battlerDef].status1 & STATUS1_PSN_ANY)) + { + critChance = CRITICAL_HIT_ALWAYS; + } + + return critChance; +} + +static bool32 IsCriticalHit(struct BattleContext *ctx) +{ + bool32 isCrit = FALSE; + s32 critChance = 0; + + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + critChance = CalcCritChanceStageGen1(ctx); + else + critChance = CalcCritChanceStage(ctx); + + if ((gBattleTypeFlags & (BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_POKEDUDE)) + || ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) && (!IS_FRLG || !BtlCtrl_OakOldMan_TestState2Flag(1)))) + isCrit = FALSE; + else if (critChance == -1) + isCrit = FALSE; + else if (critChance == -2) + isCrit = TRUE; + else + { + if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_1) + isCrit = RandomChance(RNG_CRITICAL_HIT, critChance, 256); + else if (GetConfig(CONFIG_CRIT_CHANCE) == GEN_2) + isCrit = RandomChance(RNG_CRITICAL_HIT, GetCriticalHitOdds(critChance), 256); + else + isCrit = RandomChance(RNG_CRITICAL_HIT, 1, GetCriticalHitOdds(critChance)); + } + + // Counter for IF_CRITICAL_HITS_GE evolution condition. + if (isCrit && IsOnPlayerSide(ctx->battlerAtk) + && !(gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(ctx->battlerAtk) == B_POSITION_PLAYER_LEFT)) + gPartyCriticalHits[gBattlerPartyIndexes[ctx->battlerAtk]]++; + + gSpecialStatuses[ctx->battlerDef].criticalHit = isCrit; + return isCrit; +} + +s32 CalculateMoveDamage(struct BattleContext *ctx) { - ctx->weather = GetWeather(); ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); + if (!ctx->isSelfInflicted) + ctx->isCrit = IsCriticalHit(ctx); if (IsFutureSightAttackerInParty(ctx->battlerAtk, ctx->battlerDef, ctx->move)) return DoFutureSightAttackDamageCalc(ctx); @@ -8417,16 +9815,12 @@ s32 CalculateMoveDamage(struct DamageContext *ctx) } // for AI so that typeEffectivenessModifier, weather, abilities and holdEffects are calculated only once -s32 CalculateMoveDamageVars(struct DamageContext *ctx) +s32 CalculateMoveDamageVars(struct BattleContext *ctx) { - s32 dmg = DoFixedDamageMoveCalc(ctx); - if (dmg != INT32_MAX) - return dmg; - return DoMoveDamageCalcVars(ctx); } -static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *modifier, enum Type defType) +static inline void MulByTypeEffectiveness(struct BattleContext *ctx, uq4_12_t *modifier, enum Type defType) { uq4_12_t mod = GetTypeModifier(ctx->moveType, defType); @@ -8459,7 +9853,7 @@ static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *m mod = UQ_4_12(2.0); // B_WEATHER_STRONG_WINDS weakens Super Effective moves against Flying-type Pokémon - if (gBattleWeather & B_WEATHER_STRONG_WINDS && HasWeatherEffect() && !ctx->isAnticipation) + if (ctx->weather & B_WEATHER_STRONG_WINDS && !ctx->isAnticipation) { if (defType == TYPE_FLYING && mod >= UQ_4_12(2.0)) mod = UQ_4_12(1.0); @@ -8479,12 +9873,12 @@ static inline void MulByTypeEffectiveness(struct DamageContext *ctx, uq4_12_t *m *modifier = uq4_12_multiply(*modifier, mod); } -static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, enum Type moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t resultingModifier, u32 illusionSpecies) +static inline void TryNoticeIllusionInTypeEffectiveness(enum Move move, enum Type moveType, u32 battlerAtk, u32 battlerDef, uq4_12_t resultingModifier, u32 illusionSpecies) { // Check if the type effectiveness would've been different if the pokemon really had the types as the disguise. uq4_12_t presumedModifier = UQ_4_12(1.0); - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.battlerAtk = battlerAtk; ctx.battlerDef = battlerDef; ctx.move = ctx.chosenMove = move; @@ -8527,7 +9921,7 @@ void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags) } } -static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageContext *ctx, uq4_12_t modifier) +static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct BattleContext *ctx, uq4_12_t modifier) { u32 illusionSpecies; enum Type types[3]; @@ -8538,7 +9932,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont MulByTypeEffectiveness(ctx, &modifier, types[1]); if (types[2] != TYPE_MYSTERY && types[2] != types[1] && types[2] != types[0]) MulByTypeEffectiveness(ctx, &modifier, types[2]); - if (ctx->moveType == TYPE_FIRE && gDisableStructs[ctx->battlerDef].tarShot) + if (ctx->moveType == TYPE_FIRE && gBattleMons[ctx->battlerDef].volatiles.tarShot) modifier = uq4_12_multiply(modifier, UQ_4_12(2.0)); if (ctx->updateFlags && (illusionSpecies = GetIllusionMonSpecies(ctx->battlerDef))) @@ -8557,12 +9951,15 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont { gBattleStruct->moveResultFlags[ctx->battlerDef] |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastUsedAbility = ABILITY_LEVITATE; - gLastLandedMoves[ctx->battlerDef] = 0; - gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_GROUND_MISS; + ctx->abilityBlocked = TRUE; RecordAbilityBattle(ctx->battlerDef, ABILITY_LEVITATE); } + else if (ctx->holdEffectDef == HOLD_EFFECT_AIR_BALLOON) + { + ctx->airBalloonBlocked = TRUE; + } } - else if (GetGenConfig(GEN_CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) + else if (GetConfig(CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) { modifier = UQ_4_12(0.0); } @@ -8576,7 +9973,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont } // Iron Ball ignores type modifiers for flying-type mons if it is the only source of grounding - if (B_IRON_BALL >= GEN_5 + if (GetConfig(CONFIG_IRON_BALL) >= GEN_5 && ctx->moveType == TYPE_GROUND && ctx->holdEffectDef == HOLD_EFFECT_IRON_BALL && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_FLYING) @@ -8591,12 +9988,11 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont && GetMovePower(ctx->move) != 0) { modifier = UQ_4_12(0.0); + ctx->abilityBlocked = TRUE; if (ctx->updateFlags) { - gLastUsedAbility = gBattleMons[ctx->battlerDef].ability; + gLastUsedAbility = ctx->abilityDef; gBattleStruct->moveResultFlags[ctx->battlerDef] |= MOVE_RESULT_MISSED; - gLastLandedMoves[ctx->battlerDef] = 0; - gBattleStruct->missStringId[ctx->battlerDef] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(ctx->battlerDef, gBattleMons[ctx->battlerDef].ability); } } @@ -8607,7 +10003,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont return modifier; } -uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx) +uq4_12_t CalcTypeEffectivenessMultiplier(struct BattleContext *ctx) { uq4_12_t modifier = UQ_4_12(1.0); @@ -8626,14 +10022,14 @@ uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx) return modifier; } -uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef) +uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(enum Move move, u16 speciesDef, enum Ability abilityDef) { uq4_12_t modifier = UQ_4_12(1.0); enum Type moveType = GetBattleMoveType(move); if (move != MOVE_STRUGGLE && moveType != TYPE_MYSTERY) { - struct DamageContext ctx = {0}; + struct BattleContext ctx = {0}; ctx.move = ctx.chosenMove = move; ctx.moveType = moveType; ctx.updateFlags = FALSE; @@ -8670,25 +10066,27 @@ static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier) uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, enum Type moveType) { uq4_12_t modifier = UQ_4_12(1.0); - enum Ability abilityDef = GetMonAbility(mon); - u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES); - enum Type type1 = GetSpeciesType(speciesDef, 0); - enum Type type2 = GetSpeciesType(speciesDef, 1); if (moveType == TYPE_MYSTERY) return modifier; - struct DamageContext ctx = {0}; + + struct BattleContext ctx = {0}; + ctx.abilityDef = GetMonAbility(mon); ctx.move = ctx.chosenMove = MOVE_POUND; ctx.moveType = moveType; ctx.updateFlags = FALSE; + u32 speciesDef = GetMonData(mon, MON_DATA_SPECIES); + enum Type type1 = GetSpeciesType(speciesDef, 0); + enum Type type2 = GetSpeciesType(speciesDef, 1); + MulByTypeEffectiveness(&ctx, &modifier, type1); if (type2 != type1) MulByTypeEffectiveness(&ctx, &modifier, type2); - if ((modifier <= UQ_4_12(1.0) && abilityDef == ABILITY_WONDER_GUARD) - || CanAbilityAbsorbMove(0, 0, abilityDef, MOVE_NONE, moveType, CHECK_TRIGGER)) + if ((modifier <= UQ_4_12(1.0) && ctx.abilityDef == ABILITY_WONDER_GUARD) + || CanAbilityAbsorbMove(&ctx)) modifier = UQ_4_12(0.0); return modifier; @@ -8756,14 +10154,10 @@ s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler) bool32 IsPartnerMonFromSameTrainer(u32 battler) { - if (!IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - return FALSE; - else if (IsOnPlayerSide(battler) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - return FALSE; - else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - return FALSE; + if (!IsOnPlayerSide(battler)) + return !(gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS); else - return TRUE; + return !(gBattleTypeFlags & BATTLE_TYPE_MULTI); } bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) @@ -8864,16 +10258,16 @@ void ActivateMegaEvolution(u32 battler) gLastUsedItem = gBattleMons[battler].item; SetActiveGimmick(battler, GIMMICK_MEGA); if (GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE) != gBattleMons[battler].species) - BattleScriptExecute(BattleScript_WishMegaEvolution); + BattleScriptPushCursorAndCallback(BattleScript_WishMegaEvolution); else - BattleScriptExecute(BattleScript_MegaEvolution); + BattleScriptPushCursorAndCallback(BattleScript_MegaEvolution); } void ActivateUltraBurst(u32 battler) { gLastUsedItem = gBattleMons[battler].item; SetActiveGimmick(battler, GIMMICK_ULTRA_BURST); - BattleScriptExecute(BattleScript_UltraBurst); + BattleScriptPushCursorAndCallback(BattleScript_UltraBurst); } bool32 IsBattlerMegaEvolved(u32 battler) @@ -8909,7 +10303,7 @@ bool32 IsBattlerInTeraForm(u32 battler) } // Returns SPECIES_NONE if no form change is possible -u16 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) +u32 GetBattleFormChangeTargetSpecies(u32 battler, enum FormChanges method) { u32 i; u32 species = gBattleMons[battler].species; @@ -9052,7 +10446,7 @@ bool32 TryRevertPartyMonFormChange(u32 partyIndex) bool32 changedForm = FALSE; // Appeared in battle and didn't faint - if (gBattleStruct->partyState[B_SIDE_PLAYER][partyIndex].sentOut && GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL) != 0) + if (gBattleStruct->partyState[B_SIDE_PLAYER][partyIndex].sentOut && GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP) != 0) changedForm = TryFormChange(partyIndex, B_SIDE_PLAYER, FORM_CHANGE_END_BATTLE_ENVIRONMENT); if (!changedForm) @@ -9150,10 +10544,10 @@ bool32 DoBattlersShareType(u32 battler1, u32 battler2) return FALSE; } -bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) +bool32 CanBattlerGetOrLoseItem(u32 fromBattler, u32 battler, enum Item itemId) { - u16 species = gBattleMons[battler].species; - enum HoldEffect holdEffect = GetItemHoldEffect(itemId); + u16 species = gBattleMons[fromBattler].species; + enum HoldEffect holdEffect = GetItemHoldEffect(itemId); // Raw hold effect if (ItemIsMail(itemId)) return FALSE; @@ -9164,7 +10558,7 @@ bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) else if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) return FALSE; else if (holdEffect == HOLD_EFFECT_BOOSTER_ENERGY - && (gSpeciesInfo[gBattleMons[battler].species].isParadox || gSpeciesInfo[gBattleMons[gBattlerTarget].species].isParadox)) + && (gSpeciesInfo[gBattleMons[fromBattler].species].isParadox || gSpeciesInfo[gBattleMons[battler].species].isParadox)) return FALSE; else return TRUE; @@ -9178,18 +10572,15 @@ u32 GetBattlerVisualSpecies(u32 battler) return gBattleMons[battler].species; } -bool32 TryClearIllusion(u32 battler, enum AbilityEffect caseID) +bool32 TryClearIllusion(u32 battler, enum Ability ability) { if (gBattleStruct->illusion[battler].state != ILLUSION_ON) return FALSE; - if (GetBattlerAbility(battler) == ABILITY_ILLUSION && IsBattlerAlive(battler)) + if (ability == ABILITY_ILLUSION && IsBattlerAlive(battler)) return FALSE; gBattleScripting.battler = battler; - if (caseID == ABILITYEFFECT_ON_SWITCHIN) - BattleScriptPushCursorAndCallback(BattleScript_IllusionOffEnd3); - else - BattleScriptCall(BattleScript_IllusionOff); + BattleScriptCall(BattleScript_IllusionOff); return TRUE; } @@ -9256,14 +10647,14 @@ u32 GetIllusionMonPartyId(struct Pokemon *party, struct Pokemon *mon, struct Pok return PARTY_SIZE; } -bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) +void SetIllusionMon(struct Pokemon *mon, u32 battler) { struct Pokemon *party, *partnerMon; u32 id; gBattleStruct->illusion[battler].state = ILLUSION_OFF; if (GetMonAbility(mon) != ABILITY_ILLUSION) - return FALSE; + return; party = GetBattlerParty(battler); @@ -9277,15 +10668,12 @@ bool32 SetIllusionMon(struct Pokemon *mon, u32 battler) { gBattleStruct->illusion[battler].state = ILLUSION_ON; gBattleStruct->illusion[battler].mon = &party[id]; - return TRUE; } - - return FALSE; } -u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) +enum ImmunityHealStatusOutcome TryImmunityAbilityHealStatus(u32 battler) { - u32 effect = 0; + enum ImmunityHealStatusOutcome outcome = IMMUNITY_NO_EFFECT; switch (GetBattlerAbilityIgnoreMoldBreaker(battler)) { case ABILITY_IMMUNITY: @@ -9293,21 +10681,21 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - effect = 1; + outcome = IMMUNITY_STATUS_CLEARED; } break; case ABILITY_OWN_TEMPO: if (gBattleMons[battler].volatiles.confusionTurns > 0) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - effect = 2; + outcome = IMMUNITY_CONFUSION_CLEARED; } break; case ABILITY_LIMBER: if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - effect = 1; + outcome = IMMUNITY_STATUS_CLEARED; } break; case ABILITY_INSOMNIA: @@ -9317,7 +10705,7 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) TryDeactivateSleepClause(GetBattlerSide(battler), gBattlerPartyIndexes[battler]); gBattleMons[battler].volatiles.nightmare = FALSE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); - effect = 1; + outcome = IMMUNITY_STATUS_CLEARED; } break; case ABILITY_WATER_VEIL: @@ -9326,70 +10714,57 @@ u32 TryImmunityAbilityHealStatus(u32 battler, enum AbilityEffect caseID) if (gBattleMons[battler].status1 & STATUS1_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - effect = 1; + outcome = IMMUNITY_STATUS_CLEARED; } break; case ABILITY_MAGMA_ARMOR: - if (gBattleMons[battler].status1 & (STATUS1_FREEZE | STATUS1_FROSTBITE)) + if (gBattleMons[battler].status1 & STATUS1_ICY_ANY) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - effect = 1; + outcome = IMMUNITY_STATUS_CLEARED; } break; case ABILITY_OBLIVIOUS: if (gBattleMons[battler].volatiles.infatuation) - effect = 3; - else if (GetGenConfig(GEN_CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && gDisableStructs[battler].tauntTimer != 0) - effect = 4; + outcome = IMMUNITY_INFATUATION_CLEARED; + else if (GetConfig(CONFIG_OBLIVIOUS_TAUNT) >= GEN_6 && gBattleMons[battler].volatiles.tauntTimer != 0) + outcome = IMMUNITY_TAUNT_CLEARED; + break; + default: break; } - if (effect != 0) + switch (outcome) { - switch (effect) - { - case 1: // status cleared - gBattleMons[battler].status1 = 0; - if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) - BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); - else - BattleScriptCall(BattleScript_AbilityCuredStatus); - break; - case 2: // get rid of confusion - RemoveConfusionStatus(battler); - if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) - BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); - else - BattleScriptCall(BattleScript_AbilityCuredStatus); - break; - case 3: // get rid of infatuation - gBattleMons[battler].volatiles.infatuation = 0; - if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) - BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); - else - BattleScriptCall(BattleScript_AbilityCuredStatus); - break; - case 4: // get rid of taunt - gDisableStructs[battler].tauntTimer = 0; - if (caseID == ABILITYEFFECT_ON_SWITCHIN_IMMUNITIES) - BattleScriptExecute(BattleScript_AbilityCuredStatusEnd3); - else - BattleScriptCall(BattleScript_AbilityCuredStatus); - break; - } - - gBattleScripting.battler = gBattlerAbility = battler; - BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); - MarkBattlerForControllerExec(battler); - return effect; + case IMMUNITY_STATUS_CLEARED: + gBattleMons[battler].status1 = 0; + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case IMMUNITY_CONFUSION_CLEARED: + RemoveConfusionStatus(battler); + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case IMMUNITY_INFATUATION_CLEARED: + gBattleMons[battler].volatiles.infatuation = 0; + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case IMMUNITY_TAUNT_CLEARED: + gBattleMons[battler].volatiles.tauntTimer = 0; + BattleScriptCall(BattleScript_AbilityCuredStatus); + break; + case IMMUNITY_NO_EFFECT: + return IMMUNITY_NO_EFFECT; } - return 0; + gBattleScripting.battler = gBattlerAbility = battler; + BtlController_EmitSetMonData(battler, B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + MarkBattlerForControllerExec(battler); + return outcome; } uq4_12_t GetBadgeBoostModifier(void) { - if (GetGenConfig(GEN_CONFIG_BADGE_BOOST) < GEN_3) + if (GetConfig(CONFIG_BADGE_BOOST) < GEN_3) return UQ_4_12(1.125); else return UQ_4_12(1.1); @@ -9397,7 +10772,7 @@ uq4_12_t GetBadgeBoostModifier(void) bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) { - if (GetGenConfig(GEN_CONFIG_BADGE_BOOST) <= GEN_3 && badgeFlag != 0) + if (GetConfig(CONFIG_BADGE_BOOST) <= GEN_3 && badgeFlag != 0) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) return FALSE; @@ -9411,7 +10786,7 @@ bool32 ShouldGetStatBadgeBoost(u16 badgeFlag, u32 battler) return FALSE; } -static enum DamageCategory SwapMoveDamageCategory(u32 move) +static enum DamageCategory SwapMoveDamageCategory(enum Move move) { if (GetMoveCategory(move) == DAMAGE_CATEGORY_PHYSICAL) return DAMAGE_CATEGORY_SPECIAL; @@ -9423,7 +10798,7 @@ static enum DamageCategory SwapMoveDamageCategory(u32 move) can be removed but a lot of function arguments (battlerAtk and battlerDef) have to be added for this, about 50+. This is potentially a good change because it is less likely to cause bugs in the future. */ -enum DamageCategory GetBattleMoveCategory(u32 move) +enum DamageCategory GetBattleMoveCategory(enum Move move) { if (gMain.inBattle) { @@ -9435,13 +10810,13 @@ enum DamageCategory GetBattleMoveCategory(u32 move) return DAMAGE_CATEGORY_STATUS; } - if (B_PHYSICAL_SPECIAL_SPLIT <= GEN_4) + if (B_PHYSICAL_SPECIAL_SPLIT < GEN_4) return gTypesInfo[GetBattleMoveType(move)].damageCategory; return GetMoveCategory(move); } -void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, u32 move) +void SetDynamicMoveCategory(u32 battlerAtk, u32 battlerDef, enum Move move) { switch (GetMoveEffect(move)) { @@ -9507,7 +10882,7 @@ enum DamageCategory GetCategoryBasedOnStats(u32 battler) return DAMAGE_CATEGORY_PHYSICAL; } -static u32 GetFlingPowerFromItemId(u32 itemId) +static u32 GetFlingPowerFromItemId(enum Item itemId) { if (gItemsInfo[itemId].pocket == POCKET_TM_HM) { @@ -9520,16 +10895,16 @@ static u32 GetFlingPowerFromItemId(u32 itemId) return GetItemFlingPower(itemId); } -bool32 CanFling(u32 battler) +bool32 CanFling(u32 battlerAtk, u32 battlerDef) { - u16 item = gBattleMons[battler].item; + enum Item item = gBattleMons[battlerAtk].item; if (item == ITEM_NONE - || (B_KLUTZ_FLING_INTERACTION >= GEN_5 && GetBattlerAbility(battler) == ABILITY_KLUTZ) + || (GetConfig(CONFIG_KLUTZ_FLING_INTERACTION) >= GEN_5 && GetBattlerAbility(battlerAtk) == ABILITY_KLUTZ) || gFieldStatuses & STATUS_FIELD_MAGIC_ROOM - || gBattleMons[battler].volatiles.embargo + || gBattleMons[battlerAtk].volatiles.embargo || GetFlingPowerFromItemId(item) == 0 - || !CanBattlerGetOrLoseItem(battler, item)) + || !CanBattlerGetOrLoseItem(battlerAtk, battlerDef, item)) return FALSE; return TRUE; @@ -9601,7 +10976,7 @@ void TryRestoreHeldItems(void) } } -bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) +bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, enum Item item) { enum BattleSide stealerSide = GetBattlerSide(battlerStealing); @@ -9627,7 +11002,7 @@ bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_SECRET_BASE)) - && (gWishFutureKnock.knockedOffMons[stealerSide] & (1u << gBattlerPartyIndexes[battlerStealing]))) + && GetBattlerPartyState(battlerStealing)->isKnockedOff) { return FALSE; } @@ -9636,14 +11011,14 @@ bool32 CanStealItem(u32 battlerStealing, u32 battlerItem, u16 item) if (GetItemHoldEffect(item) == HOLD_EFFECT_AIR_BALLOON) return FALSE; - if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen - || !CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item + if (!CanBattlerGetOrLoseItem(battlerItem, battlerStealing, item) // Battler with item cannot have it stolen + || !CanBattlerGetOrLoseItem(battlerStealing, battlerItem, item)) // Stealer cannot take the item return FALSE; return TRUE; } -void TrySaveExchangedItem(u32 battler, u16 stolenItem) +void TrySaveExchangedItem(u32 battler, enum Item stolenItem) { // Because BtlController_EmitSetMonData does SetMonData, we need to save the stolen item only if it matches the battler's original // So, if the player steals an item during battle and has it stolen from it, it will not end the battle with it (naturally) @@ -9657,11 +11032,14 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem) gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen = TRUE; } -bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) +bool32 IsBattlerAffectedByHazards(u32 battler, enum HoldEffect holdEffect, bool32 toxicSpikes) { bool32 ret = TRUE; - enum HoldEffect holdEffect = GetBattlerHoldEffect(battler); - if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) + if (!IsBattlerAlive(battler)) + { + ret = FALSE; + } + else if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { ret = FALSE; RecordItemEffectBattle(battler, holdEffect); @@ -9674,16 +11052,16 @@ bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) return ret; } -bool32 TestIfSheerForceAffected(u32 battler, u16 move) +bool32 IsSheerForceAffected(enum Move move, enum Ability ability) { - return GetBattlerAbility(battler) == ABILITY_SHEER_FORCE && MoveIsAffectedBySheerForce(move); + return ability == ABILITY_SHEER_FORCE && MoveIsAffectedBySheerForce(move); } // This function is the body of "jumpifstat", but can be used dynamically in a function -bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Ability ability) +bool32 CompareStat(u32 battler, enum Stat statId, u32 cmpTo, u32 cmpKind, enum Ability ability) { bool32 ret = FALSE; - u8 statValue = gBattleMons[battler].statStages[statId]; + u32 statValue = gBattleMons[battler].statStages[statId]; // Because this command is used as a way of checking if a stat can be lowered/raised, // we need to do some modification at run-time. @@ -9731,15 +11109,17 @@ bool32 CompareStat(u32 battler, enum Stat statId, u8 cmpTo, u8 cmpKind, enum Abi return ret; } -bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) +bool32 BlocksPrankster(enum Move move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) { - if (GetGenConfig(GEN_CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) + if (GetConfig(CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) return FALSE; if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; if (IsBattlerAlly(battlerPrankster, battlerDef)) return FALSE; - if (checkTarget && (GetBattlerMoveTargetType(battlerPrankster, move) & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_DEPENDS))) + if (checkTarget && GetBattlerMoveTargetType(battlerPrankster, move) == TARGET_DEPENDS) + return FALSE; + if (checkTarget && GetBattlerMoveTargetType(battlerPrankster, move) == TARGET_OPPONENTS_FIELD) return FALSE; if (!IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK)) return FALSE; @@ -9752,7 +11132,7 @@ bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 ch bool32 CantPickupItem(u32 battler) { // Used by RandomUniformExcept() for RNG_PICKUP - if (battler == gBattlerAttacker && (GetGenConfig(GEN_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) + if (battler == gBattlerAttacker && (GetConfig(CONFIG_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK))) return TRUE; return !(IsBattlerAlive(battler) && GetBattlerPartyState(battler)->usedHeldItem && gBattleStruct->battlerState[battler].canPickupItem); } @@ -9781,23 +11161,27 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) return FALSE; } -// Gets move target before redirection effects etc. are applied -// Possible return values are defined in battle.h following MOVE_TARGET_SELECTED -// TODO: Add args: ability and hold effect -u32 GetBattlerMoveTargetType(u32 battler, u32 move) +static u32 CanBattlerHitBothFoesInTerrain(u32 battler, enum Move move, enum BattleMoveEffects effect) +{ + return effect == EFFECT_TERRAIN_BOOST + && GetMoveTerrainBoost_HitsBothFoes(move) + && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), gFieldStatuses, GetMoveTerrainBoost_Terrain(move)); +} + +enum MoveTarget GetBattlerMoveTargetType(u32 battler, enum Move move) { enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) - return MOVE_TARGET_USER; - if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) - return MOVE_TARGET_BOTH; + return TARGET_USER; + if (CanBattlerHitBothFoesInTerrain(battler, move, effect)) + return TARGET_BOTH; if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) - return MOVE_TARGET_BOTH; + return TARGET_BOTH; return GetMoveTarget(move); } -bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) +bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, enum Move move) { if (GetMoveEffect(move) == EFFECT_HIT_ENEMY_HEAL_ALLY && IsBattlerAlly(battlerAtk, battlerDef) @@ -9810,11 +11194,27 @@ bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) return TRUE; } +u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) +{ + u32 battler; + for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) + { + if (battler == gBattlerAttacker || !IsBattlerAlive(battler)) + continue; + + if (!(excludeCurrent && battler == gBattlerTarget) + && !gBattleStruct->battlerState[gBattlerAttacker].targetsDone[battler] + && (!IsBattlerAlly(battler, gBattlerAttacker) || moveTarget == TARGET_FOES_AND_ALLY)) + break; + } + return battler; +} + static void SetRandomMultiHitCounter() { if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LOADED_DICE) gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); - else if (GetGenConfig(GEN_CONFIG_MULTI_HIT_CHANCE) >= GEN_5) + else if (GetConfig(CONFIG_MULTI_HIT_CHANCE) >= GEN_5) gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. else gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 3, 3, 1, 1); // 37.5%: 2 hits, 37.5%: 3 hits, 12.5% 4 hits, 12.5% 5 hits. @@ -9872,7 +11272,7 @@ void RemoveConfusionStatus(u32 battler) gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } -u8 GetBattlerGender(u32 battler) +u32 GetBattlerGender(u32 battler) { return GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species, gBattleMons[battler].personality); @@ -9880,16 +11280,16 @@ u8 GetBattlerGender(u32 battler) bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2) { - u8 gender1 = GetBattlerGender(battler1); - u8 gender2 = GetBattlerGender(battler2); + u32 gender1 = GetBattlerGender(battler1); + u32 gender2 = GetBattlerGender(battler2); return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 != gender2); } bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2) { - u8 gender1 = GetBattlerGender(battler1); - u8 gender2 = GetBattlerGender(battler2); + u32 gender1 = GetBattlerGender(battler1); + u32 gender2 = GetBattlerGender(battler2); return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2); } @@ -9925,7 +11325,7 @@ bool32 IsGen6ExpShareEnabled(void) } -bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) +bool32 MoveHasAdditionalEffect(enum Move move, enum MoveEffect moveEffect) { u32 i; u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); @@ -9938,7 +11338,7 @@ bool32 MoveHasAdditionalEffect(u32 move, u32 moveEffect) return FALSE; } -bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) +bool32 MoveHasAdditionalEffectWithChance(enum Move move, enum MoveEffect moveEffect, u32 chance) { u32 i; u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); @@ -9951,7 +11351,7 @@ bool32 MoveHasAdditionalEffectWithChance(u32 move, u32 moveEffect, u32 chance) return FALSE; } -bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) +bool32 MoveHasAdditionalEffectSelf(enum Move move, enum MoveEffect moveEffect) { u32 i; u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); @@ -9964,12 +11364,12 @@ bool32 MoveHasAdditionalEffectSelf(u32 move, u32 moveEffect) return FALSE; } -bool32 IsMoveEffectRemoveSpeciesType(u32 move, u32 moveEffect, u32 argument) +bool32 IsMoveEffectRemoveSpeciesType(enum Move move, enum MoveEffect moveEffect, u32 argument) { - return (GetMoveArgType(move) == argument) && MoveHasAdditionalEffectSelf(move, moveEffect); + return (MoveHasAdditionalEffectSelf(move, moveEffect) && GetMoveArgType(move) == argument); } -bool32 MoveHasChargeTurnAdditionalEffect(u32 move) +bool32 MoveHasChargeTurnAdditionalEffect(enum Move move) { u32 i; u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); @@ -9981,7 +11381,7 @@ bool32 MoveHasChargeTurnAdditionalEffect(u32 move) return FALSE; } -bool32 MoveIsAffectedBySheerForce(u32 move) +bool32 MoveIsAffectedBySheerForce(enum Move move) { u32 i; u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move); @@ -9994,57 +11394,23 @@ bool32 MoveIsAffectedBySheerForce(u32 move) return FALSE; } -bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon) +bool32 CanMonParticipateInSkyBattle(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES); - u16 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); + u32 species = GetMonData(mon, MON_DATA_SPECIES); + u32 monAbilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM); - bool8 hasLevitateAbility = GetSpeciesAbility(species, monAbilityNum) == ABILITY_LEVITATE; - bool8 isFlyingType = GetSpeciesType(species, 0) == TYPE_FLYING || GetSpeciesType(species, 1) == TYPE_FLYING; - bool8 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG); + bool32 hasLevitateAbility = GetSpeciesAbility(species, monAbilityNum) == ABILITY_LEVITATE; + bool32 isFlyingType = GetSpeciesType(species, 0) == TYPE_FLYING || GetSpeciesType(species, 1) == TYPE_FLYING; + bool32 monIsValidAndNotEgg = GetMonData(mon, MON_DATA_SANITY_HAS_SPECIES) && !GetMonData(mon, MON_DATA_IS_EGG); if (monIsValidAndNotEgg) { - if ((hasLevitateAbility || isFlyingType) && !IsMonBannedFromSkyBattles(species)) + if ((hasLevitateAbility || isFlyingType) && !gSpeciesInfo[species].isSkyBattleBanned) return TRUE; } return FALSE; } -bool8 IsMonBannedFromSkyBattles(u16 species) -{ - switch (species) - { -#if B_SKY_BATTLE_STRICT_ELIGIBILITY == TRUE - case SPECIES_SPEAROW: - case SPECIES_FARFETCHD: - case SPECIES_DODUO: - case SPECIES_DODRIO: - case SPECIES_HOOTHOOT: - case SPECIES_NATU: - case SPECIES_MURKROW: - case SPECIES_DELIBIRD: - case SPECIES_TAILLOW: - case SPECIES_STARLY: - case SPECIES_CHATOT: - case SPECIES_SHAYMIN: - case SPECIES_PIDOVE: - case SPECIES_ARCHEN: - case SPECIES_DUCKLETT: - case SPECIES_RUFFLET: - case SPECIES_VULLABY: - case SPECIES_FLETCHLING: - case SPECIES_HAWLUCHA: - case SPECIES_ROWLET: - case SPECIES_PIKIPEK: -#endif - case SPECIES_EGG: - return TRUE; - default: - return FALSE; - } -} - void GetBattlerTypes(u32 battler, bool32 ignoreTera, enum Type types[static 3]) { // Terastallization. @@ -10064,7 +11430,7 @@ void GetBattlerTypes(u32 battler, bool32 ignoreTera, enum Type types[static 3]) types[2] = gBattleMons[battler].types[2]; // Roost. - if (!isTera && gDisableStructs[battler].roostActive) + if (!isTera && gBattleMons[battler].volatiles.roostActive) { if (types[0] == TYPE_FLYING && types[1] == TYPE_FLYING) types[0] = types[1] = B_ROOST_PURE_FLYING >= GEN_5 ? TYPE_NORMAL : TYPE_MYSTERY; @@ -10160,32 +11526,23 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef) && battlerDef != BATTLE_PARTNER(battlerAtk)); } -static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerDef, enum Type moveType) +bool32 IsBattlerUnaffectedByMove(u32 battler) { - enum Ability abilityDef = GetBattlerAbility(battlerDef); - - return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, CHECK_TRIGGER) - || CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER); + return gBattleStruct->moveResultFlags[battler] & MOVE_RESULT_NO_EFFECT; } -bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef) +enum Type GetBattleMoveType(enum Move move) { - enum Type moveType = GetBattleMoveType(gCurrentMove); - return ((CalcTypeEffectivenessMultiplierHelper(gCurrentMove, moveType, battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), GetBattlerAbility(battlerDef), FALSE) == UQ_4_12(0.0)) - || IsBattlerProtected(battlerAtk, battlerDef, gCurrentMove) - || !BreaksThroughSemiInvulnerablity(battlerDef, gCurrentMove) - || DoesBattlerHaveAbilityImmunity(battlerAtk, battlerDef, moveType)); -} + if (gMain.inBattle) + { + if (gBattleStruct->dynamicMoveType) + return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; -enum Type GetBattleMoveType(u32 move) -{ - if (gMain.inBattle && gBattleStruct->dynamicMoveType) - return gBattleStruct->dynamicMoveType & DYNAMIC_TYPE_MASK; - else if (B_UPDATED_MOVE_TYPES < GEN_5 - && (move == MOVE_BEAT_UP - || move == MOVE_FUTURE_SIGHT - || move == MOVE_DOOM_DESIRE)) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (B_UPDATED_MOVE_TYPES < GEN_5 + && (effect == EFFECT_BEAT_UP || effect == EFFECT_FUTURE_SIGHT)) return TYPE_MYSTERY; + } return GetMoveType(move); } @@ -10201,7 +11558,7 @@ void TryActivateSleepClause(u32 battler, u32 indexInParty) gBattleStruct->monCausingSleepClause[GetBattlerSide(battler)] = indexInParty; } -void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty) +void TryDeactivateSleepClause(enum BattleSide battlerSide, u32 indexInParty) { // If the pokemon on the given side at the given index in the party is the one causing Sleep Clause to be active, // set monCausingSleepClause[battlerSide] = PARTY_SIZE, which means Sleep Clause is not active for the given side @@ -10209,7 +11566,7 @@ void TryDeactivateSleepClause(u32 battlerSide, u32 indexInParty) gBattleStruct->monCausingSleepClause[battlerSide] = PARTY_SIZE; } -bool32 IsSleepClauseActiveForSide(u32 battlerSide) +bool32 IsSleepClauseActiveForSide(enum BattleSide battlerSide) { // If monCausingSleepClause[battlerSide] == PARTY_SIZE, Sleep Clause is not active for the given side. // If monCausingSleepClause[battlerSide] < PARTY_SIZE, it means it is storing the index of the mon that is causing Sleep Clause to be active, @@ -10217,7 +11574,7 @@ bool32 IsSleepClauseActiveForSide(u32 battlerSide) return (IsSleepClauseEnabled() && (gBattleStruct->monCausingSleepClause[battlerSide] < PARTY_SIZE)); } -bool32 IsSleepClauseEnabled() +bool32 IsSleepClauseEnabled(void) { if (B_SLEEP_CLAUSE) return TRUE; @@ -10231,11 +11588,9 @@ void ClearDamageCalcResults(void) for (u32 battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { gBattleStruct->moveDamage[battler] = 0; - gBattleStruct->critChance[battler] = 0; - gBattleStruct->moveResultFlags[battler] = CAN_DAMAGE; - gBattleStruct->noResultString[battler] = 0; - gBattleStruct->missStringId[battler] = 0; + gBattleStruct->moveResultFlags[battler] = 0; gSpecialStatuses[battler].criticalHit = FALSE; + gSpecialStatuses[battler].damagedByAttack = FALSE; } gBattleStruct->doneDoublesSpreadHit = FALSE; @@ -10243,11 +11598,18 @@ void ClearDamageCalcResults(void) gBattleStruct->calculatedSpreadMoveAccuracy = FALSE; gBattleStruct->printedStrongWindsWeakenedAttack = FALSE; gBattleStruct->numSpreadTargets = 0; + gBattleStruct->unableToUseMove = FALSE; + gBattleStruct->preAttackAnimPlayed = FALSE; + gBattleScripting.savedDmg = 0; + if (gCurrentMove != MOVE_NONE) + gBattleStruct->moldBreakerActive = IsMoldBreakerTypeAbility(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) || MoveIgnoresTargetAbility(gCurrentMove); + else + gBattleStruct->moldBreakerActive = FALSE; } bool32 DoesDestinyBondFail(u32 battler) { - return GetGenConfig(GEN_CONFIG_DESTINY_BOND_FAIL) >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; + return GetConfig(CONFIG_DESTINY_BOND_FAIL) >= GEN_7 && gBattleMons[battler].volatiles.destinyBond; } // This check has always to be the last in a condtion statement because of the recording of AI data. @@ -10267,6 +11629,29 @@ bool32 IsMoveEffectBlockedByTarget(enum Ability ability) return FALSE; } +bool32 SetTargetToNextPursuiter(u32 battlerDef) +{ + u32 i; + for (i = gCurrentTurnActionNumber + 1; i < gBattlersCount; i++) + { + u32 battler = gBattlerByTurnOrder[i]; + if (gChosenActionByBattler[battler] == B_ACTION_USE_MOVE + && GetMoveEffect(gChosenMoveByBattler[battler]) == EFFECT_PURSUIT + && IsBattlerAlive(battlerDef) + && IsBattlerAlive(battler) + && !IsBattlerAlly(battler, battlerDef) + && (B_PURSUIT_TARGET >= GEN_4 || gBattleStruct->moveTarget[battler] == battlerDef) + && !IsGimmickSelected(battler, GIMMICK_Z_MOVE) + && !IsGimmickSelected(battler, GIMMICK_DYNAMAX) + && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) + { + gBattlerTarget = battler; + return TRUE; + } + } + return FALSE; +} + bool32 IsPursuitTargetSet(void) { for (u32 battler = 0; battler < gBattlersCount; battler++) @@ -10313,22 +11698,32 @@ bool32 HasWeatherEffect(void) void UpdateStallMons(void) { - if (IsBattlerTurnDamaged(gBattlerTarget) || IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove) || gMovesInfo[gCurrentMove].category == DAMAGE_CATEGORY_STATUS) + if (IsBattlerTurnDamaged(gBattlerTarget) || GetMoveCategory(gCurrentMove) == DAMAGE_CATEGORY_STATUS) return; - if (!IsDoubleBattle() || gMovesInfo[gCurrentMove].target == MOVE_TARGET_SELECTED) + + struct BattleContext ctx = {0}; + ctx.battlerAtk = gBattlerAttacker; + ctx.battlerDef = gBattlerTarget; + ctx.move = ctx.chosenMove = gCurrentMove; + ctx.moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now + ctx.abilityAtk = GetBattlerAbility(ctx.battlerAtk); + ctx.abilityDef = GetBattlerAbility(ctx.battlerDef); + ctx.holdEffectAtk = GetBattlerHoldEffect(ctx.battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(ctx.battlerDef); + + if (IsBattlerProtected(&ctx)) + return; + + enum MoveTarget target = GetBattlerMoveTargetType(ctx.battlerAtk, ctx.move); + if (!IsDoubleBattle() + || target == TARGET_SELECTED + || target == TARGET_SMART) { - enum Type moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now - enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum Ability abilityDef = GetBattlerAbility(gBattlerTarget); - if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER)) + if (CanMoveBeBlockedByTarget(&ctx, GetChosenMovePriority(ctx.battlerAtk, ctx.abilityAtk))) { gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; } - else if (CanAbilityBlockMove(gBattlerAttacker, gBattlerTarget, abilityAtk, abilityDef, gCurrentMove, CHECK_TRIGGER)) - { - gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; - } - else if (AI_GetMoveEffectiveness(gCurrentMove, gBattlerAttacker, gBattlerTarget) == 0) + else if (CalcTypeEffectivenessMultiplier(&ctx) == UQ_4_12(0.0)) { gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++; } @@ -10344,7 +11739,7 @@ bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) for (u32 i = 0; i < gBattlersCount; i++) { - if (gDisableStructs[i].tryEjectPack + if (gBattleMons[i].volatiles.tryEjectPack && GetBattlerHoldEffect(i) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(i) && CountUsablePartyMons(i) > 0) @@ -10362,7 +11757,7 @@ bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) SortBattlersBySpeed(battlers, FALSE); for (u32 i = 0; i < gBattlersCount; i++) - gDisableStructs[i].tryEjectPack = FALSE; + gBattleMons[i].volatiles.tryEjectPack = FALSE; for (u32 i = 0; i < gBattlersCount; i++) { @@ -10373,9 +11768,7 @@ bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) gBattleScripting.battler = battler; gLastUsedItem = gBattleMons[battler].item; - if (timing == FIRST_TURN) - BattleScriptPushCursorAndCallback(BattleScript_EjectPackActivate_End3); - else if (timing == END_TURN) + if (timing == END_TURN) BattleScriptExecute(BattleScript_EjectPackActivate_End2); else BattleScriptCall(BattleScript_EjectPackActivate_Ret); @@ -10386,11 +11779,82 @@ bool32 TrySwitchInEjectPack(enum EjectPackTiming timing) return FALSE; } +bool32 EmergencyExitCanBeTriggered(u32 battler) +{ + enum Ability ability = GetBattlerAbility(battler); + + if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT) + return FALSE; + + if (IsBattlerAlive(battler) + && HadMoreThanHalfHpNowDoesnt(battler) + && (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) + && !(gBattleTypeFlags & BATTLE_TYPE_ARENA) + && gBattleMons[battler].volatiles.semiInvulnerable != STATE_SKY_DROP) + return TRUE; + + return FALSE; +} + +bool32 TryTriggerSymbiosis(u32 battler, u32 ally) +{ + return GetBattlerAbility(ally) == ABILITY_SYMBIOSIS + && gBattleMons[battler].item == ITEM_NONE + && gBattleMons[ally].item != ITEM_NONE + && CanBattlerGetOrLoseItem(battler, ally, gBattleMons[ally].item) + && CanBattlerGetOrLoseItem(ally, battler, gBattleMons[ally].item) + && IsBattlerAlive(battler) + && IsBattlerAlive(ally); +} + +// Called by Cmd_removeitem. itemId represents the item that was removed, not being given. +bool32 TrySymbiosis(u32 battler, enum Item itemId, bool32 moveEnd) +{ + if (!gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen + && gBattleStruct->changedItems[battler] == ITEM_NONE + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK + && (GetConfig(CONFIG_SYMBIOSIS_GEMS) < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) + && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. + && !gSpecialStatuses[battler].berryReduced + && TryTriggerSymbiosis(battler, BATTLE_PARTNER(battler))) + { + BestowItem(BATTLE_PARTNER(battler), battler); + gLastUsedAbility = gBattleMons[BATTLE_PARTNER(battler)].ability; + gEffectBattler = battler; + gBattleScripting.battler = gBattlerAbility = BATTLE_PARTNER(battler); + if (moveEnd) + BattleScriptPushCursor(); + else + BattleScriptPush(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = BattleScript_SymbiosisActivates; + return TRUE; + } + return FALSE; +} + +// Used by Bestow and Symbiosis to take an item from one battler and give to another. +void BestowItem(u32 battlerAtk, u32 battlerDef) +{ + gLastUsedItem = gBattleMons[battlerAtk].item; + + gBattleMons[battlerAtk].item = ITEM_NONE; + BtlController_EmitSetMonData(battlerAtk, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerAtk].item), &gBattleMons[battlerAtk].item); + MarkBattlerForControllerExec(battlerAtk); + CheckSetUnburden(battlerAtk); + + gBattleMons[battlerDef].item = gLastUsedItem; + BtlController_EmitSetMonData(battlerDef, B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[battlerDef].item), &gBattleMons[battlerDef].item); + MarkBattlerForControllerExec(battlerDef); + gBattleMons[battlerDef].volatiles.unburdenActive = FALSE; +} + #define UNPACK_VOLATILE_GETTERS(_enum, _fieldName, _typeMaxValue, ...) case _enum: return gBattleMons[battler].volatiles._fieldName; // Gets the value of a volatile status flag for a certain battler // Primarily used for the debug menu and scripts. Outside of it explicit references are preferred -u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile) +// Uses Arm because there is a compiler bug when it tries to compile in thumb +ARM_FUNC u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile) { switch (_volatile) { @@ -10423,15 +11887,16 @@ void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue) } } -bool32 ItemHealMonVolatile(u32 battler, u16 itemId) +bool32 ItemHealMonVolatile(u32 battler, enum Item itemId) { bool32 statusChanged = FALSE; const u8 *effect = GetItemEffect(itemId); if (effect[3] & ITEM3_STATUS_ALL) { - statusChanged = (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0); + statusChanged = (gBattleMons[battler].volatiles.infatuation || gBattleMons[battler].volatiles.confusionTurns > 0 || gBattleMons[battler].volatiles.infiniteConfusion); gBattleMons[battler].volatiles.infatuation = 0; gBattleMons[battler].volatiles.confusionTurns = 0; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } else if (effect[0] & ITEM0_INFATUATION) { @@ -10440,21 +11905,22 @@ bool32 ItemHealMonVolatile(u32 battler, u16 itemId) } else if (effect[3] & ITEM3_CONFUSION) { - statusChanged = gBattleMons[battler].volatiles.confusionTurns > 0; + statusChanged = (gBattleMons[battler].volatiles.confusionTurns > 0 || gBattleMons[battler].volatiles.infiniteConfusion); gBattleMons[battler].volatiles.confusionTurns = 0; + gBattleMons[battler].volatiles.infiniteConfusion = FALSE; } return statusChanged; } // Hazards are added to a queue and applied based in order (FIFO) -void PushHazardTypeToQueue(u32 side, enum Hazards hazardType) +void PushHazardTypeToQueue(enum BattleSide side, enum Hazards hazardType) { if (!IsHazardOnSide(side, hazardType)) // Failsafe gBattleStruct->hazardsQueue[side][gBattleStruct->numHazards[side]++] = hazardType; } -bool32 IsHazardOnSide(u32 side, enum Hazards hazardType) +bool32 IsHazardOnSide(enum BattleSide side, enum Hazards hazardType) { for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) { @@ -10464,12 +11930,12 @@ bool32 IsHazardOnSide(u32 side, enum Hazards hazardType) return FALSE; } -bool32 AreAnyHazardsOnSide(u32 side) +bool32 AreAnyHazardsOnSide(enum BattleSide side) { return gBattleStruct->numHazards[side] > 0; } -bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType) +bool32 IsHazardOnSideAndClear(enum BattleSide side, enum Hazards hazardType) { for (u32 i = 0; i < HAZARDS_MAX_COUNT; i++) { @@ -10486,7 +11952,7 @@ bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType) return FALSE; } -void RemoveAllHazardsFromField(u32 side) +void RemoveAllHazardsFromField(enum BattleSide side) { gSideTimers[side].spikesAmount = 0; gSideTimers[side].toxicSpikesAmount = 0; @@ -10495,7 +11961,7 @@ void RemoveAllHazardsFromField(u32 side) gBattleStruct->hazardsQueue[side][i] = HAZARDS_NONE; } -void RemoveHazardFromField(u32 side, enum Hazards hazardType) +void RemoveHazardFromField(enum BattleSide side, enum Hazards hazardType) { u32 i; for (i = 0; i < HAZARDS_MAX_COUNT; i++) @@ -10523,15 +11989,21 @@ void RemoveHazardFromField(u32 side, enum Hazards hazardType) } } -bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option) +static bool32 CanToxicSkipAccuracyCheck(u32 battlerAtk, u32 move) +{ + if (GetConfig(CONFIG_TOXIC_NEVER_MISS) < GEN_6) + return FALSE; + return move == MOVE_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON); +} + +bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum Move move, enum ResultOption option) { bool32 effect = FALSE; enum Ability ability = ABILITY_NONE; enum BattleMoveEffects moveEffect = GetMoveEffect(move); - u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); - if ((gBattleMons[battlerDef].volatiles.lockOn && gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) - || (GetGenConfig(GEN_CONFIG_TOXIC_NEVER_MISS) >= GEN_6 && nonVolatileStatus == MOVE_EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + if ((gBattleMons[battlerDef].volatiles.lockOn && gBattleMons[battlerDef].volatiles.battlerWithSureHit == battlerAtk) + || CanToxicSkipAccuracyCheck(battlerAtk, move) || gBattleMons[battlerDef].volatiles.glaiveRush) { effect = TRUE; @@ -10567,18 +12039,6 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abil { effect = TRUE; } - else if (!BreaksThroughSemiInvulnerablity(battlerDef, move)) - { - if (option == RUN_SCRIPT) - { - gBattleStruct->moveResultFlags[battlerDef] |= MOVE_RESULT_MISSED; - effect = TRUE; - } - else - { - effect = FALSE; - } - } else if (B_MINIMIZE_DMG_ACC >= GEN_6 && gBattleMons[battlerDef].volatiles.minimize && MoveIncreasesPowerToMinimizedTargets(move)) @@ -10594,7 +12054,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abil { if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battlerDef, B_WEATHER_RAIN)) effect = TRUE; - else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) + else if ((gBattleWeather & B_WEATHER_ICY_ANY) && MoveAlwaysHitsInHailSnow(move)) effect = TRUE; if (effect) @@ -10607,7 +12067,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abil return effect; } -u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect) +u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, enum Move move, enum Ability atkAbility, enum Ability defAbility, enum HoldEffect atkHoldEffect, enum HoldEffect defHoldEffect) { u32 calc, moveAcc; s8 buff, accStage, evasionStage; @@ -10618,7 +12078,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA accStage = gBattleMons[battlerAtk].statStages[STAT_ACC]; evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION]; if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE - || (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) + || (GetConfig(CONFIG_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE)) evasionStage = DEFAULT_STAT_STAGE; if (MoveIgnoresDefenseEvasionStages(move)) evasionStage = DEFAULT_STAT_STAGE; @@ -10671,7 +12131,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkA calc = (calc * 80) / 100; // 1.2 sand veil loss break; case ABILITY_SNOW_CLOAK: - if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && HasWeatherEffect()) + if ((gBattleWeather & B_WEATHER_ICY_ANY) && HasWeatherEffect()) calc = (calc * 80) / 100; // 1.2 snow cloak loss break; case ABILITY_TANGLED_FEET: @@ -10746,9 +12206,21 @@ bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCom return gBattleMons[battler].volatiles.semiInvulnerable != STATE_NONE; } -bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) +bool32 BreaksThroughSemiInvulnerablity(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum Move move) { - switch (gBattleMons[battler].volatiles.semiInvulnerable) + enum SemiInvulnerableState state = gBattleMons[battlerDef].volatiles.semiInvulnerable; + + if (state != STATE_COMMANDER) + { + if (CanToxicSkipAccuracyCheck(battlerAtk, move)) + return TRUE; + if (abilityAtk == ABILITY_NO_GUARD || abilityDef == ABILITY_NO_GUARD) + return TRUE; + if (gBattleMons[battlerDef].volatiles.lockOn && gBattleMons[battlerDef].volatiles.battlerWithSureHit == battlerAtk) + return TRUE; + } + + switch (state) { case STATE_UNDERGROUND: return MoveDamagesUnderground(move); @@ -10760,8 +12232,9 @@ bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) case STATE_PHANTOM_FORCE: return FALSE; case STATE_COMMANDER: - return FALSE; + return GetMoveEffect(move) == EFFECT_TRANSFORM; case STATE_NONE: + case SEMI_INVULNERABLE_COUNT: return TRUE; } @@ -10792,19 +12265,21 @@ static bool32 IsOpposingSideEmpty(u32 battler) return TRUE; } -bool32 IsAffectedByPowderMove(u32 battler, u32 ability, enum HoldEffect holdEffect) +bool32 IsAffectedByPowderMove(u32 battler, enum Ability ability, enum HoldEffect holdEffect) { - if ((GetGenConfig(GEN_CONFIG_POWDER_OVERCOAT) >= GEN_6 && ability == ABILITY_OVERCOAT) - || (GetGenConfig(GEN_CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) + if (GetConfig(CONFIG_POWDER_OVERCOAT) >= GEN_6 && ability == ABILITY_OVERCOAT) + return FALSE; + if (GetConfig(CONFIG_POWDER_GRASS) >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) + return FALSE; + if (holdEffect == HOLD_EFFECT_SAFETY_GOGGLES) return FALSE; return TRUE; } -static u32 GetMirrorMoveMove(void) +static enum Move GetMirrorMoveMove(void) { s32 i, validMovesCount; - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; u16 validMoves[MAX_BATTLERS_COUNT] = {0}; for (validMovesCount = 0, i = 0; i < gBattlersCount; i++) @@ -10836,9 +12311,9 @@ static bool32 InvalidMetronomeMove(u32 move) || IsMoveMetronomeBanned(move); } -static u32 GetMetronomeMove(void) +static enum Move GetMetronomeMove(void) { - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; #if B_METRONOME_MOVES >= GEN_9 u32 moveCount = MOVES_COUNT_GEN9; @@ -10864,12 +12339,12 @@ static u32 GetMetronomeMove(void) return move; } -static u32 GetAssistMove(void) +static enum Move GetAssistMove(void) { - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; s32 chooseableMovesNo = 0; struct Pokemon *party; - u16 *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); + enum Move *validMoves = Alloc(sizeof(u16) * PARTY_SIZE * MAX_MON_MOVES); if (validMoves != NULL) { @@ -10886,7 +12361,7 @@ static u32 GetAssistMove(void) for (u32 moveId = 0; moveId < MAX_MON_MOVES; moveId++) { - u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + enum Move move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); if (IsMoveAssistBanned(move)) continue; @@ -10904,9 +12379,9 @@ static u32 GetAssistMove(void) return move; } -u32 GetNaturePowerMove(u32 battler) +enum Move GetNaturePowerMove(u32 battler) { - u32 move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; + enum Move move = gBattleEnvironmentInfo[gBattleEnvironment].naturePower; if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) move = MOVE_MOONBLAST; else if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) @@ -10916,14 +12391,14 @@ u32 GetNaturePowerMove(u32 battler) else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) move = MOVE_PSYCHIC; else if (gBattleEnvironmentInfo[gBattleEnvironment].naturePower == MOVE_NONE) - move = MOVE_TRI_ATTACK; + move = B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT; return move; } -static u32 GetSleepTalkMove(void) +static enum Move GetSleepTalkMove(void) { - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; u32 i, unusableMovesBits = 0, movePosition; @@ -10943,7 +12418,7 @@ static u32 GetSleepTalkMove(void) return move; // Set Sleep Talk as used move, so it works with Last Resort. - gDisableStructs[gBattlerAttacker].usedMoves |= 1u << gCurrMovePos; + gBattleMons[gBattlerAttacker].volatiles.usedMoves |= 1u << gCurrMovePos; do { movePosition = MOD(Random(), MAX_MON_MOVES); @@ -10955,7 +12430,7 @@ static u32 GetSleepTalkMove(void) return move; } -static u32 GetCopyCatMove(void) +static enum Move GetCopycatMove(void) { if (gLastUsedMove == MOVE_NONE || gLastUsedMove == MOVE_UNAVAILABLE @@ -10966,9 +12441,9 @@ static u32 GetCopyCatMove(void) return gLastUsedMove; } -static u32 GetMeFirstMove(void) +static enum Move GetMeFirstMove(void) { - u32 move = GetChosenMoveFromPosition(gBattlerTarget); + enum Move move = GetChosenMoveFromPosition(gBattlerTarget); if (IsBattleMoveStatus(move) || IsMoveMeFirstBanned(move) @@ -10980,10 +12455,12 @@ static u32 GetMeFirstMove(void) void RemoveAbilityFlags(u32 battler) { + gBattleMons[battler].volatiles.unburdenActive = FALSE; + switch (GetBattlerAbility(battler)) { case ABILITY_FLASH_FIRE: - gDisableStructs[battler].flashFireBoosted = FALSE; + gBattleMons[battler].volatiles.flashFireBoosted = FALSE; break; case ABILITY_VESSEL_OF_RUIN: gBattleMons[battler].volatiles.vesselOfRuin = FALSE; @@ -11002,6 +12479,12 @@ void RemoveAbilityFlags(u32 battler) } } +void CheckSetUnburden(u32 battler) +{ + if (IsAbilityAndRecord(battler, GetBattlerAbility(battler), ABILITY_UNBURDEN)) + gBattleMons[battler].volatiles.unburdenActive = TRUE; +} + bool32 IsAnyTargetTurnDamaged(u32 battlerAtk) { for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -11014,6 +12497,33 @@ bool32 IsAnyTargetTurnDamaged(u32 battlerAtk) return FALSE; } +bool32 IsAnyTargetAffected(void) +{ + for (u32 battler = 0; battler < gBattlersCount; battler++) + { + if (battler == gBattlerAttacker) + continue; + + if (!IsBattlerUnaffectedByMove(battler)) + return TRUE; + } + return FALSE; +} + +bool32 IsDoubleSpreadMove(void) +{ + return gBattleStruct->numSpreadTargets > 1 + && !gBattleStruct->unableToUseMove + && IsSpreadMove(GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove)); +} + +bool32 IsBattlerInvalidForSpreadMove(u32 battlerAtk, u32 battlerDef) +{ + return battlerDef == battlerAtk + || !IsBattlerAlive(battlerDef) + || IsBattlerUnaffectedByMove(battlerDef); +} + bool32 IsAllowedToUseBag(void) { switch(VarGet(B_VAR_NO_BAG_USE)) @@ -11034,3 +12544,201 @@ bool32 IsMimikyuDisguised(u32 battler) return gBattleMons[battler].species == SPECIES_MIMIKYU_DISGUISED || gBattleMons[battler].species == SPECIES_MIMIKYU_TOTEM_DISGUISED; } + +#define UNPACK_STARTING_STATUS_TO_EWRAM(_enum, _fieldName, ...) case _enum: gStartingStatuses._fieldName = TRUE; break; + +void SetStartingStatus(enum StartingStatus status) +{ + switch (status) + { + STARTING_STATUS_DEFINITIONS(UNPACK_STARTING_STATUS_TO_EWRAM); + } +} + +#define UNPACK_STARTING_STATUS_RESET(_enum, _fieldName, ...) gStartingStatuses._fieldName = FALSE; + +void ResetStartingStatuses(void) +{ + STARTING_STATUS_DEFINITIONS(UNPACK_STARTING_STATUS_RESET); +} + +bool32 IsUsableWhileAsleepEffect(enum BattleMoveEffects effect) +{ + // All moves usable while asleep like Snore, Sleep Talk, etc. + switch (effect) + { + case EFFECT_SNORE: + case EFFECT_SLEEP_TALK: + return TRUE; + default: + return FALSE; + } +} + +void SetWrapTurns(u32 battler, enum HoldEffect holdEffect) +{ + u32 normalWrapTurns = B_WRAP_TURNS - 2; // 5 turns + if (holdEffect == HOLD_EFFECT_GRIP_CLAW) + gBattleMons[battler].volatiles.wrapTurns = GetConfig(CONFIG_BINDING_TURNS) >= GEN_5 ? B_WRAP_TURNS : normalWrapTurns; + else + gBattleMons[battler].volatiles.wrapTurns = GetConfig(CONFIG_BINDING_TURNS) >= GEN_5 ? RandomUniform(RNG_WRAP, 4, normalWrapTurns) : RandomUniform(RNG_WRAP, 2, normalWrapTurns); +} + +// Return True if the order was changed, and false if the order was not changed(for example because the target would move after the attacker anyway). +bool32 ChangeOrderTargetAfterAttacker(void) +{ + u32 i; + u8 data[MAX_BATTLERS_COUNT]; + u8 actionsData[MAX_BATTLERS_COUNT]; + u32 attackerTurnOrderNum = GetBattlerTurnOrderNum(gBattlerAttacker); + u32 targetTurnOrderNum = GetBattlerTurnOrderNum(gBattlerTarget); + + if (attackerTurnOrderNum > targetTurnOrderNum) + return FALSE; + if (attackerTurnOrderNum + 1 == targetTurnOrderNum) + return GetConfig(CONFIG_AFTER_YOU_TURN_ORDER) >= GEN_8; + + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { + data[i] = gBattlerByTurnOrder[i]; + actionsData[i] = gActionsByTurnOrder[i]; + } + if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 2) + { + gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[2]; + gBattlerByTurnOrder[2] = data[1]; + gActionsByTurnOrder[2] = actionsData[1]; + } + else if (attackerTurnOrderNum == 0 && targetTurnOrderNum == 3) + { + gBattlerByTurnOrder[1] = gBattlerTarget; + gActionsByTurnOrder[1] = actionsData[3]; + gBattlerByTurnOrder[2] = data[1]; + gActionsByTurnOrder[2] = actionsData[1]; + gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; + } + else // attackerTurnOrderNum == 1, targetTurnOrderNum == 3 + { + gBattlerByTurnOrder[2] = gBattlerTarget; + gActionsByTurnOrder[2] = actionsData[3]; + gBattlerByTurnOrder[3] = data[2]; + gActionsByTurnOrder[3] = actionsData[2]; + } + return TRUE; +} + +void TryUpdateEvolutionTracker(enum EvolutionConditions evolutionCondition, u32 upAmount, enum Move usedMove) +{ + u32 i, j; + + if (IsOnPlayerSide(gBattlerAttacker) + && ((TESTING && IsDoubleBattle()) // To be removed when Wild Double Battles are added to tests + || !(gBattleTypeFlags & (BATTLE_TYPE_LINK + | BATTLE_TYPE_EREADER_TRAINER + | BATTLE_TYPE_RECORDED_LINK + | BATTLE_TYPE_TRAINER_HILL + | BATTLE_TYPE_FRONTIER)))) + { + const struct Evolution *evolutions = GetSpeciesEvolutions(gBattleMons[gBattlerAttacker].species); + if (evolutions == NULL) + return; + + for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) + { + if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) + continue; + if (evolutions[i].params == NULL) + continue; + + for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + if (evolutions[i].params[j].condition != evolutionCondition) + continue; + + struct Pokemon *monAtk = GetBattlerMon(gBattlerAttacker); + struct Pokemon *monDef = GetBattlerMon(gBattlerTarget); + // We only have 10 bits to use + u16 val = min(1023, GetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER) + upAmount); + // Reset progress if you faint for the recoil method. + switch (evolutionCondition) + { + case IF_USED_MOVE_X_TIMES: + if (evolutions[i].params[j].arg1 == usedMove) + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + case IF_RECOIL_DAMAGE_GE: + if (gBattleMons[gBattlerAttacker].hp == 0) + val = 0; + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + case IF_DEFEAT_X_WITH_ITEMS: + if (GetMonData(monDef, MON_DATA_SPECIES) == evolutions[i].params[j].arg1 + && GetMonData(monDef, MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) + SetMonData(monAtk, MON_DATA_EVOLUTION_TRACKER, &val); + break; + default: + assertf(FALSE, "evolution condition %d is not handled within TryUpdateEvolutionTracker", evolutionCondition) {} + break; + } + return; + } + } + } +} + +static const u16 sProtectSuccessRates[] = +{ + USHRT_MAX, + USHRT_MAX / 2, + USHRT_MAX / 4, + USHRT_MAX / 8 +}; + +static const u16 sGen5ProtectSuccessRates[] = +{ + USHRT_MAX, + USHRT_MAX / 3, + USHRT_MAX / 9, + USHRT_MAX / 27 +}; + +bool32 CanUseMoveConsecutively(u32 battler) +{ + u32 moveUses = gBattleMons[battler].volatiles.consecutiveMoveUses; + if (moveUses >= ARRAY_COUNT(sProtectSuccessRates)) + moveUses = ARRAY_COUNT(sProtectSuccessRates) - 1; + + u32 successRate = sGen5ProtectSuccessRates[moveUses]; + if (B_PROTECT_FAILURE_RATE < GEN_5) + successRate = sProtectSuccessRates[moveUses]; + + return successRate >= RandomUniform(RNG_PROTECT_FAIL, 0, USHRT_MAX); +} + +// Used for Protect, Endure and Ally switch +void TryResetConsecutiveUseCounter(u32 battler) +{ + u32 lastMove = gLastResultingMoves[battler]; + if (lastMove == MOVE_UNAVAILABLE) + { + gBattleMons[battler].volatiles.consecutiveMoveUses = 0; + return; + } + + enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove); + if (!gBattleMoveEffects[lastEffect].usesProtectCounter) + { + if (GetConfig(CONFIG_ALLY_SWITCH_FAIL_CHANCE) < GEN_9 || lastEffect != EFFECT_ALLY_SWITCH) + gBattleMons[battler].volatiles.consecutiveMoveUses = 0; + } +} + +void SetOrClearRageVolatile(void) +{ + if (GetConfig(CONFIG_RAGE_BUILDS) <= GEN_3 && MoveHasAdditionalEffect(gCurrentMove, MOVE_EFFECT_RAGE)) + gBattleMons[gBattlerAttacker].volatiles.rage = TRUE; + else + gBattleMons[gBattlerAttacker].volatiles.rage = FALSE; +} diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 2ec4678a2..4df1f920e 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -121,7 +121,7 @@ bool32 CanUseZMove(u32 battler) return FALSE; // Add '| BATTLE_TYPE_FRONTIER' to below if issues occur - if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_OLD_MAN_TUTORIAL)) + if (gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_CATCH_TUTORIAL)) return FALSE; // Check if Trainer has already used a Z-Move. diff --git a/src/clock.c b/src/clock.c index 2a551216d..71c52b3e0 100644 --- a/src/clock.c +++ b/src/clock.c @@ -11,6 +11,7 @@ #include "main.h" #include "overworld.h" #include "wallclock.h" +#include "pokerus.h" static void UpdatePerDay(struct Time *localTime); static void UpdatePerMinute(struct Time *localTime); @@ -25,7 +26,7 @@ void InitTimeBasedEvents(void) void DoTimeBasedEvents(void) { - if (FlagGet(FLAG_SYS_CLOCK_SET) && !InPokemonCenter()) + if (FlagGet(FLAG_SYS_CLOCK_SET) && !InPokemonCenter()) { RtcCalcLocalTime(); UpdatePerDay(&gLocalTime); diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 22d90f474..dd02d498e 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1,5 +1,6 @@ #include "battle.h" #include "battle_scripts.h" +// #include "constants/battle_factory.h" #include "constants/battle_move_effects.h" const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = @@ -20,6 +21,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectNonVolatileStatus, .battleTvScore = 0, // Handled within the battle TV functions + .encourageEncore = TRUE, }, [EFFECT_ABSORB] = @@ -28,15 +30,9 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 4, }, - [EFFECT_EXPLOSION] = + [EFFECT_TERRAIN_BOOST] = { - .battleScript = BattleScript_EffectExplosion, - .battleTvScore = 0, // TODO: Assign points - }, - - [EFFECT_MISTY_EXPLOSION] = - { - .battleScript = BattleScript_EffectExplosion, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -51,12 +47,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_ATTACK_UP] = { .battleScript = BattleScript_EffectAttackUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -64,6 +62,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDefenseUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -71,6 +70,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpeedUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -78,6 +78,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpecialAttackUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -85,6 +86,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpecialDefenseUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -99,60 +101,70 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectEvasionUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, }, [EFFECT_SPECIAL_ATTACK_UP_3] = { .battleScript = BattleScript_EffectSpecialAttackUp3, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, }, [EFFECT_ATTACK_DOWN] = { .battleScript = BattleScript_EffectAttackDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_DEFENSE_DOWN] = { .battleScript = BattleScript_EffectDefenseDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPEED_DOWN] = { .battleScript = BattleScript_EffectSpeedDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPECIAL_ATTACK_DOWN] = { .battleScript = BattleScript_EffectSpecialAttackDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPECIAL_DEFENSE_DOWN] = { .battleScript = BattleScript_EffectSpecialDefenseDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_ACCURACY_DOWN] = { .battleScript = BattleScript_EffectAccuracyDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_EVASION_DOWN] = { .battleScript = BattleScript_EffectEvasionDown, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_HAZE] = { .battleScript = BattleScript_EffectHaze, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -160,6 +172,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectBide, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_ROAR] = @@ -169,16 +182,11 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_MULTI_HIT] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 1, - }, - [EFFECT_CONVERSION] = { .battleScript = BattleScript_EffectConversion, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -186,6 +194,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectRestoreHp, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -193,6 +202,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectLightScreen, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -200,6 +210,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectRest, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -207,6 +218,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectOHKO, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_SHEER_COLD] = @@ -251,6 +263,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMist, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -258,6 +271,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectFocusEnergy, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -265,6 +279,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectConfuse, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -272,6 +287,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectAttackUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -279,6 +295,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDefenseUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -286,6 +303,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpeedUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -293,6 +311,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpecialAttackUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -300,6 +319,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpecialDefenseUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -314,66 +334,76 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectEvasionUp2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, }, [EFFECT_TRANSFORM] = { .battleScript = BattleScript_EffectTransform, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 0, // Natural 0 + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_ATTACK_DOWN_2] = { .battleScript = BattleScript_EffectAttackDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_DEFENSE_DOWN_2] = { .battleScript = BattleScript_EffectDefenseDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPEED_DOWN_2] = { .battleScript = BattleScript_EffectSpeedDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPECIAL_ATTACK_DOWN_2] = { .battleScript = BattleScript_EffectSpecialAttackDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_SPECIAL_DEFENSE_DOWN_2] = { .battleScript = BattleScript_EffectSpecialDefenseDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_ACCURACY_DOWN_2] = { .battleScript = BattleScript_EffectAccuracyDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_EVASION_DOWN_2] = { .battleScript = BattleScript_EffectEvasionDown2, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_REFLECT] = { .battleScript = BattleScript_EffectReflect, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, [EFFECT_TWO_TURNS_ATTACK] = { - .battleScript = BattleScript_EffectTwoTurnsAttack, + .battleScript = BattleScript_EffectHit, .battleTvScore = 3, .twoTurnEffect = TRUE, }, @@ -382,30 +412,28 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSubstitute, .battleTvScore = 4, - }, - - [EFFECT_RAGE] = - { - .battleScript = BattleScript_EffectRage, - .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_MIMIC] = { .battleScript = BattleScript_EffectMimic, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_METRONOME] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_LEECH_SEED] = { .battleScript = BattleScript_EffectLeechSeed, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -441,6 +469,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDisable, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_LEVEL_DAMAGE] = @@ -455,10 +484,11 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 1, }, - [EFFECT_COUNTER] = + [EFFECT_REFLECT_DAMAGE] = { - .battleScript = BattleScript_EffectCounter, + .battleScript = BattleScript_EffectHit, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, .encourageEncore = TRUE, }, @@ -466,12 +496,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectEncore, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_PAIN_SPLIT] = { .battleScript = BattleScript_EffectPainSplit, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_SNORE] = @@ -484,6 +516,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectConversion2, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -498,6 +531,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSketch, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_SLEEP_TALK] = @@ -511,18 +545,21 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDestinyBond, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_FLAIL] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_SPITE] = { .battleScript = BattleScript_EffectSpite, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_FALSE_SWIPE] = @@ -535,6 +572,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectHealBell, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -548,6 +586,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMeanLook, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -562,12 +601,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMinimize, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, }, [EFFECT_CURSE] = { .battleScript = BattleScript_EffectCurse, .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, .encourageEncore = TRUE, }, @@ -577,10 +618,17 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, + [EFFECT_LUNAR_DANCE] = + { + .battleScript = BattleScript_EffectHealingWish, + .battleTvScore = 0, // TODO: Assign points + }, + [EFFECT_PROTECT] = { .battleScript = BattleScript_EffectProtect, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, .usesProtectCounter = TRUE, }, @@ -589,6 +637,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSpikes, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_FORESIGHT] = @@ -602,13 +651,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectPerishSong, .battleTvScore = 6, - .encourageEncore = TRUE, - }, - - [EFFECT_SANDSTORM] = - { - .battleScript = BattleScript_EffectSandstorm, - .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, .encourageEncore = TRUE, }, @@ -616,13 +659,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectEndure, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, .usesProtectCounter = TRUE, }, [EFFECT_ROLLOUT] = { - .battleScript = BattleScript_EffectRollout, + .battleScript = BattleScript_EffectHit, .battleTvScore = 3, }, @@ -630,12 +674,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSwagger, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, [EFFECT_FURY_CUTTER] = { - .battleScript = BattleScript_EffectFuryCutter, + .battleScript = BattleScript_EffectHit, .battleTvScore = 2, }, @@ -643,6 +688,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectAttract, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -656,6 +702,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectPresent, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_FRUSTRATION] = @@ -668,6 +715,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSafeguard, .battleTvScore = 5, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -681,6 +729,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectBatonPass, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, }, [EFFECT_PURSUIT] = @@ -699,6 +748,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMorningSun, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -706,6 +756,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSynthesis, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -713,6 +764,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMoonlight, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -722,17 +774,11 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 1, }, - [EFFECT_RAIN_DANCE] = + [EFFECT_WEATHER] = { - .battleScript = BattleScript_EffectRainDance, - .battleTvScore = 4, - .encourageEncore = TRUE, - }, - - [EFFECT_SUNNY_DAY] = - { - .battleScript = BattleScript_EffectSunnyDay, + .battleScript = BattleScript_EffectWeather, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_WEATHER, .encourageEncore = TRUE, }, @@ -746,6 +792,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectBellyDrum, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -753,13 +800,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectPsychUp, .battleTvScore = 7, - .encourageEncore = TRUE, - }, - - [EFFECT_MIRROR_COAT] = - { - .battleScript = BattleScript_EffectMirrorCoat, - .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -778,7 +819,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SOLAR_BEAM] = { - .battleScript = BattleScript_EffectTwoTurnsAttack, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, .twoTurnEffect = TRUE, }, @@ -791,13 +832,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_BEAT_UP] = { - .battleScript = (B_BEAT_UP >= GEN_5) ? BattleScript_EffectHit : BattleScript_EffectBeatUp, + .battleScript = BattleScript_EffectBeatUp, .battleTvScore = 2, }, [EFFECT_SEMI_INVULNERABLE] = { - .battleScript = BattleScript_EffectTwoTurnsAttack, + .battleScript = BattleScript_EffectHit, .battleTvScore = 3, .twoTurnEffect = TRUE, .semiInvulnerableEffect = TRUE, @@ -807,6 +848,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDefenseCurl, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -814,6 +856,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSoftboiled, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -848,6 +891,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSwallow, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -858,17 +902,11 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_HAIL] = - { - .battleScript = BattleScript_EffectHail, - .battleTvScore = 4, - .encourageEncore = TRUE, - }, - [EFFECT_TORMENT] = { .battleScript = BattleScript_EffectTorment, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -876,24 +914,28 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectFlatter, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_MEMENTO] = { .battleScript = BattleScript_EffectMemento, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_FACADE] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_FOCUS_PUNCH] = { - .battleScript = BattleScript_EffectFocusPunch, + .battleScript = BattleScript_EffectHit, .battleTvScore = 7, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, }, [EFFECT_DOUBLE_POWER_ON_ARG_STATUS] = @@ -912,13 +954,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_NATURE_POWER] = { .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 0, // Natural 0 }, [EFFECT_CHARGE] = { .battleScript = BattleScript_EffectCharge, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -926,6 +969,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectTaunt, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_HELPING_HAND] = @@ -938,6 +982,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectTrick, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, .encourageEncore = TRUE, }, @@ -945,6 +990,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectRolePlay, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, .encourageEncore = TRUE, }, @@ -952,18 +998,21 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectWish, .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, }, [EFFECT_ASSIST] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, }, [EFFECT_INGRAIN] = { .battleScript = BattleScript_EffectIngrain, .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -971,12 +1020,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMagicCoat, .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, }, [EFFECT_RECYCLE] = { .battleScript = BattleScript_EffectRecycle, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -986,12 +1037,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 4, }, - [EFFECT_BRICK_BREAK] = - { - .battleScript = BattleScript_EffectBrickBreak, - .battleTvScore = 2, - }, - [EFFECT_YAWN] = { .battleScript = BattleScript_EffectYawn, @@ -1002,6 +1047,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 2, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_STEAL_ITEM] = @@ -1012,7 +1058,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_ENDEAVOR] = { - .battleScript = BattleScript_EffectEndeavor, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -1026,6 +1072,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSkillSwap, .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, .encourageEncore = TRUE, }, @@ -1033,6 +1080,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectImprison, .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, .encourageEncore = TRUE, }, @@ -1040,6 +1088,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectRefresh, .battleTvScore = 6, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -1047,6 +1096,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectGrudge, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_HIGH_RISK, .encourageEncore = TRUE, }, @@ -1054,6 +1104,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectSnatch, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_SLOW_STEADY, }, [EFFECT_LOW_KICK] = @@ -1072,6 +1123,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectMudSport, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -1079,18 +1131,21 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEATHER, }, [EFFECT_TICKLE] = { .battleScript = BattleScript_EffectTickle, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_COSMIC_POWER] = { .battleScript = BattleScript_EffectCosmicPower, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1098,6 +1153,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectBulkUp, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1105,6 +1161,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectWaterSport, .battleTvScore = 4, + .battleFactoryStyle = FACTORY_STYLE_ENDURANCE, .encourageEncore = TRUE, }, @@ -1112,6 +1169,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectCalmMind, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1119,6 +1177,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDragonDance, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1126,6 +1185,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectCamouflage, .battleTvScore = 3, + .battleFactoryStyle = FACTORY_STYLE_UNPREDICTABLE, .encourageEncore = TRUE, }, @@ -1377,12 +1437,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_METAL_BURST] = - { - .battleScript = BattleScript_EffectMetalBurst, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_LUCKY_CHANT] = { .battleScript = BattleScript_EffectLuckyChant, @@ -1395,7 +1449,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, - + [EFFECT_ENTRAINMENT] = { .battleScript = BattleScript_EffectEntrainment, @@ -1469,6 +1523,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectAttackSpAttackUp, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1520,6 +1575,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectGrowth, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1547,6 +1603,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectDefenseUp3, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -1614,7 +1671,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SYNCHRONOISE] = { - .battleScript = BattleScript_EffectSynchronoise, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -1936,18 +1993,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .semiInvulnerableEffect = TRUE, }, - [EFFECT_EXPANDING_FORCE] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - - [EFFECT_RISING_VOLTAGE] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_BEAK_BLAST] = { .battleScript = BattleScript_EffectHit, @@ -1998,24 +2043,12 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_ATTACK_UP_USER_ALLY] = - { - .battleScript = BattleScript_EffectAttackUpUserAlly, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_SHELL_TRAP] = { .battleScript = BattleScript_EffectShellTrap, .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_PSYBLADE] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_HYDRO_STEAM] = { .battleScript = BattleScript_EffectHit, @@ -2028,12 +2061,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_SNOWSCAPE] = - { - .battleScript = BattleScript_EffectSnow, - .battleTvScore = 4, - }, - [EFFECT_TAKE_HEART] = { .battleScript = BattleScript_EffectTakeHeart, @@ -2050,6 +2077,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectCorrosiveGas, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_WEAKENING, }, [EFFECT_POPULATION_BOMB] = @@ -2058,27 +2086,22 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_CHILLY_RECEPTION] = + [EFFECT_WEATHER_AND_SWITCH] = { - .battleScript = BattleScript_EffectChillyReception, + .battleScript =BattleScript_EffectWeatherAndSwitch, .battleTvScore = 0, // TODO: Assign points + .battleFactoryStyle = FACTORY_STYLE_WEATHER, }, [EFFECT_MAX_MOVE] = { - .battleScript = BattleScript_EffectMaxMove, - .battleTvScore = 0, // TODO: Assign points - }, - - [EFFECT_GLAIVE_RUSH] = - { - .battleScript = BattleScript_EffectGlaiveRush, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, [EFFECT_RAGING_BULL] = { - .battleScript = BattleScript_EffectBrickBreak, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, @@ -2121,7 +2144,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_UPPER_HAND] = { - .battleScript = BattleScript_EffectUpperHand, + .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points .encourageEncore = TRUE, }, @@ -2130,6 +2153,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = { .battleScript = BattleScript_EffectFocusEnergy, .battleTvScore = 1, + .battleFactoryStyle = FACTORY_STYLE_PREPARATION, .encourageEncore = TRUE, }, @@ -2165,36 +2189,18 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_DRAGON_DARTS] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_SHELL_SIDE_ARM] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_ORDER_UP] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_RAPID_SPIN] = { .battleScript = BattleScript_EffectHit, .battleTvScore = 2, }, - [EFFECT_SPECTRAL_THIEF] = - { - .battleScript = BattleScript_EffectSpectralThief, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_RECOIL] = { .battleScript = BattleScript_EffectHit, @@ -2236,4 +2242,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_SPECIES_POWER_OVERRIDE] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/battle_partners.party b/src/data/battle_partners.party index bd3f2135a..95834394f 100644 --- a/src/data/battle_partners.party +++ b/src/data/battle_partners.party @@ -1,5 +1,5 @@ === PARTNER_NONE === -Name: +Name: Class: Pkmn Trainer 1 Pic: RS Brendan 1 Gender: Male diff --git a/src/data/graphics/items.h b/src/data/graphics/items.h index 403530eff..bb1828b1a 100644 --- a/src/data/graphics/items.h +++ b/src/data/graphics/items.h @@ -22,6 +22,7 @@ const u32 gItemIcon_MasterBall[] = INCBIN_U32("graphics/items/icons/master_ball. const u16 gItemIconPalette_MasterBall[] = INCBIN_U16("graphics/items/icon_palettes/master_ball.gbapal"); const u32 gItemIcon_PremierBall[] = INCBIN_U32("graphics/items/icons/premier_ball.4bpp.lz"); +const u16 gItemIconPalette_PremierBall[] = INCBIN_U16("graphics/items/icon_palettes/premier_ball.gbapal"); const u32 gItemIcon_HealBall[] = INCBIN_U32("graphics/items/icons/heal_ball.4bpp.lz"); const u16 gItemIconPalette_HealBall[] = INCBIN_U16("graphics/items/icon_palettes/heal_ball.gbapal"); @@ -216,22 +217,12 @@ const u16 gItemIconPalette_PPMax[] = INCBIN_U16("graphics/items/icon_palettes/pp // EV Feathers -const u32 gItemIcon_HealthFeather[] = INCBIN_U32("graphics/items/icons/health_feather.4bpp.lz"); +const u32 gItemIcon_EVFeather[] = INCBIN_U32("graphics/items/icons/ev_feather.4bpp.smol"); const u16 gItemIconPalette_HealthFeather[] = INCBIN_U16("graphics/items/icon_palettes/health_feather.gbapal"); - -const u32 gItemIcon_MuscleFeather[] = INCBIN_U32("graphics/items/icons/muscle_feather.4bpp.lz"); const u16 gItemIconPalette_MuscleFeather[] = INCBIN_U16("graphics/items/icon_palettes/muscle_feather.gbapal"); - -const u32 gItemIcon_ResistFeather[] = INCBIN_U32("graphics/items/icons/resist_feather.4bpp.lz"); const u16 gItemIconPalette_ResistFeather[] = INCBIN_U16("graphics/items/icon_palettes/resist_feather.gbapal"); - -const u32 gItemIcon_GeniusFeather[] = INCBIN_U32("graphics/items/icons/genius_feather.4bpp.lz"); const u16 gItemIconPalette_GeniusFeather[] = INCBIN_U16("graphics/items/icon_palettes/genius_feather.gbapal"); - -const u32 gItemIcon_CleverFeather[] = INCBIN_U32("graphics/items/icons/clever_feather.4bpp.lz"); const u16 gItemIconPalette_CleverFeather[] = INCBIN_U16("graphics/items/icon_palettes/clever_feather.gbapal"); - -const u32 gItemIcon_SwiftFeather[] = INCBIN_U32("graphics/items/icons/swift_feather.4bpp.lz"); const u16 gItemIconPalette_SwiftFeather[] = INCBIN_U16("graphics/items/icon_palettes/swift_feather.gbapal"); // Ability Modifiers @@ -474,25 +465,13 @@ const u16 gItemIconPalette_AmazeMulch[] = INCBIN_U16("graphics/items/icon_palett // Apricorns -const u32 gItemIcon_RedApricorn[] = INCBIN_U32("graphics/items/icons/red_apricorn.4bpp.lz"); +const u32 gItemIcon_Apricorn[] = INCBIN_U32("graphics/items/icons/apricorn.4bpp.smol"); const u16 gItemIconPalette_RedApricorn[] = INCBIN_U16("graphics/items/icon_palettes/red_apricorn.gbapal"); - -const u32 gItemIcon_BlueApricorn[] = INCBIN_U32("graphics/items/icons/blue_apricorn.4bpp.lz"); const u16 gItemIconPalette_BlueApricorn[] = INCBIN_U16("graphics/items/icon_palettes/blue_apricorn.gbapal"); - -const u32 gItemIcon_YellowApricorn[] = INCBIN_U32("graphics/items/icons/yellow_apricorn.4bpp.lz"); const u16 gItemIconPalette_YellowApricorn[] = INCBIN_U16("graphics/items/icon_palettes/yellow_apricorn.gbapal"); - -const u32 gItemIcon_GreenApricorn[] = INCBIN_U32("graphics/items/icons/green_apricorn.4bpp.lz"); const u16 gItemIconPalette_GreenApricorn[] = INCBIN_U16("graphics/items/icon_palettes/green_apricorn.gbapal"); - -const u32 gItemIcon_PinkApricorn[] = INCBIN_U32("graphics/items/icons/pink_apricorn.4bpp.lz"); const u16 gItemIconPalette_PinkApricorn[] = INCBIN_U16("graphics/items/icon_palettes/pink_apricorn.gbapal"); - -const u32 gItemIcon_WhiteApricorn[] = INCBIN_U32("graphics/items/icons/white_apricorn.4bpp.lz"); const u16 gItemIconPalette_WhiteApricorn[] = INCBIN_U16("graphics/items/icon_palettes/white_apricorn.gbapal"); - -const u32 gItemIcon_BlackApricorn[] = INCBIN_U32("graphics/items/icons/black_apricorn.4bpp.lz"); const u16 gItemIconPalette_BlackApricorn[] = INCBIN_U16("graphics/items/icon_palettes/black_apricorn.gbapal"); const u32 gItemIcon_WishingPiece[] = INCBIN_U32("graphics/items/icons/wishing_piece.4bpp.lz"); @@ -671,83 +650,39 @@ const u16 gItemIconPalette_MetalAlloy[] = INCBIN_U16("graphics/items/icon_palett // Nectars -const u32 gItemIcon_RedNectar[] = INCBIN_U32("graphics/items/icons/red_nectar.4bpp.lz"); +const u32 gItemIcon_Nectar[] = INCBIN_U32("graphics/items/icons/nectar.4bpp.smol"); const u16 gItemIconPalette_RedNectar[] = INCBIN_U16("graphics/items/icon_palettes/red_nectar.gbapal"); - -const u32 gItemIcon_YellowNectar[] = INCBIN_U32("graphics/items/icons/yellow_nectar.4bpp.lz"); const u16 gItemIconPalette_YellowNectar[] = INCBIN_U16("graphics/items/icon_palettes/yellow_nectar.gbapal"); - -const u32 gItemIcon_PinkNectar[] = INCBIN_U32("graphics/items/icons/pink_nectar.4bpp.lz"); const u16 gItemIconPalette_PinkNectar[] = INCBIN_U16("graphics/items/icon_palettes/pink_nectar.gbapal"); - -const u32 gItemIcon_PurpleNectar[] = INCBIN_U32("graphics/items/icons/purple_nectar.4bpp.lz"); const u16 gItemIconPalette_PurpleNectar[] = INCBIN_U16("graphics/items/icon_palettes/purple_nectar.gbapal"); // Plates -const u32 gItemIcon_FlamePlate[] = INCBIN_U32("graphics/items/icons/flame_plate.4bpp.lz"); +const u32 gItemIcon_Plate[] = INCBIN_U32("graphics/items/icons/plate.4bpp.smol"); const u16 gItemIconPalette_FlamePlate[] = INCBIN_U16("graphics/items/icon_palettes/flame_plate.gbapal"); - -const u32 gItemIcon_SplashPlate[] = INCBIN_U32("graphics/items/icons/splash_plate.4bpp.lz"); const u16 gItemIconPalette_SplashPlate[] = INCBIN_U16("graphics/items/icon_palettes/splash_plate.gbapal"); - -const u32 gItemIcon_ZapPlate[] = INCBIN_U32("graphics/items/icons/zap_plate.4bpp.lz"); const u16 gItemIconPalette_ZapPlate[] = INCBIN_U16("graphics/items/icon_palettes/zap_plate.gbapal"); - -const u32 gItemIcon_MeadowPlate[] = INCBIN_U32("graphics/items/icons/meadow_plate.4bpp.lz"); const u16 gItemIconPalette_MeadowPlate[] = INCBIN_U16("graphics/items/icon_palettes/meadow_plate.gbapal"); - -const u32 gItemIcon_IciclePlate[] = INCBIN_U32("graphics/items/icons/icicle_plate.4bpp.lz"); const u16 gItemIconPalette_IciclePlate[] = INCBIN_U16("graphics/items/icon_palettes/icicle_plate.gbapal"); - -const u32 gItemIcon_FistPlate[] = INCBIN_U32("graphics/items/icons/fist_plate.4bpp.lz"); const u16 gItemIconPalette_FistPlate[] = INCBIN_U16("graphics/items/icon_palettes/fist_plate.gbapal"); - -const u32 gItemIcon_ToxicPlate[] = INCBIN_U32("graphics/items/icons/toxic_plate.4bpp.lz"); const u16 gItemIconPalette_ToxicPlate[] = INCBIN_U16("graphics/items/icon_palettes/toxic_plate.gbapal"); - -const u32 gItemIcon_EarthPlate[] = INCBIN_U32("graphics/items/icons/earth_plate.4bpp.lz"); const u16 gItemIconPalette_EarthPlate[] = INCBIN_U16("graphics/items/icon_palettes/earth_plate.gbapal"); - -const u32 gItemIcon_SkyPlate[] = INCBIN_U32("graphics/items/icons/sky_plate.4bpp.lz"); const u16 gItemIconPalette_SkyPlate[] = INCBIN_U16("graphics/items/icon_palettes/sky_plate.gbapal"); - -const u32 gItemIcon_MindPlate[] = INCBIN_U32("graphics/items/icons/mind_plate.4bpp.lz"); const u16 gItemIconPalette_MindPlate[] = INCBIN_U16("graphics/items/icon_palettes/mind_plate.gbapal"); - -const u32 gItemIcon_InsectPlate[] = INCBIN_U32("graphics/items/icons/insect_plate.4bpp.lz"); const u16 gItemIconPalette_InsectPlate[] = INCBIN_U16("graphics/items/icon_palettes/insect_plate.gbapal"); - -const u32 gItemIcon_StonePlate[] = INCBIN_U32("graphics/items/icons/stone_plate.4bpp.lz"); const u16 gItemIconPalette_StonePlate[] = INCBIN_U16("graphics/items/icon_palettes/stone_plate.gbapal"); - -const u32 gItemIcon_SpookyPlate[] = INCBIN_U32("graphics/items/icons/spooky_plate.4bpp.lz"); const u16 gItemIconPalette_SpookyPlate[] = INCBIN_U16("graphics/items/icon_palettes/spooky_plate.gbapal"); - -const u32 gItemIcon_DracoPlate[] = INCBIN_U32("graphics/items/icons/draco_plate.4bpp.lz"); const u16 gItemIconPalette_DracoPlate[] = INCBIN_U16("graphics/items/icon_palettes/draco_plate.gbapal"); - -const u32 gItemIcon_DreadPlate[] = INCBIN_U32("graphics/items/icons/dread_plate.4bpp.lz"); const u16 gItemIconPalette_DreadPlate[] = INCBIN_U16("graphics/items/icon_palettes/dread_plate.gbapal"); - -const u32 gItemIcon_IronPlate[] = INCBIN_U32("graphics/items/icons/iron_plate.4bpp.lz"); const u16 gItemIconPalette_IronPlate[] = INCBIN_U16("graphics/items/icon_palettes/iron_plate.gbapal"); - -const u32 gItemIcon_PixiePlate[] = INCBIN_U32("graphics/items/icons/pixie_plate.4bpp.lz"); const u16 gItemIconPalette_PixiePlate[] = INCBIN_U16("graphics/items/icon_palettes/pixie_plate.gbapal"); // Drives -const u32 gItemIcon_DouseDrive[] = INCBIN_U32("graphics/items/icons/douse_drive.4bpp.lz"); +const u32 gItemIcon_Drive[] = INCBIN_U32("graphics/items/icons/drive.4bpp.smol"); const u16 gItemIconPalette_DouseDrive[] = INCBIN_U16("graphics/items/icon_palettes/douse_drive.gbapal"); - -const u32 gItemIcon_ShockDrive[] = INCBIN_U32("graphics/items/icons/shock_drive.4bpp.lz"); const u16 gItemIconPalette_ShockDrive[] = INCBIN_U16("graphics/items/icon_palettes/shock_drive.gbapal"); - -const u32 gItemIcon_BurnDrive[] = INCBIN_U32("graphics/items/icons/burn_drive.4bpp.lz"); const u16 gItemIconPalette_BurnDrive[] = INCBIN_U16("graphics/items/icon_palettes/burn_drive.gbapal"); - -const u32 gItemIcon_ChillDrive[] = INCBIN_U32("graphics/items/icons/chill_drive.4bpp.lz"); const u16 gItemIconPalette_ChillDrive[] = INCBIN_U16("graphics/items/icon_palettes/chill_drive.gbapal"); // Memories @@ -959,59 +894,24 @@ const u32 gItemIcon_Diancite[] = INCBIN_U32("graphics/items/icons/diancite.4bpp. const u16 gItemIconPalette_Diancite[] = INCBIN_U16("graphics/items/icon_palettes/diancite.gbapal"); // Gems - -const u32 gItemIcon_NormalGem[] = INCBIN_U32("graphics/items/icons/normal_gem.4bpp.lz"); +const u32 gItemIcon_TypeGem[] = INCBIN_U32("graphics/items/icons/type_gem.4bpp.smol"); const u16 gItemIconPalette_NormalGem[] = INCBIN_U16("graphics/items/icon_palettes/normal_gem.gbapal"); - -const u32 gItemIcon_FireGem[] = INCBIN_U32("graphics/items/icons/fire_gem.4bpp.lz"); const u16 gItemIconPalette_FireGem[] = INCBIN_U16("graphics/items/icon_palettes/fire_gem.gbapal"); - -const u32 gItemIcon_WaterGem[] = INCBIN_U32("graphics/items/icons/water_gem.4bpp.lz"); const u16 gItemIconPalette_WaterGem[] = INCBIN_U16("graphics/items/icon_palettes/water_gem.gbapal"); - -const u32 gItemIcon_ElectricGem[] = INCBIN_U32("graphics/items/icons/electric_gem.4bpp.lz"); const u16 gItemIconPalette_ElectricGem[] = INCBIN_U16("graphics/items/icon_palettes/electric_gem.gbapal"); - -const u32 gItemIcon_GrassGem[] = INCBIN_U32("graphics/items/icons/grass_gem.4bpp.lz"); const u16 gItemIconPalette_GrassGem[] = INCBIN_U16("graphics/items/icon_palettes/grass_gem.gbapal"); - -const u32 gItemIcon_IceGem[] = INCBIN_U32("graphics/items/icons/ice_gem.4bpp.lz"); const u16 gItemIconPalette_IceGem[] = INCBIN_U16("graphics/items/icon_palettes/ice_gem.gbapal"); - -const u32 gItemIcon_FightingGem[] = INCBIN_U32("graphics/items/icons/fighting_gem.4bpp.lz"); const u16 gItemIconPalette_FightingGem[] = INCBIN_U16("graphics/items/icon_palettes/fighting_gem.gbapal"); - -const u32 gItemIcon_PoisonGem[] = INCBIN_U32("graphics/items/icons/poison_gem.4bpp.lz"); const u16 gItemIconPalette_PoisonGem[] = INCBIN_U16("graphics/items/icon_palettes/poison_gem.gbapal"); - -const u32 gItemIcon_GroundGem[] = INCBIN_U32("graphics/items/icons/ground_gem.4bpp.lz"); const u16 gItemIconPalette_GroundGem[] = INCBIN_U16("graphics/items/icon_palettes/ground_gem.gbapal"); - -const u32 gItemIcon_FlyingGem[] = INCBIN_U32("graphics/items/icons/flying_gem.4bpp.lz"); const u16 gItemIconPalette_FlyingGem[] = INCBIN_U16("graphics/items/icon_palettes/flying_gem.gbapal"); - -const u32 gItemIcon_PsychicGem[] = INCBIN_U32("graphics/items/icons/psychic_gem.4bpp.lz"); const u16 gItemIconPalette_PsychicGem[] = INCBIN_U16("graphics/items/icon_palettes/psychic_gem.gbapal"); - -const u32 gItemIcon_BugGem[] = INCBIN_U32("graphics/items/icons/bug_gem.4bpp.lz"); const u16 gItemIconPalette_BugGem[] = INCBIN_U16("graphics/items/icon_palettes/bug_gem.gbapal"); - -const u32 gItemIcon_RockGem[] = INCBIN_U32("graphics/items/icons/rock_gem.4bpp.lz"); const u16 gItemIconPalette_RockGem[] = INCBIN_U16("graphics/items/icon_palettes/rock_gem.gbapal"); - -const u32 gItemIcon_GhostGem[] = INCBIN_U32("graphics/items/icons/ghost_gem.4bpp.lz"); const u16 gItemIconPalette_GhostGem[] = INCBIN_U16("graphics/items/icon_palettes/ghost_gem.gbapal"); - -const u32 gItemIcon_DragonGem[] = INCBIN_U32("graphics/items/icons/dragon_gem.4bpp.lz"); const u16 gItemIconPalette_DragonGem[] = INCBIN_U16("graphics/items/icon_palettes/dragon_gem.gbapal"); - -const u32 gItemIcon_DarkGem[] = INCBIN_U32("graphics/items/icons/dark_gem.4bpp.lz"); const u16 gItemIconPalette_DarkGem[] = INCBIN_U16("graphics/items/icon_palettes/dark_gem.gbapal"); - -const u32 gItemIcon_SteelGem[] = INCBIN_U32("graphics/items/icons/steel_gem.4bpp.lz"); const u16 gItemIconPalette_SteelGem[] = INCBIN_U16("graphics/items/icon_palettes/steel_gem.gbapal"); - -const u32 gItemIcon_FairyGem[] = INCBIN_U32("graphics/items/icons/fairy_gem.4bpp.lz"); const u16 gItemIconPalette_FairyGem[] = INCBIN_U16("graphics/items/icon_palettes/fairy_gem.gbapal"); // Z-Crystals @@ -1129,16 +1029,14 @@ const u16 gItemIconPalette_LightBall[] = INCBIN_U16("graphics/items/icon_palette const u32 gItemIcon_Leek[] = INCBIN_U32("graphics/items/icons/leek.4bpp.lz"); const u16 gItemIconPalette_Leek[] = INCBIN_U16("graphics/items/icon_palettes/leek.gbapal"); -const u32 gItemIcon_ThickClub[] = INCBIN_U32("graphics/items/icons/thick_club.4bpp.lz"); -const u16 gItemIconPalette_ThickClub[] = INCBIN_U16("graphics/items/icon_palettes/thick_club.gbapal"); +const u32 gItemIcon_Bone[] = INCBIN_U32("graphics/items/icons/bone.4bpp.smol"); +const u16 gItemIconPalette_Bone[] = INCBIN_U16("graphics/items/icon_palettes/bone.gbapal"); const u32 gItemIcon_LuckyPunch[] = INCBIN_U32("graphics/items/icons/lucky_punch.4bpp.lz"); const u16 gItemIconPalette_LuckyPunch[] = INCBIN_U16("graphics/items/icon_palettes/lucky_punch.gbapal"); -const u32 gItemIcon_MetalPowder[] = INCBIN_U32("graphics/items/icons/metal_powder.4bpp.lz"); +const u32 gItemIcon_DittoPowder[] = INCBIN_U32("graphics/items/icons/ditto_powder.4bpp.smol"); const u16 gItemIconPalette_MetalPowder[] = INCBIN_U16("graphics/items/icon_palettes/metal_powder.gbapal"); - -const u32 gItemIcon_QuickPowder[] = INCBIN_U32("graphics/items/icons/quick_powder.4bpp.lz"); const u16 gItemIconPalette_QuickPowder[] = INCBIN_U16("graphics/items/icon_palettes/quick_powder.gbapal"); const u32 gItemIcon_DeepSeaScale[] = INCBIN_U32("graphics/items/icons/deep_sea_scale.4bpp.lz"); @@ -1250,7 +1148,7 @@ const u16 gItemIconPalette_BlackTypeEnhancingItem[] = INCBIN_U16("graphics/items const u32 gItemIcon_PoisonBarb[] = INCBIN_U32("graphics/items/icons/poison_barb.4bpp.lz"); const u16 gItemIconPalette_PoisonBarb[] = INCBIN_U16("graphics/items/icon_palettes/poison_barb.gbapal"); -const u32 gItemIcon_SoftSand[] = INCBIN_U32("graphics/items/icons/soft_sand.4bpp.lz"); +const u32 gItemIcon_Sand[] = INCBIN_U32("graphics/items/icons/sand.4bpp.smol"); const u16 gItemIconPalette_SoftSand[] = INCBIN_U16("graphics/items/icon_palettes/soft_sand.gbapal"); const u32 gItemIcon_SharpBeak[] = INCBIN_U32("graphics/items/icons/sharp_beak.4bpp.lz"); @@ -1311,16 +1209,10 @@ const u16 gItemIconPalette_IcyRock[] = INCBIN_U16("graphics/items/icon_palettes/ // Terrain Seeds -const u32 gItemIcon_ElectricSeed[] = INCBIN_U32("graphics/items/icons/electric_seed.4bpp.lz"); +const u32 gItemIcon_TerrainSeed[] = INCBIN_U32("graphics/items/icons/terrain_seed.4bpp.smol"); const u16 gItemIconPalette_ElectricSeed[] = INCBIN_U16("graphics/items/icon_palettes/electric_seed.gbapal"); - -const u32 gItemIcon_PsychicSeed[] = INCBIN_U32("graphics/items/icons/psychic_seed.4bpp.lz"); const u16 gItemIconPalette_PsychicSeed[] = INCBIN_U16("graphics/items/icon_palettes/psychic_seed.gbapal"); - -const u32 gItemIcon_MistySeed[] = INCBIN_U32("graphics/items/icons/misty_seed.4bpp.lz"); const u16 gItemIconPalette_MistySeed[] = INCBIN_U16("graphics/items/icon_palettes/misty_seed.gbapal"); - -const u32 gItemIcon_GrassySeed[] = INCBIN_U32("graphics/items/icons/grassy_seed.4bpp.lz"); const u16 gItemIconPalette_GrassySeed[] = INCBIN_U16("graphics/items/icon_palettes/grassy_seed.gbapal"); // Type-activated Stat Modifiers diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 1b70cf3aa..a133f2b9d 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -12050,11 +12050,22 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_SPOINK #if P_FAMILY_SPINDA +#if !P_GBA_STYLE_SPECIES_GFX const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front.4bpp.smol"); const u16 gMonPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/normal.gbapal"); const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back.4bpp.smol"); const u16 gMonShinyPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/shiny.gbapal"); +#else + const u32 gMonFrontPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/anim_front_gba.4bpp.smol"); + const u16 gMonPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/normal_gba.gbapal"); + const u32 gMonBackPic_Spinda[] = INCBIN_U32("graphics/pokemon/spinda/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_Spinda[] = INCBIN_U16("graphics/pokemon/spinda/shiny_gba.gbapal"); +#endif //P_GBA_STYLE_SPECIES_GFX +#if !P_GBA_STYLE_SPECIES_ICONS const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon.4bpp"); +#else + const u8 gMonIcon_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/icon_gba.4bpp"); +#endif //P_GBA_STYLE_SPECIES_ICONS #if P_FOOTPRINTS const u8 gMonFootprint_Spinda[] = INCBIN_U8("graphics/pokemon/spinda/footprint.1bpp"); #endif //P_FOOTPRINTS @@ -12745,31 +12756,58 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_FEEBAS #if P_FAMILY_CASTFORM +#if !P_GBA_STYLE_SPECIES_GFX const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/anim_front.4bpp.smol"); const u16 gMonPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/normal.gbapal"); const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back.4bpp.smol"); const u16 gMonShinyPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/shiny.gbapal"); - const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); -#if P_FOOTPRINTS - const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); -#endif //P_FOOTPRINTS const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/normal.gbapal"); const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/shiny.gbapal"); - const u8 gMonIcon_CastformSunny[] = INCBIN_U8("graphics/pokemon/castform/sunny/icon.4bpp"); const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/normal.gbapal"); const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/shiny.gbapal"); - const u8 gMonIcon_CastformRainy[] = INCBIN_U8("graphics/pokemon/castform/rainy/icon.4bpp"); const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/anim_front.4bpp.smol"); const u16 gMonPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/normal.gbapal"); const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back.4bpp.smol"); const u16 gMonShinyPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/shiny.gbapal"); +#else + const u32 gMonFrontPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/normal_gba.gbapal"); + const u32 gMonBackPic_CastformNormal[] = INCBIN_U32("graphics/pokemon/castform/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformNormal[] = INCBIN_U16("graphics/pokemon/castform/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/normal_gba.gbapal"); + const u32 gMonBackPic_CastformSunny[] = INCBIN_U32("graphics/pokemon/castform/sunny/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformSunny[] = INCBIN_U16("graphics/pokemon/castform/sunny/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/normal_gba.gbapal"); + const u32 gMonBackPic_CastformRainy[] = INCBIN_U32("graphics/pokemon/castform/rainy/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformRainy[] = INCBIN_U16("graphics/pokemon/castform/rainy/shiny_gba.gbapal"); + + const u32 gMonFrontPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/front_gba.4bpp.smol"); + const u16 gMonPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/normal_gba.gbapal"); + const u32 gMonBackPic_CastformSnowy[] = INCBIN_U32("graphics/pokemon/castform/snowy/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_CastformSnowy[] = INCBIN_U16("graphics/pokemon/castform/snowy/shiny_gba.gbapal"); +#endif //P_GBA_STYLE_SPECIES_GFX +#if !P_GBA_STYLE_SPECIES_ICONS + const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon.4bpp"); +#else + const u8 gMonIcon_CastformNormal[] = INCBIN_U8("graphics/pokemon/castform/icon_gba.4bpp"); +#endif //P_GBA_STYLE_SPECIES_ICONS +#if P_FOOTPRINTS + const u8 gMonFootprint_Castform[] = INCBIN_U8("graphics/pokemon/castform/footprint.1bpp"); +#endif //P_FOOTPRINTS + + const u8 gMonIcon_CastformSunny[] = INCBIN_U8("graphics/pokemon/castform/sunny/icon.4bpp"); + const u8 gMonIcon_CastformRainy[] = INCBIN_U8("graphics/pokemon/castform/rainy/icon.4bpp"); const u8 gMonIcon_CastformSnowy[] = INCBIN_U8("graphics/pokemon/castform/snowy/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -13943,11 +13981,41 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal.gbapal"); const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal.gbapal"); + const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal.gbapal"); + const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny.gbapal"); + + const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.smol"); + const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal.gbapal"); + const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny.gbapal"); #else const u32 gMonFrontPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/anim_front_gba.4bpp.smol"); const u16 gMonPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/normal_gba.gbapal"); const u32 gMonBackPic_DeoxysNormal[] = INCBIN_U32("graphics/pokemon/deoxys/back_gba.4bpp.smol"); const u16 gMonShinyPalette_DeoxysNormal[] = INCBIN_U16("graphics/pokemon/deoxys/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny_gba.gbapal"); + + const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/front_gba.4bpp.smol"); + const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal_gba.gbapal"); + const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back_gba.4bpp.smol"); + const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny_gba.gbapal"); #endif //P_GBA_STYLE_SPECIES_GFX #if !P_GBA_STYLE_SPECIES_ICONS const u8 gMonIcon_DeoxysNormal[] = INCBIN_U8("graphics/pokemon/deoxys/icon.4bpp"); @@ -13958,22 +14026,8 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u8 gMonFootprint_Deoxys[] = INCBIN_U8("graphics/pokemon/deoxys/footprint.1bpp"); #endif //P_FOOTPRINTS - const u32 gMonFrontPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/anim_front.4bpp.smol"); - const u16 gMonPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/normal.gbapal"); - const u32 gMonBackPic_DeoxysAttack[] = INCBIN_U32("graphics/pokemon/deoxys/attack/back.4bpp.smol"); - const u16 gMonShinyPalette_DeoxysAttack[] = INCBIN_U16("graphics/pokemon/deoxys/attack/shiny.gbapal"); const u8 gMonIcon_DeoxysAttack[] = INCBIN_U8("graphics/pokemon/deoxys/attack/icon.4bpp"); - - const u32 gMonFrontPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/anim_front.4bpp.smol"); - const u16 gMonPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/normal.gbapal"); - const u32 gMonBackPic_DeoxysDefense[] = INCBIN_U32("graphics/pokemon/deoxys/defense/back.4bpp.smol"); - const u16 gMonShinyPalette_DeoxysDefense[] = INCBIN_U16("graphics/pokemon/deoxys/defense/shiny.gbapal"); const u8 gMonIcon_DeoxysDefense[] = INCBIN_U8("graphics/pokemon/deoxys/defense/icon.4bpp"); - - const u32 gMonFrontPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/anim_front.4bpp.smol"); - const u16 gMonPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/normal.gbapal"); - const u32 gMonBackPic_DeoxysSpeed[] = INCBIN_U32("graphics/pokemon/deoxys/speed/back.4bpp.smol"); - const u16 gMonShinyPalette_DeoxysSpeed[] = INCBIN_U16("graphics/pokemon/deoxys/speed/shiny.gbapal"); const u8 gMonIcon_DeoxysSpeed[] = INCBIN_U8("graphics/pokemon/deoxys/speed/icon.4bpp"); #if OW_POKEMON_OBJECT_EVENTS @@ -15681,6 +15735,11 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ const u32 gMonBackPic_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/back.4bpp.smol"); const u16 gMonShinyPalette_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/shiny.gbapal"); const u8 gMonIcon_Manaphy[] = INCBIN_U8("graphics/pokemon/manaphy/icon.4bpp"); + const u8 gMonEggIcon_Manaphy[] = INCBIN_U8("graphics/pokemon/manaphy/icon_egg.4bpp"); + const u32 gMonEggGfx_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/egg_sprite.4bpp.smol"); + const u16 gMonEggPal_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/egg_sprite.gbapal"); + const u32 gMonHatchGfx_Manaphy[] = INCBIN_U32("graphics/pokemon/manaphy/hatch.4bpp.smol"); + const u16 gMonHatchPal_Manaphy[] = INCBIN_U16("graphics/pokemon/manaphy/hatch.gbapal"); #if P_FOOTPRINTS const u8 gMonFootprint_Manaphy[] = INCBIN_U8("graphics/pokemon/manaphy/footprint.1bpp"); #endif //P_FOOTPRINTS diff --git a/src/data/hold_effects.h b/src/data/hold_effects.h index 221c9e166..c3c0c197e 100644 --- a/src/data/hold_effects.h +++ b/src/data/hold_effects.h @@ -7,161 +7,138 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_RESTORE_HP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CURE_PAR] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CURE_SLP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CURE_PSN] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CURE_BRN] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CURE_FRZ] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_RESTORE_PP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onAttackerAfterHit = TRUE, }, [HOLD_EFFECT_CURE_CONFUSION] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CURE_STATUS] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onStatusChange = TRUE, }, [HOLD_EFFECT_CONFUSE_SPICY] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CONFUSE_DRY] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CONFUSE_SWEET] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CONFUSE_BITTER] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CONFUSE_SOUR] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_ATTACK_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_DEFENSE_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_SPEED_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_SP_ATTACK_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_SP_DEFENSE_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_CRITICAL_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_RANDOM_STAT_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_EVASION_UP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_WHITE_HERB] = { .whiteHerb = TRUE, - .whiteHerbFirstTurn = TRUE, .whiteHerbEndTurn = TRUE, .onFling = TRUE, }, @@ -201,7 +178,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_DOUBLE_PRIZE] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, }, [HOLD_EFFECT_REPEL] = @@ -245,10 +221,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = .leftovers = TRUE, }, - [HOLD_EFFECT_DRAGON_SCALE] = - { - }, - [HOLD_EFFECT_LIGHT_BALL] = { }, @@ -257,10 +229,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = { }, - [HOLD_EFFECT_UPGRADE] = - { - }, - [HOLD_EFFECT_SHELL_BELL] = { .lifeOrbShellBell = TRUE, @@ -424,14 +392,12 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_RESTORE_PCT_HP] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, [HOLD_EFFECT_MICLE_BERRY] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onHpThreshold = TRUE, }, @@ -492,7 +458,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = { .onTargetAfterHit = TRUE, .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, }, [HOLD_EFFECT_RED_CARD] = @@ -559,7 +524,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_TERRAIN_SEED] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onEffect = TRUE, }, @@ -586,7 +550,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_ROOM_SERVICE] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onEffect = TRUE, }, @@ -615,7 +578,6 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_MIRROR_HERB] = { .mirrorHerb = TRUE, - .mirrorHerbFirstTurn = TRUE, }, [HOLD_EFFECT_PUNCHING_GLOVE] = @@ -632,9 +594,8 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_BOOSTER_ENERGY] = { - .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, .onEffect = TRUE, + .boosterEnergy = TRUE, }, [HOLD_EFFECT_OGERPON_MASK] = @@ -644,6 +605,5 @@ const struct HoldEffectInfo gHoldEffectsInfo[HOLD_EFFECT_COUNT] = [HOLD_EFFECT_BERSERK_GENE] = { .onSwitchIn = TRUE, - .onSwitchInFirstTurn = TRUE, }, }; diff --git a/src/data/items.h b/src/data/items.h index a187e7c2e..6d9b9e30f 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -76,8 +76,8 @@ static const u8 sBeadMailDesc[] = _("Mail featuring a " "\nholding Pokémon."); static const u8 sEvolutionStoneDesc[] = _("Makes certain " - "species of Pokémon\n" - "evolve."); + "species of Pokémon " + "\nevolve."); static const u8 sNectarDesc[] = _("Flower nectar that " "changes the\nform " @@ -159,7 +159,7 @@ static const u8 sGenericMulchDesc[] = _("A fertilizer that " "is unsuitable\nfor " "local soil."); -const struct Item gItemsInfo[] = +const struct ItemInfo gItemsInfo[] = { [ITEM_NONE] = { @@ -269,7 +269,7 @@ const struct Item gItemsInfo[] = .battleUsage = EFFECT_ITEM_THROW_BALL, .secondaryId = BALL_PREMIER, .iconPic = gItemIcon_PremierBall, - .iconPalette = gItemIconPalette_LuxuryBall, + .iconPalette = gItemIconPalette_PremierBall, }, [ITEM_HEAL_BALL] = @@ -519,7 +519,7 @@ const struct Item gItemsInfo[] = .description = COMPOUND_STRING( "Works well on " "very heavy " - "\nPokémon."), + "Pokémon."), .pocket = POCKET_POKE_BALLS, .type = ITEM_USE_BAG_MENU, .battleUsage = EFFECT_ITEM_THROW_BALL, @@ -568,7 +568,7 @@ const struct Item gItemsInfo[] = [ITEM_SPORT_BALL] = { .name = ITEM_NAME("Sport Ball"), - .price = (I_PRICE < GEN_3 || I_PRICE >= GEN_9) ? 0 : 300, + .price = (I_PRICE <= GEN_3 || I_PRICE >= GEN_9) ? 0 : 300, .description = COMPOUND_STRING( "A special Ball " "used in the Bug-" @@ -824,17 +824,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Lemonade"), .price = (I_PRICE >= GEN_7) ? 400 : 350, .holdEffectParam = 70, -#if I_HEALTH_RECOVERY >= GEN_7 - .description = COMPOUND_STRING( - "A very sweet drink " - "that\nrestores HP " - "by 70 points."), -#else .description = COMPOUND_STRING( "A very sweet drink " "that restores\nHP " + #if I_HEALTH_RECOVERY >= GEN_7 + "by 70 points."), + #else "by 80 points."), -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_HEALTH_RECOVERY, .type = ITEM_USE_PARTY_MENU, @@ -849,7 +846,6 @@ const struct Item gItemsInfo[] = [ITEM_MOOMOO_MILK] = { .name = ITEM_NAME("Moomoo Milk"), - .pluralName = ITEM_PLURAL_NAME("Moomoo Milk"), .price = (I_PRICE >= GEN_7) ? 600 : 500, .holdEffectParam = 100, .description = COMPOUND_STRING( @@ -870,7 +866,6 @@ const struct Item gItemsInfo[] = [ITEM_ENERGY_POWDER] = { .name = ITEM_NAME("Energy Powder"), - .pluralName = ITEM_PLURAL_NAME("Energy Powder"), .price = 500, .description = COMPOUND_STRING( "A bitter powder " @@ -917,7 +912,6 @@ const struct Item gItemsInfo[] = [ITEM_HEAL_POWDER] = { .name = ITEM_NAME("Heal Powder"), - .pluralName = ITEM_PLURAL_NAME("Heal Powder"), .price = (I_PRICE >= GEN_7) ? 300 : 450, .description = COMPOUND_STRING( "A bitter powder " @@ -967,7 +961,7 @@ const struct Item gItemsInfo[] = .battleUsage = EFFECT_ITEM_CURE_STATUS, .effect = gItemEffect_Antidote, .flingPower = 30, - .iconPic = gItemIcon_Antidote, + .iconPic = gItemIcon_StatusHeal, .iconPalette = gItemIconPalette_Antidote, }, @@ -992,7 +986,13 @@ const struct Item gItemsInfo[] = [ITEM_BURN_HEAL] = { .name = ITEM_NAME("Burn Heal"), - .price = (I_PRICE == GEN_7) ? 300 : ((I_PRICE <= GEN_7) ? 250 : 200), + #if I_PRICE >= GEN_8 + .price = 200, + #elif I_PRICE == GEN_7 + .price = 300, + #else + .price = 250, + #endif .description = COMPOUND_STRING( "Heals Pokémon " "of a burn."), @@ -1010,7 +1010,13 @@ const struct Item gItemsInfo[] = [ITEM_ICE_HEAL] = { .name = ITEM_NAME("Ice Heal"), - .price = (I_PRICE == GEN_7) ? 100 : ((I_PRICE <= GEN_7) ? 250 : 200), + #if I_PRICE >= GEN_8 + .price = 200, + #elif I_PRICE == GEN_7 + .price = 100, + #else + .price = 250, + #endif .description = COMPOUND_STRING( "Defrosts a frozen " "Pokémon."), @@ -1028,7 +1034,13 @@ const struct Item gItemsInfo[] = [ITEM_AWAKENING] = { .name = ITEM_NAME("Awakening"), - .price = (I_PRICE >= GEN_2 && I_PRICE <= GEN_6) ? 250 : ((I_PRICE == GEN_7) ? 100 : 200), + #if (I_PRICE >= GEN_8 || I_PRICE == GEN_1) + .price = 200, + #elif I_PRICE == GEN_7 + .price = 100, + #else + .price = 250, + #endif .description = COMPOUND_STRING( "Awakens a sleeping " "Pokémon."), @@ -1141,7 +1153,6 @@ const struct Item gItemsInfo[] = [ITEM_BERRY_JUICE] = { .name = ITEM_NAME("Berry Juice"), - .pluralName = ITEM_PLURAL_NAME("Berry Juice"), .price = 100, .holdEffect = HOLD_EFFECT_RESTORE_HP, .holdEffectParam = 20, @@ -1175,7 +1186,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_SacredAsh, .effect = gItemEffect_SacredAsh, .flingPower = 30, - .iconPic = gItemIcon_SacredAsh, + .iconPic = gItemIcon_DittoPowder, .iconPalette = gItemIconPalette_SacredAsh, }, @@ -1464,7 +1475,13 @@ const struct Item gItemsInfo[] = [ITEM_PP_UP] = { .name = ITEM_NAME("PP Up"), - .price = (I_PRICE == GEN_1) ? 1 : ((I_PRICE >= GEN_7) ? 10000 : 9800), + #if I_PRICE >= GEN_7 + .price = 10000, + #elif I_PRICE >= GEN_2 + .price = 9800, + #else + .price = 1, + #endif .description = COMPOUND_STRING( "Raises the maximum " "PP of a\nselected " @@ -1511,7 +1528,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_HpFeather, .flingPower = 20, - .iconPic = gItemIcon_HealthFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_HealthFeather, }, @@ -1526,7 +1543,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_AtkFeather, .flingPower = 20, - .iconPic = gItemIcon_MuscleFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_MuscleFeather, }, @@ -1541,7 +1558,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_DefFeather, .flingPower = 20, - .iconPic = gItemIcon_ResistFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_ResistFeather, }, @@ -1556,7 +1573,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpatkFeather, .flingPower = 20, - .iconPic = gItemIcon_GeniusFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_GeniusFeather, }, @@ -1571,7 +1588,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpdefFeather, .flingPower = 20, - .iconPic = gItemIcon_CleverFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_CleverFeather, }, @@ -1586,7 +1603,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_Medicine, .effect = gItemEffect_SpeedFeather, .flingPower = 20, - .iconPic = gItemIcon_SwiftFeather, + .iconPic = gItemIcon_EVFeather, .iconPalette = gItemIconPalette_SwiftFeather, }, @@ -1595,7 +1612,13 @@ const struct Item gItemsInfo[] = [ITEM_ABILITY_CAPSULE] = { .name = ITEM_NAME("Ability Capsule"), - .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE < GEN_9) ? 10000 : 100000), + #if I_PRICE >= GEN_9 + .price = 100000, + #elif I_PRICE >= GEN_7 + .price = 10000, + #else + .price = 1000, + #endif .holdEffectParam = 0, .description = COMPOUND_STRING( "Switches a Poké-" @@ -2015,8 +2038,8 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 10000 : 4800, .description = COMPOUND_STRING( "Raises the level " - "of a Pokémon by\n" - "one."), + "of a Pokémon by " + "\none."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_LEVEL_UP_ITEM, .type = ITEM_USE_PARTY_MENU, @@ -2173,8 +2196,8 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 20 : 300, .description = COMPOUND_STRING( "A glass flute that " - "snaps Pokémon\n" - "out of confusion."), + "snaps Pokémon " + "\nout of confusion."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_FLUTE, @@ -2193,8 +2216,8 @@ const struct Item gItemsInfo[] = .price = (I_PRICE >= GEN_7) ? 20 : 200, .description = COMPOUND_STRING( "A glass flute that " - "snaps Pokémon\n" - "out of attraction."), + "snaps Pokémon " + "\nout of attraction."), .notConsumed = TRUE, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_FLUTE, @@ -2255,8 +2278,8 @@ const struct Item gItemsInfo[] = .holdEffectParam = 100, .description = COMPOUND_STRING( "Repels weak wild " - "Pokémon for 100\n" - "steps."), + "Pokémon for 100 " + "\nsteps."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, @@ -2273,8 +2296,8 @@ const struct Item gItemsInfo[] = .holdEffectParam = 200, .description = COMPOUND_STRING( "Repels weak wild " - "Pokémon for 200\n" - "steps."), + "Pokémon for 200 " + "\nsteps."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, @@ -2291,8 +2314,8 @@ const struct Item gItemsInfo[] = .holdEffectParam = 250, .description = COMPOUND_STRING( "Repels weak wild " - "Pokémon for 250\n" - "steps."), + "Pokémon for 250 " + "\nsteps."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_FIELD_USE, .type = ITEM_USE_BAG_MENU, @@ -2366,15 +2389,15 @@ const struct Item gItemsInfo[] = "Use to escape " "instantly from a " "\ncave or a dungeon."), - #if I_KEY_ESCAPE_ROPE >= GEN_8 - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #else - .price = (I_PRICE >= GEN_7) ? 1000 : 550, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FIELD_USE, - #endif + #if I_KEY_ESCAPE_ROPE >= GEN_8 + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #else + .price = (I_PRICE >= GEN_7) ? 1000 : 550, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FIELD_USE, + #endif .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_EscapeRope, .flingPower = 30, @@ -2401,7 +2424,7 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XAttack, @@ -2427,7 +2450,7 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XDefense, @@ -2453,7 +2476,7 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XSpecialAttack, @@ -2479,12 +2502,12 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XSpecialDefense, .flingPower = 30, - .iconPic = gItemIcon_XSpecialDefense, + .iconPic = gItemIcon_BattleStatItem, .iconPalette = gItemIconPalette_XSpecialDefense, }, @@ -2505,7 +2528,7 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XSpeed, @@ -2520,7 +2543,7 @@ const struct Item gItemsInfo[] = .pluralName = ITEM_PLURAL_NAME("X Accuracies"), .price = (I_PRICE >= GEN_7) ? 1000 : 950, .holdEffectParam = X_ITEM_STAGES, - .description = COMPOUND_STRING( + .description = COMPOUND_STRING( #if B_X_ITEMS_BUFF >= GEN_7 "Sharply raises move " "accuracy\nduring " @@ -2532,7 +2555,7 @@ const struct Item gItemsInfo[] = #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_STAT, .effect = gItemEffect_XAccuracy, @@ -2551,7 +2574,7 @@ const struct Item gItemsInfo[] = "\nduring one battle."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_X_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_SET_FOCUS_ENERGY, .effect = gItemEffect_DireHit, @@ -2583,7 +2606,13 @@ const struct Item gItemsInfo[] = [ITEM_POKE_DOLL] = { .name = ITEM_NAME("Poké Doll"), - .price = (I_PRICE < GEN_7) ? 1000 : ((I_PRICE == GEN_7) ? 100 : 300), + #if I_PRICE >= GEN_8 + .price = 300, + #elif I_PRICE == GEN_7 + .price = 100, + #else + .price = 1000, + #endif .description = sPokeDollDesc, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_BATTLE_ITEM, @@ -2636,7 +2665,7 @@ const struct Item gItemsInfo[] = "by one stage."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_BATTLE_ITEM, - .type = ITEM_USE_BAG_MENU, + .type = B_X_ITEMS_CROSSUSE ? ITEM_USE_BATTLER : ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .battleUsage = EFFECT_ITEM_INCREASE_ALL_STATS, .flingPower = 30, @@ -2700,7 +2729,13 @@ const struct Item gItemsInfo[] = [ITEM_BIG_NUGGET] = { .name = ITEM_NAME("Big Nugget"), - .price = (I_PRICE >= GEN_7) ? (40000 * TREASURE_FACTOR) : 20000, + #if I_PRICE >= GEN_7 + .price = 40000 * TREASURE_FACTOR, + #elif I_PRICE == GEN_6 + .price = 20000, + #else + .price = 0, + #endif .description = COMPOUND_STRING( "A big nugget made " "of gold,\nsellable " @@ -2709,7 +2744,7 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .flingPower = 130, + .flingPower = B_UPDATED_MOVE_DATA >= GEN_8 ? 130 : 80, .iconPic = gItemIcon_BigNugget, .iconPalette = gItemIconPalette_BigNugget, }, @@ -2748,7 +2783,13 @@ const struct Item gItemsInfo[] = [ITEM_BALM_MUSHROOM] = { .name = ITEM_NAME("Balm Mushroom"), - .price = (I_PRICE >= GEN_7) ? 15000 * TREASURE_FACTOR: 12500, + #if I_PRICE >= GEN_7 + .price = 15000 * TREASURE_FACTOR, + #elif I_PRICE == GEN_6 + .price = 12500, + #else + .price = 0, + #endif .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_SELLABLE, @@ -2796,7 +2837,15 @@ const struct Item gItemsInfo[] = [ITEM_PEARL_STRING] = { .name = ITEM_NAME("Pearl String"), - .price = (I_PRICE >= GEN_8) ? 15000 * TREASURE_FACTOR: ((I_PRICE == GEN_7) ? 30000 : 15000), + #if I_PRICE >= GEN_8 + .price = 20000 * TREASURE_FACTOR, + #elif I_PRICE == GEN_7 + .price = 30000, + #elif I_PRICE == GEN_6 + .price = 15000, + #else + .price = 0, + #endif .description = COMPOUND_STRING( "Very large pearls " "that would sell\nat a " @@ -2813,7 +2862,6 @@ const struct Item gItemsInfo[] = [ITEM_STARDUST] = { .name = ITEM_NAME("Stardust"), - .pluralName = ITEM_PLURAL_NAME("Stardust"), .price = (I_PRICE >= GEN_7) ? 3000 * TREASURE_FACTOR: 2000, .description = COMPOUND_STRING( "Beautiful red sand. " @@ -2824,7 +2872,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, - .iconPic = gItemIcon_Stardust, + .iconPic = gItemIcon_Sand, .iconPalette = gItemIconPalette_Star, }, @@ -2848,7 +2896,15 @@ const struct Item gItemsInfo[] = [ITEM_COMET_SHARD] = { .name = ITEM_NAME("Comet Shard"), - .price = (I_PRICE <= GEN_5) ? 0 : ((I_PRICE == GEN_6) ? 30000 : ((I_PRICE == GEN_7) ? 60000 : 25000 * TREASURE_FACTOR)), + #if I_PRICE >= GEN_8 + .price = 25000 * TREASURE_FACTOR, + #elif I_PRICE == GEN_7 + .price = 60000, + #elif I_PRICE == GEN_6 + .price = 30000, + #else + .price = 0, + #endif .description = COMPOUND_STRING( "A comet's shard. " "It would sell\nfor a " @@ -2858,14 +2914,13 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 30, - .iconPic = gItemIcon_CometShard, + .iconPic = gItemIcon_StarPiece, .iconPalette = gItemIconPalette_CometShard, }, [ITEM_SHOAL_SALT] = { .name = ITEM_NAME("Shoal Salt"), - .pluralName = ITEM_PLURAL_NAME("Shoal Salt"), .price = 20, .description = COMPOUND_STRING( "Salt obtained from " @@ -2974,7 +3029,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Honey"), .pluralName = ITEM_PLURAL_NAME("Honey"), - .price = (I_PRICE < GEN_5) ? 100 : ((I_PRICE < GEN_8) ? 300 : 900), + #if I_PRICE >= GEN_8 + .price = 900, + #elif I_PRICE == GEN_7 + .price = 300, + #else + .price = 100, + #endif .description = COMPOUND_STRING( "Sweet honey that " "attracts wild " @@ -3001,8 +3062,8 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, - .iconPic = gItemIcon_RareBone, - .iconPalette = gItemIconPalette_RareBone, + .iconPic = gItemIcon_Bone, + .iconPalette = gItemIconPalette_Bone, }, [ITEM_ODD_KEYSTONE] = @@ -3076,7 +3137,7 @@ const struct Item gItemsInfo[] = [ITEM_RELIC_GOLD] = { .name = ITEM_NAME("Relic Gold"), - .price = 0, + .price = (I_PRICE >= GEN_6) ? 60000 : 0, .description = COMPOUND_STRING( "A gold coin used " "long ago. It\nsells " @@ -3184,15 +3245,15 @@ const struct Item gItemsInfo[] = "A piece of an " "ancient marine " "\nPokémon's seashell."), - #if I_KEY_FOSSILS >= GEN_4 - .price = (I_PRICE >= GEN_7) ? 7000: 1000, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FOSSIL, - #else - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #endif + #if I_KEY_FOSSILS >= GEN_4 + .price = (I_PRICE >= GEN_7) ? 7000: 1000, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, + #else + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #endif .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3207,15 +3268,15 @@ const struct Item gItemsInfo[] = "A piece of an " "ancient marine " "\nPokémon's shell."), - #if I_KEY_FOSSILS >= GEN_4 - .price = (I_PRICE >= GEN_7) ? 7000: 1000, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FOSSIL, - #else - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #endif + #if I_KEY_FOSSILS >= GEN_4 + .price = (I_PRICE >= GEN_7) ? 7000: 1000, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, + #else + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #endif .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3230,15 +3291,15 @@ const struct Item gItemsInfo[] = "A stone containing " "the genes of\nan " "ancient Pokémon."), - #if I_KEY_FOSSILS >= GEN_4 - .price = 1000, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FOSSIL, - #else - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #endif + #if I_KEY_FOSSILS >= GEN_4 + .price = 1000, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, + #else + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #endif .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3250,15 +3311,15 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Root Fossil"), .description = sRootFossilDesc, - #if I_KEY_FOSSILS >= GEN_4 - .price = (I_PRICE >= GEN_7) ? 7000: 1000, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FOSSIL, - #else - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #endif + #if I_KEY_FOSSILS >= GEN_4 + .price = (I_PRICE >= GEN_7) ? 7000: 1000, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, + #else + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #endif .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3270,15 +3331,15 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Claw Fossil"), .description = sRootFossilDesc, - #if I_KEY_FOSSILS >= GEN_4 - .price = (I_PRICE >= GEN_7) ? 7000: 1000, - .pocket = POCKET_ITEMS, - .sortType = ITEM_TYPE_FOSSIL, - #else - .price = 0, - .importance = 1, - .pocket = POCKET_KEY_ITEMS, - #endif + #if I_KEY_FOSSILS >= GEN_4 + .price = (I_PRICE >= GEN_7) ? 7000: 1000, + .pocket = POCKET_ITEMS, + .sortType = ITEM_TYPE_FOSSIL, + #else + .price = 0, + .importance = 1, + .pocket = POCKET_KEY_ITEMS, + #endif .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 100, @@ -3408,7 +3469,7 @@ const struct Item gItemsInfo[] = [ITEM_FOSSILIZED_FISH] = { .name = ITEM_NAME("Fossilized Fish"), - .pluralName = ITEM_PLURAL_NAME("Fossilized Fishes"), + .pluralName = ITEM_PLURAL_NAME("Fossilized Fish"), .price = 5000, .description = sFossilizedFishDesc, .pocket = POCKET_ITEMS, @@ -3458,14 +3519,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Growth Mulch"), .pluralName = ITEM_PLURAL_NAME("Growth Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "accelerates the\n" "growth of Berries."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3481,14 +3542,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Damp Mulch"), .pluralName = ITEM_PLURAL_NAME("Damp Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "decelerates the\n" "growth of Berries."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3504,14 +3565,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Stable Mulch"), .pluralName = ITEM_PLURAL_NAME("Stable Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "ups the life\ntime " "of Berry trees."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3527,14 +3588,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Gooey Mulch"), .pluralName = ITEM_PLURAL_NAME("Gooey Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "makes more\nBerries " "regrow after fall."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3550,14 +3611,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Rich Mulch"), .pluralName = ITEM_PLURAL_NAME("Rich Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "ups the number\nof " "Berries harvested."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3573,14 +3634,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Surprise Mulch"), .pluralName = ITEM_PLURAL_NAME("Surprise Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "ups the chance\nof " "Berry mutations."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3596,14 +3657,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Boost Mulch"), .pluralName = ITEM_PLURAL_NAME("Boost Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer that " "ups the dry\nspeed " "of soft soil."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3619,14 +3680,14 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Amaze Mulch"), .pluralName = ITEM_PLURAL_NAME("Amaze Mulch"), .price = 200, -#if OW_BERRY_MULCH_USAGE == TRUE + #if OW_BERRY_MULCH_USAGE == TRUE .description = COMPOUND_STRING( "A fertilizer Rich " "Surprising and " "\nBoosting as well."), -#else + #else .description = sGenericMulchDesc, -#endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, @@ -3638,11 +3699,18 @@ const struct Item gItemsInfo[] = }, // Apricorns + #if (I_PRICE >= GEN_8 || I_PRICE <= GEN_2) + #define APRICORN_PRICE 200 + #elif I_PRICE >= GEN_5 + #define APRICORN_PRICE 20 + #else + #define APRICORN_PRICE 0 + #endif [ITEM_RED_APRICORN] = { .name = ITEM_NAME("Red Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A red apricorn. " "It assails your " @@ -3651,14 +3719,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_RedApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_RedApricorn, }, [ITEM_BLUE_APRICORN] = { .name = ITEM_NAME("Blue Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A blue apricorn. " "It smells a bit " @@ -3667,14 +3735,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_BlueApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_BlueApricorn, }, [ITEM_YELLOW_APRICORN] = { .name = ITEM_NAME("Yellow Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A yellow apricorn. " "It has an\ninvigor-" @@ -3683,14 +3751,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_YellowApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_YellowApricorn, }, [ITEM_GREEN_APRICORN] = { .name = ITEM_NAME("Green Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A green apricorn. " "It has a\nstrange, " @@ -3699,14 +3767,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_GreenApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_GreenApricorn, }, [ITEM_PINK_APRICORN] = { .name = ITEM_NAME("Pink Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A pink apricorn. " "It has a nice, " @@ -3715,14 +3783,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_PinkApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_PinkApricorn, }, [ITEM_WHITE_APRICORN] = { .name = ITEM_NAME("White Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A white apricorn. " "It doesn't\nsmell " @@ -3731,14 +3799,14 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_WhiteApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_WhiteApricorn, }, [ITEM_BLACK_APRICORN] = { .name = ITEM_NAME("Black Apricorn"), - .price = (I_PRICE == GEN_4) ? 0 : ((I_PRICE >= GEN_5 && I_PRICE <= GEN_7) ? 20 : 200), + .price = APRICORN_PRICE, .description = COMPOUND_STRING( "A black apricorn. " "It has an inde-" @@ -3747,7 +3815,7 @@ const struct Item gItemsInfo[] = .sortType = ITEM_TYPE_GROWTH, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .iconPic = gItemIcon_BlackApricorn, + .iconPic = gItemIcon_Apricorn, .iconPalette = gItemIconPalette_BlackApricorn, }, @@ -4128,7 +4196,15 @@ const struct Item gItemsInfo[] = [ITEM_MOON_STONE] = { .name = ITEM_NAME("Moon Stone"), - .price = (I_PRICE >= GEN_7) ? 3000 : 2100, + #if I_PRICE >= GEN_7 + .price = 3000, + #elif I_PRICE >= GEN_4 + .price = 2100, + #elif I_PRICE == GEN_3 + .price = 0, + #else + .price = 1, + #endif .description = sEvolutionStoneDesc, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_EVOLUTION_STONE, @@ -4278,7 +4354,6 @@ const struct Item gItemsInfo[] = [ITEM_GALARICA_WREATH] = { .name = ITEM_NAME("Galarica Wreath"), - .pluralName = ITEM_PLURAL_NAME("Galarica Wreathes"), .price = (I_PRICE >= GEN_9) ? 3000 : 6000, .description = COMPOUND_STRING( "A wreath made in " @@ -4298,7 +4373,6 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Dragon Scale"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, - .holdEffect = HOLD_EFFECT_DRAGON_SCALE, .holdEffectParam = 10, .description = COMPOUND_STRING( "A strange scale " @@ -4318,7 +4392,6 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Upgrade"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, - .holdEffect = HOLD_EFFECT_UPGRADE, .description = COMPOUND_STRING( "A peculiar box made " "by Silph Co."), @@ -4407,7 +4480,6 @@ const struct Item gItemsInfo[] = [ITEM_REAPER_CLOTH] = { .name = ITEM_NAME("Reaper Cloth"), - .pluralName = ITEM_PLURAL_NAME("Reaper Cloths"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "Loved by a certain " @@ -4426,7 +4498,13 @@ const struct Item gItemsInfo[] = [ITEM_PRISM_SCALE] = { .name = ITEM_NAME("Prism Scale"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 500), + #if I_PRICE >= GEN_9 + .price = 3000, + #elif I_PRICE >= GEN_7 + .price = 2000, + #else + .price = 500, + #endif .description = COMPOUND_STRING( "A mysterious scale " "that evolves a\n" @@ -4444,7 +4522,6 @@ const struct Item gItemsInfo[] = [ITEM_WHIPPED_DREAM] = { .name = ITEM_NAME("Whipped Dream"), - .pluralName = ITEM_PLURAL_NAME("Whipped Dream"), .price = (I_PRICE >= GEN_7) ? 2000 * TREASURE_FACTOR : 2100, .description = COMPOUND_STRING( "A soft and sweet " @@ -4646,7 +4723,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, - .iconPic = gItemIcon_RedNectar, + .iconPic = gItemIcon_Nectar, .iconPalette = gItemIconPalette_RedNectar, }, @@ -4661,7 +4738,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, - .iconPic = gItemIcon_YellowNectar, + .iconPic = gItemIcon_Nectar, .iconPalette = gItemIconPalette_YellowNectar, }, @@ -4676,7 +4753,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, - .iconPic = gItemIcon_PinkNectar, + .iconPic = gItemIcon_Nectar, .iconPalette = gItemIconPalette_PinkNectar, }, @@ -4691,7 +4768,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_FormChange_ConsumedOnUse, .flingPower = 10, - .iconPic = gItemIcon_PurpleNectar, + .iconPic = gItemIcon_Nectar, .iconPalette = gItemIconPalette_PurpleNectar, }, @@ -4713,7 +4790,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, .flingPower = 90, - .iconPic = gItemIcon_FlamePlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_FlamePlate, }, @@ -4733,7 +4810,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, .flingPower = 90, - .iconPic = gItemIcon_SplashPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_SplashPlate, }, @@ -4753,7 +4830,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, .flingPower = 90, - .iconPic = gItemIcon_ZapPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_ZapPlate, }, @@ -4773,7 +4850,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, .flingPower = 90, - .iconPic = gItemIcon_MeadowPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_MeadowPlate, }, @@ -4793,7 +4870,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, .flingPower = 90, - .iconPic = gItemIcon_IciclePlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_IciclePlate, }, @@ -4813,7 +4890,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, .flingPower = 90, - .iconPic = gItemIcon_FistPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_FistPlate, }, @@ -4833,7 +4910,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, .flingPower = 90, - .iconPic = gItemIcon_ToxicPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_ToxicPlate, }, @@ -4853,7 +4930,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, .flingPower = 90, - .iconPic = gItemIcon_EarthPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_EarthPlate, }, @@ -4873,7 +4950,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, .flingPower = 90, - .iconPic = gItemIcon_SkyPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_SkyPlate, }, @@ -4893,7 +4970,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, .flingPower = 90, - .iconPic = gItemIcon_MindPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_MindPlate, }, @@ -4913,7 +4990,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, .flingPower = 90, - .iconPic = gItemIcon_InsectPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_InsectPlate, }, @@ -4933,7 +5010,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, .flingPower = 90, - .iconPic = gItemIcon_StonePlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_StonePlate, }, @@ -4953,7 +5030,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, .flingPower = 90, - .iconPic = gItemIcon_SpookyPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_SpookyPlate, }, @@ -4973,7 +5050,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, .flingPower = 90, - .iconPic = gItemIcon_DracoPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_DracoPlate, }, @@ -4993,7 +5070,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, .flingPower = 90, - .iconPic = gItemIcon_DreadPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_DreadPlate, }, @@ -5013,7 +5090,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, .flingPower = 90, - .iconPic = gItemIcon_IronPlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_IronPlate, }, @@ -5033,7 +5110,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, .flingPower = 90, - .iconPic = gItemIcon_PixiePlate, + .iconPic = gItemIcon_Plate, .iconPalette = gItemIconPalette_PixiePlate, }, @@ -5054,7 +5131,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, .flingPower = 70, - .iconPic = gItemIcon_DouseDrive, + .iconPic = gItemIcon_Drive, .iconPalette = gItemIconPalette_DouseDrive, }, @@ -5073,7 +5150,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, .flingPower = 70, - .iconPic = gItemIcon_ShockDrive, + .iconPic = gItemIcon_Drive, .iconPalette = gItemIconPalette_ShockDrive, }, @@ -5092,7 +5169,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, .flingPower = 70, - .iconPic = gItemIcon_BurnDrive, + .iconPic = gItemIcon_Drive, .iconPalette = gItemIconPalette_BurnDrive, }, @@ -5111,7 +5188,7 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, .flingPower = 70, - .iconPic = gItemIcon_ChillDrive, + .iconPic = gItemIcon_Drive, .iconPalette = gItemIconPalette_ChillDrive, }, @@ -5565,7 +5642,6 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_X] = { .name = ITEM_NAME("Charizardite X"), - .pluralName = ITEM_PLURAL_NAME("Charizardites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, @@ -5581,7 +5657,6 @@ const struct Item gItemsInfo[] = [ITEM_CHARIZARDITE_Y] = { .name = ITEM_NAME("Charizardite Y"), - .pluralName = ITEM_PLURAL_NAME("Charizardites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sCharizarditeDesc, @@ -5777,7 +5852,6 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_X] = { .name = ITEM_NAME("Mewtwonite X"), - .pluralName = ITEM_PLURAL_NAME("Mewtwonites X"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, @@ -5793,7 +5867,6 @@ const struct Item gItemsInfo[] = [ITEM_MEWTWONITE_Y] = { .name = ITEM_NAME("Mewtwonite Y"), - .pluralName = ITEM_PLURAL_NAME("Mewtwonites Y"), .price = 0, .holdEffect = HOLD_EFFECT_MEGA_STONE, .description = sMewtwoniteDesc, @@ -6855,8 +6928,8 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 80, - .iconPic = gItemIcon_QuestionMark, // gItemIcon_Darkranite, - .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Darkranite, + .iconPic = gItemIcon_QuestionMark, // gItemIcon_Heatranite, + .iconPalette = gItemIconPalette_QuestionMark, // gItemIconPalette_Heatranite, }, [ITEM_DARKRANITE] = @@ -7169,11 +7242,18 @@ const struct Item gItemsInfo[] = }, // Gems + #if I_PRICE >= GEN_9 + #define GEM_PRICE 15000 + #elif I_PRICE >= GEN_7 + #define GEM_PRICE 4000 + #else + #define GEM_PRICE 200 + #endif [ITEM_NORMAL_GEM] = { .name = ITEM_NAME("Normal Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7185,14 +7265,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_NORMAL, - .iconPic = gItemIcon_NormalGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_NormalGem, }, [ITEM_FIRE_GEM] = { .name = ITEM_NAME("Fire Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7204,14 +7284,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIRE, - .iconPic = gItemIcon_FireGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_FireGem, }, [ITEM_WATER_GEM] = { .name = ITEM_NAME("Water Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7223,14 +7303,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_WATER, - .iconPic = gItemIcon_WaterGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_WaterGem, }, [ITEM_ELECTRIC_GEM] = { .name = ITEM_NAME("Electric Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7242,14 +7322,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ELECTRIC, - .iconPic = gItemIcon_ElectricGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_ElectricGem, }, [ITEM_GRASS_GEM] = { .name = ITEM_NAME("Grass Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7261,14 +7341,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GRASS, - .iconPic = gItemIcon_GrassGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_GrassGem, }, [ITEM_ICE_GEM] = { .name = ITEM_NAME("Ice Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7280,14 +7360,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ICE, - .iconPic = gItemIcon_IceGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_IceGem, }, [ITEM_FIGHTING_GEM] = { .name = ITEM_NAME("Fighting Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7299,14 +7379,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FIGHTING, - .iconPic = gItemIcon_FightingGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_FightingGem, }, [ITEM_POISON_GEM] = { .name = ITEM_NAME("Poison Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7318,14 +7398,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_POISON, - .iconPic = gItemIcon_PoisonGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_PoisonGem, }, [ITEM_GROUND_GEM] = { .name = ITEM_NAME("Ground Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7337,14 +7417,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, - .iconPic = gItemIcon_GroundGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_GroundGem, }, [ITEM_FLYING_GEM] = { .name = ITEM_NAME("Flying Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7356,14 +7436,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FLYING, - .iconPic = gItemIcon_FlyingGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_FlyingGem, }, [ITEM_PSYCHIC_GEM] = { .name = ITEM_NAME("Psychic Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7375,14 +7455,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_PSYCHIC, - .iconPic = gItemIcon_PsychicGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_PsychicGem, }, [ITEM_BUG_GEM] = { .name = ITEM_NAME("Bug Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7394,14 +7474,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_BUG, - .iconPic = gItemIcon_BugGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_BugGem, }, [ITEM_ROCK_GEM] = { .name = ITEM_NAME("Rock Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7413,14 +7493,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_ROCK, - .iconPic = gItemIcon_RockGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_RockGem, }, [ITEM_GHOST_GEM] = { .name = ITEM_NAME("Ghost Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7432,14 +7512,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GHOST, - .iconPic = gItemIcon_GhostGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_GhostGem, }, [ITEM_DRAGON_GEM] = { .name = ITEM_NAME("Dragon Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7451,14 +7531,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DRAGON, - .iconPic = gItemIcon_DragonGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_DragonGem, }, [ITEM_DARK_GEM] = { .name = ITEM_NAME("Dark Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7470,14 +7550,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_DARK, - .iconPic = gItemIcon_DarkGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_DarkGem, }, [ITEM_STEEL_GEM] = { .name = ITEM_NAME("Steel Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7489,14 +7569,14 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_STEEL, - .iconPic = gItemIcon_SteelGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_SteelGem, }, [ITEM_FAIRY_GEM] = { .name = ITEM_NAME("Fairy Gem"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + .price = GEM_PRICE, .holdEffect = HOLD_EFFECT_GEMS, .holdEffectParam = GEM_BOOST_PARAM, .description = COMPOUND_STRING( @@ -7508,7 +7588,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_FAIRY, - .iconPic = gItemIcon_FairyGem, + .iconPic = gItemIcon_TypeGem, .iconPalette = gItemIconPalette_FairyGem, }, @@ -8196,8 +8276,8 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 90, - .iconPic = gItemIcon_ThickClub, - .iconPalette = gItemIconPalette_ThickClub, + .iconPic = gItemIcon_Bone, + .iconPalette = gItemIconPalette_Bone, }, [ITEM_LUCKY_PUNCH] = @@ -8222,7 +8302,6 @@ const struct Item gItemsInfo[] = [ITEM_METAL_POWDER] = { .name = ITEM_NAME("Metal Powder"), - .pluralName = ITEM_PLURAL_NAME("Metal Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_METAL_POWDER, .description = COMPOUND_STRING( @@ -8234,14 +8313,13 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_MetalPowder, + .iconPic = gItemIcon_DittoPowder, .iconPalette = gItemIconPalette_MetalPowder, }, [ITEM_QUICK_POWDER] = { .name = ITEM_NAME("Quick Powder"), - .pluralName = ITEM_PLURAL_NAME("Quick Powder"), .price = (I_PRICE >= GEN_7) ? 1000 : 10, .holdEffect = HOLD_EFFECT_QUICK_POWDER, .description = COMPOUND_STRING( @@ -8253,7 +8331,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_QuickPowder, + .iconPic = gItemIcon_DittoPowder, .iconPalette = gItemIconPalette_QuickPowder, }, @@ -8385,7 +8463,7 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Sea Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, .holdEffect = HOLD_EFFECT_TYPE_POWER, - .holdEffectParam = 20, + .holdEffectParam = I_TYPE_BOOST_POWER >= GEN_4 ? 20 : 5, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_INCENSE, @@ -8402,11 +8480,19 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Lax Incense"), .price = (I_PRICE >= GEN_7) ? 5000 : 9600, .holdEffect = HOLD_EFFECT_EVASION_UP, + #if I_LAX_INCENSE_BOOST >= GEN_4 .holdEffectParam = 10, + .description = COMPOUND_STRING( + "A hold item that " + "lowers the " + "foe's\naccuracy."), + #else + .holdEffectParam = 5, .description = COMPOUND_STRING( "A hold item that " "slightly lowers\nthe " "foe's accuracy."), + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_INCENSE, .type = ITEM_USE_BAG_MENU, @@ -8764,12 +8850,19 @@ const struct Item gItemsInfo[] = }, // Type-boosting Held Items + #if I_PRICE >= GEN_9 + #define TYPE_BOOSTING_PRICE 3000 + #elif I_PRICE >= GEN_7 + #define TYPE_BOOSTING_PRICE 1000 + #else + #define TYPE_BOOSTING_PRICE 100 + #endif [ITEM_SILK_SCARF] = { .name = ITEM_NAME("Silk Scarf"), .pluralName = ITEM_PLURAL_NAME("Silk Scarves"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8789,7 +8882,13 @@ const struct Item gItemsInfo[] = [ITEM_CHARCOAL] = { .name = ITEM_NAME("Charcoal"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 9800), + #if I_PRICE >= GEN_9 + .price = 3000, + #elif I_PRICE >= GEN_7 + .price = 1000, + #else + .price = 9800, + #endif .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8809,8 +8908,7 @@ const struct Item gItemsInfo[] = [ITEM_MYSTIC_WATER] = { .name = ITEM_NAME("Mystic Water"), - .pluralName = ITEM_PLURAL_NAME("Mystic Water"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8830,7 +8928,7 @@ const struct Item gItemsInfo[] = [ITEM_MAGNET] = { .name = ITEM_NAME("Magnet"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8850,7 +8948,7 @@ const struct Item gItemsInfo[] = [ITEM_MIRACLE_SEED] = { .name = ITEM_NAME("Miracle Seed"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRoseIncenseDesc, @@ -8867,8 +8965,7 @@ const struct Item gItemsInfo[] = [ITEM_NEVER_MELT_ICE] = { .name = ITEM_NAME("Never-Melt Ice"), - .pluralName = ITEM_PLURAL_NAME("Never-Melt Ice"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8888,7 +8985,7 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_BELT] = { .name = ITEM_NAME("Black Belt"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8908,7 +9005,7 @@ const struct Item gItemsInfo[] = [ITEM_POISON_BARB] = { .name = ITEM_NAME("Poison Barb"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8929,7 +9026,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Soft Sand"), .pluralName = ITEM_PLURAL_NAME("Soft Sand"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8942,14 +9039,14 @@ const struct Item gItemsInfo[] = .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = TYPE_GROUND, .flingPower = 10, - .iconPic = gItemIcon_SoftSand, + .iconPic = gItemIcon_Sand, .iconPalette = gItemIconPalette_SoftSand, }, [ITEM_SHARP_BEAK] = { .name = ITEM_NAME("Sharp Beak"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -8969,7 +9066,7 @@ const struct Item gItemsInfo[] = [ITEM_TWISTED_SPOON] = { .name = ITEM_NAME("Twisted Spoon"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sOddIncenseDesc, @@ -8986,8 +9083,7 @@ const struct Item gItemsInfo[] = [ITEM_SILVER_POWDER] = { .name = ITEM_NAME("Silver Powder"), - .pluralName = ITEM_PLURAL_NAME("Silver Powder"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -9007,7 +9103,7 @@ const struct Item gItemsInfo[] = [ITEM_HARD_STONE] = { .name = ITEM_NAME("Hard Stone"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRockIncenseDesc, @@ -9024,7 +9120,7 @@ const struct Item gItemsInfo[] = [ITEM_SPELL_TAG] = { .name = ITEM_NAME("Spell Tag"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -9044,7 +9140,7 @@ const struct Item gItemsInfo[] = [ITEM_DRAGON_FANG] = { .name = ITEM_NAME("Dragon Fang"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -9065,7 +9161,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Black Glasses"), .pluralName = ITEM_PLURAL_NAME("Black Glasses"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), + .price = TYPE_BOOSTING_PRICE, .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -9085,7 +9181,13 @@ const struct Item gItemsInfo[] = [ITEM_METAL_COAT] = { .name = ITEM_NAME("Metal Coat"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 100), + #if I_PRICE >= GEN_9 + .price = 3000, + #elif I_PRICE >= GEN_7 + .price = 2000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( @@ -9108,7 +9210,13 @@ const struct Item gItemsInfo[] = [ITEM_CHOICE_BAND] = { .name = ITEM_NAME("Choice Band"), - .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 100000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_CHOICE_BAND, .description = COMPOUND_STRING( "Boosts Attack, but " @@ -9127,7 +9235,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Choice Specs"), .pluralName = ITEM_PLURAL_NAME("Choice Specs"), - .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 100000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_CHOICE_SPECS, .description = COMPOUND_STRING( "Boosts Sp. Atk, but " @@ -9146,7 +9260,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Choice Scarf"), .pluralName = ITEM_PLURAL_NAME("Choice Scarves"), - .price = (I_PRICE >= GEN_9) ? 100000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 100000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_CHOICE_SCARF, .description = COMPOUND_STRING( "Boosts Speed, but " @@ -9166,7 +9286,13 @@ const struct Item gItemsInfo[] = [ITEM_FLAME_ORB] = { .name = ITEM_NAME("Flame Orb"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_FLAME_ORB, .description = COMPOUND_STRING( "A bizarre orb that " @@ -9184,7 +9310,13 @@ const struct Item gItemsInfo[] = [ITEM_TOXIC_ORB] = { .name = ITEM_NAME("Toxic Orb"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_TOXIC_ORB, .description = COMPOUND_STRING( "A bizarre orb that " @@ -9204,7 +9336,13 @@ const struct Item gItemsInfo[] = [ITEM_DAMP_ROCK] = { .name = ITEM_NAME("Damp Rock"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_DAMP_ROCK, .description = COMPOUND_STRING( "Extends the length " @@ -9222,7 +9360,13 @@ const struct Item gItemsInfo[] = [ITEM_HEAT_ROCK] = { .name = ITEM_NAME("Heat Rock"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_HEAT_ROCK, .description = COMPOUND_STRING( "Extends the length " @@ -9240,7 +9384,13 @@ const struct Item gItemsInfo[] = [ITEM_SMOOTH_ROCK] = { .name = ITEM_NAME("Smooth Rock"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_SMOOTH_ROCK, .description = COMPOUND_STRING( "Extends the length " @@ -9258,24 +9408,30 @@ const struct Item gItemsInfo[] = [ITEM_ICY_ROCK] = { .name = ITEM_NAME("Icy Rock"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_ICY_ROCK, - #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL + #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL .description = COMPOUND_STRING( "Extends the\nlength " "of the move Hail " "used by\nthe holder."), - #elif B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW + #elif B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW .description = COMPOUND_STRING( "Extends the length " "of\nSnowscape if " "used by the holder."), - #else + #else .description = COMPOUND_STRING( "Extends the length " "of cold\nweathers " "used by the holder."), - #endif + #endif .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_BAG_MENU, @@ -9302,7 +9458,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_ElectricSeed, + .iconPic = gItemIcon_TerrainSeed, .iconPalette = gItemIconPalette_ElectricSeed, }, @@ -9321,7 +9477,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_PsychicSeed, + .iconPic = gItemIcon_TerrainSeed, .iconPalette = gItemIconPalette_PsychicSeed, }, @@ -9340,7 +9496,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_MistySeed, + .iconPic = gItemIcon_TerrainSeed, .iconPalette = gItemIconPalette_MistySeed, }, @@ -9359,7 +9515,7 @@ const struct Item gItemsInfo[] = .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .flingPower = 10, - .iconPic = gItemIcon_GrassySeed, + .iconPic = gItemIcon_TerrainSeed, .iconPalette = gItemIconPalette_GrassySeed, }, @@ -9368,7 +9524,13 @@ const struct Item gItemsInfo[] = [ITEM_ABSORB_BULB] = { .name = ITEM_NAME("Absorb Bulb"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_ABSORB_BULB, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -9388,7 +9550,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Cell Battery"), .pluralName = ITEM_PLURAL_NAME("Cell Batteries"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_CELL_BATTERY, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -9408,7 +9576,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Luminous Moss"), .pluralName = ITEM_PLURAL_NAME("Luminous Moss"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 1000, + #endif .holdEffect = HOLD_EFFECT_LUMINOUS_MOSS, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -9427,7 +9601,13 @@ const struct Item gItemsInfo[] = [ITEM_SNOWBALL] = { .name = ITEM_NAME("Snowball"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_SNOWBALL, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -9448,8 +9628,13 @@ const struct Item gItemsInfo[] = [ITEM_BRIGHT_POWDER] = { .name = ITEM_NAME("Bright Powder"), - .pluralName = ITEM_PLURAL_NAME("Bright Powder"), - .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 10), + #if I_PRICE >= GEN_9 + .price = 30000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 10, + #endif .holdEffect = HOLD_EFFECT_EVASION_UP, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9468,7 +9653,13 @@ const struct Item gItemsInfo[] = [ITEM_WHITE_HERB] = { .name = ITEM_NAME("White Herb"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_WHITE_HERB, .description = COMPOUND_STRING( "A hold item that " @@ -9487,20 +9678,22 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Exp. Share"), .holdEffect = HOLD_EFFECT_EXP_SHARE, - #if I_EXP_SHARE_ITEM >= GEN_6 - .price = 0, - .description = COMPOUND_STRING( - "This device gives " - "\nexp. to other " - "party members."), - #else - .price = 3000, - .description = COMPOUND_STRING( - "A hold item that " - "gets Exp. points\n" - "from battles."), - #endif - .pocket = I_EXP_SHARE_ITEM >= GEN_6 ? POCKET_KEY_ITEMS : POCKET_ITEMS, + #if I_EXP_SHARE_ITEM >= GEN_6 + .price = 0, + .importance = 1, + .description = COMPOUND_STRING( + "This device gives " + "\nexp. to other " + "party members."), + .pocket = POCKET_KEY_ITEMS, + #else + .price = (I_PRICE == GEN_1) ? 1 : 3000, + .description = COMPOUND_STRING( + "A hold item that " + "gets Exp. points\n" + "from battles."), + .pocket = POCKET_ITEMS, + #endif .sortType = ITEM_TYPE_HELD_ITEM, .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_ExpShare, @@ -9512,7 +9705,13 @@ const struct Item gItemsInfo[] = [ITEM_QUICK_CLAW] = { .name = ITEM_NAME("Quick Claw"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_QUICK_CLAW, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -9531,7 +9730,13 @@ const struct Item gItemsInfo[] = [ITEM_SOOTHE_BELL] = { .name = ITEM_NAME("Soothe Bell"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_FRIENDSHIP_UP, .description = COMPOUND_STRING( "A hold item that " @@ -9549,12 +9754,18 @@ const struct Item gItemsInfo[] = [ITEM_MENTAL_HERB] = { .name = ITEM_NAME("Mental Herb"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_MENTAL_HERB, .description = COMPOUND_STRING( #if B_MENTAL_HERB >= GEN_5 "Snaps Pokémon out " - "of\nmove-binding " + "of move-binding\n" "effects."), #else "A hold item that " @@ -9573,7 +9784,13 @@ const struct Item gItemsInfo[] = [ITEM_KINGS_ROCK] = { .name = ITEM_NAME("King's Rock"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 5000 : 100), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 5000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, .description = sKingsRockDesc, @@ -9590,7 +9807,13 @@ const struct Item gItemsInfo[] = [ITEM_AMULET_COIN] = { .name = ITEM_NAME("Amulet Coin"), - .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 10000 : 100), + #if I_PRICE >= GEN_9 + .price = 30000, + #elif I_PRICE >= GEN_7 + .price = 10000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_DOUBLE_PRIZE, .description = sLuckIncenseDesc, .pocket = POCKET_ITEMS, @@ -9620,7 +9843,13 @@ const struct Item gItemsInfo[] = [ITEM_SMOKE_BALL] = { .name = ITEM_NAME("Smoke Ball"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, .description = COMPOUND_STRING( "A hold item that " @@ -9638,7 +9867,13 @@ const struct Item gItemsInfo[] = [ITEM_FOCUS_BAND] = { .name = ITEM_NAME("Focus Band"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_FOCUS_BAND, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9676,7 +9911,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Scope Lens"), .pluralName = ITEM_PLURAL_NAME("Scope Lenses"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( "A hold item that " @@ -9695,7 +9936,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Leftovers"), .pluralName = ITEM_PLURAL_NAME("Leftovers"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_LEFTOVERS, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9714,7 +9961,13 @@ const struct Item gItemsInfo[] = [ITEM_SHELL_BELL] = { .name = ITEM_NAME("Shell Bell"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_SHELL_BELL, .holdEffectParam = 8, .description = COMPOUND_STRING( @@ -9734,7 +9987,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Wide Lens"), .pluralName = ITEM_PLURAL_NAME("Wide Lenses"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_WIDE_LENS, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9753,7 +10012,13 @@ const struct Item gItemsInfo[] = [ITEM_MUSCLE_BAND] = { .name = ITEM_NAME("Muscle Band"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_MUSCLE_BAND, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9773,7 +10038,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Wise Glasses"), .pluralName = ITEM_PLURAL_NAME("Wise Glasses"), - .price = (I_PRICE >= GEN_9) ? 8000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 8000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_WISE_GLASSES, .holdEffectParam = 10, .description = COMPOUND_STRING( @@ -9792,7 +10063,13 @@ const struct Item gItemsInfo[] = [ITEM_EXPERT_BELT] = { .name = ITEM_NAME("Expert Belt"), - .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 30000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_EXPERT_BELT, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -9811,8 +10088,13 @@ const struct Item gItemsInfo[] = [ITEM_LIGHT_CLAY] = { .name = ITEM_NAME("Light Clay"), - .pluralName = ITEM_PLURAL_NAME("Light Clay"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_LIGHT_CLAY, .description = COMPOUND_STRING( "Extends the length " @@ -9830,7 +10112,13 @@ const struct Item gItemsInfo[] = [ITEM_LIFE_ORB] = { .name = ITEM_NAME("Life Orb"), - .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 50000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_LIFE_ORB, .description = COMPOUND_STRING( "Boosts move power " @@ -9848,7 +10136,13 @@ const struct Item gItemsInfo[] = [ITEM_POWER_HERB] = { .name = ITEM_NAME("Power Herb"), - .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 30000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_POWER_HERB, .description = COMPOUND_STRING( "Allows immediate " @@ -9867,7 +10161,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Focus Sash"), .pluralName = ITEM_PLURAL_NAME("Focus Sashes"), - .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 50000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_FOCUS_SASH, .description = COMPOUND_STRING( "If the holder has " @@ -9886,7 +10186,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Zoom Lens"), .pluralName = ITEM_PLURAL_NAME("Zoom Lenses"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_ZOOM_LENS, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -9905,7 +10211,13 @@ const struct Item gItemsInfo[] = [ITEM_METRONOME] = { .name = ITEM_NAME("Metronome"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_METRONOME, .holdEffectParam = 20, .description = COMPOUND_STRING( @@ -9924,7 +10236,13 @@ const struct Item gItemsInfo[] = [ITEM_IRON_BALL] = { .name = ITEM_NAME("Iron Ball"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_IRON_BALL, .description = COMPOUND_STRING( "Cuts Speed and " @@ -9942,7 +10260,13 @@ const struct Item gItemsInfo[] = [ITEM_LAGGING_TAIL] = { .name = ITEM_NAME("Lagging Tail"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_LAGGING_TAIL, .description = sFullIncenseDesc, .pocket = POCKET_ITEMS, @@ -9957,7 +10281,13 @@ const struct Item gItemsInfo[] = [ITEM_DESTINY_KNOT] = { .name = ITEM_NAME("Destiny Knot"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_DESTINY_KNOT, .description = COMPOUND_STRING( "If the holder falls " @@ -9975,8 +10305,13 @@ const struct Item gItemsInfo[] = [ITEM_BLACK_SLUDGE] = { .name = ITEM_NAME("Black Sludge"), - .pluralName = ITEM_PLURAL_NAME("Black Sludge"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_BLACK_SLUDGE, .description = COMPOUND_STRING( "Restores HP for " @@ -9994,7 +10329,13 @@ const struct Item gItemsInfo[] = [ITEM_GRIP_CLAW] = { .name = ITEM_NAME("Grip Claw"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_GRIP_CLAW, .description = COMPOUND_STRING( "A held item that " @@ -10012,7 +10353,13 @@ const struct Item gItemsInfo[] = [ITEM_STICKY_BARB] = { .name = ITEM_NAME("Sticky Barb"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_STICKY_BARB, .description = COMPOUND_STRING( "Damages the holder " @@ -10030,7 +10377,13 @@ const struct Item gItemsInfo[] = [ITEM_SHED_SHELL] = { .name = ITEM_NAME("Shed Shell"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 100), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 100, + #endif .holdEffect = HOLD_EFFECT_SHED_SHELL, .description = COMPOUND_STRING( "Allows the holder " @@ -10048,7 +10401,13 @@ const struct Item gItemsInfo[] = [ITEM_BIG_ROOT] = { .name = ITEM_NAME("Big Root"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_BIG_ROOT, .holdEffectParam = 30, .description = COMPOUND_STRING( @@ -10067,7 +10426,13 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_CLAW] = { .name = ITEM_NAME("Razor Claw"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 5000, + #else + .price = 2100, + #endif .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = COMPOUND_STRING( "A hooked claw that " @@ -10086,7 +10451,13 @@ const struct Item gItemsInfo[] = [ITEM_RAZOR_FANG] = { .name = ITEM_NAME("Razor Fang"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 5000 : 2100), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 5000, + #else + .price = 2100, + #endif .holdEffect = HOLD_EFFECT_FLINCH, .holdEffectParam = 10, .description = sKingsRockDesc, @@ -10103,7 +10474,13 @@ const struct Item gItemsInfo[] = [ITEM_EVIOLITE] = { .name = ITEM_NAME("Eviolite"), - .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 50000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_EVIOLITE, .holdEffectParam = 50, .description = COMPOUND_STRING( @@ -10122,7 +10499,13 @@ const struct Item gItemsInfo[] = [ITEM_FLOAT_STONE] = { .name = ITEM_NAME("Float Stone"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_FLOAT_STONE, .description = COMPOUND_STRING( "It's so light that " @@ -10140,7 +10523,13 @@ const struct Item gItemsInfo[] = [ITEM_ROCKY_HELMET] = { .name = ITEM_NAME("Rocky Helmet"), - .price = (I_PRICE >= GEN_9) ? 50000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 50000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_ROCKY_HELMET, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -10159,7 +10548,13 @@ const struct Item gItemsInfo[] = [ITEM_AIR_BALLOON] = { .name = ITEM_NAME("Air Balloon"), - .price = (I_PRICE >= GEN_9) ? 15000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 15000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_AIR_BALLOON, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -10178,7 +10573,13 @@ const struct Item gItemsInfo[] = [ITEM_RED_CARD] = { .name = ITEM_NAME("Red Card"), - .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 3000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_RED_CARD, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -10197,7 +10598,13 @@ const struct Item gItemsInfo[] = [ITEM_RING_TARGET] = { .name = ITEM_NAME("Ring Target"), - .price = (I_PRICE >= GEN_9) ? 10000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 10000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_RING_TARGET, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -10216,7 +10623,13 @@ const struct Item gItemsInfo[] = [ITEM_BINDING_BAND] = { .name = ITEM_NAME("Binding Band"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_BINDING_BAND, .description = COMPOUND_STRING( "Increases the " @@ -10234,7 +10647,13 @@ const struct Item gItemsInfo[] = [ITEM_EJECT_BUTTON] = { .name = ITEM_NAME("Eject Button"), - .price = (I_PRICE >= GEN_9) ? 30000 : ((I_PRICE >= GEN_7) ? 4000 : 200), + #if I_PRICE >= GEN_9 + .price = 30000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 200, + #endif .holdEffect = HOLD_EFFECT_EJECT_BUTTON, .holdEffectParam = 0, .description = COMPOUND_STRING( @@ -10293,7 +10712,13 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Safety Goggles"), .pluralName = ITEM_PLURAL_NAME("Safety Goggles"), - .price = (I_PRICE >= GEN_9) ? 20000 : ((I_PRICE >= GEN_7) ? 4000 : 1000), + #if I_PRICE >= GEN_9 + .price = 20000, + #elif I_PRICE >= GEN_7 + .price = 4000, + #else + .price = 1000, + #endif .holdEffect = HOLD_EFFECT_SAFETY_GOGGLES, .description = COMPOUND_STRING( "Protect from " @@ -10311,7 +10736,13 @@ const struct Item gItemsInfo[] = [ITEM_ADRENALINE_ORB] = { .name = ITEM_NAME("Adrenaline Orb"), - .price = (I_PRICE >= GEN_9) ? 5000 : ((I_PRICE >= GEN_8) ? 4000 : 300), + #if I_PRICE >= GEN_9 + .price = 5000, + #elif I_PRICE == GEN_8 + .price = 4000, + #else + .price = 300, + #endif .holdEffect = HOLD_EFFECT_ADRENALINE_ORB, .description = COMPOUND_STRING( "This orb boosts " @@ -10503,8 +10934,8 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_CURE_SLP, .description = COMPOUND_STRING( "A hold item that " - "awakens Pokémon\n" - "in battle."), + "awakens Pokémon " + "\nin battle."), .pocket = POCKET_BERRIES, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, @@ -10563,7 +10994,7 @@ const struct Item gItemsInfo[] = .holdEffect = HOLD_EFFECT_CURE_FRZ, .description = COMPOUND_STRING( "A hold item that " - "defrosts\nPokémon " + "defrosts Pokémon\n" "in battle."), .pocket = POCKET_BERRIES, .type = ITEM_USE_PARTY_MENU, @@ -10662,21 +11093,21 @@ const struct Item gItemsInfo[] = .name = ITEM_NAME("Sitrus Berry"), .pluralName = ITEM_PLURAL_NAME("Sitrus Berries"), .price = (I_BERRY_PRICE >= GEN_8) ? 80 : 20, - #if I_SITRUS_BERRY_HEAL >= GEN_4 - .holdEffect = HOLD_EFFECT_RESTORE_PCT_HP, - .holdEffectParam = 25, - .description = COMPOUND_STRING( - "A hold item\nthat " - "restores the user's " - "HP a\nlittle."), - #else - .holdEffect = HOLD_EFFECT_RESTORE_HP, - .holdEffectParam = 30, - .description = COMPOUND_STRING( - "A hold item that " - "restores 30 HP\nin " - "battle."), - #endif + #if I_SITRUS_BERRY_HEAL >= GEN_4 + .holdEffect = HOLD_EFFECT_RESTORE_PCT_HP, + .holdEffectParam = 25, + .description = COMPOUND_STRING( + "A hold item\nthat " + "restores the user's " + "HP a\nlittle."), + #else + .holdEffect = HOLD_EFFECT_RESTORE_HP, + .holdEffectParam = 30, + .description = COMPOUND_STRING( + "A hold item that " + "restores 30 HP\nin " + "battle."), + #endif .pocket = POCKET_BERRIES, .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, @@ -11634,7 +12065,7 @@ const struct Item gItemsInfo[] = .holdEffectParam = 4, .description = COMPOUND_STRING( "It allows a Pokémon " - "in a pinch\nto move " + "in a pinch to\nmove " "first just once."), .pocket = POCKET_BERRIES, .type = ITEM_USE_BAG_MENU, @@ -11824,17 +12255,17 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("TM07"), .price = 3000, - #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW + #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW .description = COMPOUND_STRING( "Raises the\nDefense " "of Ice type\n{PKMN} " "for 5 turns."), - #else + #else .description = COMPOUND_STRING( "Creates a hailstorm " "\nthat damages all " "types\nexcept Ice."), - #endif + #endif .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, @@ -12222,7 +12653,7 @@ const struct Item gItemsInfo[] = .description = COMPOUND_STRING( "Zaps the foe with a " "\njolt of electricity " - "\nthat never misses."), + "that\nnever misses."), .importance = I_REUSABLE_TMS, .pocket = POCKET_TM_HM, .type = ITEM_USE_PARTY_MENU, @@ -13224,7 +13655,7 @@ const struct Item gItemsInfo[] = .importance = 1, .description = COMPOUND_STRING( "This glass returns " - "a Pokémon\nback to " + "a Pokémon back\nto " "its original form."), .pocket = POCKET_KEY_ITEMS, .type = ITEM_USE_PARTY_MENU, @@ -13369,6 +13800,7 @@ const struct Item gItemsInfo[] = { .name = ITEM_NAME("Dynamax Band"), .price = 0, + .importance = 1, .description = COMPOUND_STRING( "A band carrying a " "Wishing Star\nthat " @@ -13634,7 +14066,7 @@ const struct Item gItemsInfo[] = .price = 0, .description = COMPOUND_STRING( "A tool used to " - "search out\nPokémon " + "search out Pokémon\n" "hiding in grass."), .importance = 1, .pocket = POCKET_KEY_ITEMS, @@ -15097,8 +15529,8 @@ const struct Item gItemsInfo[] = [ITEM_FRESH_START_MOCHI] = { - .name = ITEM_NAME("Fresh Start Mochi"), - .pluralName = ITEM_PLURAL_NAME("Fresh Start Mochi"), + .name = ITEM_NAME("Fresh-Start Mochi"), + .pluralName = ITEM_PLURAL_NAME("Fresh-Start Mochi"), .price = 300, .description = COMPOUND_STRING( "An item that resets " @@ -15179,6 +15611,7 @@ const struct Item gItemsInfo[] = [ITEM_REMEDY] = { .name = ITEM_NAME("Remedy"), + .pluralName = ITEM_PLURAL_NAME("Remedies"), .price = 150, .description = COMPOUND_STRING( "A bitter powder " @@ -15198,6 +15631,7 @@ const struct Item gItemsInfo[] = [ITEM_FINE_REMEDY] = { .name = ITEM_NAME("Fine Remedy"), + .pluralName = ITEM_PLURAL_NAME("Fine Remedies"), .price = 150, .description = COMPOUND_STRING( "A bitter powder " @@ -15221,6 +15655,7 @@ const struct Item gItemsInfo[] = [ITEM_SUPERB_REMEDY] = { .name = ITEM_NAME("Superb Remedy"), + .pluralName = ITEM_PLURAL_NAME("Superb Remedies"), .price = 750, .description = COMPOUND_STRING( "A bitter powder " @@ -15363,6 +15798,7 @@ const struct Item gItemsInfo[] = [ITEM_TWICE_SPICED_RADISH] = { .name = ITEM_NAME("Twice-Spiced Radish"), + .pluralName = ITEM_PLURAL_NAME("Twice-Spiced Radishes"), .price = 1600, .description = sQuestionMarksDesc, .pocket = POCKET_ITEMS, @@ -15379,8 +15815,8 @@ const struct Item gItemsInfo[] = .price = 2000, .description = COMPOUND_STRING( "A wooden toy " - "resembling a Poké-.\n" - "mon. Can be sold."), + "resembling a Poké-" + "\nmon. Can be sold."), .pocket = POCKET_ITEMS, .sortType = ITEM_TYPE_SELLABLE, .type = ITEM_USE_BAG_MENU, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 00608542f..b1fde5f4f 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -130,7 +130,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 0, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -151,7 +151,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -171,11 +171,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "high\ncritical-hit\nratio."), .effect = EFFECT_HIT, .power = 50, - .type = TYPE_FIGHTING, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_FIGHTING : TYPE_NORMAL, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -193,14 +193,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Repeatedly slaps\nthe foe " "2 to 5\ntimes."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, @@ -216,14 +217,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Repeatedly punches\nthe foe " "2 to 5\ntimes."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 18, .type = TYPE_NORMAL, .accuracy = 85, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .punchingMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, @@ -244,7 +246,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -268,7 +270,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -292,7 +294,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -324,7 +326,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -352,7 +354,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -380,7 +382,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -402,7 +404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -424,7 +426,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -439,16 +441,28 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_RAZOR_WIND] = { .name = COMPOUND_STRING("Razor Wind"), - .description = COMPOUND_STRING( - "A 2-turn move with\na high " - "\ncritical-hit ratio."), + #if B_UPDATED_MOVE_DATA == GEN_3 + .description = COMPOUND_STRING( + "A 2-turn\nmove that strikes " + "\nthe foe on the 2nd\nturn."), + #else + .description = COMPOUND_STRING( + "A 2-turn move with\na high " + "\ncritical-hit ratio."), + #endif .effect = EFFECT_TWO_TURNS_ATTACK, .power = 80, .type = TYPE_NORMAL, - .accuracy = 100, - .criticalHitStage = 1, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 100 : 75, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .criticalHitStage = 1, + #elif B_UPDATED_MOVE_DATA == GEN_3 + .criticalHitStage = 0, + #else + .criticalHitStage = 2, + #endif .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .sleepTalkBanned = TRUE, @@ -473,7 +487,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -498,7 +512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 95, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -518,14 +532,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "of\nwind whipped up by\nwings."), .effect = EFFECT_HIT, .power = 40, - .type = TYPE_FLYING, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_FLYING : TYPE_NORMAL, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), - .damagesAirborneDoubleDamage = TRUE, + .damagesAirborneDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_2, .windMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, @@ -541,11 +555,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Strikes the foe\nwith wings " "spread\nwide."), .effect = EFFECT_HIT, - .power = 60, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 60 : 35, .type = TYPE_FLYING, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -565,22 +579,33 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, - .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : 100, + #if B_UPDATED_MOVE_DATA >= GEN_6 + .accuracy = 0, + .priority = -6, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .accuracy = 100, + .priority = -6, + #elif B_UPDATED_MOVE_DATA == GEN_2 + .accuracy = 100, + .priority = -1, + #else + .accuracy = 85, + .priority = 0, + #endif .pp = 20, - .target = MOVE_TARGET_SELECTED, - .priority = -6, + .target = TARGET_SELECTED, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .windMove = TRUE, .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, - .copycatBanned = TRUE, - .assistBanned = TRUE, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Whirlwind, .validApprenticeMove = TRUE, }, @@ -596,14 +621,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNFLEWHIGH, .status = STATE_ON_AIR }, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, .contestCategory = CONTEST_CATEGORY_SMART, @@ -624,7 +649,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -652,7 +677,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -682,7 +707,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 45 : 35, .type = TYPE_GRASS, .accuracy = 100, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -704,11 +729,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .minimizeDoubleDamage = TRUE, + .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS >= GEN_2, .skyBattleBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, @@ -733,7 +758,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -757,7 +782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -777,7 +802,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "miss and\nhurt the kicker."), #if B_UPDATED_MOVE_DATA >= GEN_5 .power = 100, - #elif B_UPDATED_MOVE_DATA >= GEN_4 + #elif B_UPDATED_MOVE_DATA == GEN_4 .power = 85, #else .power = 70, @@ -786,7 +811,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 95, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -810,7 +835,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 85, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -835,10 +860,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "by\nhurling sand in\nits face."), .effect = EFFECT_ACCURACY_DOWN, .power = 0, - .type = TYPE_GROUND, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_GROUND : TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -862,7 +887,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -889,7 +914,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -906,14 +931,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Jabs the foe 2 to\n5 times " "with sharp\nhorns, etc."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, @@ -933,7 +959,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 30, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -962,7 +988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 100 : 95, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -984,7 +1010,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1013,10 +1039,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, .multistring.wrapped = B_MSG_WRAPPED_WRAP, @@ -1040,7 +1067,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 25 }, @@ -1064,7 +1091,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 20, - .target = MOVE_TARGET_RANDOM, + .target = TARGET_RANDOM, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1088,14 +1115,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "A life-risking\ntackle that " "also\nhurts the user."), .effect = EFFECT_RECOIL, - .power = 120, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 120 : 100, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .recoilPercentage = 33 }, + .argument = { .recoilPercentage = B_UPDATED_MOVE_DATA >= GEN_3 ? 33 : 25 }, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -1116,7 +1143,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -1139,12 +1166,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 20, }), .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_SMART, @@ -1164,7 +1191,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), @@ -1187,14 +1214,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Sharp pins are\nfired to " "strike 2\nto 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 25 : 14, .type = TYPE_BUG, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 95 : 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -1213,7 +1241,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -1233,17 +1261,17 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "May cause\nflinching."), .effect = EFFECT_HIT, .power = 60, - .type = TYPE_DARK, + .type = B_UPDATED_MOVE_TYPES >= GEN_2 ? TYPE_DARK : TYPE_NORMAL, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .bitingMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 10, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -1264,7 +1292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -1289,20 +1317,26 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, - .priority = -6, + .target = TARGET_SELECTED, + #if B_UPDATED_MOVE_DATA >= GEN_3 + .priority = -6, + #elif B_UPDATED_MOVE_DATA == GEN_2 + .priority = -1, + #else + .priority = 0, + #endif .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .soundMove = TRUE, - .copycatBanned = TRUE, - .assistBanned = TRUE, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_NEXT_APPEAL_LATER : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Roar, .validApprenticeMove = TRUE, }, @@ -1318,7 +1352,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 55, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -1345,7 +1379,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 55, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -1371,7 +1405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .fixedDamage = 20 }, @@ -1406,7 +1440,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 0, .type = TYPE_NORMAL, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -1435,12 +1469,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = B_UPDATED_MOVE_DATA >= GEN_4 ? MOVE_EFFECT_SP_DEF_MINUS_1 : MOVE_EFFECT_DEF_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, @@ -1460,7 +1494,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -1485,7 +1519,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -1511,7 +1545,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -1537,7 +1571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, @@ -1558,7 +1592,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 80, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_HIGHLY_APPEALING, @@ -1584,7 +1618,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = B_UPDATED_MOVE_DATA >= GEN_4 ? MOVE_TARGET_FOES_AND_ALLY : MOVE_TARGET_BOTH, + .target = B_UPDATED_MOVE_DATA >= GEN_4 ? TARGET_FOES_AND_ALLY : TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .damagesUnderwater = TRUE, @@ -1612,7 +1646,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -1642,9 +1676,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 110 : 120, .type = TYPE_ICE, - .accuracy = 70, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_2 ? 70 : 90, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -1672,7 +1706,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -1698,12 +1732,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -1723,12 +1757,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_ATK_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -1746,7 +1780,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, @@ -1773,7 +1807,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1795,7 +1829,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1818,7 +1852,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 80, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1834,15 +1868,26 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_LOW_KICK] = { .name = COMPOUND_STRING("Low Kick"), - .description = COMPOUND_STRING( - "A kick that\ninflicts more " - "\ndamage on heavier\nfoes."), - .effect = EFFECT_LOW_KICK, - .power = 1, + #if B_UPDATED_MOVE_DATA >= GEN_3 + .description = COMPOUND_STRING( + "A\nkick that inflicts\nmore " + "damage on\nheavier foes."), + .effect = EFFECT_LOW_KICK, + #else + .description = COMPOUND_STRING( + "A low, tripping\nkick that " + "may\ncause flinching."), + .effect = EFFECT_HIT, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), + #endif + .power = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 50, .type = TYPE_FIGHTING, - .accuracy = 100, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 100 : 90, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1860,24 +1905,30 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Retaliates any\nphysical hit " "with\ndouble the power."), - .effect = EFFECT_COUNTER, + .effect = EFFECT_REFLECT_DAMAGE, .power = 1, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = -5, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .argument = { + .reflectDamage.damagePercent = 200, + .reflectDamage.damageCategories = 1u << DAMAGE_CATEGORY_PHYSICAL, + }, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .meFirstBanned = TRUE, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_2, .copycatBanned = TRUE, .assistBanned = TRUE, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TAUNT}, + .contestComboMoves = {COMBO_STARTER_TAUNT, COMBO_STARTER_ENCORE, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Counter, .validApprenticeMove = TRUE, }, @@ -1893,7 +1944,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1901,7 +1952,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, + .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SeismicToss, .validApprenticeMove = TRUE, }, @@ -1917,7 +1968,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -1940,7 +1991,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_4 ? 25 : 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, @@ -1962,7 +2013,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_4 ? 15 : 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, @@ -1987,7 +2038,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -1995,7 +2046,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_LEECH_SEED, - .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED}, + .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_WORRY_SEED, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_LeechSeed, .validApprenticeMove = TRUE, }, @@ -2016,7 +2067,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -2026,7 +2077,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_GROWTH, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_Growth, .validApprenticeMove = TRUE, }, @@ -2041,9 +2092,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 55, .type = TYPE_GRASS, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .slicingMove = TRUE, @@ -2066,12 +2117,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .status = B_WEATHER_SUN }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .weather = B_WEATHER_SUN }, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -2091,7 +2142,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 75, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_POISON }, @@ -2100,7 +2151,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_POISON_POWDER, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_PoisonPowder, .validApprenticeMove = TRUE, @@ -2117,7 +2168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 75, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -2143,7 +2194,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 75, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -2152,7 +2203,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SLEEP_POWDER, .contestComboMoves = {COMBO_STARTER_SWEET_SCENT}, .battleAnimScript = gBattleAnimMove_SleepPowder, .validApprenticeMove = TRUE, @@ -2175,7 +2226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 20, - .target = MOVE_TARGET_RANDOM, + .target = TARGET_RANDOM, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -2204,7 +2255,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 95, .pp = 40, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -2227,7 +2278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_4) || (B_UPDATED_MOVE_FLAGS < GEN_3), @@ -2251,7 +2302,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, @@ -2278,7 +2329,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -2303,7 +2354,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -2329,7 +2380,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 90 : 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_PARALYSIS }, @@ -2337,7 +2388,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_THUNDER_WAVE, .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ThunderWave, .validApprenticeMove = TRUE, @@ -2354,15 +2405,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 70, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .damagesAirborne = TRUE, + .damagesAirborne = B_UPDATED_MOVE_FLAGS >= GEN_2, .alwaysHitsInRain = TRUE, .accuracy50InSun = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 10, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_COOL, @@ -2381,9 +2432,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HIT, .power = 50, .type = TYPE_ROCK, - .accuracy = 90, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_2 ? 90 : 65, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, @@ -2404,11 +2455,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, - .damagesUnderground = TRUE, + .damagesUnderground = B_UPDATED_MOVE_FLAGS >= GEN_2, .skyBattleBanned = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -2429,7 +2480,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 30, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .damagesUnderground = TRUE, @@ -2449,17 +2500,23 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Digs underground\nthe first " "turn and\nstrikes next turn."), .effect = EFFECT_SEMI_INVULNERABLE, - .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 80 : 60, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .power = 80, + #elif B_UPDATED_MOVE_DATA >= GEN_2 + .power = 60, + #else + .power = 100, + #endif .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .skyBattleBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNDUGHOLE, .status = STATE_UNDERGROUND }, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_AVOID_STARTLE, @@ -2481,7 +2538,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_TOXIC }, @@ -2506,7 +2563,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -2531,12 +2588,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SP_DEF_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, @@ -2557,7 +2614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 60, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -2582,7 +2639,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -2608,7 +2665,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -2617,7 +2674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_AGILITY, .contestComboMoves = {COMBO_STARTER_DOUBLE_TEAM}, .battleAnimScript = gBattleAnimMove_Agility, .validApprenticeMove = TRUE, @@ -2634,7 +2691,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -2652,14 +2709,17 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Raises the user's\nAttack " "every time\nit is hit."), - .effect = EFFECT_RAGE, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_RAGE, + }), .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_COOL, @@ -2685,8 +2745,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, - .priority = -6, + .target = TARGET_USER, + .priority = B_UPDATED_MOVE_DATA >= GEN_8 ? -6 : 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .ignoresProtect = TRUE, @@ -2709,7 +2769,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, @@ -2729,9 +2789,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MIMIC, .power = 0, .type = TYPE_NORMAL, - .accuracy = 0, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 0 : 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -2762,7 +2822,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -2788,7 +2848,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -2820,7 +2880,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 0, .type = TYPE_NORMAL, .accuracy = 0, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -2847,7 +2907,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -2877,7 +2937,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 10 : 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -2903,7 +2963,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -2927,7 +2987,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -2951,7 +3011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -2977,7 +3037,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -3003,7 +3063,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3029,7 +3089,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -3055,7 +3115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -3081,7 +3141,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -3107,7 +3167,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -3132,10 +3192,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_BIDE, .power = 1, .type = TYPE_NORMAL, - .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 0 : 100, + #if B_UPDATED_MOVE_DATA >= GEN_4 + .accuracy = 0, + .priority = 1, + #elif B_UPDATED_MOVE_DATA >= GEN_2 + .accuracy = 100, + .priority = 0, + #else + .accuracy = 0, + .priority = 0, + #endif .pp = 10, - .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_4 ? 1 : 0, + .target = TARGET_USER, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sleepTalkBanned = TRUE, @@ -3153,13 +3221,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Metronome"), .description = COMPOUND_STRING( "Waggles a finger\nto use any " - "\nPokémon move at\nrandom."), + "Pokémon\nmove at random."), .effect = EFFECT_METRONOME, .power = 0, .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -3169,7 +3237,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .sleepTalkBanned = B_UPDATED_MOVE_FLAGS >= GEN_3, .instructBanned = TRUE, - .encoreBanned = TRUE, + .encoreBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), .assistBanned = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -3190,7 +3258,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_2 }, @@ -3215,20 +3283,21 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Inflicts severe\ndamage but " "makes\nthe user faint."), - .effect = EFFECT_EXPLOSION, - .power = 200, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 200 : 130, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .explosion = TRUE, .parentalBondBanned = TRUE, .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_SelfDestruct, .validApprenticeMove = TRUE, }, @@ -3244,7 +3313,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, @@ -3267,7 +3336,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -3294,7 +3363,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 70, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -3319,12 +3388,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_POISON, - .chance = 30, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 30 : 40, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MON : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -3344,7 +3413,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -3369,12 +3438,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 30, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -3395,7 +3464,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -3424,7 +3493,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 75, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 15 : 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -3452,7 +3521,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, @@ -3474,18 +3543,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNLOWEREDHEAD }, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_DEF_PLUS_1, - .self = TRUE, - .onChargeTurnOnly = TRUE, - }), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_DEF_PLUS_1, + .self = TRUE, + .onChargeTurnOnly = TRUE, + }), + #endif .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -3500,14 +3571,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Launches sharp\nspikes that " "strike\n2 to 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 20, .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -3526,13 +3598,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -3552,7 +3624,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3561,7 +3633,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .snatchAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_AMNESIA, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Amnesia, .validApprenticeMove = TRUE, @@ -3578,11 +3650,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 80, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, - .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, + .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_4, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_KINESIS, @@ -3600,9 +3672,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_SOFTBOILED, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -3635,7 +3707,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -3665,7 +3737,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 0, .type = TYPE_NORMAL, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_PARALYSIS }, @@ -3673,7 +3745,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_SAME_TYPE : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_GLARE, .contestComboMoves = {COMBO_STARTER_LEER}, .battleAnimScript = gBattleAnimMove_Glare, .validApprenticeMove = TRUE, @@ -3690,15 +3762,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { .absorbPercentage = 50 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, - .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS}, + .contestComboMoves = {COMBO_STARTER_CALM_MIND, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_DreamEater, .validApprenticeMove = TRUE, }, @@ -3715,7 +3787,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "gas that may\npoison."), #if B_UPDATED_MOVE_DATA >= GEN_6 .accuracy = 90, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .accuracy = 80, #else .accuracy = 55, @@ -3724,7 +3796,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 0, .type = TYPE_POISON, .pp = 40, - .target = B_UPDATED_MOVE_DATA >= GEN_5 ? MOVE_TARGET_BOTH : MOVE_TARGET_SELECTED, + .target = B_UPDATED_MOVE_DATA >= GEN_5 ? TARGET_BOTH : TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_POISON }, @@ -3732,7 +3804,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_POISON_GAS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PoisonGas, }, @@ -3743,14 +3815,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hurls round\nobjects at the " "foe\n2 to 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .ballisticMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, @@ -3770,7 +3843,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_7 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .absorbPercentage = 50 }, @@ -3795,7 +3868,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 75, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -3803,7 +3876,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_LOVELY_KISS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_LovelyKiss, .validApprenticeMove = TRUE, @@ -3820,7 +3893,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3, @@ -3852,18 +3925,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .ignoresProtect = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_5, .mirrorMoveBanned = TRUE, .mimicBanned = TRUE, .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, - .copycatBanned = TRUE, + .copycatBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .instructBanned = TRUE, .encoreBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -3883,12 +3957,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, - .chance = 10, + .chance = B_UPDATED_MOVE_DATA >= GEN_2 ? 10 : 33, }), .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -3900,23 +3974,31 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DIZZY_PUNCH] = { .name = COMPOUND_STRING("Dizzy Punch"), - .description = COMPOUND_STRING( - "A rhythmic punch\nthat may " - "confuse\nthe foe."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "A\nrhythmic punch\nthat may " + "confuse\nthe target."), + #else + .description = COMPOUND_STRING( + "The target is hit\nwith " + "rhythmic\npunches."), + #endif .effect = EFFECT_HIT, .power = 70, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .punchingMove = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_CONFUSION, - .chance = 20, - }), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_CONFUSION, + .chance = 20, + }), + #endif .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -3936,7 +4018,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -3945,7 +4027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .powderMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SPORE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spore, .validApprenticeMove = TRUE, @@ -3962,7 +4044,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 100 : 70, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -3986,7 +4068,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 100 : 80, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, @@ -4008,7 +4090,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_3 }, @@ -4033,7 +4115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4058,9 +4140,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 100 : 90, .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4078,20 +4160,21 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Inflicts severe\ndamage but " "makes\nthe user faint."), - .effect = EFFECT_EXPLOSION, - .power = 250, + .effect = EFFECT_HIT, + .power = B_UPDATED_MOVE_DATA >= GEN_2 ? 250 : 170, .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .explosion = TRUE, .parentalBondBanned = TRUE, .dampBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_Explosion, .validApprenticeMove = TRUE, }, @@ -4102,14 +4185,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Rakes the foe with\nsharp " "claws, etc.,\n2 to 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 18, .type = TYPE_NORMAL, .accuracy = 80, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -4129,7 +4213,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .strikeCount = 2, @@ -4152,7 +4236,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4171,21 +4255,29 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_ROCK_SLIDE] = { .name = COMPOUND_STRING("Rock Slide"), - .description = COMPOUND_STRING( - "Large boulders are\nhurled. " - "May cause\nflinching."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "Large\nboulders are\nhurled. " + "May cause\nflinching."), + #else + .description = COMPOUND_STRING( + "Hits the foe with\nan " + "avalanche of\nrocks."), + #endif .effect = EFFECT_HIT, .power = 75, .type = TYPE_ROCK, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_FLINCH, - .chance = 30, - }), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_FLINCH, + .chance = 30, + }), + #endif .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_PREV_MONS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -4205,7 +4297,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4233,7 +4325,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -4263,7 +4355,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -4281,25 +4373,33 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TRI_ATTACK] = { .name = COMPOUND_STRING("Tri Attack"), - .description = COMPOUND_STRING( - "Fires three types\nof beams. " - #if B_USE_FROSTBITE == TRUE - "May\nburn/para/frostbite."), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .description = COMPOUND_STRING( + "Fires three\ntypes of beams. " + #if B_USE_FROSTBITE == TRUE + "May\nburn/para/frostbite."), + #else + "May\nburn/paralyze/freeze."), + #endif #else - "May\nburn/paralyze/freeze."), + .description = COMPOUND_STRING( + "A triangular field\nof energy " + "is\ncreated and\nlaunched."), #endif .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_TRI_ATTACK, - .chance = 20, - }), + #if B_UPDATED_MOVE_DATA >= GEN_2 + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_TRI_ATTACK, + .chance = 20, + }), + #endif .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -4319,7 +4419,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .damagePercentage = 50 }, @@ -4343,9 +4443,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_NORMAL, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4369,7 +4469,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4394,20 +4494,25 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #if B_UPDATED_MOVE_DATA >= GEN_4 .effect = EFFECT_STRUGGLE, .accuracy = 0, - .mirrorMoveBanned = TRUE, + .pp = 1, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_RECOIL_HP_25, .self = TRUE, }), + #elif B_UPDATED_MOVE_DATA >= GEN_2 + .effect = EFFECT_RECOIL, + .accuracy = 100, + .pp = 1, + .argument = { .recoilPercentage = 25 }, #else .effect = EFFECT_RECOIL, .accuracy = 100, - .argument = { .recoilPercentage = 25 }, + .pp = 10, + .argument = { .recoilPercentage = 50 }, #endif .power = 50, .type = TYPE_NORMAL, - .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4420,6 +4525,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .encoreBanned = TRUE, .assistBanned = TRUE, .sketchBanned = TRUE, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .battleAnimScript = gBattleAnimMove_Struggle, .validApprenticeMove = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, @@ -4437,12 +4543,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, .ignoresProtect = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .mimicBanned = TRUE, .metronomeBanned = TRUE, @@ -4471,7 +4577,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4495,7 +4601,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 25 : 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4504,7 +4610,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, + .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE : CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, .contestComboMoves = {0}, @@ -4523,11 +4629,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS < GEN_3), .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, @@ -4548,7 +4654,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 0 : 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -4571,15 +4677,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 100 : 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, - .ignoresProtect = B_UPDATED_MOVE_FLAGS <= GEN_3, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_3, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_Nightmare, .validApprenticeMove = TRUE, }, @@ -4595,7 +4701,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4622,7 +4728,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -4651,12 +4757,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = B_UPDATED_MOVE_TYPES >= GEN_5 ? TYPE_GHOST : TYPE_MYSTERY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_CURSE }, .ignoresProtect = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -4677,7 +4783,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4700,12 +4806,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = B_UPDATED_MOVE_DATA >= GEN_5 ? MOVE_TARGET_SELECTED : MOVE_TARGET_USER, + .target = B_UPDATED_MOVE_DATA >= GEN_5 ? TARGET_SELECTED : TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, - .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_5, - .ignoresSubstitute = TRUE, + .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_3, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_5, .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -4725,9 +4831,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_FLYING, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -4754,7 +4860,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 100 : 85, .pp = 40, - .target = B_UPDATED_MOVE_DATA >= GEN_6 ? MOVE_TARGET_BOTH : MOVE_TARGET_SELECTED, + .target = B_UPDATED_MOVE_DATA >= GEN_6 ? TARGET_BOTH : TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4779,7 +4885,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4806,7 +4912,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -4815,7 +4921,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Spite, .validApprenticeMove = TRUE, }, @@ -4835,7 +4941,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -4858,8 +4964,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + .target = TARGET_USER, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_NORMAL }, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -4885,7 +4997,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -4909,7 +5021,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 100 : 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -4933,7 +5045,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = B_UPDATED_MOVE_DATA >= GEN_4, @@ -4956,7 +5068,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = B_UPDATED_MOVE_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_NORMAL, .accuracy = 75, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -4980,7 +5092,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -5006,7 +5118,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -5033,7 +5145,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -5059,7 +5171,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -5086,7 +5198,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_OPPONENTS_FIELD, + .target = TARGET_OPPONENTS_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -5097,7 +5209,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SPIKES, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Spikes, .validApprenticeMove = TRUE, @@ -5114,7 +5226,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 50, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -5141,7 +5253,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 0 : 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, @@ -5166,7 +5278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_FOLLOW_ME }, @@ -5179,7 +5291,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENDURE, COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_DestinyBond, .validApprenticeMove = TRUE, }, @@ -5195,18 +5307,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_ALL_BATTLERS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, - .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, + .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, .soundMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, //C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUICKLY_GROW_BORED : .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_SING, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_PerishSong, .validApprenticeMove = TRUE, }, @@ -5222,7 +5334,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -5247,8 +5359,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + .target = TARGET_USER, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_NORMAL }, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -5271,14 +5389,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Strikes the foe\nwith a bone " "in\nhand 2 to 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 25, .type = TYPE_GROUND, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 80, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_BONE_RUSH, @@ -5297,7 +5416,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 0 : 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -5320,7 +5439,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 15, - .target = MOVE_TARGET_RANDOM, + .target = TARGET_RANDOM, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5343,18 +5462,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Causes a sandstorm\nthat " "rages for\nseveral turns."), - .effect = EFFECT_SANDSTORM, + .effect = EFFECT_WEATHER, .power = 0, .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .windMove = TRUE, + .argument = { .weatherType = BATTLE_WEATHER_SANDSTORM }, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_SCRAMBLE_NEXT_TURN_ORDER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_SANDSTORM, @@ -5374,7 +5494,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_4 ? 10 : 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, @@ -5399,9 +5519,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, - .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 4 : 3, + .target = TARGET_USER, + #if B_UPDATED_MOVE_DATA >= GEN_5 + .priority = 4, + #elif B_UPDATED_MOVE_DATA >= GEN_3 + .priority = 3, + #else + .priority = 2, + #endif .category = DAMAGE_CATEGORY_STATUS, + .argument = { .protectMethod = PROTECT_NONE }, .zMove = { .effect = Z_EFFECT_RESET_STATS }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, @@ -5427,7 +5554,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = B_UPDATED_MOVE_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -5451,7 +5578,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 90, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5474,7 +5601,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5497,10 +5624,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 85 : 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, + //.ignoresSubstitute = TRUE, In Gen4+, the attack raise will no longer bypass Substitute. However, this is tricky to code .magicCoatAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS : CONTEST_EFFECT_BETTER_IF_FIRST, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -5521,7 +5649,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -5548,7 +5676,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5571,7 +5699,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "on\neach successive\nhit."), #if B_UPDATED_MOVE_DATA >= GEN_6 .power = 40, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .power = 20, #else .power = 10, @@ -5580,7 +5708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 95, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5604,10 +5732,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 90, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_DEF_PLUS_1, .self = TRUE, @@ -5632,11 +5761,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS < GEN_3), .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -5657,7 +5786,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -5682,7 +5811,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, @@ -5693,7 +5822,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .mimicBanned = TRUE, - .encoreBanned = TRUE, + .encoreBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), .assistBanned = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -5714,7 +5843,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -5722,7 +5851,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresProtect = TRUE, .ignoresSubstitute = TRUE, .mirrorMoveBanned = TRUE, - .soundMove = B_UPDATED_MOVE_FLAGS != GEN_5, + .soundMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_HEAL_BELL, @@ -5742,7 +5871,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5765,14 +5894,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Present, .validApprenticeMove = TRUE, }, @@ -5788,7 +5917,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5811,7 +5940,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 25, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -5835,9 +5964,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_PAIN_SPLIT, .power = 0, .type = TYPE_NORMAL, - .accuracy = 0, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_3 ? 0 : 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -5860,7 +5989,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .thawsUser = TRUE, @@ -5887,7 +6016,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .damagesUnderground = TRUE, @@ -5910,7 +6039,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 50, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5938,7 +6067,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -5961,7 +6090,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, @@ -5988,7 +6117,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -5997,7 +6126,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION : CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AGILITY, COMBO_STARTER_AMNESIA, COMBO_STARTER_HONE_CLAWS, COMBO_STARTER_CALM_MIND, COMBO_STARTER_NASTY_PLOT, COMBO_STARTER_ROCK_POLISH}, .battleAnimScript = gBattleAnimMove_BatonPass, .validApprenticeMove = TRUE, }, @@ -6013,7 +6142,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -6022,7 +6151,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoresSubstitute = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ENCORE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Encore, .validApprenticeMove = TRUE, @@ -6039,7 +6168,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6067,7 +6196,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6104,7 +6233,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -6128,7 +6257,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 75, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6155,7 +6284,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 95, .pp = 35, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6183,14 +6312,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_FAKE_OUT}, + .contestComboMoves = {COMBO_STARTER_FAKE_OUT, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_VitalThrow, .validApprenticeMove = TRUE, }, @@ -6206,7 +6335,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -6233,7 +6362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -6260,7 +6389,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = B_UPDATED_MOVE_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -6292,7 +6421,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, @@ -6313,9 +6442,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_FIGHTING, .accuracy = 80, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6338,9 +6467,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .damagesAirborneDoubleDamage = TRUE, .windMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -6360,17 +6490,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Boosts the power\nof Water- " "type\nmoves for 5 turns."), - .effect = EFFECT_RAIN_DANCE, + .effect = EFFECT_WEATHER, .power = 0, .type = TYPE_WATER, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .argument = { .weatherType = BATTLE_WEATHER_RAIN }, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_BEAUTY : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_RAIN_DANCE, @@ -6385,17 +6516,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Boosts the power\nof Fire- " "type\nmoves for 5 turns."), - .effect = EFFECT_SUNNY_DAY, + .effect = EFFECT_WEATHER, .power = 0, .type = TYPE_FIRE, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .argument = { .weatherType = BATTLE_WEATHER_SUN }, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_SUNNY_DAY, @@ -6419,7 +6551,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6446,14 +6578,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Counters the foe's\nspecial " "attack at\ndouble the power."), - .effect = EFFECT_MIRROR_COAT, + .effect = EFFECT_REFLECT_DAMAGE, .power = 1, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = -5, .category = DAMAGE_CATEGORY_SPECIAL, + .argument = { + .reflectDamage.damagePercent = 200, + .reflectDamage.damageCategories = 1u << DAMAGE_CATEGORY_SPECIAL, + }, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .meFirstBanned = TRUE, .metronomeBanned = TRUE, @@ -6461,7 +6598,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_AVOID_STARTLE_ONCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TAUNT}, + .contestComboMoves = {COMBO_STARTER_TAUNT, COMBO_STARTER_ENCORE, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_MirrorCoat, .validApprenticeMove = TRUE, }, @@ -6477,7 +6614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -6504,7 +6641,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 2 : 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6527,7 +6664,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = B_UPDATED_MOVE_DATA < GEN_4, @@ -6555,7 +6692,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -6579,7 +6716,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "strike 2\nturns later."), #if B_UPDATED_MOVE_DATA >= GEN_6 .power = 120, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .power = 100, #else .power = 80, @@ -6588,7 +6725,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 100 : 90, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, @@ -6612,7 +6749,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -6639,9 +6776,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .ignoresKingsRock = B_UPDATED_MOVE_FLAGS < GEN_3, .damagesUnderwater = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_WRAP, @@ -6660,13 +6798,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Beat Up"), .description = COMPOUND_STRING( "Summons party\nPokémon to " - "join\nin the attack."), + "join in\nthe attack."), .effect = EFFECT_BEAT_UP, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 1 : 10, .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, @@ -6690,7 +6828,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLINCH, @@ -6719,7 +6857,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_RANDOM, + .target = TARGET_RANDOM, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -6749,7 +6887,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_4 ? 20 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -6771,11 +6909,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Releases\nstockpiled power " "\n(the more the\nbetter)."), .effect = EFFECT_SPIT_UP, - .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 1 : 100, + .power = 1, .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = TRUE, @@ -6798,7 +6936,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -6825,7 +6963,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -6848,23 +6986,23 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Summons a\nsnowstorm that " "\nlasts for five\nturns."), - .effect = EFFECT_SNOWSCAPE, #else .description = COMPOUND_STRING( "Summons a\nhailstorm that " "\nstrikes every turn."), - .effect = EFFECT_HAIL, #endif + .effect = EFFECT_WEATHER, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .argument = { .weatherType = (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW) ? BATTLE_WEATHER_SNOW : BATTLE_WEATHER_HAIL }, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_HAIL, @@ -6884,14 +7022,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_TORMENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Torment, .validApprenticeMove = TRUE, @@ -6908,7 +7046,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -6932,7 +7070,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 85 : 75, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_BURN }, @@ -6940,7 +7078,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_WILL_O_WISP, .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, .battleAnimScript = gBattleAnimMove_WillOWisp, .validApprenticeMove = TRUE, @@ -6955,16 +7093,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MEMENTO, .power = 0, .type = TYPE_DARK, - .accuracy = 100, + .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 100 : 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESTORE_REPLACEMENT_HP }, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_MEAN_LOOK, COMBO_STARTER_BLOCK}, .battleAnimScript = gBattleAnimMove_Memento, .validApprenticeMove = TRUE, }, @@ -6980,7 +7118,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7003,7 +7141,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -3, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7034,7 +7172,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .status = STATUS1_PARALYSIS }, @@ -7045,7 +7183,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL : CONTEST_EFFECT_STARTLE_PREV_MON, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FORCE_PALM, COMBO_STARTER_THUNDER_WAVE, COMBO_STARTER_GLARE}, .battleAnimScript = gBattleAnimMove_SmellingSalts, .validApprenticeMove = TRUE, }, @@ -7059,9 +7197,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_FOLLOW_ME, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 2 : 3, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -7089,15 +7227,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = B_UPDATED_MOVE_FLAGS >= GEN_6 ? TARGET_SELECTED : TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, - .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, + .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_5, .copycatBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .encoreBanned = TRUE, - .assistBanned = TRUE, + .encoreBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -7116,9 +7254,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_CHARGE, .power = 0, .type = TYPE_ELECTRIC, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -7144,12 +7282,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, .ignoresSubstitute = TRUE, .magicCoatAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, + .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_4, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION : CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_TAUNT, @@ -7167,9 +7306,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_HELPING_HAND, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = B_UPDATED_MOVE_DATA >= GEN_4 ? MOVE_TARGET_ALLY : MOVE_TARGET_USER, + .target = B_UPDATED_MOVE_DATA >= GEN_4 ? TARGET_ALLY : TARGET_USER, .priority = 5, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -7198,7 +7337,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -7224,7 +7363,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -7250,7 +7389,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -7260,7 +7399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_BETTER_IF_LAST : CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_WISH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Wish, .validApprenticeMove = TRUE, @@ -7275,13 +7414,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_ASSIST, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, - .mirrorMoveBanned = TRUE, + .mirrorMoveBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), .metronomeBanned = B_UPDATED_MOVE_FLAGS >= GEN_4, .copycatBanned = TRUE, .sleepTalkBanned = TRUE, @@ -7306,9 +7445,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_INGRAIN, .power = 0, .type = TYPE_GRASS, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -7335,7 +7474,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7360,9 +7499,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MAGIC_COAT, .power = 0, .type = TYPE_PSYCHIC, - .accuracy = 100, + .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, @@ -7385,9 +7524,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_RECYCLE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -7411,7 +7550,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -4, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7429,14 +7568,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Destroys barriers\nsuch as " "REFLECT\nand causes damage."), - .effect = EFFECT_BRICK_BREAK, + .effect = EFFECT_HIT, .power = 75, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BREAK_SCREEN, + .preAttackEffect = TRUE, + }), .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_HIGHLY_APPEALING : CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_COOL, @@ -7457,7 +7600,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -7482,7 +7625,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7505,7 +7648,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7529,7 +7672,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_BETTER_WHEN_LATER, @@ -7551,7 +7694,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -7573,9 +7716,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_IMPRISON, .power = 0, .type = TYPE_PSYCHIC, - .accuracy = 100, + .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, @@ -7601,9 +7744,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_REFRESH, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -7627,9 +7770,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_GRUDGE, .power = 0, .type = TYPE_GHOST, - .accuracy = 100, + .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_FOLLOW_ME }, @@ -7639,7 +7782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_JAMS_OTHERS_BUT_MISS_ONE_TURN : CONTEST_EFFECT_BETTER_WHEN_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_CURSE}, + .contestComboMoves = {COMBO_STARTER_CURSE, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_Grudge, .validApprenticeMove = TRUE, }, @@ -7653,9 +7796,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_SNATCH, .power = 0, .type = TYPE_DARK, - .accuracy = 100, + .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -7683,7 +7826,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -7709,13 +7852,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .skyBattleBanned = TRUE, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNHIDUNDERWATER, .status = STATE_UNDERWATER }, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE_ONCE, @@ -7732,14 +7875,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Straight-arm\npunches that " "\nstrike the foe 2\nto 5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 15, .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -7757,9 +7901,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_CAMOUFLAGE, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -7789,7 +7933,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -7815,7 +7959,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -7841,7 +7985,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -7868,7 +8012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -7893,7 +8037,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -7917,9 +8061,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 85, .type = TYPE_FIRE, .accuracy = 90, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7930,7 +8074,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_REPETITION_NOT_BORING : CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_SUNNY_DAY}, + .contestComboMoves = {COMBO_STARTER_SUNNY_DAY, COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_BlazeKick, .validApprenticeMove = TRUE, }, @@ -7945,9 +8089,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_MUD_SPORT, .power = 0, .type = TYPE_GROUND, - .accuracy = 100, + .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -7973,7 +8117,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -7983,7 +8127,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_HAIL}, + .contestComboMoves = {COMBO_STARTER_HAIL, COMBO_STARTER_DEFENSE_CURL}, .battleAnimScript = gBattleAnimMove_IceBall, }, @@ -7998,7 +8142,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8024,9 +8168,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_RESTORE_HP, .power = 0, .type = TYPE_NORMAL, - .accuracy = 100, + .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -8053,7 +8197,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -8077,7 +8221,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8104,7 +8248,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8131,7 +8275,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -8157,7 +8301,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -8183,7 +8327,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8212,7 +8356,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8240,7 +8384,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 160 }, @@ -8264,12 +8408,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, .snatchAffected = TRUE, .ignoresProtect = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_6, .mirrorMoveBanned = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE : CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_SMART, @@ -8290,7 +8435,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -8313,9 +8458,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 60 : 55, .type = TYPE_FLYING, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -8339,7 +8484,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = B_UPDATED_MOVE_DATA < GEN_4, @@ -8366,7 +8511,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_4 ? 0 : 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -8391,7 +8536,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 95 : 80, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 15 : 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -8417,7 +8562,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = B_EXTRAPOLATED_MOVE_FLAGS, @@ -8445,7 +8590,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 85, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -8471,7 +8616,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 55, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -8481,7 +8626,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .soundMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_AVOID_STARTLE_ONCE : CONTEST_EFFECT_BADLY_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_GRASS_WHISTLE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_GrassWhistle, .validApprenticeMove = TRUE, @@ -8498,10 +8643,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS < GEN_4, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -8522,7 +8668,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -8548,7 +8694,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_USER_MORE_EASILY_STARTLED : CONTEST_EFFECT_BETTER_WHEN_LATER, @@ -8570,7 +8716,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -8596,7 +8742,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8620,7 +8766,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 20 : 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_4, @@ -8647,7 +8793,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8672,7 +8818,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 85 : 70, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -8698,7 +8844,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 30, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, @@ -8720,7 +8866,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -8742,19 +8888,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Shoots 2 to 5\nseeds in a row " "to\nstrike the foe."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 25 : 10, .type = TYPE_GRASS, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .ballisticMove = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_GROWTH}, + .contestComboMoves = {COMBO_STARTER_GROWTH, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_BulletSeed, }, @@ -8769,7 +8916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8788,14 +8935,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Attacks the foe by\nfiring " "2 to 5\nicicles in a row."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 25 : 10, .type = TYPE_ICE, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -8814,7 +8962,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -8840,15 +8988,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, - .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6) || (B_UPDATED_MOVE_FLAGS <= GEN_3), + .ignoresProtect = (B_UPDATED_MOVE_FLAGS >= GEN_6 || B_UPDATED_MOVE_FLAGS < GEN_3), .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_BLOCK, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Block, .validApprenticeMove = TRUE, @@ -8861,11 +9009,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Howls to raise the\nspirit " "and boosts\nAttack."), .power = 0, - .effect = B_UPDATED_MOVE_DATA >= GEN_8 ? EFFECT_ATTACK_UP_USER_ALLY : EFFECT_ATTACK_UP, + .effect = EFFECT_ATTACK_UP, .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, // Targeting is handled through the script + .target = B_UPDATED_MOVE_DATA >= GEN_8 ? TARGET_USER_AND_ALLY: TARGET_USER , .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -8892,7 +9040,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -8915,7 +9063,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -8942,7 +9090,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -8968,14 +9116,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNSPRANGUP, .status = STATE_ON_AIR }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, @@ -9000,7 +9148,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -9024,9 +9172,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 50, .type = TYPE_POISON, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9037,7 +9185,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_PoisonTail, .validApprenticeMove = TRUE, }, @@ -9053,7 +9201,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 25 : 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = B_UPDATED_MOVE_DATA >= GEN_4, @@ -9063,7 +9211,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .assistBanned = TRUE, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_COVET, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Covet, .validApprenticeMove = TRUE, @@ -9086,7 +9234,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 33 }, @@ -9099,7 +9247,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #endif .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltTackle, .validApprenticeMove = TRUE, @@ -9116,7 +9264,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, @@ -9137,9 +9285,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .effect = EFFECT_WATER_SPORT, .power = 0, .type = TYPE_WATER, - .accuracy = 100, + .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -9165,7 +9313,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -9190,9 +9338,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_4 ? 90 : 70, .type = TYPE_GRASS, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9216,7 +9364,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -9238,14 +9386,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hurls boulders at\nthe foe " "2 to 5\ntimes in a row."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 25, .type = TYPE_ROCK, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 80, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .ballisticMove = B_UPDATED_MOVE_FLAGS >= GEN_6, .contestEffect = C_UPDATED_MOVE_EFFECTS >= GEN_6 ? CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING : CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_TOUGH, @@ -9265,7 +9414,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, @@ -9287,7 +9436,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -9314,7 +9463,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 100 : 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, @@ -9338,7 +9487,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -9364,7 +9513,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -9390,7 +9539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -9415,7 +9564,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -9439,7 +9588,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .status = STATUS1_SLEEP }, @@ -9450,7 +9599,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER}, .battleAnimScript = gBattleAnimMove_WakeUpSlap, }, @@ -9465,7 +9614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9492,7 +9641,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9513,7 +9662,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .healingMove = TRUE, @@ -9538,7 +9687,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, @@ -9559,7 +9708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, @@ -9578,7 +9727,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 2, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, @@ -9605,7 +9754,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9634,7 +9783,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 15 : 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, @@ -9660,7 +9809,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER | MOVE_TARGET_ALLY, + .target = TARGET_USER_OR_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, @@ -9680,19 +9829,24 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Retaliates any hit\nwith " "greater\npower."), - .effect = EFFECT_METAL_BURST, + .effect = EFFECT_REFLECT_DAMAGE, .power = 1, .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = { + .reflectDamage.damagePercent = 150, + .reflectDamage.damageCategories = 1u << DAMAGE_CATEGORY_PHYSICAL | 1u << DAMAGE_CATEGORY_SPECIAL, + }, + .ignoresProtect = B_UPDATED_MOVE_FLAGS < GEN_5, .meFirstBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_METAL_SOUND}, + .contestComboMoves = {COMBO_STARTER_METAL_SOUND, COMBO_STARTER_ENCORE, COMBO_STARTER_TAUNT, COMBO_STARTER_TORMENT}, .battleAnimScript = gBattleAnimMove_MetalBurst, }, @@ -9705,7 +9859,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9725,7 +9879,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9751,7 +9905,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9773,7 +9927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -9795,7 +9949,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -9818,14 +9972,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .parentalBondBanned = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_CUTE : CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Fling, }, @@ -9840,7 +9994,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 100 : 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_2 }, @@ -9862,7 +10016,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -9884,7 +10038,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_2 }, @@ -9905,7 +10059,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -9927,7 +10081,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -9952,7 +10106,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -9975,7 +10129,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -10000,7 +10154,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_OPPONENT, + .target = TARGET_OPPONENT, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -10011,7 +10165,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .encoreBanned = TRUE, + .encoreBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), .assistBanned = TRUE, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, @@ -10032,7 +10186,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -10042,7 +10196,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .copycatBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .encoreBanned = TRUE, + .encoreBanned = (B_UPDATED_MOVE_FLAGS >= GEN_7 || B_UPDATED_MOVE_FLAGS < GEN_3), .assistBanned = TRUE, .mimicBanned = TRUE, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONE, @@ -10063,7 +10217,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -10086,7 +10240,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -10109,7 +10263,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10131,7 +10285,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10153,7 +10307,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .overwriteAbility = ABILITY_INSOMNIA }, @@ -10162,7 +10316,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = COMBO_STARTER_WORRY_SEED, - .contestComboMoves = {COMBO_STARTER_LEECH_SEED}, + .contestComboMoves = {COMBO_STARTER_LEECH_SEED, COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_WorrySeed, }, @@ -10175,7 +10329,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10197,7 +10351,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_OPPONENTS_FIELD, + .target = TARGET_OPPONENTS_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -10208,7 +10362,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_TOXIC_SPIKES, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ToxicSpikes, }, @@ -10224,7 +10378,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_BOOST_CRITS }, @@ -10247,7 +10401,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -10272,7 +10426,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_EVSN_UP_1 }, @@ -10298,7 +10452,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 33 }, @@ -10326,7 +10480,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10336,7 +10490,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_FORCE_PALM, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ForcePalm, }, @@ -10352,7 +10506,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -10375,7 +10529,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -10384,7 +10538,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ROCK_POLISH, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_RockPolish, }, @@ -10400,7 +10554,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10426,7 +10580,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -10451,9 +10605,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_DARK, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10461,7 +10615,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_NightSlash, }, @@ -10476,7 +10630,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10498,14 +10652,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_TOUGH : CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ROTOTILLER}, .battleAnimScript = gBattleAnimMove_SeedBomb, }, @@ -10520,7 +10674,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 95, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 15 : 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .slicingMove = TRUE, @@ -10546,7 +10700,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10569,7 +10723,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -10596,7 +10750,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -10618,7 +10772,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 75, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10645,7 +10799,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, @@ -10664,7 +10818,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_5 ? 10 : 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .absorbPercentage = 50 }, @@ -10689,7 +10843,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, @@ -10710,7 +10864,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 70, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -10736,7 +10890,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -10762,7 +10916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 33 }, @@ -10785,7 +10939,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -10811,7 +10965,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -10834,7 +10988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10860,7 +11014,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -10869,7 +11023,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_SMART : CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_NASTY_PLOT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_NastyPlot, }, @@ -10885,7 +11039,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10906,7 +11060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -4, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -10928,7 +11082,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, @@ -10948,16 +11102,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_GHOST, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = C_UPDATED_MOVE_CATEGORIES >= GEN_6 ? CONTEST_CATEGORY_COOL : CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_ShadowClaw, }, @@ -10972,7 +11126,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11007,7 +11161,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11038,7 +11192,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11069,7 +11223,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11091,7 +11245,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -11116,9 +11270,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_PSYCHIC, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .slicingMove = TRUE, @@ -11140,7 +11294,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11166,7 +11320,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11191,7 +11345,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11216,7 +11370,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 85, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11242,7 +11396,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -11259,14 +11413,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Trick Room"), .description = COMPOUND_STRING( - "Slower Pokémon\nget to move " - "first\nfor 5 turns."), + "Slower Pokémon get\nto move " + "first for\n5 turns."), .effect = EFFECT_TRICK_ROOM, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = -7, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ACC_UP_1 }, @@ -11289,7 +11443,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11314,7 +11468,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11337,7 +11491,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11362,7 +11516,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11387,7 +11541,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11407,7 +11561,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, @@ -11432,9 +11586,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_POISON, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11461,7 +11615,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 80 : 70, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11486,7 +11640,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11512,7 +11666,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ballisticMove = TRUE, @@ -11533,15 +11687,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_ROCK, .accuracy = 80, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_StoneEdge, }, @@ -11556,7 +11710,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, @@ -11579,7 +11733,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_OPPONENTS_FIELD, + .target = TARGET_OPPONENTS_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -11590,7 +11744,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STEALTH_ROCK}, .battleAnimScript = gBattleAnimMove_StealthRock, }, @@ -11605,7 +11759,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -11628,7 +11782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -11640,11 +11794,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, + .sketchBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSION, #if B_UPDATED_MOVE_DATA >= GEN_6 .chance = 100, - #elif B_UPDATED_MOVE_DATA >= GEN_5 + #elif B_UPDATED_MOVE_DATA == GEN_5 .chance = 10, #else .chance = 31, @@ -11668,7 +11823,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .holdEffect = HOLD_EFFECT_PLATE }, @@ -11688,7 +11843,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11713,7 +11868,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11739,7 +11894,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 33 }, @@ -11762,7 +11917,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11783,9 +11938,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 90, .type = TYPE_BUG, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, @@ -11806,7 +11961,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -11831,7 +11986,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -11857,7 +12012,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 80, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 50 }, @@ -11880,7 +12035,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11903,7 +12058,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -11927,9 +12082,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 100, .type = TYPE_DRAGON, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_USER_MORE_EASILY_STARTLED, @@ -11943,12 +12098,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Lunar Dance"), .description = sHealingWishDescription, - .effect = EFFECT_HEALING_WISH, + .effect = EFFECT_LUNAR_DANCE, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = B_UPDATED_MOVE_FLAGS >= GEN_5, @@ -11972,7 +12127,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -11994,7 +12149,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 75 : 70, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -12019,7 +12174,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 50 : 80, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .nonVolatileStatus = MOVE_EFFECT_SLEEP }, @@ -12028,7 +12183,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .sketchBanned = (B_SKETCH_BANS >= GEN_9), .contestEffect = CONTEST_EFFECT_MAKE_FOLLOWING_MONS_NERVOUS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_DARK_VOID, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_DarkVoid, }, @@ -12044,7 +12199,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -12069,7 +12224,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = B_EXTRAPOLATED_MOVE_FLAGS, @@ -12094,7 +12249,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12102,7 +12257,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS == GEN_6, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .argument.twoTurnAttack = { .stringId = STRINGID_VANISHEDINSTANTLY, .status = STATE_PHANTOM_FORCE }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FEINT, @@ -12125,7 +12280,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -12134,7 +12289,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_HONE_CLAWS, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HoneClaws, }, @@ -12150,7 +12305,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_WIDE_GUARD }, @@ -12177,7 +12332,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -12200,7 +12355,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -12223,7 +12378,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : -7, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -12244,7 +12399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, @@ -12265,14 +12420,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .status = STATUS1_PSN_ANY }, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_Venoshock, }, @@ -12287,7 +12442,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -12312,7 +12467,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 2 : 3, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -12340,7 +12495,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -12364,7 +12519,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = B_UPDATED_MOVE_DATA >= GEN_6 ? 0 : -7, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -12387,7 +12542,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .damagesAirborne = TRUE, @@ -12395,7 +12550,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SmackDown, }, @@ -12408,7 +12563,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12416,7 +12571,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_StormThrow, }, @@ -12431,12 +12586,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FLAME_BURST, - .self = TRUE, }), .contestEffect = CONTEST_EFFECT_SHIFT_JUDGE_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, @@ -12456,7 +12610,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -12481,7 +12635,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -12505,7 +12659,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12529,7 +12683,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 10 : 15, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_SAME_TYPE, @@ -12550,14 +12704,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_FIRST .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AGILITY, COMBO_STARTER_CHARGE, COMBO_STARTER_ROCK_POLISH}, .battleAnimScript = gBattleAnimMove_ElectroBall, }, @@ -12572,7 +12726,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .type = TYPE_WATER }, @@ -12581,7 +12735,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Soak, }, @@ -12596,7 +12750,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12623,7 +12777,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -12648,7 +12802,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12674,7 +12828,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -12700,7 +12854,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12722,7 +12876,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .overwriteAbility = ABILITY_SIMPLE }, @@ -12746,14 +12900,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ENTRAINMENT, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Entrainment, }, @@ -12769,7 +12923,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -12795,7 +12949,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -12821,7 +12975,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -12842,7 +12996,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -12865,7 +13019,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -12889,13 +13043,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_WITH_GOOD_CONDITION, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_AMNESIA, COMBO_STARTER_HONE_CLAWS, COMBO_STARTER_CALM_MIND, COMBO_STARTER_NASTY_PLOT}, .battleAnimScript = gBattleAnimMove_StoredPower, }, @@ -12910,7 +13064,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_QUICK_GUARD, }, @@ -12937,7 +13091,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = B_UPDATED_MOVE_DATA >= GEN_7 ? 2 : 1, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -12961,7 +13115,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -12987,7 +13141,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -13012,7 +13166,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -13038,7 +13192,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 160 }, @@ -13046,7 +13200,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_FORCE_PALM, COMBO_STARTER_THUNDER_WAVE, COMBO_STARTER_INFERNO, COMBO_STARTER_WILL_O_WISP, COMBO_STARTER_LOVELY_KISS, COMBO_STARTER_SPORE, COMBO_STARTER_SING, COMBO_STARTER_YAWN, COMBO_STARTER_HYPNOSIS, COMBO_STARTER_DARK_VOID, COMBO_STARTER_GRASS_WHISTLE, COMBO_STARTER_SLEEP_POWDER, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES, COMBO_STARTER_GLARE}, .battleAnimScript = gBattleAnimMove_Hex, }, @@ -13061,19 +13215,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .gravityBanned = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .assistBanned = TRUE, + .assistBanned = B_UPDATED_MOVE_FLAGS >= GEN_6, .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKTARGETHIGH, .status = STATE_ON_AIR }, .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_SkyDrop, }, @@ -13088,7 +13242,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -13097,7 +13251,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_SHIFT_GEAR, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_ShiftGear, }, @@ -13111,7 +13265,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -6, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13120,7 +13274,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_ENTRAINMENT, COMBO_STARTER_PLAY_NICE}, .battleAnimScript = gBattleAnimMove_CircleThrow, }, @@ -13135,7 +13289,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13159,7 +13313,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -13182,7 +13336,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13204,7 +13358,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -13228,7 +13382,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13250,9 +13404,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .explosion = B_UPDATED_MOVE_FLAGS <= GEN_5, .mirrorMoveBanned = TRUE, .parentalBondBanned = TRUE, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, @@ -13273,7 +13428,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, @@ -13285,7 +13440,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CELEBRATE, COMBO_STARTER_COVET, COMBO_STARTER_HAPPY_HOUR, COMBO_STARTER_WISH}, .battleAnimScript = gBattleAnimMove_Bestow, }, @@ -13300,7 +13455,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 50, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13309,7 +13464,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }), .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_BEAUTY, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_INFERNO, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Inferno, }, @@ -13325,7 +13480,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -13347,7 +13502,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -13369,7 +13524,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .skyBattleBanned = TRUE, @@ -13389,12 +13544,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_AVOID_STARTLE, //CONTEST_EFFECT_QUICKLY_GROW_BORED .contestCategory = CONTEST_CATEGORY_COOL, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CHARGE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_VoltSwitch, }, @@ -13410,7 +13565,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13435,7 +13590,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .skyBattleBanned = TRUE, @@ -13459,7 +13614,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .alwaysCriticalHit = TRUE, @@ -13479,7 +13634,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -6, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13488,7 +13643,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_LATER, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_DRAGON_TAIL, - .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH}, + .contestComboMoves = {COMBO_STARTER_DRAGON_BREATH, COMBO_STARTER_DRAGON_DANCE, COMBO_STARTER_DRAGON_RAGE, COMBO_STARTER_DRAGON_RUSH, COMBO_STARTER_STEALTH_ROCK, COMBO_STARTER_SPIKES, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_DragonTail, }, @@ -13503,7 +13658,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -13528,7 +13683,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13538,7 +13693,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_Electroweb, }, @@ -13553,7 +13708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 25 }, @@ -13575,16 +13730,16 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 80, .type = TYPE_GROUND, .accuracy = 95, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_AFFECTED_BY_PREV_APPEAL, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_FOCUS_ENERGY}, .battleAnimScript = gBattleAnimMove_DrillRun, }, @@ -13599,7 +13754,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13622,7 +13777,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13646,7 +13801,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .absorbPercentage = 50 }, @@ -13668,7 +13823,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_6 ? 15 : 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13692,7 +13847,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13717,7 +13872,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13740,7 +13895,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13765,7 +13920,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -13792,7 +13947,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -13817,7 +13972,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -13840,7 +13995,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_REPETITION_NOT_BORING, @@ -13856,14 +14011,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Strikes the foe\nwith its " "tail 2 to\n5 times."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 25, .type = TYPE_NORMAL, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .multiHit = TRUE, .makesContact = TRUE, .contestEffect = CONTEST_EFFECT_QUALITY_DEPENDS_ON_TIMING, .contestCategory = CONTEST_CATEGORY_CUTE, @@ -13883,7 +14039,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 70, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -13897,7 +14053,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_MONS_WITH_GOOD_APPEALS, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_RAIN_DANCE}, .battleAnimScript = gBattleAnimMove_Hurricane, }, @@ -13912,7 +14068,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 25 }, @@ -13935,7 +14091,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 85, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .zMove = { .powerOverride = 180 }, @@ -13944,7 +14100,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_SHIFT_GEAR}, .battleAnimScript = gBattleAnimMove_GearGrind, }, @@ -13957,7 +14113,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -13983,7 +14139,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .holdEffect = HOLD_EFFECT_DRIVE }, @@ -14006,7 +14162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .status = STATUS1_SLEEP }, @@ -14035,7 +14191,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .slicingMove = TRUE, @@ -14058,7 +14214,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -14068,7 +14224,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_Glaciate, }, @@ -14083,7 +14239,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -14109,7 +14265,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 85, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -14134,7 +14290,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .danceMove = TRUE, @@ -14161,7 +14317,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -14190,7 +14346,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -14219,7 +14375,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -14247,7 +14403,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -14257,7 +14413,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_HAIL}, .battleAnimScript = gBattleAnimMove_IcicleCrash, }, @@ -14272,7 +14428,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .zMove = { .powerOverride = 220 }, @@ -14300,7 +14456,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -14322,7 +14478,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_LATER, @@ -14343,7 +14499,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .zMove = { .powerOverride = 170 }, @@ -14370,7 +14526,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_MAT_BLOCK, }, @@ -14400,7 +14556,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = TRUE, @@ -14429,7 +14585,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_ALL_BATTLERS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -14438,7 +14594,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_IMPROVE_CONDITION_PREVENT_NERVOUSNESS, .contestCategory = CONTEST_CATEGORY_TOUGH, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_ROTOTILLER, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Rototiller, }, @@ -14454,7 +14610,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_OPPONENTS_FIELD, + .target = TARGET_OPPONENTS_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -14465,7 +14621,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MON_WITH_JUDGES_ATTENTION, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_STRING_SHOT}, .battleAnimScript = gBattleAnimMove_StickyWeb, }, @@ -14480,7 +14636,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 25, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -14500,12 +14656,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, .makesContact = TRUE, - .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS == GEN_6, + .minimizeDoubleDamage = B_UPDATED_MOVE_FLAGS < GEN_7, .sleepTalkBanned = TRUE, .instructBanned = TRUE, .assistBanned = TRUE, @@ -14531,7 +14687,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .type = TYPE_GHOST }, @@ -14555,7 +14711,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -14580,7 +14736,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 25, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 1, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -14604,15 +14760,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, .healingMove = B_HEAL_BLOCKING >= GEN_6, .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_SMART, - .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboStarterId = COMBO_STARTER_PARABOLIC_CHARGE, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_ParabolicCharge, }, @@ -14627,7 +14783,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .type = TYPE_GRASS }, @@ -14651,7 +14807,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .windMove = TRUE, @@ -14677,7 +14833,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .type = TYPE_WATER }, @@ -14703,7 +14859,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -14726,7 +14882,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESTORE_REPLACEMENT_HP }, @@ -14751,7 +14907,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 0 : 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -14772,7 +14928,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 75 }, @@ -14796,7 +14952,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_CRAFTY_SHIELD }, @@ -14822,7 +14978,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, // The targeting of Flower Shield is handled through a script + .target = TARGET_ALL_BATTLERS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -14846,7 +15002,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -14871,7 +15027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -14896,14 +15052,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_PARABOLIC_CHARGE}, .battleAnimScript = gBattleAnimMove_Electrify, }, @@ -14918,7 +15074,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -14944,7 +15100,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -14966,7 +15122,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -14991,7 +15147,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -15014,7 +15170,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -15038,7 +15194,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_KINGS_SHIELD }, @@ -15067,7 +15223,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -15076,7 +15232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .magicCoatAffected = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_PLAY_NICE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_PlayNice, }, @@ -15092,7 +15248,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -15118,7 +15274,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -15145,7 +15301,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -15170,7 +15326,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresProtect = TRUE, @@ -15192,14 +15348,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Throws 2 to 5\nstars that " "are\nsure to strike\nfirst."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_SPECIES_POWER_OVERRIDE, .power = 15, .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = B_UPDATED_MOVE_DATA >= GEN_7 ? DAMAGE_CATEGORY_SPECIAL : DAMAGE_CATEGORY_PHYSICAL, + .argument = { + .speciesPowerOverride.species = SPECIES_GRENINJA_ASH, + .speciesPowerOverride.power = 20, + .speciesPowerOverride.numOfHits = 3 + }, + .multiHit = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -15218,7 +15380,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -15243,7 +15405,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_SPIKY_SHIELD }, @@ -15271,7 +15433,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_ALLY, + .target = TARGET_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, @@ -15296,7 +15458,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -15319,7 +15481,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -15327,7 +15489,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, - .contestComboMoves = {COMBO_STARTER_TOXIC}, + .contestComboMoves = {COMBO_STARTER_TOXIC, COMBO_STARTER_POISON_GAS, COMBO_STARTER_POISON_POWDER, COMBO_STARTER_TOXIC_SPIKES}, .battleAnimScript = gBattleAnimMove_VenomDrench, }, @@ -15342,7 +15504,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_2 }, @@ -15366,7 +15528,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -15392,7 +15554,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -15418,7 +15580,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -15426,7 +15588,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .mirrorMoveBanned = TRUE, .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_HAPPY_HOUR, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_HappyHour, }, @@ -15442,7 +15604,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -15467,7 +15629,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, @@ -15488,7 +15650,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -15502,7 +15664,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .assistBanned = TRUE, .contestEffect = CONTEST_EFFECT_EXCITE_AUDIENCE_IN_ANY_CONTEST, .contestCategory = CONTEST_CATEGORY_CUTE, - .contestComboStarterId = 0, + .contestComboStarterId = COMBO_STARTER_CELEBRATE, .contestComboMoves = {0}, .battleAnimScript = gBattleAnimMove_Celebrate, }, @@ -15518,7 +15680,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 40, - .target = MOVE_TARGET_ALLY, + .target = TARGET_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -15548,7 +15710,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 30, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -15571,7 +15733,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -15582,7 +15744,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, - .contestComboMoves = {0}, + .contestComboMoves = {COMBO_STARTER_CHARGE}, .battleAnimScript = gBattleAnimMove_Nuzzle, }, @@ -15595,7 +15757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -15617,7 +15779,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -15643,7 +15805,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -15669,7 +15831,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 75 }, @@ -15692,7 +15854,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .damagesAirborne = TRUE, @@ -15717,7 +15879,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -15743,7 +15905,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .skyBattleBanned = TRUE, @@ -15765,7 +15927,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .recoilPercentage = 50 }, @@ -15788,7 +15950,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -15811,10 +15973,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, + .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_IF_LAST, //CONTEST_EFFECT_EXCITES_AUDIENCE_MORE_IF_LAST .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, @@ -15831,7 +15994,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -15856,7 +16019,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, @@ -15886,7 +16049,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 5 : 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -15912,7 +16075,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 2, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .moveProperty = MOVE_FIRST_IMPRESSION }, @@ -15935,7 +16098,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_BANEFUL_BUNKER }, @@ -15963,7 +16126,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -15988,7 +16151,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16011,7 +16174,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .status = STATUS1_BURN }, @@ -16039,7 +16202,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16066,7 +16229,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -16092,7 +16255,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16114,7 +16277,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -16138,14 +16301,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, .slicingMove = TRUE, .sleepTalkBanned = TRUE, .instructBanned = TRUE, - .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .status = B_WEATHER_SUN }, + .argument.twoTurnAttack = { .stringId = STRINGID_PKMNTOOKSUNLIGHT, .weather = B_WEATHER_SUN }, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -16164,7 +16327,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, @@ -16185,7 +16348,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 3, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPDEF_UP_1 }, @@ -16212,7 +16375,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -16235,7 +16398,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 30, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ATK_UP_1 }, @@ -16260,7 +16423,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -16286,7 +16449,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16312,7 +16475,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -16334,7 +16497,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16360,12 +16523,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, + .skyBattleBanned = TRUE, .contestEffect = CONTEST_EFFECT_BETTER_WHEN_AUDIENCE_EXCITED, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = COMBO_STARTER_PSYCHIC_TERRAIN, @@ -16384,7 +16548,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16410,7 +16574,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16436,7 +16600,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16458,7 +16622,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -16485,7 +16649,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -16508,7 +16672,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16530,7 +16694,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_ALL_STATS_UP_1 }, @@ -16555,7 +16719,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .danceMove = TRUE, @@ -16577,7 +16741,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .zMove = { .powerOverride = 140 }, @@ -16602,7 +16766,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16628,7 +16792,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPATK_UP_1 }, @@ -16654,7 +16818,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = -3, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -16683,7 +16847,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, @@ -16710,7 +16874,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16732,7 +16896,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16764,7 +16928,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, @@ -16789,7 +16953,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = -3, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = TRUE, @@ -16817,7 +16981,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -16838,14 +17002,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Chomps with\npsychic fangs. " "\nDestroys any\nbarriers."), - .effect = EFFECT_BRICK_BREAK, + .effect = EFFECT_HIT, .power = 85, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BREAK_SCREEN, + .preAttackEffect = TRUE, + }), .makesContact = TRUE, .bitingMove = TRUE, .contestEffect = CONTEST_EFFECT_WORSEN_CONDITION_OF_PREV_MONS, @@ -16866,7 +17034,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16889,7 +17057,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -16914,7 +17082,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16936,7 +17104,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -16962,7 +17130,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -16982,14 +17150,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Steals the\ntarget's stat " "\nboosts, then\nattacks."), - .effect = EFFECT_SPECTRAL_THIEF, + .effect = EFFECT_HIT, .power = 90, .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEAL_STATS, + .preAttackEffect = TRUE, + }), .ignoresSubstitute = TRUE, .makesContact = TRUE, .metronomeBanned = TRUE, @@ -17011,7 +17183,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17035,7 +17207,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresTargetAbility = TRUE, @@ -17058,7 +17230,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_DEF_UP_1 }, @@ -17082,7 +17254,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17108,7 +17280,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .damagePercentage = 50 }, @@ -17131,7 +17303,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .holdEffect = HOLD_EFFECT_MEMORY }, @@ -17154,7 +17326,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -17177,7 +17349,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17204,7 +17376,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresTargetAbility = TRUE, @@ -17227,7 +17399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 2, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17254,7 +17426,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17277,7 +17449,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17303,7 +17475,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17326,7 +17498,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 20 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = B_UPDATED_MOVE_DATA >= GEN_8 ? 100 : 50 }, @@ -17347,7 +17519,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 20 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17369,7 +17541,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 20 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17393,7 +17565,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 95 : 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17415,7 +17587,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 95 : 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17437,7 +17609,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 90 : 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17460,7 +17632,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 90 : 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17482,7 +17654,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = B_UPDATED_MOVE_DATA >= GEN_8 ? 85 : 100, .pp = B_UPDATED_MOVE_DATA >= GEN_8 ? 5 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = B_UPDATED_MOVE_FLAGS < GEN_8, @@ -17504,7 +17676,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17524,7 +17696,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17554,7 +17726,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .mirrorMoveBanned = TRUE, @@ -17583,9 +17755,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 80, .type = TYPE_WATER, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_STARTLE_MONS_SAME_TYPE_APPEAL, @@ -17606,7 +17778,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17632,7 +17804,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -17656,7 +17828,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -17680,7 +17852,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .magicCoatAffected = TRUE, @@ -17702,7 +17874,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .argument = { .type = TYPE_PSYCHIC }, @@ -17721,12 +17893,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "The user attacks\ntwice. Two " "targets\nare hit once each."), - .effect = EFFECT_DRAGON_DARTS, + .effect = EFFECT_HIT, .power = 50, .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SMART, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .strikeCount = 2, @@ -17749,7 +17921,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_ALL_BATTLERS, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -17773,7 +17945,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .contestEffect = CONTEST_EFFECT_DONT_EXCITE_AUDIENCE, @@ -17794,7 +17966,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17816,7 +17988,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17839,7 +18011,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -17861,7 +18033,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -17888,7 +18060,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17912,7 +18084,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -17936,7 +18108,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -17962,7 +18134,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -17990,7 +18162,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .thawsUser = TRUE, @@ -18018,7 +18190,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18045,7 +18217,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18071,7 +18243,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -18098,7 +18270,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18125,7 +18297,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18148,7 +18320,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -18172,7 +18344,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18198,7 +18370,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -18224,7 +18396,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18251,7 +18423,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18277,7 +18449,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -18304,7 +18476,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_OBSTRUCT }, @@ -18330,7 +18502,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18353,7 +18525,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -18380,7 +18552,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18406,7 +18578,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18423,14 +18595,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Power goes up and\ndamages " "all foes\non Psychic\nTerrain."), - .effect = EFFECT_EXPANDING_FORCE, + .effect = EFFECT_TERRAIN_BOOST, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument.terrainBoost = { + .terrain = STATUS_FIELD_PSYCHIC_TERRAIN, + .percent = 50, + .groundCheck = GROUND_CHECK_USER, + .hitsBothFoes = TRUE, + }, .contestEffect = CONTEST_EFFECT_STARTLE_PREV_MONS, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -18449,7 +18627,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18467,19 +18645,22 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Shoots scales 2 to\n5 times. " "Ups\nSpeed, lowers\ndefense."), - .effect = EFFECT_MULTI_HIT, + .effect = EFFECT_HIT, .power = 25, .type = TYPE_DRAGON, .accuracy = 90, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, - .argument = { .moveProperty = MOVE_EFFECT_SCALE_SHOT }, + .multiHit = TRUE, .contestEffect = CONTEST_EFFECT_NEXT_APPEAL_EARLIER, .contestCategory = CONTEST_CATEGORY_COOL, .contestComboStarterId = 0, .contestComboMoves = {0}, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_SCALE_SHOT, + }), .battleAnimScript = gBattleAnimMove_ScaleShot, }, @@ -18494,7 +18675,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .instructBanned = TRUE, @@ -18522,7 +18703,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -18542,15 +18723,21 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hit everything and\nfaint. " "Powers up\non Misty Terrain."), - .effect = EFFECT_MISTY_EXPLOSION, + .effect = EFFECT_TERRAIN_BOOST, .power = 100, .type = TYPE_FAIRY, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .explosion = TRUE, .dampBanned = TRUE, + .argument.terrainBoost = { + .terrain = STATUS_FIELD_MISTY_TERRAIN, + .percent = 50, + .groundCheck = GROUND_CHECK_USER, + }, .contestEffect = CONTEST_EFFECT_GREAT_APPEAL_BUT_NO_MORE_MOVES, .contestCategory = CONTEST_CATEGORY_CUTE, .contestComboStarterId = 0, @@ -18569,7 +18756,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18587,14 +18774,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "This move's power\ndoubles " "when on\nElectric Terrain."), - .effect = EFFECT_RISING_VOLTAGE, + .effect = EFFECT_TERRAIN_BOOST, .power = 70, .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, + .argument.terrainBoost = { + .terrain = STATUS_FIELD_ELECTRIC_TERRAIN, + .percent = 100, + .groundCheck = GROUND_CHECK_TARGET, + }, .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, .contestComboStarterId = 0, @@ -18613,7 +18805,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .pulseMove = TRUE, @@ -18635,7 +18827,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18661,7 +18853,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -18680,14 +18872,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Lash Out"), .description = COMPOUND_STRING( - "If stats lowered\nduring this " - "turn,\npower is doubled."), + "If user's stats\nwere lowered " + "this\nturn, power is\ndoubled."), .effect = EFFECT_LASH_OUT, .power = 75, .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18709,7 +18901,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 90, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, @@ -18730,7 +18922,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 40, - .target = MOVE_TARGET_FOES_AND_ALLY, + .target = TARGET_FOES_AND_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .magicCoatAffected = TRUE, @@ -18752,7 +18944,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALLY, + .target = TARGET_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -18776,7 +18968,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18798,7 +18990,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18821,7 +19013,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18844,7 +19036,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -18870,7 +19062,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -18896,7 +19088,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18921,7 +19113,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -18947,7 +19139,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18973,7 +19165,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -18999,7 +19191,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -19025,7 +19217,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -19051,7 +19243,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19078,7 +19270,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -19100,7 +19292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -19122,7 +19314,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -19149,7 +19341,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19171,7 +19363,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19194,7 +19386,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -19215,7 +19407,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19237,7 +19429,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 80, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -19260,7 +19452,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19282,7 +19474,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_RANDOM, + .target = TARGET_RANDOM, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -19307,7 +19499,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .recoilPercentage = 33 }, @@ -19330,7 +19522,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 95, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .battleAnimScript = gBattleAnimMove_Chloroblast, @@ -19347,7 +19539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 85, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19368,7 +19560,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 20, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .danceMove = TRUE, @@ -19392,7 +19584,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19418,7 +19610,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .status = STATUS1_PSN_ANY }, @@ -19439,9 +19631,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 80 : 75, .type = TYPE_PSYCHIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_9 ? 100 : 90, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19463,7 +19655,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19484,7 +19676,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -19504,8 +19696,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 15, - .criticalHitStage = 1, - .target = MOVE_TARGET_SELECTED, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19530,7 +19722,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .status = STATUS1_ANY }, @@ -19552,7 +19744,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19574,7 +19766,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 80, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -19597,7 +19789,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 80, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -19620,7 +19812,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 80, .pp = B_UPDATED_MOVE_DATA >= GEN_9 ? 10 : 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, @@ -19643,7 +19835,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -19664,7 +19856,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .snatchAffected = TRUE, @@ -19684,7 +19876,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .forcePressure = TRUE, @@ -19706,7 +19898,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_SILK_TRAP }, @@ -19727,7 +19919,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19749,7 +19941,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, // Only since it isn't implemented yet @@ -19767,7 +19959,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -19783,12 +19975,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Boosts a user's\nstats " "depending on\nTatsugiri."), - .effect = EFFECT_ORDER_UP, + .effect = EFFECT_HIT, .power = 80, .type = TYPE_DRAGON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -19812,7 +20004,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19835,7 +20027,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .magicCoatAffected = TRUE, @@ -19854,7 +20046,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19877,7 +20069,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19898,7 +20090,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19912,15 +20104,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Foe attacks next\nturn can't " "miss\nand do double\ndamage."), - .effect = EFFECT_GLAIVE_RUSH, + .effect = EFFECT_HIT, .power = 120, .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_GLAIVE_RUSH, + .self = TRUE, + }), .battleAnimScript = gBattleAnimMove_GlaiveRush, }, @@ -19935,7 +20131,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -19957,7 +20153,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -19979,7 +20175,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 95, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -19998,7 +20194,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20021,7 +20217,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -20041,7 +20237,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RECOVER_HP }, @@ -20063,7 +20259,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20082,7 +20278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .alwaysCriticalHit = TRUE, @@ -20100,7 +20296,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -20124,7 +20320,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20148,9 +20344,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_BREAK_SCREEN, + .preAttackEffect = TRUE, + }), .makesContact = TRUE, .metronomeBanned = TRUE, .battleAnimScript = gBattleAnimMove_RagingBull, @@ -20167,7 +20367,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -20192,7 +20392,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 90, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .damagePercentage = 50 }, @@ -20214,7 +20414,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20233,7 +20433,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .makesContact = TRUE, @@ -20252,7 +20452,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_RESET_STATS }, @@ -20274,18 +20474,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Bad joke summons\nsnowstorm. " "The\nuser also switches\nout."), #endif - .effect = EFFECT_CHILLY_RECEPTION, + .effect = EFFECT_WEATHER_AND_SWITCH, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, .metronomeBanned = TRUE, + .argument = { .weatherType = (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL) ? BATTLE_WEATHER_HAIL : BATTLE_WEATHER_SNOW }, .battleAnimScript = gBattleAnimMove_ChillyReception, }, @@ -20300,7 +20501,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresProtect = TRUE, @@ -20316,20 +20517,20 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Summons a\nhailstorm that " "\nstrikes every turn."), - .effect = EFFECT_HAIL, #else .description = COMPOUND_STRING( "Summons a\nsnowstorm that " "\nlasts for five\nturns."), - .effect = EFFECT_SNOWSCAPE, #endif + .effect = EFFECT_WEATHER, .power = 0, .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_ALL_BATTLERS, + .target = TARGET_FIELD, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, + .argument = { .weatherType = (B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL) ? BATTLE_WEATHER_HAIL : BATTLE_WEATHER_SNOW }, .zMove = { .effect = Z_EFFECT_SPD_UP_1 }, .ignoresProtect = TRUE, .mirrorMoveBanned = TRUE, @@ -20352,7 +20553,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20375,7 +20576,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20402,7 +20603,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -20427,7 +20628,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20447,7 +20648,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .strikeCount = 2, @@ -20466,7 +20667,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20486,7 +20687,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .metronomeBanned = TRUE, @@ -20511,7 +20712,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .argument = { .absorbPercentage = 50 }, @@ -20532,7 +20733,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -20556,7 +20757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .cantUseTwice = TRUE, @@ -20569,14 +20770,18 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Retaliates\nstrongly against " "\nwho last hurt the\nuser."), - .effect = EFFECT_METAL_BURST, + .effect = EFFECT_REFLECT_DAMAGE, .power = 1, .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_DEPENDS, + .target = TARGET_DEPENDS, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument = { + .reflectDamage.damagePercent = 150, + .reflectDamage.damageCategories = 1u << DAMAGE_CATEGORY_PHYSICAL | 1u << DAMAGE_CATEGORY_SPECIAL, + }, .makesContact = TRUE, .meFirstBanned = TRUE, .metronomeBanned = TRUE, @@ -20596,9 +20801,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .power = 70, .type = TYPE_WATER, .accuracy = 100, - .criticalHitStage = 1, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, .pp = 20, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .slicingMove = TRUE, @@ -20614,7 +20819,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -20643,7 +20848,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -20672,7 +20877,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -20701,7 +20906,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -20730,7 +20935,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .mirrorMoveBanned = TRUE, @@ -20756,14 +20961,19 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "This move's power\nincreases " "when on\nElectric Terrain."), - .effect = EFFECT_PSYBLADE, + .effect = EFFECT_TERRAIN_BOOST, .power = 80, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .argument.terrainBoost = { + .terrain = STATUS_FIELD_ELECTRIC_TERRAIN, + .percent = 50, + .groundCheck = GROUND_CHECK_NONE, + }, .makesContact = TRUE, .slicingMove = TRUE, .battleAnimScript = gBattleAnimMove_Psyblade, @@ -20780,7 +20990,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .thawsUser = TRUE, @@ -20798,7 +21008,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .cantUseTwice = TRUE, @@ -20816,7 +21026,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 90, .pp = 15, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .absorbPercentage = 50 }, @@ -20841,7 +21051,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 85, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ballisticMove = TRUE, @@ -20864,8 +21074,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 100, .pp = 10, - .criticalHitStage = 1, - .target = MOVE_TARGET_SELECTED, + .criticalHitStage = B_UPDATED_MOVE_DATA >= GEN_3 ? 1 : 2, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .metronomeBanned = TRUE, @@ -20883,10 +21093,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, - .argument.twoTurnAttack = { .stringId = STRINGID_ELECTROSHOTCHARGING, .status = B_WEATHER_RAIN }, + .argument.twoTurnAttack = { .stringId = STRINGID_ELECTROSHOTCHARGING, .weather = B_WEATHER_RAIN }, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SP_ATK_PLUS_1, .self = TRUE, @@ -20907,7 +21117,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .assistBanned = TRUE, @@ -20928,7 +21138,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .battleAnimScript = gBattleAnimMove_FickleBeam, @@ -20945,7 +21155,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_BURNING_BULWARK }, @@ -20967,7 +21177,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 1, .category = DAMAGE_CATEGORY_SPECIAL, .contestEffect = CONTEST_EFFECT_BETTER_IF_FIRST, @@ -20985,7 +21195,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -21005,7 +21215,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .strikeCount = 2, @@ -21022,7 +21232,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -21040,7 +21250,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 15, - .target = MOVE_TARGET_ALLY, + .target = TARGET_ALLY, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .ignoresSubstitute = TRUE, @@ -21058,11 +21268,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSION, .onlyIfTargetRaisedStats = TRUE, @@ -21082,7 +21292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -21100,7 +21310,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 95, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -21122,11 +21332,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PSYCHIC_NOISE, .chance = 100, @@ -21145,7 +21355,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 100, .pp = 15, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 3, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, @@ -21167,7 +21377,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 100, .pp = 5, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -21189,7 +21399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, //determined from move type .battleAnimScript = gBattleAnimMove_BreakneckBlitz, @@ -21205,7 +21415,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_AllOutPummeling, @@ -21221,7 +21431,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SupersonicSkystrike, @@ -21237,7 +21447,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_AcidDownpour, @@ -21253,7 +21463,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, @@ -21270,7 +21480,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_ContinentalCrush, @@ -21286,7 +21496,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SavageSpinOut, @@ -21302,7 +21512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_NeverEndingNightmare, @@ -21318,7 +21528,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_CorkscrewCrash, @@ -21334,7 +21544,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_InfernoOverdrive, @@ -21350,7 +21560,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_HydroVortex, @@ -21366,7 +21576,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_BloomDoom, @@ -21382,7 +21592,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GigavoltHavoc, @@ -21398,7 +21608,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_ShatteredPsyche, @@ -21414,7 +21624,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SubzeroSlammer, @@ -21430,7 +21640,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_DevastatingDrake, @@ -21446,7 +21656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_BlackHoleEclipse, @@ -21462,7 +21672,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_TwinkleTackle, @@ -21478,7 +21688,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_Catastropika, @@ -21495,7 +21705,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .accuracy = 0, .criticalHitStage = 2, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .battleAnimScript = gBattleAnimMove_10000000VoltThunderbolt, @@ -21511,7 +21721,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .additionalEffects = ADDITIONAL_EFFECTS({ @@ -21531,7 +21741,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 0, .category = DAMAGE_CATEGORY_STATUS, .battleAnimScript = gBattleAnimMove_ExtremeEvoboost, @@ -21547,7 +21757,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_PulverizingPancake, @@ -21563,7 +21773,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .battleAnimScript = gBattleAnimMove_GenesisSupernova, @@ -21583,7 +21793,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SinisterArrowRaid, @@ -21599,9 +21809,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, + .minimizeDoubleDamage = TRUE, .battleAnimScript = gBattleAnimMove_MaliciousMoonsault, }, [MOVE_OCEANIC_OPERETTA] = @@ -21615,7 +21826,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .battleAnimScript = gBattleAnimMove_OceanicOperetta, @@ -21631,7 +21842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SplinteredStormshards, @@ -21647,7 +21858,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_LetsSnuggleForever, @@ -21663,7 +21874,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_BOTH, + .target = TARGET_BOTH, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .soundMove = TRUE, @@ -21686,7 +21897,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .argument = { .damagePercentage = 75 }, @@ -21703,7 +21914,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresTargetAbility = TRUE, @@ -21720,7 +21931,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresTargetAbility = TRUE, @@ -21737,7 +21948,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .ignoresTargetAbility = TRUE, @@ -21754,7 +21965,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 1, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_SoulStealing7StarStrike, @@ -21769,7 +21980,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_USER, + .target = TARGET_USER, .priority = 4, .category = DAMAGE_CATEGORY_STATUS, .argument = { .protectMethod = PROTECT_MAX_GUARD }, @@ -21787,7 +21998,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxFlare, @@ -21807,7 +22018,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxFlutterby, @@ -21827,7 +22038,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxLightning, @@ -21847,7 +22058,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxStrike, @@ -21867,7 +22078,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxKnuckle, @@ -21887,7 +22098,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxPhantasm, @@ -21907,7 +22118,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxHailstorm, @@ -21927,7 +22138,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxOoze, @@ -21947,7 +22158,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxGeyser, @@ -21967,7 +22178,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxAirstream, @@ -21987,7 +22198,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxStarfall, @@ -22007,7 +22218,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxWyrmwind, @@ -22027,7 +22238,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxMindstorm, @@ -22047,7 +22258,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxRockfall, @@ -22067,7 +22278,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .skyBattleBanned = B_EXTRAPOLATED_MOVE_FLAGS, @@ -22088,7 +22299,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxDarkness, @@ -22108,7 +22319,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxOvergrowth, @@ -22128,7 +22339,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_MaxSteelspike, @@ -22148,7 +22359,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxVineLash, @@ -22168,7 +22379,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxWildfire, @@ -22188,7 +22399,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxCannonade, @@ -22208,7 +22419,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_BUG, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxBefuddle, @@ -22228,7 +22439,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxVoltCrash, @@ -22248,7 +22459,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxGoldRush, @@ -22268,7 +22479,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIGHTING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxChiStrike, @@ -22288,7 +22499,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GHOST, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxTerror, @@ -22308,7 +22519,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxFoamBurst, @@ -22328,7 +22539,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ICE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxResonance, @@ -22348,7 +22559,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxCuddle, @@ -22368,7 +22579,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_NORMAL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxReplenish, @@ -22388,7 +22599,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_POISON, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxMalodor, @@ -22408,7 +22619,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxMeltdown, @@ -22428,7 +22639,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresTargetAbility = TRUE, @@ -22449,7 +22660,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresTargetAbility = TRUE, @@ -22470,7 +22681,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresTargetAbility = TRUE, @@ -22491,7 +22702,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FLYING, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxWindRage, @@ -22511,7 +22722,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_PSYCHIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxGravitas, @@ -22531,7 +22742,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxStonesurge, @@ -22551,7 +22762,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ROCK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxVolcalith, @@ -22571,7 +22782,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxTartness, @@ -22591,7 +22802,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GRASS, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxSweetness, @@ -22611,7 +22822,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_GROUND, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxSandblast, @@ -22631,7 +22842,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_ELECTRIC, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxStunShock, @@ -22651,7 +22862,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FIRE, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxCentiferno, @@ -22671,7 +22882,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxSmite, @@ -22692,7 +22903,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxSnooze, @@ -22712,7 +22923,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_FAIRY, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxFinale, @@ -22732,7 +22943,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_STEEL, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxSteelsurge, @@ -22752,7 +22963,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DRAGON, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .battleAnimScript = gBattleAnimMove_GMaxDepletion, @@ -22770,7 +22981,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_DARK, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, @@ -22786,7 +22997,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .type = TYPE_WATER, .accuracy = 0, .pp = 10, - .target = MOVE_TARGET_SELECTED, + .target = TARGET_SELECTED, .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .ignoresProtect = TRUE, diff --git a/src/data/pokemon/all_learnables.json b/src/data/pokemon/all_learnables.json new file mode 100644 index 000000000..16f5e9cea --- /dev/null +++ b/src/data/pokemon/all_learnables.json @@ -0,0 +1,89249 @@ +{ + "PINCURCHIN": [ + "MOVE_ACUPRESSURE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_LIQUIDATION", + "MOVE_MEMENTO", + "MOVE_MUDDY_WATER", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERCELL_SLAM", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_GUN", + "MOVE_WILD_CHARGE", + "MOVE_ZING_ZAP" + ], + "ARCHALUDON": [ + "MOVE_AURA_SPHERE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ELECTRO_SHOT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE" + ], + "ORBEETLE": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_PRESS", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIRROR_COAT", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STORED_POWER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_U_TURN", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "TINKATUFF": [ + "MOVE_ASTONISH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_COVET", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLASH_CANNON", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_HELPING_HAND", + "MOVE_ICE_HAMMER", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWEET_KISS", + "MOVE_SWORDS_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE" + ], + "SNOM": [ + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LUNGE", + "MOVE_MIRROR_COAT", + "MOVE_POUNCE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST" + ], + "GASTRODON": [ + "MOVE_ACID_ARMOR", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_LIQUIDATION", + "MOVE_MEMENTO", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "MARILL": [ + "MOVE_ALLURING_VOICE", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "CACTURNE": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COTTON_SPORE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NEEDLE_ARM", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROLE_PLAY", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "DARUMAKA_GALAR": [ + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_DIG", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FREEZE_DRY", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OVERHEAT", + "MOVE_POWDER_SNOW", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "CUBCHOO": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHEER_COLD", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_X_SCISSOR", + "MOVE_YAWN" + ], + "FLAMIGO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COPYCAT", + "MOVE_DETECT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MEGA_KICK", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "KLEAVOR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BATON_PASS", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_AXE", + "MOVE_STONE_EDGE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_X_SCISSOR" + ], + "ENTEI": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXTRASENSORY", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_FIRE", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP" + ], + "IMPIDIMP": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR" + ], + "CASCOON": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT", + "MOVE_TACKLE" + ], + "ESCAVALIER": [ + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_METAL_BURST", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_TWINEEDLE", + "MOVE_X_SCISSOR" + ], + "UMBREON": [ + "MOVE_ALLURING_VOICE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON" + ], + "SPECTRIER": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "KINGDRA": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BREAKING_SWIPE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_OCTAZOOKA", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "PIKACHU": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PAY_DAY", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZAP_CANNON" + ], + "SEVIPER": [ + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_INFESTATION", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LICK", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WRAP", + "MOVE_WRING_OUT", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "DARTRIX": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "CORPHISH": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRABHAMMER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GUILLOTINE", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_VICE_GRIP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "KARTANA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FALSE_SWIPE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAF_BLADE", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TOXIC", + "MOVE_VACUUM_WAVE", + "MOVE_X_SCISSOR" + ], + "ELEKID": [ + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGNET_RISE", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "SHROODLE": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_COPYCAT", + "MOVE_CROSS_POISON", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FURY_SWIPES", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VENOSHOCK" + ], + "HIPPOWDON": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_YAWN" + ], + "MUK_ALOLA": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MINIMIZE", + "MOVE_MOONBLAST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "SAMUROTT_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CEASELESS_EDGE", + "MOVE_CHILLING_WATER", + "MOVE_COPYCAT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DRILL_RUN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROCK_SMASH", + "MOVE_SACRED_SWORD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNOWSCAPE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "IRON_BOULDER": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_METEOR_BEAM", + "MOVE_MIGHTY_CLEAVE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SACRED_SWORD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BLADE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "HUNTAIL": [ + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "KYUREM_BLACK": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FREEZE_DRY", + "MOVE_FREEZE_SHOCK", + "MOVE_FRUSTRATION", + "MOVE_FUSION_BOLT", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "SUICUNE": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "SPINDA": [ + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GUARD_SPLIT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPOTLIGHT", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TEETER_DANCE", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "PALKIA": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_AURA_SPHERE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LIQUIDATION", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPACIAL_REND", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "CRABRAWLER": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CRABHAMMER", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VISE_GRIP", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "URSHIFU_SINGLE_STRIKE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BEAT_UP", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WICKED_BLOW", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DONDOZO": [ + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LIQUIDATION", + "MOVE_NOBLE_ROAR", + "MOVE_ORDER_UP", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SOAK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SHARPEDO": [ + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "CLAYDOL": [ + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "CINCCINO": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_SPINNER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TIDY_UP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "GLAMEOW": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "GOLURK": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_ZEN_HEADBUTT" + ], + "BUNEARY": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COTTON_GUARD", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_JUMP_KICK", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TEETER_DANCE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "MELMETAL": [ + "MOVE_ACID_ARMOR", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_DARKEST_LARIAT", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_IRON_BASH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC" + ], + "MEDICHAM": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_AXE_KICK", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "ARCANINE_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRAGON_PULSE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MORNING_SUN", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGING_FURY", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "DUSCLOPS": [ + "MOVE_ABSORB", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GRUDGE", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "IRON_TREADS": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MEGAHORN", + "MOVE_METAL_SOUND", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDER_FANG", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "ZOROARK_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITTER_MALICE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_COMEUPPANCE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "POLTEAGEIST": [ + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ASTONISH", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHELL_SMASH", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWEET_SCENT", + "MOVE_TEATIME", + "MOVE_TERA_BLAST", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM" + ], + "BRUTE_BONNET": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CLEAR_SMOG", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SYNTHESIS", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "SHIELDON": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GUARD_SPLIT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_SOUND", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD" + ], + "TREECKO": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "TYRANITAR": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "GRIMER": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_LICK", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "BRELOOM": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_VACUUM_WAVE", + "MOVE_VENOSHOCK", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "SEWADDLE": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_ME_FIRST", + "MOVE_MIND_READER", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED" + ], + "UNOWN": [ + "MOVE_HIDDEN_POWER" + ], + "DRACOVISH": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISHIOUS_REND", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "MIRAIDON": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ELECTRO_DRIFT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_COAT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PARABOLIC_CHARGE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "CLAMPERL": [ + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CLAMP", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "GLIMMORA": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ANCIENT_POWER", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MEMENTO", + "MOVE_METEOR_BEAM", + "MOVE_MORTAL_SPIN", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK" + ], + "ARBOK": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WRAP" + ], + "BEWEAR": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DARKEST_LARIAT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "INTELEON": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BREAKING_SWIPE", + "MOVE_CHILLING_WATER", + "MOVE_DARK_PULSE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METRONOME", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_BALL", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNIPE_SHOT", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "VOLCARONA": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIERY_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUIVER_DANCE", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "PORYGON": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHARPEN", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "DRIFLOON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GUST", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_MAGIC_COAT", + "MOVE_MEMENTO", + "MOVE_MINIMIZE", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP" + ], + "FURRET": [ + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TIDY_UP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "HONCHKROW": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_COMEUPPANCE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LASH_OUT", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "PINECO": [ + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK" + ], + "FORRETRESS": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MIRROR_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON" + ], + "NAGANADEL": [ + "MOVE_ACID", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_BREAKING_SWIPE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "MAGNEZONE": [ + "MOVE_ALLY_SWITCH", + "MOVE_BARRIER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_BOMB", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_COAT", + "MOVE_MIRROR_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_SPARK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "VAROOM": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LICK", + "MOVE_METAL_SOUND", + "MOVE_PARTING_SHOT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SPIN_OUT", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "STARLY": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "LICKITUNG": [ + "MOVE_ACID", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_WRAP", + "MOVE_WRING_OUT", + "MOVE_ZEN_HEADBUTT" + ], + "LINOONE": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PIN_MISSILE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIMPLE_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "MIENSHAO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "DROWZEE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_POISON_GAS", + "MOVE_POUND", + "MOVE_POWER_SPLIT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WAKE_UP_SLAP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "MEOWSTIC_F": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_ME_FIRST", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SNORLAX": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "VIBRAVA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "REGIELEKI": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGNET_RISE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_CAGE", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "CARVANHA": [ + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "REMORAID": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LOCK_ON", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OCTAZOOKA", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WHIRLPOOL" + ], + "MINCCINO": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TIDY_UP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP" + ], + "SOLGALEO": [ + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COSMIC_POWER", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUNSTEEL_STRIKE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DRACOZOLT": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BOLT_BEAK", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_DISCHARGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_WILD_CHARGE" + ], + "BASCULIN": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "WORMADAM_TRASH": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GUST", + "MOVE_GYRO_BALL", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOSHOCK" + ], + "CERULEDGE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_BITTER_BLADE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLEAR_SMOG", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DRAGON_CLAW", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR" + ], + "KABUTOPS": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_SHELL", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRING_OUT", + "MOVE_X_SCISSOR" + ], + "LARVITAR": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR" + ], + "NUMEL": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HOWL", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LAVA_PLUME", + "MOVE_MAGNITUDE", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "BRIONNE": [ + "MOVE_ACROBATICS", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP" + ], + "SALAMENCE": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_ZEN_HEADBUTT" + ], + "MEOWSTIC_M": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MIRACLE_EYE", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "WOOBAT": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_GYRO_BALL", + "MOVE_HEART_STAMP", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_NASTY_PLOT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_ZEN_HEADBUTT" + ], + "BEAUTIFLY": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUIVER_DANCE", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND" + ], + "PUMPKABOO": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_OR_TREAT", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WORRY_SEED" + ], + "NINCADA": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_BIDE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_LEECH_LIFE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "PARAS": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_DRAIN", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WIDE_GUARD", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "GENGAR": [ + "MOVE_ACID_SPRAY", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CORROSIVE_GAS", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LICK", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON" + ], + "HAPPINY": [ + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MINIMIZE", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "JIGGLYPUFF": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_PUNISHMENT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "NICKIT": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FOUL_PLAY", + "MOVE_HONE_CLAWS", + "MOVE_HOWL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT" + ], + "PIDGEOT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "KRICKETOT": [ + "MOVE_ABSORB", + "MOVE_BIDE", + "MOVE_BUG_BITE", + "MOVE_ENDEAVOR", + "MOVE_GROWL", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_POUND", + "MOVE_SKITTER_SMACK", + "MOVE_SNORE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_UPROAR" + ], + "DRAGAPULT": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRINE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_DARTS", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_NIGHT_SHADE", + "MOVE_OUTRAGE", + "MOVE_PHANTOM_FORCE", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "MIGHTYENA": [ + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_YAWN" + ], + "SEEDOT": [ + "MOVE_ABSORB", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED" + ], + "DIGLETT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FINAL_GAMBIT", + "MOVE_FISSURE", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_MAGNITUDE", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WORK_UP" + ], + "AMBIPOM": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "SNEASEL_HISUI": [ + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HONE_CLAWS", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "DEOXYS_ATTACK": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COSMIC_POWER", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_BOOST", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WRAP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "HOOTHOOT": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "CROCALOR": [ + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_WILL_O_WISP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "YANMA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_STEEL_WING", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "ZIGZAGOON_GALAR": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_COUNTER", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TENTACOOL": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "CHARIZARD": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SKY_DROP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "RABSCA": [ + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MEMENTO", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_REVIVAL_BLESSING", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "VIVILLON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POWDER", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND" + ], + "GRAFAIAI": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_BATON_PASS", + "MOVE_COPYCAT", + "MOVE_CROSS_POISON", + "MOVE_DIG", + "MOVE_DOODLE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "TOGEKISS": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIRROR_MOVE", + "MOVE_MOONBLAST", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLAY_ROUGH", + "MOVE_PLUCK", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "CUFANT": [ + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_GROWL", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MEGA_KICK", + "MOVE_MUD_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "PICHU": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZAP_CANNON" + ], + "ZIGZAGOON": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIMPLE_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "LITWICK": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_MEMENTO", + "MOVE_MINIMIZE", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP" + ], + "PALOSSAND": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SHORE_UP", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TOXIC", + "MOVE_TRICK" + ], + "KILOWATTREL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE" + ], + "GOGOAT": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_MILK_DRINK", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "MANTYKE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "LOUDRED": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CIRCLE_THROW", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MAGEARNA": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_AURORA_BEAM", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRAFTY_SHIELD", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FLEUR_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GEAR_UP", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BELL", + "MOVE_HEART_SWAP", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIND_READER", + "MOVE_MIRROR_SHOT", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHIFT_GEAR", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_SPEED_SWAP", + "MOVE_SPIKES", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_TRUMP_CARD", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "SALANDIT": [ + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BURNING_JEALOUSY", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP" + ], + "MISDREAVUS": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON" + ], + "PRINPLUP": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUND", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "MEOWTH_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_METAL_CLAW", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "TAPU_LELE": [ + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ASTONISH", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MOONBLAST", + "MOVE_NATURES_MADNESS", + "MOVE_NATURE_POWER", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM" + ], + "RATTATA": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAME_WHEEL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "CATERPIE": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_SNORE", + "MOVE_STRING_SHOT", + "MOVE_TACKLE" + ], + "KRABBY": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRABHAMMER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GUILLOTINE", + "MOVE_HAIL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "IRON_HANDS": [ + "MOVE_ARM_THRUST", + "MOVE_BELLY_DRUM", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CLOSE_COMBAT", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_GIGA_IMPACT", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SEISMIC_TOSS", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_VOLT_SWITCH", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE" + ], + "LUGIA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AEROBLAST", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "KIRLIA": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "ARCHEOPS": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "BOLDORE": [ + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGNITUDE", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "GOODRA": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIFE_DEW", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_POISON_TAIL", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "METANG": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_METEOR_MASH", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_ZEN_HEADBUTT" + ], + "AXEW": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" + ], + "RAGING_BOLT": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_HAMMER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_SCARY_FACE", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDERCLAP", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TWISTER", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "SANDYGAST": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SHORE_UP", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRICK" + ], + "APPLIN": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_DEFENSE_CURL", + "MOVE_DRACO_METEOR", + "MOVE_GRASSY_GLIDE", + "MOVE_POUNCE", + "MOVE_RECYCLE", + "MOVE_ROLLOUT", + "MOVE_SUCKER_PUNCH", + "MOVE_TERA_BLAST", + "MOVE_WITHDRAW" + ], + "AEGISLASH": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KINGS_SHIELD", + "MOVE_LASER_FOCUS", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_ZEN_HEADBUTT" + ], + "WATCHOG": [ + "MOVE_AFTER_YOU", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MEAN_LOOK", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "CHANSEY": [ + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EGG_BOMB", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "CALYREX": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_BATON_PASS", + "MOVE_BODY_PRESS", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CONFUSION", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWTH", + "MOVE_GUARD_SWAP", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_DRAIN", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_PAY_DAY", + "MOVE_POLLEN_PUFF", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "STARAVIA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TOGEPI": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOLLOW_ME", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MOONBLAST", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "MISMAGIUS": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_ME_FIRST", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "PORYGON2": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "CAMERUPT": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LAVA_PLUME", + "MOVE_MAGNITUDE", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "NECROZMA": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_AUTOTOMIZE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_SHOT", + "MOVE_MOONLIGHT", + "MOVE_MORNING_SUN", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PHOTON_GEYSER", + "MOVE_POWER_GEM", + "MOVE_PRISMATIC_LASER", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WRING_OUT", + "MOVE_X_SCISSOR" + ], + "UXIE": [ + "MOVE_ACROBATICS", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_POWER", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "TEDDIURSA": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON" + ], + "CUTIEFLY": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LAST_RESORT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_MOONBLAST", + "MOVE_PLAY_ROUGH", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POWDER", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STICKY_WEB", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WONDER_ROOM" + ], + "AMAURA": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "HOOPA_UNBOUND": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPERSPACE_FURY", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_NASTY_PLOT", + "MOVE_PHANTOM_FORCE", + "MOVE_POWER_SPLIT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "PANPOUR": [ + "MOVE_ACROBATICS", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WORK_UP" + ], + "SKWOVET": [ + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_GYRO_BALL", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR" + ], + "BRAVIARY_HISUI": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", + "MOVE_CRUSH_CLAW", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ESPER_WING", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "YAMASK_GALAR": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CRAFTY_SHIELD", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_GUARD_SPLIT", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAYBACK", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_THIEF", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "KROOKODILE": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR" + ], + "CHARJABUG": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR" + ], + "CROCONAW": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "CHANDELURE": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_MEMENTO", + "MOVE_MINIMIZE", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP" + ], + "MR_MIME": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_POWER_SHIFT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "YAMASK": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CRAFTY_SHIELD", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GRUDGE", + "MOVE_GUARD_SPLIT", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "WYNAUT": [ + "MOVE_AMNESIA", + "MOVE_CHARM", + "MOVE_COUNTER", + "MOVE_DESTINY_BOND", + "MOVE_ENCORE", + "MOVE_MIRROR_COAT", + "MOVE_SAFEGUARD", + "MOVE_SPLASH" + ], + "VULPIX_ALOLA": [ + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GRUDGE", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_MIST", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "LILEEP": [ + "MOVE_ACID", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_MEGA_DRAIN", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "FLYGON": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FIRST_IMPRESSION", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_NOISE", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE" + ], + "BLISSEY": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EGG_BOMB", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "SKRELP": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWISTER", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "GARCHOMP": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WHIRLPOOL" + ], + "SCEPTILE": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHED_TAIL", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "ROSELIA": [ + "MOVE_ABSORB", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POISON_STING", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "TAUROS_PALDEA_AQUA": [ + "MOVE_AQUA_JET", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LIQUIDATION", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGING_BULL", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MUNNA": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "MAWILE": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_BURST", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VICE_GRIP" + ], + "SYLVEON": [ + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "KINGLER": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRABHAMMER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HAIL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_X_SCISSOR" + ], + "NACLSTACK": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_SALT_CURE", + "MOVE_SANDSTORM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_ZEN_HEADBUTT" + ], + "PERSIAN_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_METAL_CLAW", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "SPEAROW": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "ORICORIO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DEFOG", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_ICY_WIND", + "MOVE_MIRROR_MOVE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVELATION_DANCE", + "MOVE_REVERSAL", + "MOVE_ROLE_PLAY", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "GABITE": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER" + ], + "SMOOCHUM": [ + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HEAL_BELL", + "MOVE_HEART_STAMP", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LICK", + "MOVE_LIGHT_SCREEN", + "MOVE_LOVELY_KISS", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_POUND", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "GLASTRIER": [ + "MOVE_ASSURANCE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LASH_OUT", + "MOVE_MEGAHORN", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "CYNDAQUIL": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_BURN_UP", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "PILOSWINE": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FREEZE_DRY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PECK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE" + ], + "VOLTORB_HISUI": [ + "MOVE_AGILITY", + "MOVE_BULLET_SEED", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_ICE_BALL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WORRY_SEED" + ], + "RAYQUAZA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COSMIC_POWER", + "MOVE_CRUNCH", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_ASCENT", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE" + ], + "SAWK": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DIG", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "UNFEZANT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BRAVE_BIRD", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LEER", + "MOVE_LUCKY_CHANT", + "MOVE_MORNING_SUN", + "MOVE_NIGHT_SLASH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "SHAYMIN_LAND": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AROMATHERAPY", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OMINOUS_WIND", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEED_FLARE", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "RAIKOU": [ + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "LILLIGANT": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "GHOLDENGO": [ + "MOVE_ASTONISH", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAKE_IT_RAIN", + "MOVE_MEMENTO", + "MOVE_METAL_SOUND", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK" + ], + "WAILORD": [ + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_NOBLE_ROAR", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "GRAVELER_ALOLA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_IRON_DEFENSE", + "MOVE_MAGNET_RISE", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WIDE_GUARD", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "MAROWAK_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BONEMERANG", + "MOVE_BONE_CLUB", + "MOVE_BONE_RUSH", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PERISH_SONG", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_BONE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "IRON_LEAVES": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PSYBLADE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_SACRED_SWORD", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "WURMPLE": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_POISON_STING", + "MOVE_SNORE", + "MOVE_STRING_SHOT", + "MOVE_TACKLE" + ], + "ELDEGOSS": [ + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SING", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "ROSERADE": [ + "MOVE_ABSORB", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POISON_STING", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "SWOOBAT": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_GYRO_BALL", + "MOVE_HEART_STAMP", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_NASTY_PLOT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_ZEN_HEADBUTT" + ], + "BRUXISH": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM" + ], + "VIKAVOLT": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR", + "MOVE_ZAP_CANNON" + ], + "KLEFKI": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRAFTY_SHIELD", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_LOCK", + "MOVE_FAIRY_WIND", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_SHOT", + "MOVE_MISTY_TERRAIN", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEEL_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM" + ], + "TANGROWTH": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CONSTRICT", + "MOVE_CUT", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POWER_SWAP", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VINE_WHIP", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT" + ], + "DUOSION": [ + "MOVE_ACID_ARMOR", + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_ROLLER", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "SHUCKLE": [ + "MOVE_ACID", + "MOVE_ACUPRESSURE", + "MOVE_AFTER_YOU", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GUARD_SPLIT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_ROLLER", + "MOVE_STICKY_WEB", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WITHDRAW", + "MOVE_WRAP" + ], + "TAPU_FINI": [ + "MOVE_AQUA_RING", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEAL_PULSE", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MIST", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MUDDY_WATER", + "MOVE_NATURES_MADNESS", + "MOVE_NATURE_POWER", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM" + ], + "BRAMBLEGHAST": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_BEAT_UP", + "MOVE_BLOCK", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DISABLE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE" + ], + "GLALIE": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "AVALUGG": [ + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHARPEN", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD" + ], + "PIDOVE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_LEER", + "MOVE_LUCKY_CHANT", + "MOVE_MORNING_SUN", + "MOVE_NIGHT_SLASH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "RUNERIGUS": [ + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CRAFTY_SHIELD", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "CHARCADET": [ + "MOVE_ASTONISH", + "MOVE_CLEAR_SMOG", + "MOVE_CONFUSE_RAY", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_INCINERATE", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WILL_O_WISP" + ], + "TERAPAGOS": [ + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_SCORCHING_SANDS", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SURF", + "MOVE_TAKE_DOWN", + "MOVE_TERA_STARSTORM", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_WITHDRAW", + "MOVE_ZEN_HEADBUTT" + ], + "PIGNITE": [ + "MOVE_ARM_THRUST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNITUDE", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "PECHARUNT": [ + "MOVE_ACID_SPRAY", + "MOVE_ASTONISH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_ENDURE", + "MOVE_FAKE_TEARS", + "MOVE_FOUL_PLAY", + "MOVE_GUNK_SHOT", + "MOVE_HEX", + "MOVE_IMPRISON", + "MOVE_MALIGNANT_CHAIN", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PARTING_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_GAS", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WITHDRAW" + ], + "TRUMBEAK": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BOOMBURST", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAME_CHARGE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_KNOCK_OFF", + "MOVE_MIRROR_MOVE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "SENTRET": [ + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TIDY_UP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "CROBAT": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TOGETIC": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MOONBLAST", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "GOLEM": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEAMROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "MEOWTH_GALAR": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CHARM", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "SERPERIOR": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PETAL_BLIZZARD", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "DUSTOX": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_POWDER", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_QUIVER_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND" + ], + "ELECTABUZZ": [ + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYWAVE", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "HONEDGE": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "JOLTEON": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON" + ], + "LILLIGANT_HISUI": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AIR_SLASH", + "MOVE_AXE_KICK", + "MOVE_BABY_DOLL_EYES", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_DEFOG", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_INGRAIN", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_METRONOME", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_SMASH", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VICTORY_DANCE", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "VELUZA": [ + "MOVE_AGILITY", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_RUN", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FILLET_AWAY", + "MOVE_FINAL_GAMBIT", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_PAIN_SPLIT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_SCALE_SHOT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_ZEN_HEADBUTT" + ], + "ESPEON": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "BUZZWOLE": [ + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DARKEST_LARIAT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_LEECH_LIFE", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MEGA_PUNCH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_VITAL_THROW", + "MOVE_WORK_UP" + ], + "CRADILY": [ + "MOVE_ACID", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "LYCANROC_MIDNIGHT": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "XERNEAS": [ + "MOVE_AROMATHERAPY", + "MOVE_AURORA_BEAM", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GEOMANCY", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HAIL", + "MOVE_HEAL_PULSE", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INGRAIN", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGAHORN", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "STARYU": [ + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZAP_CANNON" + ], + "ROTOM_HEAT": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "WISHIWASHI": [ + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL" + ], + "BIDOOF": [ + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATER_SPORT", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "TANDEMAUS": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_POPULATION_BOMB", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_U_TURN", + "MOVE_WATER_PULSE" + ], + "AERODACTYL": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WHIRLWIND", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "BARRASKEWDA": [ + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_RUN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_LASER_FOCUS", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "HITMONTOP": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_ICE_SPINNER", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_TRIPLE_KICK", + "MOVE_TWISTER", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "ROCKRUFF": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" + ], + "VENUSAUR": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "SLOWKING_GALAR": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CHILLY_RECEPTION", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EERIE_SPELL", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "MALAMAR": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POISON_JAB", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_TOPSY_TURVY", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "BLACEPHALON": [ + "MOVE_AFTER_YOU", + "MOVE_ASTONISH", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIND_BLOWN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "LINOONE_GALAR": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_COUNTER", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "POLIWRATH": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "WAILMER": [ + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "HAWLUCHA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CROSS_CHOP", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FLYING_PRESS", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_KARATE_CHOP", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUD_SPORT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "WHIMSICOTT": [ + "MOVE_ABSORB", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_GUST", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "SEISMITOAD": [ + "MOVE_ACID", + "MOVE_AFTER_YOU", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "LUNATONE": [ + "MOVE_ACROBATICS", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "VANILLITE": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AUTOTOMIZE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MIRROR_COAT", + "MOVE_MIRROR_SHOT", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE" + ], + "CHIEN_PAO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_MEAN_LOOK", + "MOVE_MIST", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RUINATION", + "MOVE_SACRED_SWORD", + "MOVE_SCARY_FACE", + "MOVE_SHEER_COLD", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP" + ], + "NUZLEAF": [ + "MOVE_ABSORB", + "MOVE_AIR_CUTTER", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "GIMMIGHOUL": [ + "MOVE_ASTONISH", + "MOVE_CONFUSE_RAY", + "MOVE_ENDURE", + "MOVE_HEX", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF" + ], + "CARBINK": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHARPEN", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM" + ], + "LUXRAY": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "STONJOURNER": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HARD_PRESS", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_METEOR_BEAM", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WIDE_GUARD", + "MOVE_WONDER_ROOM" + ], + "BUNNELBY": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "GOODRA_HISUI": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BUBBLE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LIFE_DEW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHELTER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "MANKEY": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "GOURGEIST": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_OR_TREAT", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WORRY_SEED" + ], + "KOMMO_O": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_AUTOTOMIZE", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLANGING_SCALES", + "MOVE_CLANGOROUS_SOUL", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "SLOWKING": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHILLY_RECEPTION", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_TRUMP_CARD", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "URSALUNA_BLOODMOON": [ + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BLOOD_MOON", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADLONG_RUSH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_METAL_CLAW", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_YAWN" + ], + "SPHEAL": [ + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "EMBOAR": [ + "MOVE_ARM_THRUST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLAST_BURN", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNITUDE", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "DUSKNOIR": [ + "MOVE_ABSORB", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GRUDGE", + "MOVE_HARD_PRESS", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "POOCHYENA": [ + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_YAWN" + ], + "SHIFTRY": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "INKAY": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_TOPSY_TURVY", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "MINIOR": [ + "MOVE_ACROBATICS", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "RIBOMBEE": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LAST_RESORT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_PLAY_ROUGH", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POWDER", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_STICKY_WEB", + "MOVE_STORED_POWER", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WONDER_ROOM" + ], + "KYUREM_WHITE": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FREEZE_DRY", + "MOVE_FRUSTRATION", + "MOVE_FUSION_FLARE", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_BURN", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "WEEZING": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_ZAP_CANNON" + ], + "TRUBBISH": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BELCH", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_MUD_SHOT", + "MOVE_MUD_SPORT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "KUBFU": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MEOWTH": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SLASH", + "MOVE_ODOR_SLEUTH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "SAMUROTT": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "POIPOLE": [ + "MOVE_ACID", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DRAGON_PULSE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GASTRO_ACID", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_NASTY_PLOT", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "DELCATTY": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIMPLE_BEAM", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SCREAM_TAIL": [ + "MOVE_AMNESIA", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_NOBLE_ROAR", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "MAGNETON": [ + "MOVE_BIDE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_BOMB", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MIRROR_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_SPARK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "BERGMITE": [ + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHARPEN", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WATER_PULSE" + ], + "MEWTWO": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_AURA_SPHERE", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DISABLE", + "MOVE_DISCHARGE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTRO_BALL", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYSTRIKE", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "MAKUHITA": [ + "MOVE_ARM_THRUST", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WAKE_UP_SLAP", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "ENAMORUS": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ASTONISH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEALING_WISH", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SMASH", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SPRINGTIDE_STORM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "RAMPARDOS": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "GLIGAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRABHAMMER", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GUILLOTINE", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LUNGE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "GROUDON": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRECIPICE_BLADES", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "LITTEN": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "CAPSAKID": [ + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_INGRAIN", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SANDSTORM", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "DRAGONITE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SKY_DROP", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WRAP", + "MOVE_ZAP_CANNON" + ], + "XURKITREE": [ + "MOVE_BIND", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_INGRAIN", + "MOVE_ION_DELUGE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_NATURE_POWER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAIL_GLOW", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WRAP", + "MOVE_ZAP_CANNON" + ], + "ZARUDE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLET_SEED", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HAMMER_ARM", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_JUNGLE_HEALING", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VINE_WHIP" + ], + "PHANTUMP": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BRANCH_POKE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FORESTS_CURSE", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GRUDGE", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_LEECH", + "MOVE_IMPRISON", + "MOVE_INGRAIN", + "MOVE_LASH_OUT", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_VENOM_DRENCH", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED" + ], + "BOMBIRDIER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_GEM", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "ALAKAZAM": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_KINESIS", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "ARAQUANID": [ + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIRROR_COAT", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPIDER_WEB", + "MOVE_SPIT_UP", + "MOVE_STICKY_WEB", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD", + "MOVE_WONDER_ROOM", + "MOVE_X_SCISSOR" + ], + "YUNGOOS": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_FANG", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "DARMANITAN": [ + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MYSTICAL_FIRE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "WHIRLIPEDE": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GYRO_BALL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEAMROLLER", + "MOVE_STEEL_ROLLER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "DIGLETT_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FINAL_GAMBIT", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNITUDE", + "MOVE_MEMENTO", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WORK_UP" + ], + "TORKOAL": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHELL_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WITHDRAW", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "CORSOLA": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_INGRAIN", + "MOVE_IRON_DEFENSE", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKE_CANNON", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "CHIMCHAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BLAZE_KICK", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SILICOBRA": [ + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_COIL", + "MOVE_DIG", + "MOVE_DRAGON_RUSH", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GLARE", + "MOVE_HEADBUTT", + "MOVE_LAST_RESORT", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WRAP" + ], + "BELLIBOLT": [ + "MOVE_ACID_SPRAY", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FLAIL", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PARABOLIC_CHARGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SOAK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "CETODDLE": [ + "MOVE_AMNESIA", + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_GROWL", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATER_PULSE", + "MOVE_YAWN" + ], + "RABOOT": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_COUNTER", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ELECTRO_BALL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HI_JUMP_KICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP" + ], + "FLETCHLING": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_ME_FIRST", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "ARCANINE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAGING_FURY", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "ROLYCOLY": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_GYRO_BALL", + "MOVE_HEAT_CRASH", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_WILL_O_WISP" + ], + "SWALOT": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE", + "MOVE_WRING_OUT", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "KABUTO": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MEGA_DRAIN", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRING_OUT" + ], + "NACLI": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_SANDSTORM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_ZEN_HEADBUTT" + ], + "DURANT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_X_SCISSOR" + ], + "GEODUDE_ALOLA": [ + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_IRON_DEFENSE", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WIDE_GUARD", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "GRAVELER": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNITUDE", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "FRIGIBAX": [ + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_HELPING_HAND", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST" + ], + "DUNSPARCE": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_DRILL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "VOLTORB": [ + "MOVE_AGILITY", + "MOVE_BIDE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "EXEGGUTOR": [ + "MOVE_ABSORB", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BARRAGE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EGG_BOMB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHTMARE", + "MOVE_POISON_POWDER", + "MOVE_POWER_SWAP", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "AGGRON": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "OINKOLOGNE_F": [ + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "GIRATINA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_FORCE", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WILL_O_WISP" + ], + "MAROWAK": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BONEMERANG", + "MOVE_BONE_CLUB", + "MOVE_BONE_RUSH", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PERISH_SONG", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_GUN" + ], + "LYCANROC_DUSK": [ + "MOVE_ACCELEROCK", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "LUNALA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BLIZZARD", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METEOR_BEAM", + "MOVE_MOONBLAST", + "MOVE_MOONGEIST_BEAM", + "MOVE_MOONLIGHT", + "MOVE_NIGHT_DAZE", + "MOVE_NIGHT_SHADE", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WIDE_GUARD", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP" + ], + "MAGBY": [ + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "SLOWPOKE": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAY_DAY", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "PANCHAM": [ + "MOVE_AERIAL_ACE", + "MOVE_ARM_THRUST", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VITAL_THROW", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DODRIO": [ + "MOVE_ACROBATICS", + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "MILTANK": [ + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEART_STAMP", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MILK_DRINK", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "LUDICOLO": [ + "MOVE_ABSORB", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "ALOMOMOLA": [ + "MOVE_ACROBATICS", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MISTY_TERRAIN", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "MAMOSWINE": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FREEZE_DRY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARD_PRESS", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MIST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PECK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE" + ], + "EELEKTRIK": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "MABOSSTIFF": [ + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_COMEUPPANCE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_JAW_LOCK", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE" + ], + "GRUBBIN": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR" + ], + "ARTICUNO": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRAVE_BIRD", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND" + ], + "PETILIL": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED" + ], + "DOTTLER": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFUSION", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GUARD_SWAP", + "MOVE_HELPING_HAND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_ROOM", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STORED_POWER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "LYCANROC_MIDDAY": [ + "MOVE_ACCELEROCK", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" + ], + "ZWEILOUS": [ + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_LASH_OUT", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "GURDURR": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HAMMER_ARM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "CONKELDURR": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "SQUAWKABILLY": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_COPYCAT", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FEATHER_DANCE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LASH_OUT", + "MOVE_MIMIC", + "MOVE_PARTING_SHOT", + "MOVE_PECK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "EKANS": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_FANG", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WRAP" + ], + "GROWLITHE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURN_UP", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_RAGE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAGING_FURY", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "ARON": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_RUSH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE" + ], + "GIBLE": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER" + ], + "DRIZZILE": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BOUNCE", + "MOVE_CHILLING_WATER", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLING", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_SHARD", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "MAGIKARP": [ + "MOVE_BOUNCE", + "MOVE_FLAIL", + "MOVE_HYDRO_PUMP", + "MOVE_SPLASH", + "MOVE_TACKLE" + ], + "MORPEKO": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_WHEEL", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_ICE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "SKITTY": [ + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIMPLE_BEAM", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SIRFETCHD": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_CUTTER", + "MOVE_GRASSY_GLIDE", + "MOVE_HELPING_HAND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_METEOR_ASSAULT", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SIMPLE_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_THROAT_CHOP", + "MOVE_WORK_UP" + ], + "TEPIG": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BURN_UP", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_MAGNITUDE", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "MORELULL": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_DRAIN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_SPOTLIGHT", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED" + ], + "JANGMO_O": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "SHAYMIN_SKY": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OMINOUS_WIND", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEED_FLARE", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "TYPHLOSION": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BLAST_BURN", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_BURN_UP", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DIALGA": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROAR_OF_TIME", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWISTER" + ], + "GOLEM_ALOLA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STEAMROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WIDE_GUARD", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "TAPU_KOKO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CONFIDE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FALSE_SWIPE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_MOVE", + "MOVE_NATURES_MADNESS", + "MOVE_NATURE_POWER", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WITHDRAW", + "MOVE_WORK_UP" + ], + "SWELLOW": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BOOMBURST", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TERRAKION": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "GYARADOS": [ + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPLASH", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZAP_CANNON" + ], + "DIPPLIN": [ + "MOVE_ASTONISH", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_HIT", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_OUTRAGE", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SYRUP_BOMB", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WITHDRAW" + ], + "STANTLER": [ + "MOVE_AGILITY", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_JUMP_KICK", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGIC_ROOM", + "MOVE_MEGAHORN", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHIELD_BASH", + "MOVE_PSYSHOCK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "WALKING_WAKE": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYDRO_STEAM", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MUD_SHOT", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "SLAKOTH": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLACK_OFF", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "DARKRAI": [ + "MOVE_AERIAL_ACE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DARK_VOID", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_X_SCISSOR" + ], + "JUMPLUFF": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "THUNDURUS": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAMMER_ARM", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILDBOLT_STORM", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "HORSEA": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_OCTAZOOKA", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "BANETTE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LICK", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "LUMINEON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "BEARTIC": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHEER_COLD", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_X_SCISSOR", + "MOVE_YAWN" + ], + "BASTIODON": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SPLIT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_GEM", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD" + ], + "ZOROARK": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_DAZE", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "SANDSLASH_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_NIGHT_SLASH", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "KLINK": [ + "MOVE_ASSURANCE", + "MOVE_AUTOTOMIZE", + "MOVE_BIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GEAR_GRIND", + "MOVE_GRAVITY", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHIFT_GEAR", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VICE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "REGIDRAGO": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CRUNCH", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_ENERGY", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TWISTER", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP" + ], + "ZORUA_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITTER_MALICE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_COMEUPPANCE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HEX", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SCRATCH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "LEDYBA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "TRANQUILL": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_LEER", + "MOVE_LUCKY_CHANT", + "MOVE_MORNING_SUN", + "MOVE_NIGHT_SLASH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "SINISTCHA": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_CALM_MIND", + "MOVE_CURSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LEAF_STORM", + "MOVE_LIFE_DEW", + "MOVE_MAGICAL_LEAF", + "MOVE_MATCHA_GOTCHA", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WITHDRAW" + ], + "MOLTRES_GALAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_BRAVE_BIRD", + "MOVE_DARK_PULSE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIERY_WRATH", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_U_TURN", + "MOVE_WING_ATTACK" + ], + "BULBASAUR": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "NYMBLE": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_COUNTER", + "MOVE_DOUBLE_KICK", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCREECH", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "CHINCHOU": [ + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEAL_BELL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_ION_DELUGE", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "URSHIFU_RAPID_STRIKE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURGING_STRIKES", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "VIRIZION": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "DOUBLADE": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_ZEN_HEADBUTT" + ], + "PARASECT": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_DRAIN", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WIDE_GUARD", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "DELPHOX": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BLAST_BURN", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "RAICHU": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PAY_DAY", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZAP_CANNON" + ], + "SHELMET": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_MEGA_DRAIN", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_YAWN" + ], + "GEODUDE": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_MAGNITUDE", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "VENONAT": [ + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_POISON_FANG", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "KADABRA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KINESIS", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "DREDNAW": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_JAW_LOCK", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_METEOR_BEAM", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SHELL_SMASH", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "CURSOLA": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEAD_SMASH", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_PERISH_SONG", + "MOVE_PIN_MISSILE", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_THROAT_CHOP", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILL_O_WISP" + ], + "GOTHITELLE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_METRONOME", + "MOVE_MIRACLE_EYE", + "MOVE_MIRROR_COAT", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "HAXORUS": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" + ], + "TOXICROAK": [ + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BELCH", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CROSS_POISON", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMELLING_SALTS", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "DRUDDIGON": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC" + ], + "OCTILLERY": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LIQUIDATION", + "MOVE_LOCK_ON", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OCTAZOOKA", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WHIRLPOOL", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "HAUNTER": [ + "MOVE_ACID_SPRAY", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON" + ], + "THROH": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAT_BLOCK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_VITAL_THROW", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "CLOBBOPUS": [ + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_DETECT", + "MOVE_DIVE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MEGA_PUNCH", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WORK_UP" + ], + "SKIPLOOM": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "ORANGURU": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INSTRUCT", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "WOOPER": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "QUAQUAVAL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_AQUA_STEP", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_HIT", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MISTY_TERRAIN", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "CLAUNCHER": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRABHAMMER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL" + ], + "VULLABY": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BRAVE_BIRD", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FEATHER_DANCE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_MOVE", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND" + ], + "LITLEO": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NOBLE_ROAR", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "GRIMMSNARL": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SURRENDER", + "MOVE_FIRE_PUNCH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIRIT_BREAK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM" + ], + "ANNIHILAPE": [ + "MOVE_ACROBATICS", + "MOVE_ASSURANCE", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAGE_FIST", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE" + ], + "GOSSIFLEUR": [ + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SING", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_WORRY_SEED" + ], + "HOUNDSTONE": [ + "MOVE_ALLY_SWITCH", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LAST_RESPECTS", + "MOVE_LICK", + "MOVE_MEMENTO", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_YAWN" + ], + "SEADRA": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_OCTAZOOKA", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "GRIMER_ALOLA": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "DOLLIV": [ + "MOVE_ABSORB", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL" + ], + "PYROAR": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NOBLE_ROAR", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "TAPU_BULU": [ + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_DARKEST_LARIAT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DUAL_CHOP", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LEAFAGE", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MEAN_LOOK", + "MOVE_MEGAHORN", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_PUNCH", + "MOVE_NATURES_MADNESS", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_WHIRLWIND", + "MOVE_WITHDRAW", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "TATSUGIRI": [ + "MOVE_BATON_PASS", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_LUNGE", + "MOVE_MEMENTO", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "CRESSELIA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNAR_BLESSING", + "MOVE_LUNAR_DANCE", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIST", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_GEM", + "MOVE_POWER_SHIFT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "CRAWDAUNT": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRABHAMMER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_VICE_GRIP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "MACHAMP": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_TRICK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "HOPPIP": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "GREAT_TUSK": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADLONG_RUSH", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SPINNER", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MEGAHORN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" + ], + "WOOPER_PALDEA": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SPIKES", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_YAWN" + ], + "KARRABLAST": [ + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "FLAAFFY": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "NOIBAT": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LEECH_LIFE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "BELLSPROUT": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "OKIDOGI": [ + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARD_PRESS", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_OUTRAGE", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR" + ], + "CORVIKNIGHT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "MOTHIM": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VENOSHOCK" + ], + "PIDGEY": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "SIZZLIPEDE": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BURN_UP", + "MOVE_COIL", + "MOVE_CRUNCH", + "MOVE_DEFENSE_CURL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_LASH", + "MOVE_FIRE_SPIN", + "MOVE_FLAME_WHEEL", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCORCHING_SANDS", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_VENOSHOCK", + "MOVE_WRAP" + ], + "KLINKLANG": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_AUTOTOMIZE", + "MOVE_BIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GEAR_GRIND", + "MOVE_GEAR_UP", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHIFT_GEAR", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_VICE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "TRAPINCH": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC" + ], + "OINKOLOGNE": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "MASCHIFF": [ + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_ICE_FANG", + "MOVE_JAW_LOCK", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE" + ], + "RHYDON": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SPLIT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MAGNITUDE", + "MOVE_MEGAHORN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_BURST", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WHIRLPOOL", + "MOVE_ZAP_CANNON" + ], + "VENOMOTH": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_FANG", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYWAVE", + "MOVE_QUIVER_DANCE", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "VILEPLUME": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "ZUBAT": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "TAUROS_PALDEA_BLAZE": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAGING_BULL", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "FERROTHORN": [ + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_MIRROR_SHOT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WORRY_SEED" + ], + "NATU": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "GROOKEY": [ + "MOVE_ACROBATICS", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRANCH_POKE", + "MOVE_BULLET_SEED", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HAMMER_ARM", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "SANDSLASH": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_MAGNITUDE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "PALAFIN": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BOUNCE", + "MOVE_BULK_UP", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_HIT", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HARD_PRESS", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_JET_PUNCH", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "QUILAVA": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BURNING_JEALOUSY", + "MOVE_BURN_UP", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "HELIOPTILE": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRIFY", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GLARE", + "MOVE_GRASS_KNOT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_PARABOLIC_CHARGE", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "LUXIO": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "SLIGGOO_HISUI": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SHELTER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "XATU": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "MEW": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CORROSIVE_GAS", + "MOVE_COSMIC_POWER", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DRILL_RUN", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_EGG_BOMB", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRENZY_PLANT", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARD_PRESS", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HURRICANE", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MAGNET_RISE", + "MOVE_MEGAHORN", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PETAL_BLIZZARD", + "MOVE_PHANTOM_FORCE", + "MOVE_PIN_MISSILE", + "MOVE_PLAY_ROUGH", + "MOVE_PLUCK", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POLLEN_PUFF", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_POUND", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_QUASH", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_RAZOR_WIND", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPEED_SWAP", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRANSFORM", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "GENESECT": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_BLAZE_KICK", + "MOVE_BLIZZARD", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUNK_SHOT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_BOMB", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TECHNO_BLAST", + "MOVE_TELEKINESIS", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_X_SCISSOR", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "GALLADE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AQUA_CUTTER", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WIDE_GUARD", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "ROTOM_WASH": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "OMASTAR": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHELL_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPIKE_CANNON", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WRING_OUT" + ], + "REGICE": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAIL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LOCK_ON", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_ZAP_CANNON" + ], + "SLURPUFF": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WISH", + "MOVE_YAWN" + ], + "AMPHAROS": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ION_DELUGE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_OUTRAGE", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "COMBUSKEN": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "MANECTRIC": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "FARFETCHD_GALAR": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_CUTTER", + "MOVE_HELPING_HAND", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SIMPLE_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_THROAT_CHOP", + "MOVE_WORK_UP" + ], + "COSMOEM": [ + "MOVE_COSMIC_POWER", + "MOVE_TELEPORT" + ], + "MAUSHOLD": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COPYCAT", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FOLLOW_ME", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_POPULATION_BOMB", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TIDY_UP", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATER_PULSE" + ], + "WORMADAM_PLANT": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GUST", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "FURFROU": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_ODOR_SLEUTH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MEOWSCARADA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AURA_SPHERE", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COPYCAT", + "MOVE_DARK_PULSE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FLOWER_TRICK", + "MOVE_FOUL_PLAY", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_POLLEN_PUFF", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "RELICANTH": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LIQUIDATION", + "MOVE_MAGNITUDE", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SEALEO": [ + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "SEAKING": [ + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL" + ], + "FLABEBE": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WISH", + "MOVE_WORRY_SEED" + ], + "DECIDUEYE_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLET_SEED", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFUSE_RAY", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_ARROWS", + "MOVE_UPPER_HAND", + "MOVE_U_TURN" + ], + "GRANBULL": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMELLING_SALTS", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "ROOKIDEE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_DEFOG", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_ATTACK", + "MOVE_HONE_CLAWS", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "DACHSBUN": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LAST_RESORT", + "MOVE_LICK", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "SCIZOR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_VENOSHOCK", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "VENIPEDE": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GYRO_BALL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEAMROLLER", + "MOVE_STEEL_ROLLER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "ELECTRIKE": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "LANDORUS": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HAMMER_ARM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSEAR_STORM", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL" + ], + "GOLETT": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC" + ], + "SPINARAK": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PURSUIT", + "MOVE_RAGE_POWDER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_SNEAK", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_SPIDER_WEB", + "MOVE_SPITE", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TOXIC_THREAD", + "MOVE_TRAILBLAZE", + "MOVE_TWINEEDLE", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "PANGORO": [ + "MOVE_AERIAL_ACE", + "MOVE_ARM_THRUST", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_IRON_HEAD", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VITAL_THROW", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "POLIWHIRL": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPNOSIS", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "SNUBBULL": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMELLING_SALTS", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "TYROGUE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FOCUS_ENERGY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "LILLIPUP": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "BLITZLE": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGNET_RISE", + "MOVE_ME_FIRST", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "HATENNA": [ + "MOVE_AFTER_YOU", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_IMPRISON", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NUZZLE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM" + ], + "TIRTOUGA": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_ZEN_HEADBUTT" + ], + "WYRDEER": [ + "MOVE_AGILITY", + "MOVE_ASTONISH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHIELD_BASH", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "FROSLASS": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRIPLE_AXEL", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP" + ], + "TORCHIC": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "ANORITH": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUG_BITE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_X_SCISSOR" + ], + "TORTERRA": [ + "MOVE_ABSORB", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEADLONG_RUSH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "PANSEAR": [ + "MOVE_ACROBATICS", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "SWINUB": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FREEZE_DRY", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE" + ], + "INDEEDEE_M": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_LAST_RESORT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", + "MOVE_PAY_DAY", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "RAPIDASH_GALAR": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DRILL_RUN", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MAGIC_ROOM", + "MOVE_MEGAHORN", + "MOVE_MISTY_TERRAIN", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TRICK_ROOM", + "MOVE_WILD_CHARGE", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "HATTERENE": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_POWDER", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NUZZLE", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SWAP", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM" + ], + "DITTO": [ + "MOVE_TRANSFORM" + ], + "GRENINJA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAT_BLOCK", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SHURIKEN", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP" + ], + "PUPITAR": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR" + ], + "HOUNDOUR": [ + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_COMEUPPANCE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMOG", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "PASSIMIAN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BESTOW", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WORK_UP" + ], + "DUSKULL": [ + "MOVE_ABSORB", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_GRUDGE", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "AZUMARILL": [ + "MOVE_ALLURING_VOICE", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_STEEL_ROLLER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TREVENANT": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BLOCK", + "MOVE_BRANCH_POKE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FOCUS_BLAST", + "MOVE_FORESTS_CURSE", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GRUDGE", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_VENOM_DRENCH", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "PONYTA_GALAR": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_DRILL", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "PIDGEOTTO": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "BEHEEYEM": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIRACLE_EYE", + "MOVE_NASTY_PLOT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SYNCHRONOISE", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "AZELF": [ + "MOVE_ACROBATICS", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_POWER", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "PHANPY": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_SHARD", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_GUN" + ], + "MAREEP": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "SPIRITOMB": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LASH_OUT", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "PORYGON_Z": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SHIFT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "RELLOR": [ + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_COSMIC_POWER", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_GUNK_SHOT", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEMENTO", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SAND_ATTACK", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_WEATHER_BALL", + "MOVE_X_SCISSOR" + ], + "WARTORTLE": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHELL_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WAVE_CRASH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "DARUMAKA": [ + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SOLROCK": [ + "MOVE_ACROBATICS", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "HO_OH": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SACRED_FIRE", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "GOLDUCK": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "INCINEROAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_DARKEST_LARIAT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "BAGON": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_ZEN_HEADBUTT" + ], + "CORSOLA_GALAR": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GRUDGE", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEAD_SMASH", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_THROAT_CHOP", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILL_O_WISP" + ], + "RATICATE": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAME_WHEEL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "AMOONGUSS": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "PANSAGE": [ + "MOVE_ACROBATICS", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKY_SHIELD", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "MUSHARNA": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MISTY_EXPLOSION", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "LAMPENT": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_LASH_OUT", + "MOVE_MEMENTO", + "MOVE_MINIMIZE", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP" + ], + "BLAZIKEN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HI_JUMP_KICK", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "KELDEO": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGAHORN", + "MOVE_MUDDY_WATER", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SECRET_SWORD", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "SOBBLE": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BOUNCE", + "MOVE_CHILLING_WATER", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_SHARD", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "BALTOY": [ + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "PERRSERKER": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "QWILFISH": [ + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BARB_BARRAGE", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "ALCREMIE": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLURING_VOICE", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DECORATE", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MYSTICAL_FIRE", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM" + ], + "GOOMY": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHELTER", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "HYPNO": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_POISON_GAS", + "MOVE_POUND", + "MOVE_POWER_SPLIT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WAKE_UP_SLAP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "BRONZONG": [ + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HEAL_BLOCK", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_SPINNER", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAYBACK", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "TOXTRICITY_AMPED": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BOOMBURST", + "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_DISCHARGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEER", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NOBLE_ROAR", + "MOVE_NUZZLE", + "MOVE_OVERDRIVE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_NOISE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHIFT_GEAR", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "KROKOROK": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR" + ], + "HAKAMO_O": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "ZERAORA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_AURA_SPHERE", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_PLASMA_FISTS", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "FARFETCHD": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAIL", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SIMPLE_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP" + ], + "ODDISH": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "WEEDLE": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT" + ], + "COPPERAJAH": [ + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HARD_PRESS", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MEGA_KICK", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "CALYREX_SHADOW": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ASSURANCE", + "MOVE_ASTRAL_BARRAGE", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWTH", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_DRAIN", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PHANTOM_FORCE", + "MOVE_POLLEN_PUFF", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPEED_SWAP", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "DIANCIE": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_BATON_PASS", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIAMOND_STORM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURE_POWER", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHARPEN", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM" + ], + "NOIVERN": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_MOONLIGHT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "METAGROSS": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_METEOR_MASH", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_ZEN_HEADBUTT" + ], + "LOKIX": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_AXE_KICK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_COUNTER", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SPITE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "LECHONK": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "BUIZEL": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_ME_FIRST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SONIC_BOOM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL" + ], + "ESPATHRA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_PECK", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUMINA_CRASH", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SANDSTORM", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "SNEASLER": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DIG", + "MOVE_DIRE_CLAW", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "JYNX": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEART_STAMP", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LICK", + "MOVE_LIGHT_SCREEN", + "MOVE_LOVELY_KISS", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRACLE_EYE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_POUND", + "MOVE_POWDER_SNOW", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WRING_OUT", + "MOVE_ZEN_HEADBUTT" + ], + "GOREBYSS": [ + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHELL_SMASH", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL" + ], + "BARBOACH": [ + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MAGNITUDE", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TSAREENA": [ + "MOVE_ACROBATICS", + "MOVE_ACUPRESSURE", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PUNISHMENT", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPLASH", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_TROP_KICK", + "MOVE_U_TURN", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "HARIYAMA": [ + "MOVE_ARM_THRUST", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEADLONG_RUSH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WAKE_UP_SLAP", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "JIRACHI": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOOM_DESIRE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_METEOR_MASH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TOEDSCOOL": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEX", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRICK_ROOM", + "MOVE_VENOSHOCK", + "MOVE_WRAP" + ], + "MARACTUS": [ + "MOVE_ABSORB", + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_NATURE_POWER", + "MOVE_NEEDLE_ARM", + "MOVE_PECK", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED" + ], + "ONIX": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WIDE_GUARD" + ], + "MANTINE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "QUAXLY": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_CHILLING_WATER", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_HIT", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MISTY_TERRAIN", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WHIRLPOOL", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "MANAPHY": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLURING_VOICE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEAL_BELL", + "MOVE_HEART_SWAP", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_GLOW", + "MOVE_TAKE_HEART", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TALONFLAME": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_ME_FIRST", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "CLEFAIRY": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BELLY_DRUM", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_METEOR_MASH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_SPOTLIGHT", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "SKIDDO": [ + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_LEECH", + "MOVE_IRON_TAIL", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_MILK_DRINK", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "SIGILYPH": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIRACLE_EYE", + "MOVE_MIRROR_MOVE", + "MOVE_PLUCK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "CELEBI": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHTMARE", + "MOVE_PERISH_SONG", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TELEKINESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "LUVDISC": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEAL_PULSE", + "MOVE_HEART_STAMP", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LUCKY_CHANT", + "MOVE_MIMIC", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WISH" + ], + "ABSOL": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MEGAHORN", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "CRABOMINABLE": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HARD_PRESS", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_HAMMER", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "NIHILEGO": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ALLY_SWITCH", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_CHARGE_BEAM", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CORROSIVE_GAS", + "MOVE_CROSS_POISON", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SPLIT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_GEM", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK_ROOM", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "CUBONE": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BONEMERANG", + "MOVE_BONE_CLUB", + "MOVE_BONE_RUSH", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PERISH_SONG", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_GUN" + ], + "CETITAN": [ + "MOVE_AMNESIA", + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATER_PULSE", + "MOVE_YAWN" + ], + "PAWNIARD": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GRASS_KNOT", + "MOVE_GUILLOTINE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEAN_LOOK", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "ILLUMISE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TING_LU": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_LASH_OUT", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_RUINATION", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "PROBOPASS": [ + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_BOMB", + "MOVE_MAGNET_RISE", + "MOVE_MAGNITUDE", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_WIDE_GUARD", + "MOVE_ZAP_CANNON" + ], + "NOCTOWL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "HATTREM": [ + "MOVE_AFTER_YOU", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_IMPRISON", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NUZZLE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM" + ], + "SLOWPOKE_GALAR": [ + "MOVE_ACID", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FOUL_PLAY", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_PAY_DAY", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "DUBWOOL": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_COPYCAT", + "MOVE_COTTON_GUARD", + "MOVE_COUNTER", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GROWL", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_LAST_RESORT", + "MOVE_MEGA_KICK", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_WAVE", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "TYPE_NULL": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_CONFIDE", + "MOVE_CRUSH_CLAW", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAME_CHARGE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_MAGIC_COAT", + "MOVE_METAL_SOUND", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "DEOXYS_SPEED": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_BOOST", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "BONSLY": [ + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LOW_KICK", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR" + ], + "BRAVIARY": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "NIDORAN_F": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE" + ], + "CHESPIN": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WIDE_GUARD", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "MANDIBUZZ": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BONE_RUSH", + "MOVE_BRAVE_BIRD", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FEATHER_DANCE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_MOVE", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND" + ], + "POLIWAG": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPNOSIS", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "TAILLOW": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BOOMBURST", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "BRAIXEN": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "FEAROW": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "SLUGMA": [ + "MOVE_ACID_ARMOR", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FRUSTRATION", + "MOVE_GUARD_SWAP", + "MOVE_HARDEN", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LAVA_PLUME", + "MOVE_LIGHT_SCREEN", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP", + "MOVE_YAWN" + ], + "PATRAT": [ + "MOVE_AFTER_YOU", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_FANG", + "MOVE_HYPNOSIS", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEAN_LOOK", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TEARFUL_LOOK", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SPIDOPS": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_SEED", + "MOVE_CIRCLE_THROW", + "MOVE_COUNTER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MEMENTO", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SILK_TRAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SPIKES", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "REUNICLUS": [ + "MOVE_ACID_ARMOR", + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_PUNCH", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_ROLLER", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "COBALION": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MAGNET_RISE", + "MOVE_MEGAHORN", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "SWABLU": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEAL_BELL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MIST", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PLUCK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SING", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_UPROAR" + ], + "STARAPTOR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "AVALUGG_HISUI": [ + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MOUNTAIN_GALE", + "MOVE_POWDER_SNOW", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD" + ], + "PERSIAN": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SLASH", + "MOVE_ODOR_SLEUTH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "TADBULB": [ + "MOVE_ACID_SPRAY", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FLAIL", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PARABOLIC_CHARGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SOAK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "ROARING_MOON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_JAW_LOCK", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROOST", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_U_TURN", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "DRAKLOAK": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BREAKING_SWIPE", + "MOVE_BRINE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_GRUDGE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_INFESTATION", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_NIGHT_SHADE", + "MOVE_OUTRAGE", + "MOVE_PHANTOM_FORCE", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "COALOSSAL": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_OVERHEAT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCORCHING_SANDS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAR_SHOT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_WILL_O_WISP" + ], + "SHELGON": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_ZEN_HEADBUTT" + ], + "IRON_THORNS": [ + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOW_KICK", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_PIN_MISSILE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "APPLETUN": [ + "MOVE_AMNESIA", + "MOVE_APPLE_ACID", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWEET_SCENT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_WITHDRAW", + "MOVE_ZEN_HEADBUTT" + ], + "WEEPINBELL": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "MORGREM": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SURRENDER", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_IMPRISON", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR" + ], + "REVAVROOM": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HARD_PRESS", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LICK", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_OVERHEAT", + "MOVE_PARTING_SHOT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHIFT_GEAR", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SPIN_OUT", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "POLTCHAGEIST": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_CALM_MIND", + "MOVE_CURSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_HEX", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LEAF_STORM", + "MOVE_LIFE_DEW", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WITHDRAW" + ], + "HYDREIGON": [ + "MOVE_ACROBATICS", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TIMBURR": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HAMMER_ARM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WAKE_UP_SLAP", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "QUILLADIN": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_NATURE_POWER", + "MOVE_NEEDLE_ARM", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WIDE_GUARD", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "COMBEE": [ + "MOVE_AIR_CUTTER", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_GUST", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_OMINOUS_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TERA_BLAST" + ], + "GOUGING_FIRE": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_BURNING_BULWARK", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_MORNING_SUN", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGING_FURY", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_WEATHER_BALL" + ], + "QUAXWELL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_CHILLING_WATER", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_HIT", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MISTY_TERRAIN", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "DEDENNE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MISTY_TERRAIN", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PARABOLIC_CHARGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "WATTREL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GROWL", + "MOVE_HURRICANE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE" + ], + "OSHAWOTT": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "FROAKIE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NIGHT_SLASH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WORK_UP" + ], + "SOLOSIS": [ + "MOVE_ACID_ARMOR", + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_ROLLER", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "SANDACONDA": [ + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_COIL", + "MOVE_DIG", + "MOVE_DRAGON_RUSH", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_HEADBUTT", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "DEOXYS_DEFENSE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_BOOST", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "MURKROW": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "LEDIAN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "MAGMAR": [ + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEPORT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "GIGALITH": [ + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LOCK_ON", + "MOVE_MAGNITUDE", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WIDE_GUARD" + ], + "BASCULEGION": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LAST_RESPECTS", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "FIDOUGH": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_ICE_FANG", + "MOVE_LAST_RESORT", + "MOVE_LICK", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "COSMOG": [ + "MOVE_SPLASH", + "MOVE_TELEPORT" + ], + "PACHIRISU": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_ION_DELUGE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "FLOETTE": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_VINE_WHIP", + "MOVE_WISH", + "MOVE_WORRY_SEED" + ], + "PSYDUCK": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_FUTURE_SIGHT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "TOUCANNON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BEAK_BLAST", + "MOVE_BOOMBURST", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_KNOCK_OFF", + "MOVE_MIRROR_MOVE", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "FUECOCO": [ + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_WILL_O_WISP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "WHISMUR": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CIRCLE_THROW", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DECIDUEYE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FORESIGHT", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PHANTOM_FORCE", + "MOVE_PLUCK", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKITTER_SMACK", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPIRIT_SHACKLE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "FLORGES": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FLOWER_SHIELD", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_VINE_WHIP", + "MOVE_WISH", + "MOVE_WORRY_SEED" + ], + "GREAVARD": [ + "MOVE_ALLY_SWITCH", + "MOVE_BITE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HOWL", + "MOVE_ICE_FANG", + "MOVE_LICK", + "MOVE_MEMENTO", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_YAWN" + ], + "SLIGGOO": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "NINETALES_ALOLA": [ + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_MIST", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WEATHER_BALL", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "MACHOP": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_TRICK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP" + ], + "FRILLISH": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HAIL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_MAGIC_COAT", + "MOVE_MIST", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_STING", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WATER_SPOUT", + "MOVE_WHIRLPOOL", + "MOVE_WILL_O_WISP", + "MOVE_WRING_OUT" + ], + "KAKUNA": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT" + ], + "IRON_BUNDLE": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_DRILL_PECK", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_PLAY_ROUGH", + "MOVE_POWDER_SNOW", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "CHIKORITA": [ + "MOVE_ANCIENT_POWER", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT" + ], + "RAPIDASH": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "DHELMISE": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ANCHOR_SHOT", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MEGA_DRAIN", + "MOVE_METAL_SOUND", + "MOVE_MUDDY_WATER", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WHIRLPOOL", + "MOVE_WRAP" + ], + "SLOWBRO_GALAR": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHELL_SIDE_ARM", + "MOVE_SKILL_SWAP", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "MELOETTA": [ + "MOVE_ACROBATICS", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_BATON_PASS", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_RELIC_SONG", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TEETER_DANCE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WAKE_UP_SLAP", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "FINIZEN": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BOUNCE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_HIT", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_ZEN_HEADBUTT" + ], + "CRANIDOS": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "IVYSAUR": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "OGERPON": [ + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_COUNTER", + "MOVE_DOUBLE_KICK", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOLLOW_ME", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HORN_LEECH", + "MOVE_IVY_CUDGEL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VINE_WHIP", + "MOVE_WOOD_HAMMER", + "MOVE_ZEN_HEADBUTT" + ], + "CHINGLING": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WISH", + "MOVE_WRAP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "BIBAREL": [ + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "HEATMOR": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_LASH", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_NIGHT_SLASH", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP", + "MOVE_WRAP" + ], + "SANDILE": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEAN_LOOK", + "MOVE_ME_FIRST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR" + ], + "ARTICUNO_GALAR": [ + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CONFUSION", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FREEZING_GLARE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_GUST", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MIND_READER", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_U_TURN" + ], + "VAPOREON": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "HIPPOPOTAS": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_YAWN" + ], + "KOFFING": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_ZAP_CANNON" + ], + "ZAMAZENTA": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_MOONBLAST", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "PIPLUP": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUND", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "BLIPBUG": [ + "MOVE_INFESTATION", + "MOVE_RECOVER", + "MOVE_STICKY_WEB", + "MOVE_STRUGGLE_BUG", + "MOVE_SUPERSONIC" + ], + "WINGULL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BRAVE_BIRD", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "RUFFLET": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_LEER", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_DROP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SWADLOON": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_ME_FIRST", + "MOVE_MIND_READER", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED" + ], + "URSARING": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON" + ], + "YAMPER": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_CHARGE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAME_CHARGE", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TOTODILE": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TORNADUS": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLEAKWIND_STORM", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUST", + "MOVE_HAMMER_ARM", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL" + ], + "ZAPDOS_GALAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDEROUS_KICK", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN" + ], + "GLACEON": [ + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "CHIMECHO": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_CRAFTY_SHIELD", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PERISH_SONG", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WISH", + "MOVE_WRAP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "ROTOM": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "MEGANIUM": [ + "MOVE_ANCIENT_POWER", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT", + "MOVE_ZEN_HEADBUTT" + ], + "GOTHORITA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_METRONOME", + "MOVE_MIRACLE_EYE", + "MOVE_MIRROR_COAT", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "SHINX": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "OMANYTE": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPIKE_CANNON", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WRING_OUT" + ], + "SHELLOS": [ + "MOVE_ACID_ARMOR", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_LIQUIDATION", + "MOVE_MEMENTO", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STONE_EDGE", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "EEVEE": [ + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRUMP_CARD", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "MARSHTOMP": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "SNEASEL": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "DRILBUR": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "PIKIPEK": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BOOMBURST", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAME_CHARGE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_KNOCK_OFF", + "MOVE_MIRROR_MOVE", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "VICTREEBEL": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_VINE_WHIP", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED", + "MOVE_WRAP" + ], + "ARCEUS": [ + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_AURA_SPHERE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_JUDGMENT", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PUNISHMENT", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "CROAGUNK": [ + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BELCH", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMELLING_SALTS", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "THWACKEY": [ + "MOVE_ACROBATICS", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRANCH_POKE", + "MOVE_BULLET_SEED", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HAMMER_ARM", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "ORTHWORM": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_COIL", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METAL_BURST", + "MOVE_METAL_SOUND", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SHED_TAIL", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WRAP" + ], + "ABOMASNOW": [ + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HAIL", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_INGRAIN", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED" + ], + "ROTOM_FAN": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "CRUSTLE": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_METEOR_BEAM", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROCK_WRECKER", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHELL_SMASH", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_X_SCISSOR" + ], + "CYCLIZAR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_SPINNER", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_SCALE_SHOT", + "MOVE_SHED_TAIL", + "MOVE_SHIFT_GEAR", + "MOVE_SLEEP_TALK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "ARCHEN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_METEOR_BEAM", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "KORAIDON": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COLLISION_COURSE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "ARIADOS": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONSTRICT", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PURSUIT", + "MOVE_RAGE_POWDER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_SNEAK", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_SPIDER_WEB", + "MOVE_SPITE", + "MOVE_STICKY_WEB", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TOXIC_THREAD", + "MOVE_TRAILBLAZE", + "MOVE_TWINEEDLE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "ZANGOOSE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "DARMANITAN_GALAR": [ + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICICLE_CRASH", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POWDER_SNOW", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SMEARGLE": [ + "MOVE_SKETCH" + ], + "DUCKLETT": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LUCKY_CHANT", + "MOVE_ME_FIRST", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SPORT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WING_ATTACK" + ], + "MOLTRES": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_BIDE", + "MOVE_BRAVE_BIRD", + "MOVE_BURNING_JEALOUSY", + "MOVE_BURN_UP", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK" + ], + "RATICATE_ALOLA": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BULK_UP", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_ZEN_HEADBUTT" + ], + "EISCUE": [ + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_CHILLING_WATER", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLIP_TURN", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "EELEKTROSS": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ION_DELUGE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TINKATINK": [ + "MOVE_ASTONISH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BRUTAL_SWING", + "MOVE_COVET", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLASH_CANNON", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_HELPING_HAND", + "MOVE_ICE_HAMMER", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWEET_KISS", + "MOVE_SWORDS_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE" + ], + "SURSKIT": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POUNCE", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT" + ], + "STEELIX": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WIDE_GUARD" + ], + "BOLTUND": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BULK_UP", + "MOVE_CHARGE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRIFY", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAME_CHARGE", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "BUDEW": [ + "MOVE_ABSORB", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_LEAF_STORM", + "MOVE_LIFE_DEW", + "MOVE_MEGA_DRAIN", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "DODUO": [ + "MOVE_ACROBATICS", + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "BOUFFALANT": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_CHARGE", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MR_RIME": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_KICK", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "KECLEON": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAIL_WHIP", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP" + ], + "TINKATON": [ + "MOVE_ASTONISH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_COVET", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLASH_CANNON", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_GIGATON_HAMMER", + "MOVE_HARD_PRESS", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_ICE_HAMMER", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWEET_KISS", + "MOVE_SWORDS_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE" + ], + "MAREANIE": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIKE_CANNON", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD" + ], + "WHISCASH": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MAGNITUDE", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "MAGCARGO": [ + "MOVE_ACID_ARMOR", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LAVA_PLUME", + "MOVE_LIGHT_SCREEN", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP", + "MOVE_YAWN" + ], + "ZEBSTRIKA": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ION_DELUGE", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGNET_RISE", + "MOVE_ME_FIRST", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "MILCERY": [ + "MOVE_ACID_ARMOR", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_HELPING_HAND", + "MOVE_LAST_RESORT", + "MOVE_MISTY_TERRAIN", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST" + ], + "CLEFFA": [ + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "LOTAD": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "SCOVILLAIN": [ + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_BURNING_JEALOUSY", + "MOVE_CRUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LASH_OUT", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPICY_EXTRACT", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "BRAMBLIN": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_BEAT_UP", + "MOVE_BLOCK", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DISABLE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEX", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE" + ], + "AROMATISSE": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METRONOME", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_ODOR_SLEUTH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_TELEKINESIS", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WISH" + ], + "NIDOQUEEN": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "GROTLE": [ + "MOVE_ABSORB", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "STOUTLAND": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "SALAZZLE": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELCH", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_COVET", + "MOVE_CROSS_POISON", + "MOVE_DISABLE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_LASH", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP" + ], + "DEOXYS_NORMAL": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COSMIC_POWER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_BOOST", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_WRAP", + "MOVE_ZEN_HEADBUTT" + ], + "PAWMOT": [ + "MOVE_AGILITY", + "MOVE_ARM_THRUST", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SHOCK", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVIVAL_BLESSING", + "MOVE_ROCK_TOMB", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPER_FANG", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_UPPER_HAND", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "FERROSEED": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INGRAIN", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_MAGNET_RISE", + "MOVE_METAL_CLAW", + "MOVE_MIRROR_SHOT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WORRY_SEED" + ], + "GOTHITA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MIRACLE_EYE", + "MOVE_MIRROR_COAT", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "GRAPPLOCT": [ + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MEGA_PUNCH", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OCTAZOOKA", + "MOVE_OCTOLOCK", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SEISMIC_TOSS", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_TAUNT", + "MOVE_TOPSY_TURVY", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "KINGAMBIT": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUILLOTINE", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KOWTOW_CLEAVE", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEAN_LOOK", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "KRICKETUNE": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PERISH_SONG", + "MOVE_POUNCE", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SING", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STICKY_WEB", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_X_SCISSOR" + ], + "TOXTRICITY_LOW_KEY": [ + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BOOMBURST", + "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_DISCHARGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEER", + "MOVE_MAGNETIC_FLUX", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NOBLE_ROAR", + "MOVE_NUZZLE", + "MOVE_OVERDRIVE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_NOISE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "SPRIGATITO": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_DISARMING_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "CLAWITZER": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRABHAMMER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL" + ], + "GREEDENT": [ + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE" + ], + "NINJASK": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "FLUTTER_MANE": [ + "MOVE_ASTONISH", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FAKE_TEARS", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_MAGICAL_LEAF", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYSHOCK", + "MOVE_REST", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK_ROOM", + "MOVE_WISH" + ], + "MIME_JR": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BATON_PASS", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEDITATE", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_POUND", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WAKE_UP_SLAP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "MAGNEMITE": [ + "MOVE_BIDE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_BOMB", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MIRROR_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_SPARK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "FLOATZEL": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULK_UP", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SONIC_BOOM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL" + ], + "SKORUPI": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_X_SCISSOR" + ], + "SUDOWOODO": [ + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WOOD_HAMMER" + ], + "MUDKIP": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "STEENEE": [ + "MOVE_ACUPRESSURE", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "SHELLDER": [ + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLAMP", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_LIFE_DEW", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_SHELL", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRI_ATTACK", + "MOVE_TWINEEDLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW" + ], + "TOGEDEMARU": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MAGNET_RISE", + "MOVE_NUZZLE", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_RISING_VOLTAGE", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPIKY_SHIELD", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TWINEEDLE", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT", + "MOVE_ZING_ZAP" + ], + "GLISCOR": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRABHAMMER", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_FANG", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LUNGE", + "MOVE_METAL_CLAW", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_POWER_SHIFT", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SKY_ATTACK", + "MOVE_SKY_UPPERCUT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "SCYTHER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "HERACROSS": [ + "MOVE_AERIAL_ACE", + "MOVE_ARM_THRUST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PIN_MISSILE", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_VENOSHOCK", + "MOVE_WORK_UP" + ], + "BAYLEEF": [ + "MOVE_ANCIENT_POWER", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT" + ], + "PHEROMOSA": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HIDDEN_POWER", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_JUMP_KICK", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_ME_FIRST", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_QUIVER_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_TRIPLE_KICK", + "MOVE_U_TURN" + ], + "BURMY": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HIDDEN_POWER", + "MOVE_PROTECT", + "MOVE_SNORE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_TACKLE" + ], + "FERALIGATR": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "FEEBAS": [ + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TYRANTRUM": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_ZEN_HEADBUTT" + ], + "GOLDEEN": [ + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL" + ], + "SILVALLY": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_BITE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_PLEDGE", + "MOVE_HAIL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_MAGIC_COAT", + "MOVE_METAL_SOUND", + "MOVE_MULTI_ATTACK", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WATER_PLEDGE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "SPOINK": [ + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPLASH", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "IGGLYBUFF": [ + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "GIRAFARIG": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_ODOR_SLEUTH", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWIN_BEAM", + "MOVE_UPROAR", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "INFERNAPE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_QUICK_GUARD", + "MOVE_RAGING_FURY", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "NIDORINA": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "MASQUERAIN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND" + ], + "ARROKUDA": [ + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_RUN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_ATTACK", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_FANG", + "MOVE_LASER_FOCUS", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "SIMISEAR": [ + "MOVE_ACROBATICS", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "MUK": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LICK", + "MOVE_LUNGE", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MOONBLAST", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "STUNFISK": [ + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_CHARGE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_MAGNET_RISE", + "MOVE_ME_FIRST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_YAWN" + ], + "VANILLUXE": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AUTOTOMIZE", + "MOVE_AVALANCHE", + "MOVE_BEAT_UP", + "MOVE_BLIZZARD", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MIRROR_COAT", + "MOVE_MIRROR_SHOT", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "HOOPA_CONFINED": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_BLOCK", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPERSPACE_HOLE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_NASTY_PLOT", + "MOVE_PHANTOM_FORCE", + "MOVE_POWER_SPLIT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "ARMALDO": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_X_SCISSOR" + ], + "COMFEY": [ + "MOVE_ACROBATICS", + "MOVE_AFTER_YOU", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLORAL_HEALING", + "MOVE_FLOWER_SHIELD", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PLAY_ROUGH", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_U_TURN", + "MOVE_VINE_WHIP", + "MOVE_WORRY_SEED", + "MOVE_WRAP" + ], + "DRATINI": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRAP", + "MOVE_ZAP_CANNON" + ], + "ELECTRODE": [ + "MOVE_AGILITY", + "MOVE_BIDE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNETIC_FLUX", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SONIC_BOOM", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "PONYTA": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_DRILL", + "MOVE_HYPNOSIS", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "PAWMO": [ + "MOVE_AGILITY", + "MOVE_ARM_THRUST", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_COACHING", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_UPPER_HAND", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "DRAGONAIR": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WRAP", + "MOVE_ZAP_CANNON" + ], + "RAICHU_ALOLA": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_NASTY_PLOT", + "MOVE_NUZZLE", + "MOVE_PAY_DAY", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "CHERUBI": [ + "MOVE_ABSORB", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLOWER_SHIELD", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LEAFAGE", + "MOVE_LEECH_SEED", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "EXPLOUD": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CIRCLE_THROW", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DEFENSE_CURL", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SYNCHRONOISE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SWANNA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLIP_TURN", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LUCKY_CHANT", + "MOVE_ME_FIRST", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SPORT", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WING_ATTACK" + ], + "KLANG": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_AUTOTOMIZE", + "MOVE_BIND", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GEAR_GRIND", + "MOVE_GRAVITY", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHIFT_GEAR", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VICE_GRIP", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "ARBOLIVA": [ + "MOVE_ABSORB", + "MOVE_ALLURING_VOICE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIRROR_COAT", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL" + ], + "GROVYLE": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SLAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "FEZANDIPITI": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BRAVE_BIRD", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CROSS_POISON", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_KICK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_LIGHT_SCREEN", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_PECK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WING_ATTACK" + ], + "GOLISOPOD": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD", + "MOVE_X_SCISSOR" + ], + "SANDY_SHOCKS": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNETIC_FLUX", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERSONIC", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "HEATRAN": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LUNGE", + "MOVE_MAGMA_STORM", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_POUNCE", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "CLOYSTER": [ + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CLAMP", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_SHELL", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHELL_SMASH", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPIKE_CANNON", + "MOVE_STEEL_ROLLER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRI_ATTACK", + "MOVE_TWINEEDLE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW" + ], + "WEEZING_GALAR": [ + "MOVE_ACID_SPRAY", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_CLEAR_SMOG", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_MEMENTO", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_GAS", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRANGE_STEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "SKUNTANK": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "WOBBUFFET": [ + "MOVE_AMNESIA", + "MOVE_CHARM", + "MOVE_COUNTER", + "MOVE_DESTINY_BOND", + "MOVE_ENCORE", + "MOVE_MIRROR_COAT", + "MOVE_SAFEGUARD", + "MOVE_SPLASH" + ], + "VULPIX": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "DELIBIRD": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEATHER_DANCE", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPLASH", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "EXEGGCUTE": [ + "MOVE_ABSORB", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BARRAGE", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EGG_BOMB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NIGHTMARE", + "MOVE_POISON_POWDER", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "CARKOL": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BURN_UP", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GYRO_BALL", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_OVERHEAT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCORCHING_SANDS", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_WILL_O_WISP" + ], + "WIGGLYTUFF": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_PUNISHMENT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TANGELA": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_POWDER", + "MOVE_POWER_SWAP", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VINE_WHIP", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT" + ], + "CARNIVINE": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_LIFE", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_VINE_WHIP", + "MOVE_WORRY_SEED", + "MOVE_WRING_OUT" + ], + "OINKOLOGNE_M": [ + "MOVE_BELCH", + "MOVE_COVET", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_HEADBUTT", + "MOVE_MUD_SHOT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "PYUKUMUKU": [ + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BIDE", + "MOVE_BLOCK", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_GASTRO_ACID", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HELPING_HAND", + "MOVE_LIGHT_SCREEN", + "MOVE_MEMENTO", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SPORT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURIFY", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SOAK", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VENOM_DRENCH", + "MOVE_WATER_SPORT" + ], + "MILOTIC": [ + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WRAP" + ], + "INDEEDEE_F": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FOLLOW_ME", + "MOVE_FUTURE_SIGHT", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", + "MOVE_PAY_DAY", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "SANDSHREW_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_METAL_CLAW", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "GARBODOR": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SPORT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "MEDITITE": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DEERLING": [ + "MOVE_AGILITY", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAMOUFLAGE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_JUMP_KICK", + "MOVE_LAST_RESORT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_ODOR_SLEUTH", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "LANTURN": [ + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEAL_BELL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_ION_DELUGE", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPARK", + "MOVE_SPIT_UP", + "MOVE_SPOTLIGHT", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "FLOETTE_ETERNAL": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_OF_RUIN", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_VINE_WHIP", + "MOVE_WISH", + "MOVE_WORRY_SEED" + ], + "FLITTLE": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DISARMING_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_HYPNOSIS", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROOST", + "MOVE_SANDSTORM", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "STUNKY": [ + "MOVE_ACID_SPRAY", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CORROSIVE_GAS", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "DWEBBLE": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROCK_WRECKER", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHELL_SMASH", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_X_SCISSOR" + ], + "CHI_YU": [ + "MOVE_BOUNCE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_LASH_OUT", + "MOVE_LAVA_PLUME", + "MOVE_LIGHT_SCREEN", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RUINATION", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "LEAVANNY": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAMOUFLAGE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_ME_FIRST", + "MOVE_MIND_READER", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "DUDUNSPARCE": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_COIL", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_DRILL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_LAST_RESORT", + "MOVE_LUNGE", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROOST", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "PLUSLE": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BESTOW", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "SNIVY": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GLARE", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "SPEWPA": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HARDEN", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_TACKLE", + "MOVE_TERA_BLAST" + ], + "NIDORAN_M": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE" + ], + "DRIFBLIM": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CONSTRICT", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_MAGIC_COAT", + "MOVE_MEMENTO", + "MOVE_MINIMIZE", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TELEKINESIS", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP" + ], + "REGIROCK": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOCK_ON", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_ZAP_CANNON" + ], + "AZURILL": [ + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PERISH_SONG", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "KLAWF": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRABHAMMER", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_VISE_GRIP", + "MOVE_X_SCISSOR" + ], + "NINETALES": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MYSTICAL_FIRE", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "ROGGENROLA": [ + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGNITUDE", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD" + ], + "ACCELGOR": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_MEGA_DRAIN", + "MOVE_ME_FIRST", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_SHURIKEN", + "MOVE_YAWN" + ], + "PURRLOIN": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_YAWN" + ], + "SIMISAGE": [ + "MOVE_ACROBATICS", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GRASS_WHISTLE", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKY_SHIELD", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "SCRAGGY": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "IRON_VALIANT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SPIRIT_BREAK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_VACUUM_WAVE", + "MOVE_WIDE_GUARD", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "FLAB\u00c9B\u00c9": [ + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FAIRY_WIND", + "MOVE_GIGA_DRAIN", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_SAFEGUARD", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_VINE_WHIP", + "MOVE_WISH" + ], + "ARCTIBAX": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_HELPING_HAND", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST" + ], + "LICKILICKY": [ + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_WRAP", + "MOVE_WRING_OUT", + "MOVE_ZEN_HEADBUTT" + ], + "WIGLETT": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BLIZZARD", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FOUL_PLAY", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_LIQUIDATION", + "MOVE_MEMENTO", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRAP" + ], + "THIEVUL": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HONE_CLAWS", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_U_TURN" + ], + "HITMONCHAN": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "GOLBAT": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "METAPOD": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_STRING_SHOT" + ], + "KYOGRE": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ORIGIN_PULSE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WHIRLPOOL" + ], + "WORMADAM_SANDY": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUIVER_DANCE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOSHOCK" + ], + "ARMAROUGE": [ + "MOVE_ACID_SPRAY", + "MOVE_ALLY_SWITCH", + "MOVE_ARMOR_CANNON", + "MOVE_ASTONISH", + "MOVE_AURA_SPHERE", + "MOVE_CALM_MIND", + "MOVE_CLEAR_SMOG", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DRAGON_PULSE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WEATHER_BALL", + "MOVE_WIDE_GUARD", + "MOVE_WILL_O_WISP" + ], + "SMOLIV": [ + "MOVE_ABSORB", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL" + ], + "LOMBRE": [ + "MOVE_ABSORB", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "SQUIRTLE": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHELL_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WAVE_CRASH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "IRON_CROWN": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFUSION", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_SACRED_SWORD", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWORDS_DANCE", + "MOVE_TACHYON_CUTTER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_VOLT_SWITCH", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "FOONGUS": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SYNTHESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "ESPURR": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "FRAXURE": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_CHOP", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" + ], + "ZEKROM": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOLT_STRIKE", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUSION_BOLT", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_ZEN_HEADBUTT" + ], + "ROWLET": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BRAVE_BIRD", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "WOOLOO": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_COPYCAT", + "MOVE_COTTON_GUARD", + "MOVE_COUNTER", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GRASSY_GLIDE", + "MOVE_GROWL", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_WAVE", + "MOVE_WILD_CHARGE" + ], + "FROSMOTH": [ + "MOVE_ACROBATICS", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FEATHER_DANCE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_QUIVER_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRIPLE_AXEL", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL", + "MOVE_WIDE_GUARD" + ], + "RHYHORN": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SPLIT", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MAGNITUDE", + "MOVE_MEGAHORN", + "MOVE_METAL_BURST", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_ZAP_CANNON" + ], + "MUDBRAY": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FRUSTRATION", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MUD_BOMB", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC" + ], + "RILLABOOM": [ + "MOVE_ACROBATICS", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", + "MOVE_BRANCH_POKE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_DARKEST_LARIAT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_DRUM_BEATING", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_HAMMER_ARM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_NATURE_POWER", + "MOVE_NOBLE_ROAR", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED" + ], + "FLAPPLE": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_DEFENSE_CURL", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAV_APPLE", + "MOVE_GROWTH", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_OUTRAGE", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_WITHDRAW" + ], + "SLITHER_WING": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MORNING_SUN", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SANDSTORM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "HELIOLISK": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRIFY", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GRASS_KNOT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MORNING_SUN", + "MOVE_MUD_SLAP", + "MOVE_PARABOLIC_CHARGE", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE" + ], + "DRAGALGE": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWISTER", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TOXAPEX": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BANEFUL_BUNKER", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CROSS_POISON", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIKE_CANNON", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE", + "MOVE_WIDE_GUARD" + ], + "CRAMORANT": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_RING", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BLIZZARD", + "MOVE_BRAVE_BIRD", + "MOVE_CHILLING_WATER", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEEL_WING", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWALLOW", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "MELTAN": [ + "MOVE_ACID_ARMOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC" + ], + "MUNKIDORI": [ + "MOVE_ACID_SPRAY", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CLEAR_SMOG", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_LASH_OUT", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PARTING_SHOT", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOSHOCK" + ], + "AURORUS": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_DARK_PULSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_RISE", + "MOVE_METEOR_BEAM", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "QWILFISH_HISUI": [ + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_BARB_BARRAGE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_LIQUIDATION", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE" + ], + "TYMPOLE": [ + "MOVE_ACID", + "MOVE_AFTER_YOU", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "SWIRLIX": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MISTY_EXPLOSION", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_WISH", + "MOVE_YAWN" + ], + "FENNEKIN": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "GASTLY": [ + "MOVE_ACID_SPRAY", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CORROSIVE_GAS", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON" + ], + "BUTTERFREE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYWAVE", + "MOVE_QUIVER_DANCE", + "MOVE_RAGE", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND" + ], + "ZORUA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_DAZE", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_U_TURN" + ], + "SKELEDIRGE": [ + "MOVE_ALLURING_VOICE", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BLAST_BURN", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SHADE", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SING", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TORCH_SONG", + "MOVE_WILL_O_WISP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "CHARMANDER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "VIGOROTH": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLACK_OFF", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "BAXCALIBUR": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_GLAIVE_RUSH", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" + ], + "SABLEYE": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WATER_PULSE", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "LAIRON": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_RUSH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_RISE", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE" + ], + "GLOOM": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "DRAMPA": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GRASS_KNOT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP" + ], + "MUNCHLAX": [ + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PAY_DAY", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MIENFOO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HONE_CLAWS", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_ME_FIRST", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_U_TURN", + "MOVE_VITAL_THROW", + "MOVE_WORK_UP" + ], + "ZAPDOS": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ANCIENT_POWER", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BRAVE_BIRD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNETIC_FLUX", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" + ], + "AUDINO": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MISTY_TERRAIN", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_NICE", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "ELGYEM": [ + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COSMIC_POWER", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_IMPRISON", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIRACLE_EYE", + "MOVE_NASTY_PLOT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SYNCHRONOISE", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "PURUGLY": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WAKE_UP_SLAP", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "ROTOM_MOW": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "SNORUNT": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "REGISTEEL": [ + "MOVE_AERIAL_ACE", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LOCK_ON", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_ZAP_CANNON" + ], + "STUFFUL": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FRUSTRATION", + "MOVE_HAMMER_ARM", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THRASH", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "LOPUNNY": [ + "MOVE_ACROBATICS", + "MOVE_AFTER_YOU", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COTTON_GUARD", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_JUMP_KICK", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TEETER_DANCE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "ARCTOZOLT": [ + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOLT_BEAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_DISCHARGE", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_WILD_CHARGE" + ], + "CHATOT": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BOOMBURST", + "MOVE_CAPTIVATE", + "MOVE_CHATTER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_VOICE", + "MOVE_MIMIC", + "MOVE_MIRROR_MOVE", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PARTING_SHOT", + "MOVE_PECK", + "MOVE_PLAY_ROUGH", + "MOVE_PLUCK", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SING", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "YVELTAL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAL_BLOCK", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_OBLIVION_WING", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "FLORAGATO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_DISARMING_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLING", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORRY_SEED" + ], + "SPRITZEE": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_ODOR_SLEUTH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWEET_SCENT", + "MOVE_TELEKINESIS", + "MOVE_THUNDERBOLT", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WISH" + ], + "FALINKS": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_BEAT_UP", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_NO_RETREAT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_ZEN_HEADBUTT" + ], + "NIDOKING": [ + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUASH", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "DEWOTT": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_CUTTER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "DEWPIDER": [ + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIRROR_COAT", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPIDER_WEB", + "MOVE_SPIT_UP", + "MOVE_STICKY_WEB", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WONDER_ROOM", + "MOVE_X_SCISSOR" + ], + "LIEPARD": [ + "MOVE_AERIAL_ACE", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_YAWN" + ], + "TOEDSCRUEL": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRICK_ROOM", + "MOVE_VENOSHOCK", + "MOVE_WRAP" + ], + "TORRACAT": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "FLAREON": [ + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PAY_DAY", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNCHRONOISE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZAP_CANNON" + ], + "EXEGGUTOR_ALOLA": [ + "MOVE_ABSORB", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BARRAGE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_HAMMER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EGG_BOMB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FLAMETHROWER", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OUTRAGE", + "MOVE_POISON_POWDER", + "MOVE_POWER_SWAP", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "FLETCHINDER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_INCINERATE", + "MOVE_ME_FIRST", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TYRUNT": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_ZEN_HEADBUTT" + ], + "DUGTRIO_ALOLA": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FINAL_GAMBIT", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNITUDE", + "MOVE_MEMENTO", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WORK_UP" + ], + "CLODSIRE": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGAHORN", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SPIKES", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWALLOW", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SIMIPOUR": [ + "MOVE_ACROBATICS", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "PRIMEAPE": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAGE_FIST", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "POLITOED": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_PERISH_SONG", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPLASH", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "HOUNDOOM": [ + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_COMEUPPANCE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_ODOR_SLEUTH", + "MOVE_OVERHEAT", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMOG", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WILL_O_WISP" + ], + "CHERRIM": [ + "MOVE_ABSORB", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLOWER_SHIELD", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEECH_SEED", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PLAY_ROUGH", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "YANMEGA": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FEINT", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LASER_FOCUS", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SONIC_BOOM", + "MOVE_STEEL_WING", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "SILCOON": [ + "MOVE_BUG_BITE", + "MOVE_ELECTROWEB", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT", + "MOVE_TACKLE" + ], + "CELESTEELA": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AIR_SLASH", + "MOVE_AUTOTOMIZE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEECH_SEED", + "MOVE_MAGNET_RISE", + "MOVE_MEGAHORN", + "MOVE_MEGA_DRAIN", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_ZEN_HEADBUTT" + ], + "FOMANTIS": [ + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "MACHOKE": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_TRICK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_VACUUM_WAVE", + "MOVE_VITAL_THROW", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORK_UP" + ], + "BEEDRILL": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ELECTROWEB", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LUNGE", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SILVER_WIND", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "LEAFEON": [ + "MOVE_AERIAL_ACE", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAY_DAY", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNCHRONOISE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR", + "MOVE_YAWN" + ], + "ZYGARDE": [ + "MOVE_BIND", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAMOUFLAGE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CORE_ENFORCER", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GRASS_KNOT", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LANDS_WRATH", + "MOVE_OUTRAGE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_THOUSAND_ARROWS", + "MOVE_THOUSAND_WAVES", + "MOVE_TOXIC", + "MOVE_ZEN_HEADBUTT" + ], + "BLASTOISE": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHELL_SMASH", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPOUT", + "MOVE_WAVE_CRASH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "OBSTAGOON": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CROSS_POISON", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", + "MOVE_OBSTRUCT", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRICK", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "CORVISQUIRE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BRAVE_BIRD", + "MOVE_DEFOG", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_FURY_ATTACK", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "NOSEPASS": [ + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GRAVITY", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_LOCK_ON", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MAGNITUDE", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WIDE_GUARD", + "MOVE_ZAP_CANNON" + ], + "DEINO": [ + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_INCINERATE", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "BISHARP": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BRICK_BREAK", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUILLOTINE", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEAN_LOOK", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PURSUIT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "AIPOM": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAIL_SLAP", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "TENTACRUEL": [ + "MOVE_ACID", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_CORROSIVE_GAS", + "MOVE_CROSS_POISON", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "WEAVILE": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSIST", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUSH_CLAW", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPPER_HAND", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_X_SCISSOR" + ], + "SAWSBUCK": [ + "MOVE_AGILITY", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAMOUFLAGE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_JUMP_KICK", + "MOVE_LAST_RESORT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_ODOR_SLEUTH", + "MOVE_PETAL_BLIZZARD", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "BARBARACLE": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLAMP", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CROSS_CHOP", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LASER_FOCUS", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_METEOR_BEAM", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHELL_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_X_SCISSOR" + ], + "HYDRAPPLE": [ + "MOVE_ASTONISH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FICKLE_BEAM", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWEET_SCENT", + "MOVE_SYRUP_BOMB", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_UPROAR", + "MOVE_WITHDRAW", + "MOVE_YAWN" + ], + "MARSHADOW": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_AURA_SPHERE", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORCE_PALM", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPECTRAL_THIEF", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MR_MIME_GALAR": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_KICK", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FREEZE_DRY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MISTY_TERRAIN", + "MOVE_NASTY_PLOT", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "MINUN": [ + "MOVE_AGILITY", + "MOVE_ALLURING_VOICE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DEFENSE_CURL", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NUZZLE", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRUMP_CARD", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "CINDERACE": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_COACHING", + "MOVE_COUNTER", + "MOVE_COURT_CHANGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ELECTRO_BALL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PYRO_BALL", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "DUGTRIO": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FINAL_GAMBIT", + "MOVE_FISSURE", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_MAGNITUDE", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WORK_UP" + ], + "OVERQWIL": [ + "MOVE_ACID_SPRAY", + "MOVE_ACUPRESSURE", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ASTONISH", + "MOVE_BARB_BARRAGE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLAIL", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HEX", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASH_OUT", + "MOVE_LIQUIDATION", + "MOVE_MINIMIZE", + "MOVE_MUD_SHOT", + "MOVE_PAIN_SPLIT", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMART_STRIKE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE" + ], + "TAROUNTULA": [ + "MOVE_ASSURANCE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_SEED", + "MOVE_CIRCLE_THROW", + "MOVE_COUNTER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FIRST_IMPRESSION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEMENTO", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SHADOW_CLAW", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SPIKES", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" + ], + "SINISTEA": [ + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ASTONISH", + "MOVE_BATON_PASS", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_HEX", + "MOVE_IMPRISON", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SHADOW_BALL", + "MOVE_SHELL_SMASH", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWEET_SCENT", + "MOVE_TERA_BLAST", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM" + ], + "IRON_JUGULIS": [ + "MOVE_ACROBATICS", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "RESHIRAM": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLUE_FLARE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FUSION_FLARE", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MYSTICAL_FIRE", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "LURANTIS": [ + "MOVE_AERIAL_ACE", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BULLET_SEED", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PETAL_BLIZZARD", + "MOVE_POISON_JAB", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED", + "MOVE_X_SCISSOR" + ], + "LUCARIO": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BITE", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BONE_RUSH", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HI_JUMP_KICK", + "MOVE_HONE_CLAWS", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIFE_DEW", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_MASH", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "PAWMI": [ + "MOVE_AGILITY", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLING", + "MOVE_GROWL", + "MOVE_HELPING_HAND", + "MOVE_MACH_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_NUZZLE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCRATCH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WISH" + ], + "COFAGRIGUS": [ + "MOVE_AFTER_YOU", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_CRAFTY_SHIELD", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRUDGE", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_IMPRISON", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MAGIC_COAT", + "MOVE_MEAN_LOOK", + "MOVE_MEMENTO", + "MOVE_NASTY_PLOT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POWER_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "SKARMORY": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AUTOTOMIZE", + "MOVE_BODY_PRESS", + "MOVE_BRAVE_BIRD", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "VOLCANION": [ + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAZE", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEAM_ERUPTION", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "GARGANACL": [ + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAMMER_ARM", + "MOVE_HARDEN", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SALT_CURE", + "MOVE_SANDSTORM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_WIDE_GUARD", + "MOVE_ZEN_HEADBUTT" + ], + "LATIOS": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLIP_TURN", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUSTER_PURGE", + "MOVE_MAGIC_COAT", + "MOVE_MEMENTO", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POWER_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SIMPLE_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "PELIPPER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRINE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_PLUCK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SKY_ATTACK", + "MOVE_SKY_DROP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SPIT_UP", + "MOVE_STEEL_WING", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WING_ATTACK" + ], + "VICTINI": [ + "MOVE_BATON_PASS", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MYSTICAL_FIRE", + "MOVE_OVERHEAT", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SEARING_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_V_CREATE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "RIOLU": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BITE", + "MOVE_BLAZE_KICK", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COUNTER", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FINAL_GAMBIT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FORCE_PALM", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HI_JUMP_KICK", + "MOVE_HOWL", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METEOR_MASH", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKY_UPPERCUT", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "MAGMORTAR": [ + "MOVE_ACID_SPRAY", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POWER_SWAP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SMOG", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP" + ], + "SHIINOTIC": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_DRAIN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_SPOTLIGHT", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WONDER_ROOM", + "MOVE_WORRY_SEED" + ], + "EMOLGA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ION_DELUGE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_NUZZLE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_SPEED_SWAP", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK" + ], + "GUZZLORD": [ + "MOVE_AMNESIA", + "MOVE_BELCH", + "MOVE_BITE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CORROSIVE_GAS", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LAST_RESORT", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STEAMROLLER", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWALLOW", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_WRING_OUT" + ], + "JELLICENT": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONSTRICT", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_MAGIC_COAT", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_STING", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STRENGTH_SAP", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WATER_SPOUT", + "MOVE_WHIRLPOOL", + "MOVE_WILL_O_WISP", + "MOVE_WRING_OUT" + ], + "DIGGERSBY": [ + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RECYCLE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "COTTONEE": [ + "MOVE_ABSORB", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_COTTON_SPORE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_MEGA_DRAIN", + "MOVE_MEMENTO", + "MOVE_MISTY_TERRAIN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_TAILWIND", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WORRY_SEED" + ], + "FARIGIRAF": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ASTONISH", + "MOVE_BATON_PASS", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_KICK", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_GUARD_SWAP", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_MEAN_LOOK", + "MOVE_MIRROR_COAT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TWIN_BEAM", + "MOVE_UPROAR", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "DREEPY": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GRUDGE", + "MOVE_HELPING_HAND", + "MOVE_INFESTATION", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE" + ], + "SANDSHREW": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LOW_KICK", + "MOVE_MAGNITUDE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "VANILLISH": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_AURORA_VEIL", + "MOVE_AUTOTOMIZE", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGNET_RISE", + "MOVE_MIRROR_COAT", + "MOVE_MIRROR_SHOT", + "MOVE_MIST", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_PULSE" + ], + "CACNEA": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COTTON_SPORE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DESTINY_BOND", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_NEEDLE_ARM", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POWER_TRIP", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SMELLING_SALTS", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VENOSHOCK", + "MOVE_WORRY_SEED" + ], + "DONPHAN": [ + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_MAGNITUDE", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_ODOR_SLEUTH", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_GUN" + ], + "GLIMMET": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ANCIENT_POWER", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MEMENTO", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOSHOCK" + ], + "POPPLIO": [ + "MOVE_ACROBATICS", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP" + ], + "PHIONE": [ + "MOVE_ACID_ARMOR", + "MOVE_ALLURING_VOICE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LIQUIDATION", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_HEART", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "MIMIKYU": [ + "MOVE_AFTER_YOU", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BEAT_UP", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LAST_RESORT", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_ROOM", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "LAPRAS": [ + "MOVE_ALLURING_VOICE", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DREAM_EATER", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FORESIGHT", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_OUTRAGE", + "MOVE_PERISH_SONG", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SPARKLING_ARIA", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "FINNEON": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GUST", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OMINOUS_WIND", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOAK", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "DRAPION": [ + "MOVE_ACUPRESSURE", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CRUNCH", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FELL_STINGER", + "MOVE_FIRE_FANG", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEECH_LIFE", + "MOVE_LEER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND", + "MOVE_X_SCISSOR" + ], + "HERDIER": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BITE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HOWL", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "WO_CHIEN": [ + "MOVE_ABSORB", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DARK_PULSE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HEX", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAYBACK", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RUINATION", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" + ], + "BINACLE": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CLAMP", + "MOVE_CONFIDE", + "MOVE_CROSS_CHOP", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCRATCH", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHELL_SMASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TICKLE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WITHDRAW", + "MOVE_X_SCISSOR" + ], + "QUAGSIRE": [ + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "SWAMPERT": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DARKEST_LARIAT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_WAVE", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "SEEL": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LICK", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "SERVINE": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_COIL", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GLARE", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_DRAIN", + "MOVE_MIRROR_COAT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_WRAP", + "MOVE_WRING_OUT" + ], + "STUNFISK_GALAR": [ + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BIND", + "MOVE_BOUNCE", + "MOVE_BULLDOZE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FOUL_PLAY", + "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_LASH_OUT", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNAP_TRAP", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_YAWN" + ], + "PINSIR": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUILLOTINE", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LUNGE", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_STRENGTH", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_VICE_GRIP", + "MOVE_VISE_GRIP", + "MOVE_VITAL_THROW", + "MOVE_X_SCISSOR" + ], + "ELECTIVIRE": [ + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_DARKEST_LARIAT", + "MOVE_DIG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ION_DELUGE", + "MOVE_IRON_TAIL", + "MOVE_KARATE_CHOP", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_RISE", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPARK", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WEATHER_BALL", + "MOVE_WILD_CHARGE" + ], + "SHEDINJA": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FINAL_GAMBIT", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRUDGE", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HEAL_BLOCK", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_LEECH_LIFE", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TELEKINESIS", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR" + ], + "BASCULIN_WHITE_STRIPED": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLIP_TURN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_LAST_RESPECTS", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SNOWSCAPE", + "MOVE_SOAK", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "SUNFLORA": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLOWER_SHIELD", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "GARDEVOIR": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRIPLE_AXEL", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "RHYPERIOR": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SPLIT", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNITUDE", + "MOVE_MEGAHORN", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROCK_WRECKER", + "MOVE_ROLLOUT", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_WHIRLPOOL" + ], + "ALTARIA": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_ALLURING_VOICE", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COTTON_GUARD", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAZE", + "MOVE_HEAL_BELL", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MOONBLAST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PLUCK", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SING", + "MOVE_SKY_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM" + ], + "ROTOM_FROST": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DEFOG", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_UPROAR", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "TYPHLOSION_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_BLAST_BURN", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ERUPTION", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAT_WAVE", + "MOVE_HEX", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_INFERNAL_PARADE", + "MOVE_INFERNO", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_POLTERGEIST", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "SCORBUNNY": [ + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BLAZE_KICK", + "MOVE_BOUNCE", + "MOVE_BURNING_JEALOUSY", + "MOVE_COUNTER", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_ELECTRO_BALL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HI_JUMP_KICK", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "STARMIE": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AQUA_JET", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_METEOR_BEAM", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAIN_SPLIT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPOTLIGHT", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "KANGASKHAN": [ + "MOVE_AERIAL_ACE", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CIRCLE_THROW", + "MOVE_COMET_PUNCH", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMP", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERRAIN_PULSE", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRUMP_CARD", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON" + ], + "ETERNATUS": [ + "MOVE_AGILITY", + "MOVE_ASSURANCE", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_CONFUSE_RAY", + "MOVE_COSMIC_POWER", + "MOVE_CROSS_POISON", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMAX_CANNON", + "MOVE_ENDURE", + "MOVE_ETERNABEAM", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", + "MOVE_MYSTICAL_FIRE", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK" + ], + "TAUROS_PALDEA_COMBAT": [ + "MOVE_ASSURANCE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAGING_BULL", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "HITMONLEE": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_AXE_KICK", + "MOVE_BATON_PASS", + "MOVE_BIDE", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEINT", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_JUMP_KICK", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MACH_PUNCH", + "MOVE_MEDITATE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIND_READER", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLING_KICK", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WIDE_GUARD", + "MOVE_WORK_UP" + ], + "KYUREM": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CONFIDE", + "MOVE_CUT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FREEZE_DRY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GLACIATE", + "MOVE_HAIL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_NOBLE_ROAR", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_ZEN_HEADBUTT" + ], + "WALREIN": [ + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STEEL_ROLLER", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WHIRLPOOL", + "MOVE_YAWN" + ], + "KOMALA": [ + "MOVE_ACROBATICS", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_PAYBACK", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SING", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WISH", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "SCOLIPEDE": [ + "MOVE_AGILITY", + "MOVE_AQUA_TAIL", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BITE", + "MOVE_BUG_BITE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_GYRO_BALL", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMART_STRIKE", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEAMROLLER", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TWINEEDLE", + "MOVE_U_TURN", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "SNOVER": [ + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_INGRAIN", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_PUNCH", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMP", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WOOD_HAMMER", + "MOVE_WORRY_SEED" + ], + "SUNKERN": [ + "MOVE_ABSORB", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INGRAIN", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "MESPRIT": [ + "MOVE_ACROBATICS", + "MOVE_ALLY_SWITCH", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COPYCAT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLATTER", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_POWER", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "GALVANTULA": [ + "MOVE_ABSORB", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAMOUFLAGE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_CUT", + "MOVE_DISABLE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_SPIDER_WEB", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR" + ], + "GRUMPIG": [ + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTH_POWER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BELL", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_LUCKY_CHANT", + "MOVE_LUNGE", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIRROR_COAT", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SIMPLE_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPLASH", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEETER_DANCE", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_UPROAR", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "MUDSDALE": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGNITUDE", + "MOVE_MEGA_KICK", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC" + ], + "SLAKING": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POUNCE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PUNISHMENT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLACK_OFF", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "GULPIN": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_POISON_GAS", + "MOVE_POISON_JAB", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOG", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_STUFF_CHEEKS", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_PULSE", + "MOVE_WRING_OUT", + "MOVE_YAWN" + ], + "CHEWTLE": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_GASTRO_ACID", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_FANG", + "MOVE_JAW_LOCK", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_REVENGE", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCARY_FACE", + "MOVE_SHELL_SMASH", + "MOVE_SKITTER_SMACK", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "VESPIQUEN": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ASSURANCE", + "MOVE_ATTACK_ORDER", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CROSS_POISON", + "MOVE_CUT", + "MOVE_DEFEND_ORDER", + "MOVE_DEFOG", + "MOVE_DESTINY_BOND", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FELL_STINGER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAL_ORDER", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_LASER_FOCUS", + "MOVE_LUNGE", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PIN_MISSILE", + "MOVE_POISON_STING", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POWER_GEM", + "MOVE_POWER_SHIFT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_NOISE", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_X_SCISSOR" + ], + "NIDORINO": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHIP_AWAY", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLATTER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_ICE_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POISON_TAIL", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_VENOM_DRENCH", + "MOVE_VENOSHOCK", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "BRONZOR": [ + "MOVE_ALLY_SWITCH", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_EXTRASENSORY", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SWAP", + "MOVE_GYRO_BALL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HYPNOSIS", + "MOVE_ICE_SPINNER", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_SOUND", + "MOVE_NATURAL_GIFT", + "MOVE_PAYBACK", + "MOVE_POWER_GEM", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPEED_SWAP", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "LARVESTA": [ + "MOVE_ABSORB", + "MOVE_ACROBATICS", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CALM_MIND", + "MOVE_CONFIDE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HARDEN", + "MOVE_HEAT_WAVE", + "MOVE_HIDDEN_POWER", + "MOVE_INCINERATE", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_MORNING_SUN", + "MOVE_OVERHEAT", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "CHARMELEON": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RAGE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAGON_TAIL", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_BURST", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_INFERNO", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METAL_CLAW", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_WEATHER_BALL", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "BOUNSWEET": [ + "MOVE_ACUPRESSURE", + "MOVE_AROMATHERAPY", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BULLET_SEED", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLAIL", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_WHISTLE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_NATURE_POWER", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "SHROOMISH": [ + "MOVE_ABSORB", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_VENOSHOCK", + "MOVE_WAKE_UP_SLAP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "ABRA": [ + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BARRIER", + "MOVE_BIDE", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GUARD_SPLIT", + "MOVE_GUARD_SWAP", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_POWER_SWAP", + "MOVE_POWER_TRICK", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WONDER_ROOM", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "EXCADRILL": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUSH_CLAW", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MAGNET_RISE", + "MOVE_MEGAHORN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROTOTILLER", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_X_SCISSOR" + ], + "CASTFORM": [ + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CAPTIVATE", + "MOVE_CLEAR_SMOG", + "MOVE_CONFIDE", + "MOVE_COSMIC_POWER", + "MOVE_DEFENSE_CURL", + "MOVE_DEFOG", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_LAST_RESORT", + "MOVE_LUCKY_CHANT", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WORK_UP" + ], + "ARCTOVISH": [ + "MOVE_ANCIENT_POWER", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_CRUNCH", + "MOVE_DIVE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISHIOUS_REND", + "MOVE_FREEZE_DRY", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_POWDER_SNOW", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SURF", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "WUGTRIO": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BLIZZARD", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_DIG", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_LIQUIDATION", + "MOVE_MEMENTO", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TRIPLE_DIVE", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WRAP" + ], + "TAUROS": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HORN_ATTACK", + "MOVE_HORN_DRILL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_INCINERATE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAGE", + "MOVE_RAGING_BULL", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPITE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TURTWIG": [ + "MOVE_ABSORB", + "MOVE_AMNESIA", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SAND_TOMB", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHELL_SMASH", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIT_UP", + "MOVE_STEALTH_ROCK", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "DURALUDON": [ + "MOVE_ATTRACT", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_IMPACT", + "MOVE_GYRO_BALL", + "MOVE_HEAVY_SLAM", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LASER_FOCUS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_BURST", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIRROR_COAT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE" + ], + "PRIMARINA": [ + "MOVE_ACROBATICS", + "MOVE_ALLURING_VOICE", + "MOVE_AMNESIA", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_AROMATIC_MIST", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPARKLING_ARIA", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP" + ], + "RALTS": [ + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GRUDGE", + "MOVE_HEADBUTT", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LUCKY_CHANT", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MEAN_LOOK", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MEMENTO", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_PAIN_SPLIT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SYNCHRONOISE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "TURTONATOR": [ + "MOVE_ATTRACT", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BURNING_JEALOUSY", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAIL", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASH_OUT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_RAPID_SPIN", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", + "MOVE_SHELL_SMASH", + "MOVE_SHELL_TRAP", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOG", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WIDE_GUARD", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "TROPIUS": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_HAMMER", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_GUST", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEAF_TORNADO", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_MIMIC", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PETAL_BLIZZARD", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPITE", + "MOVE_STEEL_WING", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WIDE_GUARD", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "CRYOGONAL": [ + "MOVE_ACID_ARMOR", + "MOVE_ACROBATICS", + "MOVE_ANCIENT_POWER", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AURORA_VEIL", + "MOVE_AVALANCHE", + "MOVE_BIND", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_DEFOG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MIST", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAPID_SPIN", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SELF_DESTRUCT", + "MOVE_SHARPEN", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_PULSE" + ], + "CALYREX_ICE": [ + "MOVE_AGILITY", + "MOVE_ALLY_SWITCH", + "MOVE_AROMATHERAPY", + "MOVE_ASSURANCE", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DRAINING_KISS", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GLACIAL_LANCE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWTH", + "MOVE_GUARD_SWAP", + "MOVE_HAIL", + "MOVE_HEAL_PULSE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_LASH_OUT", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_ROOM", + "MOVE_MEGAHORN", + "MOVE_MEGA_DRAIN", + "MOVE_METRONOME", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_PAYBACK", + "MOVE_PAY_DAY", + "MOVE_POLLEN_PUFF", + "MOVE_POUND", + "MOVE_POWER_SWAP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPEED_SWAP", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "BELDUM": [ + "MOVE_AGILITY", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_STEEL_BEAM", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_ZEN_HEADBUTT" + ], + "JOLTIK": [ + "MOVE_ABSORB", + "MOVE_AGILITY", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAMOUFLAGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CROSS_POISON", + "MOVE_CUT", + "MOVE_DISABLE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_INFESTATION", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_RISE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_RISING_VOLTAGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROUND", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SKITTER_SMACK", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPEED_SWAP", + "MOVE_SPIDER_WEB", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_X_SCISSOR" + ], + "EMPOLEON": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_PECK", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAIL", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_FURY_ATTACK", + "MOVE_FURY_CUTTER", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LASH_OUT", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MIST", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NATURAL_GIFT", + "MOVE_PECK", + "MOVE_PLUCK", + "MOVE_POUND", + "MOVE_POWER_TRIP", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUASH", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SIGNAL_BEAM", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THROAT_CHOP", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WAVE_CRASH", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_YAWN" + ], + "RATTATA_ALOLA": [ + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_EMBARGO", + "MOVE_ENDEAVOR", + "MOVE_FACADE", + "MOVE_FINAL_GAMBIT", + "MOVE_FOCUS_ENERGY", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_FANG", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_ME_FIRST", + "MOVE_PROTECT", + "MOVE_PURSUIT", + "MOVE_QUASH", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_STOCKPILE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_SWITCHEROO", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THIEF", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_ZEN_HEADBUTT" + ], + "ZACIAN": [ + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ASSURANCE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_FANG", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LASER_FOCUS", + "MOVE_METAL_CLAW", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_NOBLE_ROAR", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHO_CUT", + "MOVE_QUICK_ATTACK", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROUND", + "MOVE_SACRED_SWORD", + "MOVE_SCARY_FACE", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SNARL", + "MOVE_SNORE", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_SLAP", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "CLEFABLE": [ + "MOVE_AFTER_YOU", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_AMNESIA", + "MOVE_AROMATHERAPY", + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COPYCAT", + "MOVE_COSMIC_POWER", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFENSE_CURL", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_SLAP", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOLLOW_ME", + "MOVE_FRUSTRATION", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GRAVITY", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_BELL", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METEOR_BEAM", + "MOVE_METEOR_MASH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MINIMIZE", + "MOVE_MISTY_EXPLOSION", + "MOVE_MISTY_TERRAIN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_NIGHT_SHADE", + "MOVE_PLAY_ROUGH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRESENT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SING", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SOFT_BOILED", + "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", + "MOVE_SPOTLIGHT", + "MOVE_STEALTH_ROCK", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_KISS", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_UPROAR", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_WONDER_ROOM", + "MOVE_WORK_UP", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "WIMPOD": [ + "MOVE_AQUA_JET", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BUG_BUZZ", + "MOVE_CONFIDE", + "MOVE_DEFENSE_CURL", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FRUSTRATION", + "MOVE_HAIL", + "MOVE_HARDEN", + "MOVE_HIDDEN_POWER", + "MOVE_LEECH_LIFE", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SPIKES", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WIDE_GUARD" + ], + "TYNAMO": [ + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_MAGNET_RISE", + "MOVE_PROTECT", + "MOVE_SPARK", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE" + ], + "CHESNAUGHT": [ + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BELLY_DRUM", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DEFENSE_CURL", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FEINT", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FRENZY_PLANT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_GYRO_BALL", + "MOVE_HAMMER_ARM", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NATURE_POWER", + "MOVE_NEEDLE_ARM", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_PUNCH", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WIDE_GUARD", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_WORRY_SEED", + "MOVE_ZEN_HEADBUTT" + ], + "DEWGONG": [ + "MOVE_ALLURING_VOICE", + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AURORA_BEAM", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_ECHOED_VOICE", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENTRAINMENT", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FROST_BREATH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HORN_DRILL", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICE_SPINNER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_NATURAL_GIFT", + "MOVE_PAY_DAY", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHEER_COLD", + "MOVE_SIGNAL_BEAM", + "MOVE_SKULL_BASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMART_STRIKE", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIT_UP", + "MOVE_STOCKPILE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWALLOW", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL" + ], + "PALPITOAD": [ + "MOVE_ACID", + "MOVE_AFTER_YOU", + "MOVE_AQUA_RING", + "MOVE_ATTRACT", + "MOVE_BOUNCE", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTH_POWER", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_BOMB", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_UPROAR", + "MOVE_VENOM_DRENCH", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL" + ], + "GROWLITHE_HISUI": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CLOSE_COMBAT", + "MOVE_COVET", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HOWL", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MORNING_SUN", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SCORCHING_SANDS", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP" + ], + "CARRACOSTA": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BRINE", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FOCUS_BLAST", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GUARD_SWAP", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_METEOR_BEAM", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHELL_SMASH", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TOXIC", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WIDE_GUARD", + "MOVE_WITHDRAW", + "MOVE_ZEN_HEADBUTT" + ], + "SLOWBRO": [ + "MOVE_AERIAL_ACE", + "MOVE_AFTER_YOU", + "MOVE_AMNESIA", + "MOVE_AQUA_TAIL", + "MOVE_ATTRACT", + "MOVE_AVALANCHE", + "MOVE_BELCH", + "MOVE_BELLY_DRUM", + "MOVE_BIDE", + "MOVE_BLIZZARD", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRINE", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COUNTER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DISABLE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_EXPANDING_FORCE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_HAIL", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_ME_FIRST", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHTMARE", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_NOISE", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAGE", + "MOVE_RAIN_DANCE", + "MOVE_RAZOR_SHELL", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_SMASH", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SIGNAL_BEAM", + "MOVE_SKILL_SWAP", + "MOVE_SKULL_BASH", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_STOMP", + "MOVE_STORED_POWER", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TELEPORT", + "MOVE_TERA_BLAST", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_TRI_ATTACK", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WITHDRAW", + "MOVE_WONDER_ROOM", + "MOVE_YAWN", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TOXEL": [ + "MOVE_ACID", + "MOVE_ATTRACT", + "MOVE_BELCH", + "MOVE_CHARM", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_GROWL", + "MOVE_METAL_SOUND", + "MOVE_NUZZLE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROUND", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SUBSTITUTE", + "MOVE_TEARFUL_LOOK", + "MOVE_TERA_BLAST" + ], + "FROGADIER": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_ATTRACT", + "MOVE_BESTOW", + "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE", + "MOVE_BUBBLE_BEAM", + "MOVE_CAMOUFLAGE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CUT", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DIVE", + "MOVE_DOUBLE_TEAM", + "MOVE_ECHOED_VOICE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLING", + "MOVE_FLIP_TURN", + "MOVE_FRUSTRATION", + "MOVE_GRASS_KNOT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_MIND_READER", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_MUD_SPORT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_POUND", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_SNEAK", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SMOKESCREEN", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SNOWSCAPE", + "MOVE_SPIKES", + "MOVE_SPITE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WORK_UP" + ], + "URSALUNA": [ + "MOVE_AERIAL_ACE", + "MOVE_AVALANCHE", + "MOVE_BABY_DOLL_EYES", + "MOVE_BELLY_DRUM", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CROSS_CHOP", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FURY_CUTTER", + "MOVE_FURY_SWIPES", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADLONG_RUSH", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_KICK", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_NIGHT_SLASH", + "MOVE_PAYBACK", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SCARY_FACE", + "MOVE_SCRATCH", + "MOVE_SEED_BOMB", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWEET_SCENT", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_YAWN" + ], + "CENTISKORCH": [ + "MOVE_ATTRACT", + "MOVE_BITE", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_BURN_UP", + "MOVE_COIL", + "MOVE_CRUNCH", + "MOVE_DEFENSE_CURL", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_LASH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_INFERNO", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MYSTICAL_FIRE", + "MOVE_OVERHEAT", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCALD", + "MOVE_SCORCHING_SANDS", + "MOVE_SKITTER_SMACK", + "MOVE_SLAM", + "MOVE_SLEEP_TALK", + "MOVE_SMOKESCREEN", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_THUNDER_FANG", + "MOVE_VENOSHOCK", + "MOVE_WILL_O_WISP", + "MOVE_WRAP", + "MOVE_X_SCISSOR" + ], + "STAKATAKA": [ + "MOVE_ALLY_SWITCH", + "MOVE_AUTOTOMIZE", + "MOVE_BIDE", + "MOVE_BIND", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_GYRO_BALL", + "MOVE_HARDEN", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MAGNET_RISE", + "MOVE_MEGA_KICK", + "MOVE_METEOR_BEAM", + "MOVE_PROTECT", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_ROLLER", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERPOWER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TOXIC", + "MOVE_TRICK_ROOM", + "MOVE_WIDE_GUARD", + "MOVE_WONDER_ROOM", + "MOVE_ZEN_HEADBUTT" + ], + "LATIAS": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ALLURING_VOICE", + "MOVE_ALLY_SWITCH", + "MOVE_ATTRACT", + "MOVE_AURA_SPHERE", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSION", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DEFOG", + "MOVE_DISARMING_VOICE", + "MOVE_DIVE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CHEER", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLY", + "MOVE_FRUSTRATION", + "MOVE_FURY_CUTTER", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_GUARD_SPLIT", + "MOVE_HEALING_WISH", + "MOVE_HEAL_PULSE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LASER_FOCUS", + "MOVE_LAST_RESORT", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_MIMIC", + "MOVE_MIST_BALL", + "MOVE_MUD_SLAP", + "MOVE_MYSTICAL_FIRE", + "MOVE_NATURAL_GIFT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYCHO_SHIFT", + "MOVE_PSYCH_UP", + "MOVE_PSYSHOCK", + "MOVE_PSYWAVE", + "MOVE_RAIN_DANCE", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REFRESH", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_ROAR", + "MOVE_ROLE_PLAY", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SANDSTORM", + "MOVE_SCALE_SHOT", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WATER_SPORT", + "MOVE_WEATHER_BALL", + "MOVE_WHIRLPOOL", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "IRON_MOTH": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BUG_BUZZ", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISCHARGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIERY_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_MORNING_SUN", + "MOVE_OVERHEAT", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REST", + "MOVE_SCREECH", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_WAVE", + "MOVE_SOLAR_BEAM", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TERA_BLAST", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_WHIRLWIND" + ], + "SHUPPET": [ + "MOVE_ALLY_SWITCH", + "MOVE_ASTONISH", + "MOVE_ATTRACT", + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DESTINY_BOND", + "MOVE_DISABLE", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBARGO", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FLASH", + "MOVE_FORESIGHT", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GRUDGE", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HIDDEN_POWER", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LICK", + "MOVE_MAGIC_COAT", + "MOVE_MAGIC_ROOM", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_NIGHT_SHADE", + "MOVE_OMINOUS_WIND", + "MOVE_PAIN_SPLIT", + "MOVE_PAYBACK", + "MOVE_PHANTOM_FORCE", + "MOVE_POLTERGEIST", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCH_UP", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROLE_PLAY", + "MOVE_ROUND", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHOCK_WAVE", + "MOVE_SKILL_SWAP", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_SUBSTITUTE", + "MOVE_SUCKER_PUNCH", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TELEKINESIS", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "REGIGIGAS": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_AVALANCHE", + "MOVE_BLOCK", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUSH_GRIP", + "MOVE_DARKEST_LARIAT", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FORESIGHT", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRAVITY", + "MOVE_HAMMER_ARM", + "MOVE_HARD_PRESS", + "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", + "MOVE_HEAVY_SLAM", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_HORSEPOWER", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PAYBACK", + "MOVE_POUND", + "MOVE_POWER_SHIFT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_POLISH", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STOMP", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPERPOWER", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TERA_BLAST", + "MOVE_TERRAIN_PULSE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_WIDE_GUARD", + "MOVE_ZEN_HEADBUTT" + ], + "GUMSHOOS": [ + "MOVE_ATTRACT", + "MOVE_BIDE", + "MOVE_BITE", + "MOVE_BLOCK", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ECHOED_VOICE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_FANG", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LAST_RESORT", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_ODOR_SLEUTH", + "MOVE_PAYBACK", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_PURSUIT", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SANDSTORM", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHOCK_WAVE", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STOMPING_TANTRUM", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THRASH", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP", + "MOVE_YAWN", + "MOVE_ZEN_HEADBUTT" + ], + "ELECTRODE_HISUI": [ + "MOVE_AGILITY", + "MOVE_BULLET_SEED", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHLOROBLAST", + "MOVE_CURSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTROWEB", + "MOVE_ELECTRO_BALL", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FOUL_PLAY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GYRO_BALL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BALL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_RAIN_DANCE", + "MOVE_RECYCLE", + "MOVE_REFLECT", + "MOVE_REST", + "MOVE_ROLLOUT", + "MOVE_SCARY_FACE", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLEEP_TALK", + "MOVE_SOLAR_BEAM", + "MOVE_SPARK", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERCELL_SLAM", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WORRY_SEED" + ], + "BELLOSSOM": [ + "MOVE_ABSORB", + "MOVE_ACID", + "MOVE_ACID_SPRAY", + "MOVE_AFTER_YOU", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BULLET_SEED", + "MOVE_CAPTIVATE", + "MOVE_CHARM", + "MOVE_CONFIDE", + "MOVE_CURSE", + "MOVE_CUT", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAIL", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FRUSTRATION", + "MOVE_GASTRO_ACID", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_GLIDE", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GROWTH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_INGRAIN", + "MOVE_LASER_FOCUS", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGA_DRAIN", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_NATURAL_GIFT", + "MOVE_NATURE_POWER", + "MOVE_PETAL_BLIZZARD", + "MOVE_PETAL_DANCE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_POWDER", + "MOVE_POLLEN_PUFF", + "MOVE_PROTECT", + "MOVE_QUIVER_DANCE", + "MOVE_RAZOR_LEAF", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROUND", + "MOVE_SAFEGUARD", + "MOVE_SECRET_POWER", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STRENGTH_SAP", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWEET_SCENT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TEETER_DANCE", + "MOVE_TERA_BLAST", + "MOVE_TICKLE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_UPROAR", + "MOVE_VENOSHOCK", + "MOVE_WEATHER_BALL", + "MOVE_WORRY_SEED" + ], + "SCRAFTY": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ASSURANCE", + "MOVE_ATTRACT", + "MOVE_BEAT_UP", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHIP_AWAY", + "MOVE_CLOSE_COMBAT", + "MOVE_COACHING", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAINT_ATTACK", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_PUNCH", + "MOVE_FOUL_PLAY", + "MOVE_FRUSTRATION", + "MOVE_GIGA_IMPACT", + "MOVE_GRASS_KNOT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HIGH_JUMP_KICK", + "MOVE_HI_JUMP_KICK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_INCINERATE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", + "MOVE_PAYBACK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_GUARD", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVENGE", + "MOVE_REVERSAL", + "MOVE_ROAR", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", + "MOVE_SCARY_FACE", + "MOVE_SECRET_POWER", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMACK_DOWN", + "MOVE_SNARL", + "MOVE_SNATCH", + "MOVE_SNORE", + "MOVE_SPITE", + "MOVE_STONE_EDGE", + "MOVE_STRENGTH", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THROAT_CHOP", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "SCATTERBUG": [ + "MOVE_BUG_BITE", + "MOVE_POISON_POWDER", + "MOVE_POUNCE", + "MOVE_PROTECT", + "MOVE_RAGE_POWDER", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_STUN_SPORE", + "MOVE_TACKLE", + "MOVE_TERA_BLAST" + ], + "VOLBEAT": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_ATTRACT", + "MOVE_BATON_PASS", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BITE", + "MOVE_BUG_BUZZ", + "MOVE_CAPTIVATE", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFIDE", + "MOVE_CONFUSE_RAY", + "MOVE_COUNTER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DEFOG", + "MOVE_DIZZY_PUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH", + "MOVE_FLING", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_GIGA_DRAIN", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_ICE_PUNCH", + "MOVE_INFESTATION", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MEGA_KICK", + "MOVE_MEGA_PUNCH", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_MUD_SLAP", + "MOVE_NATURAL_GIFT", + "MOVE_OMINOUS_WIND", + "MOVE_PLAY_NICE", + "MOVE_PLAY_ROUGH", + "MOVE_POUNCE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETURN", + "MOVE_ROOST", + "MOVE_ROUND", + "MOVE_SECRET_POWER", + "MOVE_SEISMIC_TOSS", + "MOVE_SHADOW_BALL", + "MOVE_SHOCK_WAVE", + "MOVE_SIGNAL_BEAM", + "MOVE_SILVER_WIND", + "MOVE_SKITTER_SMACK", + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAILWIND", + "MOVE_TAIL_GLOW", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRICK", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_ZEN_HEADBUTT" + ], + "MONFERNO": [ + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_ASSIST", + "MOVE_ATTRACT", + "MOVE_BLAZE_KICK", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BURNING_JEALOUSY", + "MOVE_CAPTIVATE", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFIDE", + "MOVE_COUNTER", + "MOVE_COVET", + "MOVE_CUT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EMBER", + "MOVE_ENCORE", + "MOVE_ENDEAVOR", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FEINT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FLING", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_FOCUS_PUNCH", + "MOVE_FRUSTRATION", + "MOVE_FURY_SWIPES", + "MOVE_GRASS_KNOT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HELPING_HAND", + "MOVE_HIDDEN_POWER", + "MOVE_HONE_CLAWS", + "MOVE_INCINERATE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LASH_OUT", + "MOVE_LEER", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_METRONOME", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NATURAL_GIFT", + "MOVE_OVERHEAT", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYCH_UP", + "MOVE_QUICK_GUARD", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_RETURN", + "MOVE_REVERSAL", + "MOVE_ROCK_CLIMB", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLE_PLAY", + "MOVE_ROLLOUT", + "MOVE_ROUND", + "MOVE_SCRATCH", + "MOVE_SECRET_POWER", + "MOVE_SHADOW_CLAW", + "MOVE_SLACK_OFF", + "MOVE_SLEEP_TALK", + "MOVE_SMACK_DOWN", + "MOVE_SNORE", + "MOVE_STEALTH_ROCK", + "MOVE_STRENGTH", + "MOVE_SUBMISSION", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWITCHEROO", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TEMPER_FLARE", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_UPPER_HAND", + "MOVE_UPROAR", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ] +} \ No newline at end of file diff --git a/src/data/pokemon/egg_data.h b/src/data/pokemon/egg_data.h new file mode 100644 index 000000000..3e0832956 --- /dev/null +++ b/src/data/pokemon/egg_data.h @@ -0,0 +1,11 @@ +#if P_FAMILY_MANAPHY +[EGG_ID_MANAPHY] = +{ + .eggIcon = gMonEggIcon_Manaphy, + .eggSprite = gMonEggGfx_Manaphy, + .eggPalette = gMonEggPal_Manaphy, + .eggHatchGfx = gMonHatchGfx_Manaphy, + .eggHatchPal = gMonHatchPal_Manaphy, + .eggIconPalIndex = 2, +}, +#endif //P_FAMILY_MANAPHY diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 5c2281969..4707741d0 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -1,17 +1,20 @@ #if P_FAMILY_BULBASAUR -static const struct FormChange sVenusaurFormChangeTable[] = { +static const struct FormChange sVenusaurFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_VENUSAUR_MEGA, ITEM_VENUSAURITE}, #endif #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_VENUSAUR_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_VENUSAUR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BULBASAUR #if P_FAMILY_CHARMANDER -static const struct FormChange sCharizardFormChangeTable[] = { +static const struct FormChange sCharizardFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHARIZARD_MEGA_X, ITEM_CHARIZARDITE_X}, {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHARIZARD_MEGA_Y, ITEM_CHARIZARDITE_Y}, @@ -19,18 +22,21 @@ static const struct FormChange sCharizardFormChangeTable[] = { #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CHARIZARD_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CHARIZARD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHARMANDER #if P_FAMILY_SQUIRTLE -static const struct FormChange sBlastoiseFormChangeTable[] = { +static const struct FormChange sBlastoiseFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BLASTOISE_MEGA, ITEM_BLASTOISINITE}, #endif #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BLASTOISE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BLASTOISE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SQUIRTLE @@ -41,24 +47,29 @@ static const struct FormChange sButterfreeFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_BUTTERFREE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BUTTERFREE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CATERPIE #if P_FAMILY_WEEDLE -static const struct FormChange sBeedrillFormChangeTable[] = { +static const struct FormChange sBeedrillFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BEEDRILL_MEGA, ITEM_BEEDRILLITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BEEDRILL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_WEEDLE #if P_FAMILY_PIDGEY -static const struct FormChange sPidgeotFormChangeTable[] = { +static const struct FormChange sPidgeotFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_PIDGEOT_MEGA, ITEM_PIDGEOTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_PIDGEOT}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_PIDGEY @@ -69,6 +80,7 @@ static const struct FormChange sPikachuFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_PIKACHU_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_PIKACHU}, {FORM_CHANGE_TERMINATOR}, }; @@ -77,15 +89,18 @@ static const struct FormChange sRaichuFormChangeTable[] = { {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_RAICHU_MEGA_X, ITEM_RAICHUNITE_X}, {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_RAICHU_MEGA_Y, ITEM_RAICHUNITE_Y}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_RAICHU}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_PIKACHU #if P_FAMILY_CLEFAIRY -static const struct FormChange sClefableFormChangeTable[] = { +static const struct FormChange sClefableFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CLEFABLE_MEGA, ITEM_CLEFABLITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CLEFABLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CLEFAIRY @@ -96,15 +111,18 @@ static const struct FormChange sMeowthFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MEOWTH_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEOWTH}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MEOWTH #if P_FAMILY_ABRA -static const struct FormChange sAlakazamFormChangeTable[] = { +static const struct FormChange sAlakazamFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ALAKAZAM_MEGA, ITEM_ALAKAZITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ALAKAZAM}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ABRA @@ -115,46 +133,55 @@ static const struct FormChange sMachampFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MACHAMP_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MACHAMP}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MACHOP #if P_FAMILY_BELLSPROUT -static const struct FormChange sVictreebelFormChangeTable[] = { +static const struct FormChange sVictreebelFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_VICTREEBEL_MEGA, ITEM_VICTREEBELITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_VICTREEBEL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BELLSPROUT #if P_FAMILY_SLOWPOKE -static const struct FormChange sSlowbroFormChangeTable[] = { +static const struct FormChange sSlowbroFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SLOWBRO_MEGA, ITEM_SLOWBRONITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SLOWBRO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SLOWPOKE #if P_FAMILY_GASTLY -static const struct FormChange sGengarFormChangeTable[] = { +static const struct FormChange sGengarFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GENGAR_MEGA, ITEM_GENGARITE}, #endif #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GENGAR_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GENGAR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GASTLY #if P_FAMILY_ONIX #if P_GEN_2_CROSS_EVOS -static const struct FormChange sSteelixFormChangeTable[] = { +static const struct FormChange sSteelixFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_STEELIX_MEGA, ITEM_STEELIXITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_STEELIX}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_GEN_2_CROSS_EVOS @@ -166,297 +193,362 @@ static const struct FormChange sKinglerFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_KINGLER_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_KINGLER}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_KRABBY #if P_FAMILY_KANGASKHAN -static const struct FormChange sKangaskhanFormChangeTable[] = { +static const struct FormChange sKangaskhanFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_KANGASKHAN_MEGA, ITEM_KANGASKHANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_KANGASKHAN}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_KANGASKHAN #if P_FAMILY_STARYU -static const struct FormChange sStarmieFormChangeTable[] = { +static const struct FormChange sStarmieFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_STARMIE_MEGA, ITEM_STARMINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_STARMIE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_STARYU #if P_FAMILY_SCYTHER #if P_GEN_2_CROSS_EVOS -static const struct FormChange sScizorFormChangeTable[] = { +static const struct FormChange sScizorFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCIZOR_MEGA, ITEM_SCIZORITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SCIZOR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_GEN_2_CROSS_EVOS #endif //P_FAMILY_SCYTHER #if P_FAMILY_PINSIR -static const struct FormChange sPinsirFormChangeTable[] = { +static const struct FormChange sPinsirFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_PINSIR_MEGA, ITEM_PINSIRITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_PINSIR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_PINSIR #if P_FAMILY_MAGIKARP -static const struct FormChange sGyaradosFormChangeTable[] = { +static const struct FormChange sGyaradosFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GYARADOS_MEGA, ITEM_GYARADOSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GYARADOS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MAGIKARP #if P_FAMILY_LAPRAS -static const struct FormChange sLaprasFormChangeTable[] = { +static const struct FormChange sLaprasFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_LAPRAS_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_LAPRAS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LAPRAS #if P_FAMILY_EEVEE -static const struct FormChange sEeveeFormChangeTable[] = { +static const struct FormChange sEeveeFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_EEVEE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_EEVEE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_EEVEE #if P_FAMILY_AERODACTYL -static const struct FormChange sAerodactylFormChangeTable[] = { +static const struct FormChange sAerodactylFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_AERODACTYL_MEGA, ITEM_AERODACTYLITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_AERODACTYL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_AERODACTYL #if P_FAMILY_SNORLAX -static const struct FormChange sSnorlaxFormChangeTable[] = { +static const struct FormChange sSnorlaxFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SNORLAX_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SNORLAX}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SNORLAX #if P_FAMILY_DRATINI -static const struct FormChange sDragoniteFormChangeTable[] = { +static const struct FormChange sDragoniteFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAGONITE_MEGA, ITEM_DRAGONINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DRAGONITE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DRATINI #if P_FAMILY_MEWTWO -static const struct FormChange sMewtwoFormChangeTable[] = { +static const struct FormChange sMewtwoFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEWTWO_MEGA_X, ITEM_MEWTWONITE_X}, {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEWTWO_MEGA_Y, ITEM_MEWTWONITE_Y}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEWTWO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MEWTWO #if P_FAMILY_CHIKORITA -static const struct FormChange sMeganiumFormChangeTable[] = { +static const struct FormChange sMeganiumFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEGANIUM_MEGA, ITEM_MEGANIUMITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEGANIUM}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHIKORITA #if P_FAMILY_TOTODILE -static const struct FormChange sFeraligatrFormChangeTable[] = { +static const struct FormChange sFeraligatrFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FERALIGATR_MEGA, ITEM_FERALIGITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_FERALIGATR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TOTODILE #if P_FAMILY_MAREEP -static const struct FormChange sAmpharosFormChangeTable[] = { +static const struct FormChange sAmpharosFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_AMPHAROS_MEGA, ITEM_AMPHAROSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_AMPHAROS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MAREEP #if P_FAMILY_HERACROSS -static const struct FormChange sHeracrossFormChangeTable[] = { +static const struct FormChange sHeracrossFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_HERACROSS_MEGA, ITEM_HERACRONITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_HERACROSS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HERACROSS #if P_FAMILY_SKARMORY -static const struct FormChange sSkarmoryFormChangeTable[] = { +static const struct FormChange sSkarmoryFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SKARMORY_MEGA, ITEM_SKARMORITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SKARMORY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SKARMORY #if P_FAMILY_HOUNDOUR -static const struct FormChange sHoundoomFormChangeTable[] = { +static const struct FormChange sHoundoomFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_HOUNDOOM_MEGA, ITEM_HOUNDOOMINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_HOUNDOOM}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HOUNDOUR #if P_FAMILY_LARVITAR -static const struct FormChange sTyranitarFormChangeTable[] = { +static const struct FormChange sTyranitarFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_TYRANITAR_MEGA, ITEM_TYRANITARITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TYRANITAR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LARVITAR #if P_FAMILY_TREECKO -static const struct FormChange sSceptileFormChangeTable[] = { +static const struct FormChange sSceptileFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCEPTILE_MEGA, ITEM_SCEPTILITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SCEPTILE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TREECKO #if P_FAMILY_TORCHIC -static const struct FormChange sBlazikenFormChangeTable[] = { +static const struct FormChange sBlazikenFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BLAZIKEN_MEGA, ITEM_BLAZIKENITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BLAZIKEN}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TORCHIC #if P_FAMILY_MUDKIP -static const struct FormChange sSwampertFormChangeTable[] = { +static const struct FormChange sSwampertFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SWAMPERT_MEGA, ITEM_SWAMPERTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SWAMPERT}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MUDKIP #if P_FAMILY_RALTS -static const struct FormChange sGardevoirFormChangeTable[] = { +static const struct FormChange sGardevoirFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GARDEVOIR_MEGA, ITEM_GARDEVOIRITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GARDEVOIR}, {FORM_CHANGE_TERMINATOR}, }; #if P_GEN_4_CROSS_EVOS -static const struct FormChange sGalladeFormChangeTable[] = { +static const struct FormChange sGalladeFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GALLADE_MEGA, ITEM_GALLADITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GALLADE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_GEN_4_CROSS_EVOS #endif //P_FAMILY_RALTS #if P_FAMILY_SABLEYE -static const struct FormChange sSableyeFormChangeTable[] = { +static const struct FormChange sSableyeFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SABLEYE_MEGA, ITEM_SABLENITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SABLEYE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SABLEYE #if P_FAMILY_MAWILE -static const struct FormChange sMawileFormChangeTable[] = { +static const struct FormChange sMawileFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MAWILE_MEGA, ITEM_MAWILITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MAWILE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MAWILE #if P_FAMILY_ARON -static const struct FormChange sAggronFormChangeTable[] = { +static const struct FormChange sAggronFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_AGGRON_MEGA, ITEM_AGGRONITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_AGGRON}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ARON #if P_FAMILY_MEDITITE -static const struct FormChange sMedichamFormChangeTable[] = { +static const struct FormChange sMedichamFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEDICHAM_MEGA, ITEM_MEDICHAMITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEDICHAM}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MEDITITE #if P_FAMILY_ELECTRIKE -static const struct FormChange sManectricFormChangeTable[] = { +static const struct FormChange sManectricFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MANECTRIC_MEGA, ITEM_MANECTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MANECTRIC}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ELECTRIKE #if P_FAMILY_CARVANHA -static const struct FormChange sSharpedoFormChangeTable[] = { +static const struct FormChange sSharpedoFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SHARPEDO_MEGA, ITEM_SHARPEDONITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SHARPEDO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CARVANHA #if P_FAMILY_NUMEL -static const struct FormChange sCameruptFormChangeTable[] = { +static const struct FormChange sCameruptFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CAMERUPT_MEGA, ITEM_CAMERUPTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CAMERUPT}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_NUMEL #if P_FAMILY_SWABLU -static const struct FormChange sAltariaFormChangeTable[] = { +static const struct FormChange sAltariaFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ALTARIA_MEGA, ITEM_ALTARIANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ALTARIA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SWABLU #if P_FAMILY_SHUPPET -static const struct FormChange sBanetteFormChangeTable[] = { +static const struct FormChange sBanetteFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BANETTE_MEGA, ITEM_BANETTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BANETTE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SHUPPET @@ -466,40 +558,48 @@ static const struct FormChange sChimechoFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHIMECHO_MEGA, ITEM_CHIMECHITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CHIMECHO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHIMECHO #if P_FAMILY_ABSOL -static const struct FormChange sAbsolFormChangeTable[] = { +static const struct FormChange sAbsolFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ABSOL_MEGA, ITEM_ABSOLITE}, #endif #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ABSOL_MEGA_Z, ITEM_ABSOLITE_Z}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ABSOL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ABSOL #if P_FAMILY_SNORUNT -static const struct FormChange sGlalieFormChangeTable[] = { +static const struct FormChange sGlalieFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GLALIE_MEGA, ITEM_GLALITITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GLALIE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sFroslassFormChangeTable[] = { +static const struct FormChange sFroslassFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FROSLASS_MEGA, ITEM_FROSLASSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_FROSLASS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SNORUNT #if P_FAMILY_CASTFORM -static const struct FormChange sCastformFormChangeTable[] = { +static const struct FormChange sCastformFormChangeTable[] = +{ #if OW_FOLLOWERS_WEATHER_FORMS == TRUE {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_SUNNY, WEATHER_SUNNY_CLOUDS}, {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CASTFORM_SUNNY, WEATHER_DROUGHT}, @@ -514,14 +614,14 @@ static const struct FormChange sCastformFormChangeTable[] = { #if B_WEATHER_FORMS >= GEN_5 {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN, ABILITY_FORECAST}, {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN, ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW, ABILITY_FORECAST}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW), ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_ICY_ANY, ABILITY_FORECAST}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_ICY_ANY), ABILITY_FORECAST}, {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE, ABILITY_FORECAST}, #else {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SUNNY, B_WEATHER_SUN}, {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_RAINY, B_WEATHER_RAIN}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_HAIL | B_WEATHER_SNOW}, - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_HAIL | B_WEATHER_SNOW)}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_SNOWY, B_WEATHER_ICY_ANY}, + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, ~(B_WEATHER_SUN | B_WEATHER_RAIN | B_WEATHER_ICY_ANY)}, {FORM_CHANGE_BATTLE_WEATHER, SPECIES_CASTFORM_NORMAL, B_WEATHER_NONE}, #endif {FORM_CHANGE_BATTLE_SWITCH, SPECIES_CASTFORM_NORMAL}, @@ -532,85 +632,103 @@ static const struct FormChange sCastformFormChangeTable[] = { #endif //P_FAMILY_CASTFORM #if P_FAMILY_BAGON -static const struct FormChange sSalamenceFormChangeTable[] = { +static const struct FormChange sSalamenceFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SALAMENCE_MEGA, ITEM_SALAMENCITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SALAMENCE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BAGON #if P_FAMILY_BELDUM -static const struct FormChange sMetagrossFormChangeTable[] = { +static const struct FormChange sMetagrossFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_METAGROSS_MEGA, ITEM_METAGROSSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_METAGROSS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BELDUM #if P_FAMILY_LATIAS -static const struct FormChange sLatiasFormChangeTable[] = { +static const struct FormChange sLatiasFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_LATIAS_MEGA, ITEM_LATIASITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_LATIAS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LATIAS #if P_FAMILY_LATIOS -static const struct FormChange sLatiosFormChangeTable[] = { +static const struct FormChange sLatiosFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_LATIOS_MEGA, ITEM_LATIOSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_LATIOS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LATIOS #if P_FAMILY_KYOGRE -static const struct FormChange sKyogreFormChangeTable[] = { +static const struct FormChange sKyogreFormChangeTable[] = +{ #if P_PRIMAL_REVERSIONS - {FORM_CHANGE_BATTLE_PRIMAL_REVERSION, SPECIES_KYOGRE_PRIMAL, ITEM_BLUE_ORB}, + {FORM_CHANGE_BATTLE_PRIMAL_REVERSION, SPECIES_KYOGRE_PRIMAL, ITEM_BLUE_ORB}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_KYOGRE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_KYOGRE #if P_FAMILY_GROUDON -static const struct FormChange sGroudonFormChangeTable[] = { +static const struct FormChange sGroudonFormChangeTable[] = +{ #if P_PRIMAL_REVERSIONS - {FORM_CHANGE_BATTLE_PRIMAL_REVERSION, SPECIES_GROUDON_PRIMAL, ITEM_RED_ORB}, + {FORM_CHANGE_BATTLE_PRIMAL_REVERSION, SPECIES_GROUDON_PRIMAL, ITEM_RED_ORB}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GROUDON}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GROUDON #if P_FAMILY_RAYQUAZA -static const struct FormChange sRayquazaFormChangeTable[] = { +static const struct FormChange sRayquazaFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_MOVE, SPECIES_RAYQUAZA_MEGA, MOVE_DRAGON_ASCENT}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_RAYQUAZA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_RAYQUAZA #if P_FAMILY_DEOXYS -static const struct FormChange sDeoxysNormalFormChangeTable[] = { +static const struct FormChange sDeoxysNormalFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_DEOXYS_ATTACK, ITEM_METEORITE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sDeoxysAttackFormChangeTable[] = { +static const struct FormChange sDeoxysAttackFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_DEOXYS_DEFENSE, ITEM_METEORITE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sDeoxysDefenseFormChangeTable[] = { +static const struct FormChange sDeoxysDefenseFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_DEOXYS_SPEED, ITEM_METEORITE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sDeoxysSpeedFormChangeTable[] = { +static const struct FormChange sDeoxysSpeedFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_DEOXYS_NORMAL, ITEM_METEORITE}, {FORM_CHANGE_TERMINATOR}, }; @@ -621,12 +739,14 @@ static const struct FormChange sStaraptorFormChangeTable[] = { #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_STARAPTOR_MEGA, ITEM_STARAPTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_STARAPTOR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_STARLY #if P_FAMILY_BURMY -static const struct FormChange sBurmyFormChangeTable[] = { +static const struct FormChange sBurmyFormChangeTable[] = +{ {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_GRASS}, {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_LONG_GRASS}, {FORM_CHANGE_END_BATTLE_ENVIRONMENT, SPECIES_BURMY_PLANT, BATTLE_ENVIRONMENT_POND}, @@ -640,7 +760,8 @@ static const struct FormChange sBurmyFormChangeTable[] = { #endif //P_FAMILY_BURMY #if P_FAMILY_CHERUBI -static const struct FormChange sCherrimFormChangeTable[] = { +static const struct FormChange sCherrimFormChangeTable[] = +{ #if OW_FOLLOWERS_WEATHER_FORMS == TRUE {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CHERRIM_SUNSHINE, WEATHER_DROUGHT}, {FORM_CHANGE_OVERWORLD_WEATHER, SPECIES_CHERRIM_OVERCAST, WEATHER_NONE}, @@ -664,49 +785,58 @@ static const struct FormChange sCherrimFormChangeTable[] = { #endif //P_FAMILY_CHERUBI #if P_FAMILY_BUNEARY -static const struct FormChange sLopunnyFormChangeTable[] = { +static const struct FormChange sLopunnyFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_LOPUNNY_MEGA, ITEM_LOPUNNITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_LOPUNNY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BUNEARY #if P_FAMILY_GIBLE -static const struct FormChange sGarchompFormChangeTable[] = { +static const struct FormChange sGarchompFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GARCHOMP_MEGA, ITEM_GARCHOMPITE}, #endif #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GARCHOMP_MEGA_Z, ITEM_GARCHOMPITE_Z}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GARCHOMP}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GIBLE #if P_FAMILY_RIOLU -static const struct FormChange sLucarioFormChangeTable[] = { +static const struct FormChange sLucarioFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_LUCARIO_MEGA, ITEM_LUCARIONITE}, #endif #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_LUCARIO_MEGA_Z, ITEM_LUCARIONITE_Z}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_LUCARIO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_RIOLU #if P_FAMILY_SNOVER -static const struct FormChange sAbomasnowFormChangeTable[] = { +static const struct FormChange sAbomasnowFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ABOMASNOW_MEGA, ITEM_ABOMASITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ABOMASNOW}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SNOVER #if P_FAMILY_ROTOM -static const struct FormChange sRotomFormChangeTable[] = { +static const struct FormChange sRotomFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ROTOM, ITEM_ROTOM_CATALOG, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ROTOM_HEAT, ITEM_ROTOM_CATALOG, 1}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ROTOM_WASH, ITEM_ROTOM_CATALOG, 2}, @@ -718,7 +848,8 @@ static const struct FormChange sRotomFormChangeTable[] = { #endif //P_FAMILY_ROTOM #if P_FAMILY_DIALGA -static const struct FormChange sDialgaFormChangeTable[] = { +static const struct FormChange sDialgaFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_DIALGA, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_DIALGA_ORIGIN, ITEM_ADAMANT_CRYSTAL}, {FORM_CHANGE_TERMINATOR}, @@ -726,7 +857,8 @@ static const struct FormChange sDialgaFormChangeTable[] = { #endif //P_FAMILY_DIALGA #if P_FAMILY_PALKIA -static const struct FormChange sPalkiaFormChangeTable[] = { +static const struct FormChange sPalkiaFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_PALKIA, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_PALKIA_ORIGIN, ITEM_LUSTROUS_GLOBE}, {FORM_CHANGE_TERMINATOR}, @@ -738,12 +870,14 @@ static const struct FormChange sHeatranFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_HEATRAN_MEGA, ITEM_HEATRANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_HEATRAN}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HEATRAN #if P_FAMILY_GIRATINA -static const struct FormChange sGiratinaFormChangeTable[] = { +static const struct FormChange sGiratinaFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_GIRATINA_ALTERED, ITEM_NONE}, #if I_GRISEOUS_ORB_FORM_CHANGE < GEN_9 {FORM_CHANGE_ITEM_HOLD, SPECIES_GIRATINA_ORIGIN, ITEM_GRISEOUS_ORB}, @@ -758,22 +892,25 @@ static const struct FormChange sDarkraiFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DARKRAI_MEGA, ITEM_DARKRANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DARKRAI}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DARKRAI #if P_FAMILY_SHAYMIN -static const struct FormChange sShayminFormChangeTable[] = { - {FORM_CHANGE_ITEM_USE, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA, DAY, STATUS1_FREEZE | STATUS1_FROSTBITE}, +static const struct FormChange sShayminFormChangeTable[] = +{ + {FORM_CHANGE_ITEM_USE, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA, DAY, STATUS1_ICY_ANY}, {FORM_CHANGE_WITHDRAW, SPECIES_SHAYMIN_LAND}, {FORM_CHANGE_TIME_OF_DAY, SPECIES_SHAYMIN_LAND, NIGHT}, - {FORM_CHANGE_STATUS, SPECIES_SHAYMIN_LAND, STATUS1_FREEZE | STATUS1_FROSTBITE}, + {FORM_CHANGE_STATUS, SPECIES_SHAYMIN_LAND, STATUS1_ICY_ANY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SHAYMIN #if P_FAMILY_ARCEUS -static const struct FormChange sArceusFormChangeTable[] = { +static const struct FormChange sArceusFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_ARCEUS_NORMAL, ITEM_NONE, ABILITY_MULTITYPE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_ARCEUS_FIGHTING, ITEM_FIST_PLATE, ABILITY_MULTITYPE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_ARCEUS_FIGHTING, ITEM_FIGHTINIUM_Z, ABILITY_MULTITYPE}, @@ -814,43 +951,52 @@ static const struct FormChange sArceusFormChangeTable[] = { #endif //P_FAMILY_ARCEUS #if P_FAMILY_TEPIG -static const struct FormChange sEmboarFormChangeTable[] = { +static const struct FormChange sEmboarFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EMBOAR_MEGA, ITEM_EMBOARITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_EMBOAR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TEPIG #if P_FAMILY_DRILBUR -static const struct FormChange sExcadrillFormChangeTable[] = { +static const struct FormChange sExcadrillFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EXCADRILL_MEGA, ITEM_EXCADRITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_EXCADRILL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DRILBUR #if P_FAMILY_AUDINO -static const struct FormChange sAudinoFormChangeTable[] = { +static const struct FormChange sAudinoFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_AUDINO_MEGA, ITEM_AUDINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_AUDINO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_AUDINO #if P_FAMILY_VENIPEDE -static const struct FormChange sScolipedeFormChangeTable[] = { +static const struct FormChange sScolipedeFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCOLIPEDE_MEGA, ITEM_SCOLIPITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SCOLIPEDE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_VENIPEDE #if P_FAMILY_DARUMAKA -static const struct FormChange sDarmanitanFormChangeTable[] = { +static const struct FormChange sDarmanitanFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_STANDARD}, @@ -859,7 +1005,8 @@ static const struct FormChange sDarmanitanFormChangeTable[] = { }; #if P_GALARIAN_FORMS -static const struct FormChange sDarmanitanGalarFormChangeTable[] = { +static const struct FormChange sDarmanitanGalarFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALAR_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_DARMANITAN_GALAR_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_FAINT, SPECIES_DARMANITAN_GALAR_STANDARD}, @@ -870,10 +1017,12 @@ static const struct FormChange sDarmanitanGalarFormChangeTable[] = { #endif //P_FAMILY_DARUMAKA #if P_FAMILY_SCRAGGY -static const struct FormChange sScraftyFormChangeTable[] = { +static const struct FormChange sScraftyFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCRAFTY_MEGA, ITEM_SCRAFTINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SCRAFTY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SCRAGGY @@ -884,24 +1033,29 @@ static const struct FormChange sGarbodorFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GARBODOR_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GARBODOR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TRUBBISH #if P_FAMILY_TYNAMO -static const struct FormChange sEelektrossFormChangeTable[] = { +static const struct FormChange sEelektrossFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_EELEKTROSS_MEGA, ITEM_EELEKTROSSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_EELEKTROSS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TYNAMO #if P_FAMILY_LITWICK -static const struct FormChange sChandelureFormChangeTable[] = { +static const struct FormChange sChandelureFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHANDELURE_MEGA, ITEM_CHANDELURITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CHANDELURE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LITWICK @@ -911,12 +1065,14 @@ static const struct FormChange sGolurkFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GOLURK_MEGA, ITEM_GOLURKITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GOLURK}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GOLETT #if P_FAMILY_TORNADUS -static const struct FormChange sTornadusFormChangeTable[] = { +static const struct FormChange sTornadusFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_TORNADUS_THERIAN, ITEM_REVEAL_GLASS}, {FORM_CHANGE_ITEM_USE, SPECIES_TORNADUS_INCARNATE, ITEM_REVEAL_GLASS}, {FORM_CHANGE_TERMINATOR}, @@ -924,7 +1080,8 @@ static const struct FormChange sTornadusFormChangeTable[] = { #endif //P_FAMILY_TORNADUS #if P_FAMILY_THUNDURUS -static const struct FormChange sThundurusFormChangeTable[] = { +static const struct FormChange sThundurusFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_THUNDURUS_THERIAN, ITEM_REVEAL_GLASS}, {FORM_CHANGE_ITEM_USE, SPECIES_THUNDURUS_INCARNATE, ITEM_REVEAL_GLASS}, {FORM_CHANGE_TERMINATOR}, @@ -932,7 +1089,8 @@ static const struct FormChange sThundurusFormChangeTable[] = { #endif //P_FAMILY_THUNDURUS #if P_FAMILY_LANDORUS -static const struct FormChange sLandorusFormChangeTable[] = { +static const struct FormChange sLandorusFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_LANDORUS_THERIAN, ITEM_REVEAL_GLASS}, {FORM_CHANGE_ITEM_USE, SPECIES_LANDORUS_INCARNATE, ITEM_REVEAL_GLASS}, {FORM_CHANGE_TERMINATOR}, @@ -948,7 +1106,8 @@ static const struct Fusion sKyuremFusionTable[] = { #endif //P_FAMILY_KYUREM #if P_FAMILY_KELDEO -static const struct FormChange sKeldeoFormChangeTable[] = { +static const struct FormChange sKeldeoFormChangeTable[] = +{ {FORM_CHANGE_MOVE, SPECIES_KELDEO_RESOLUTE, MOVE_SECRET_SWORD, WHEN_LEARNED}, {FORM_CHANGE_MOVE, SPECIES_KELDEO_ORDINARY, MOVE_SECRET_SWORD, WHEN_FORGOTTEN}, {FORM_CHANGE_TERMINATOR}, @@ -956,7 +1115,8 @@ static const struct FormChange sKeldeoFormChangeTable[] = { #endif //P_FAMILY_KELDEO #if P_FAMILY_MELOETTA -static const struct FormChange sMeloettaFormChangeTable[] = { +static const struct FormChange sMeloettaFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_PIROUETTE, MOVE_RELIC_SONG}, {FORM_CHANGE_BATTLE_AFTER_MOVE, SPECIES_MELOETTA_ARIA, MOVE_RELIC_SONG}, {FORM_CHANGE_FAINT, SPECIES_MELOETTA_ARIA}, @@ -966,7 +1126,8 @@ static const struct FormChange sMeloettaFormChangeTable[] = { #endif //P_FAMILY_MELOETTA #if P_FAMILY_GENESECT -static const struct FormChange sGenesectFormChangeTable[] = { +static const struct FormChange sGenesectFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_DOUSE, ITEM_DOUSE_DRIVE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_GENESECT_SHOCK, ITEM_SHOCK_DRIVE}, @@ -977,32 +1138,39 @@ static const struct FormChange sGenesectFormChangeTable[] = { #endif //P_FAMILY_GENESECT #if P_FAMILY_CHESPIN -static const struct FormChange sChesnaughtFormChangeTable[] = { +static const struct FormChange sChesnaughtFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CHESNAUGHT_MEGA, ITEM_CHESNAUGHTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CHESNAUGHT}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHESPIN #if P_FAMILY_FENNEKIN -static const struct FormChange sDelphoxFormChangeTable[] = { +static const struct FormChange sDelphoxFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DELPHOX_MEGA, ITEM_DELPHOXITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DELPHOX}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_FENNEKIN #if P_FAMILY_FROAKIE -static const struct FormChange sGreninjaFormChangeTable[] = { +static const struct FormChange sGreninjaFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GRENINJA_MEGA, ITEM_GRENINJITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GRENINJA}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sGreninjaBattleBondFormChangeTable[] = { +static const struct FormChange sGreninjaBattleBondFormChangeTable[] = +{ {FORM_CHANGE_FAINT, SPECIES_GRENINJA_BATTLE_BOND}, {FORM_CHANGE_END_BATTLE, SPECIES_GRENINJA_BATTLE_BOND}, {FORM_CHANGE_TERMINATOR}, @@ -1010,25 +1178,30 @@ static const struct FormChange sGreninjaBattleBondFormChangeTable[] = { #endif //P_FAMILY_FROAKIE #if P_FAMILY_LITLEO -static const struct FormChange sPyroarFormChangeTable[] = { +static const struct FormChange sPyroarFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_PYROAR_MEGA, ITEM_PYROARITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_PYROAR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_LITLEO #if P_FAMILY_FLABEBE -static const struct FormChange sFloetteEternalFormChangeTable[] = { +static const struct FormChange sFloetteEternalFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FLOETTE_MEGA, ITEM_FLOETTITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_FLOETTE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_FLABEBE #if P_FAMILY_FURFROU -static const struct FormChange sFurfrouFormChangeTable[] = { +static const struct FormChange sFurfrouFormChangeTable[] = +{ {FORM_CHANGE_WITHDRAW, SPECIES_FURFROU_NATURAL}, {FORM_CHANGE_DAYS_PASSED, SPECIES_FURFROU_NATURAL, 5}, {FORM_CHANGE_TERMINATOR}, @@ -1040,6 +1213,7 @@ static const struct FormChange sMeowsticMFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEOWSTIC_M_MEGA, ITEM_MEOWSTICITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEOWSTIC_M}, {FORM_CHANGE_TERMINATOR}, }; @@ -1047,12 +1221,14 @@ static const struct FormChange sMeowsticFFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MEOWSTIC_F_MEGA, ITEM_MEOWSTICITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MEOWSTIC_F}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ESPURR #if P_FAMILY_HONEDGE -static const struct FormChange sAegislashFormChangeTable[] = { +static const struct FormChange sAegislashFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY, SPECIES_AEGISLASH_BLADE, DAMAGE_CATEGORY_PHYSICAL, ABILITY_STANCE_CHANGE}, {FORM_CHANGE_BATTLE_BEFORE_MOVE_CATEGORY, SPECIES_AEGISLASH_BLADE, DAMAGE_CATEGORY_SPECIAL, ABILITY_STANCE_CHANGE}, {FORM_CHANGE_BATTLE_BEFORE_MOVE, SPECIES_AEGISLASH_SHIELD, MOVE_KINGS_SHIELD, ABILITY_STANCE_CHANGE}, @@ -1064,43 +1240,52 @@ static const struct FormChange sAegislashFormChangeTable[] = { #endif //P_FAMILY_HONEDGE #if P_FAMILY_INKAY -static const struct FormChange sMalamarFormChangeTable[] = { +static const struct FormChange sMalamarFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MALAMAR_MEGA, ITEM_MALAMARITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MALAMAR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_INKAY #if P_FAMILY_BINACLE -static const struct FormChange sBarbaracleFormChangeTable[] = { +static const struct FormChange sBarbaracleFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BARBARACLE_MEGA, ITEM_BARBARACITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BARBARACLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BINACLE #if P_FAMILY_SKRELP -static const struct FormChange sDragalgeFormChangeTable[] = { +static const struct FormChange sDragalgeFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAGALGE_MEGA, ITEM_DRAGALGITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DRAGALGE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SKRELP #if P_FAMILY_HAWLUCHA -static const struct FormChange sHawluchaFormChangeTable[] = { +static const struct FormChange sHawluchaFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_HAWLUCHA_MEGA, ITEM_HAWLUCHANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_HAWLUCHA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HAWLUCHA #if P_FAMILY_XERNEAS -static const struct FormChange sXerneasFormChangeTable[] = { +static const struct FormChange sXerneasFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_XERNEAS_ACTIVE}, {FORM_CHANGE_END_BATTLE, SPECIES_XERNEAS_NEUTRAL}, {FORM_CHANGE_TERMINATOR}, @@ -1108,33 +1293,38 @@ static const struct FormChange sXerneasFormChangeTable[] = { #endif //P_FAMILY_XERNEAS #if P_FAMILY_ZYGARDE -static const struct FormChange sZygarde50AuraBreakFormChangeTable[] = { +static const struct FormChange sZygarde50AuraBreakFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_AURA_BREAK, ITEM_ZYGARDE_CUBE, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sZygarde10AuraBreakFormChangeTable[] = { +static const struct FormChange sZygarde10AuraBreakFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50, ITEM_ZYGARDE_CUBE, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sZygarde50PowerConstructFormChangeTable[] = { +static const struct FormChange sZygarde50PowerConstructFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_ZYGARDE_COMPLETE, ABILITY_POWER_CONSTRUCT, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sZygarde10PowerConstructFormChangeTable[] = { +static const struct FormChange sZygarde10PowerConstructFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_50_POWER_CONSTRUCT, ITEM_ZYGARDE_CUBE, 0}, {FORM_CHANGE_ITEM_USE_MULTICHOICE, SPECIES_ZYGARDE_10_AURA_BREAK, ITEM_ZYGARDE_CUBE, 1}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_ZYGARDE_COMPLETE, ABILITY_POWER_CONSTRUCT, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sZygardeCompleteFormChangeTable[] = { +static const struct FormChange sZygardeCompleteFormChangeTable[] = +{ {FORM_CHANGE_FAINT}, {FORM_CHANGE_END_BATTLE}, #if P_GEN_9_MEGA_EVOLUTIONS @@ -1145,16 +1335,19 @@ static const struct FormChange sZygardeCompleteFormChangeTable[] = { #endif //P_FAMILY_ZYGARDE #if P_FAMILY_DIANCIE -static const struct FormChange sDiancieFormChangeTable[] = { +static const struct FormChange sDiancieFormChangeTable[] = +{ #if P_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DIANCIE_MEGA, ITEM_DIANCITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DIANCIE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DIANCIE #if P_FAMILY_HOOPA -static const struct FormChange sHoopaFormChangeTable[] = { +static const struct FormChange sHoopaFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_HOOPA_UNBOUND, ITEM_PRISON_BOTTLE, SPECIES_HOOPA_CONFINED}, {FORM_CHANGE_WITHDRAW, SPECIES_HOOPA_CONFINED}, {FORM_CHANGE_DAYS_PASSED, SPECIES_HOOPA_CONFINED, 3}, @@ -1167,12 +1360,14 @@ static const struct FormChange sCrabominableFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_CRABOMINABLE_MEGA, ITEM_CRABOMINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CRABOMINABLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CRABRAWLER #if P_FAMILY_ORICORIO -static const struct FormChange sOricorioFormChangeTable[] = { +static const struct FormChange sOricorioFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_ORICORIO_BAILE, ITEM_RED_NECTAR}, {FORM_CHANGE_ITEM_USE, SPECIES_ORICORIO_POM_POM, ITEM_YELLOW_NECTAR}, {FORM_CHANGE_ITEM_USE, SPECIES_ORICORIO_PAU, ITEM_PINK_NECTAR}, @@ -1182,7 +1377,8 @@ static const struct FormChange sOricorioFormChangeTable[] = { #endif //P_FAMILY_ORICORIO #if P_FAMILY_WISHIWASHI -static const struct FormChange sWishiwashiFormChangeTable[] = { +static const struct FormChange sWishiwashiFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_WISHIWASHI_SCHOOL, ABILITY_SCHOOLING, HP_HIGHER_THAN, 25}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_WISHIWASHI_SOLO, ABILITY_SCHOOLING, HP_LOWER_EQ_THAN, 25}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_WISHIWASHI_SOLO}, @@ -1197,12 +1393,14 @@ static const struct FormChange sGolisopodFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GOLISOPOD_MEGA, ITEM_GOLISOPITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GOLISOPOD}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_WIMPOD #if P_FAMILY_TYPE_NULL -static const struct FormChange sSilvallyFormChangeTable[] = { +static const struct FormChange sSilvallyFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_SILVALLY_NORMAL, ITEM_NONE, ABILITY_RKS_SYSTEM}, {FORM_CHANGE_ITEM_HOLD, SPECIES_SILVALLY_FIGHTING, ITEM_FIGHTING_MEMORY, ABILITY_RKS_SYSTEM}, {FORM_CHANGE_ITEM_HOLD, SPECIES_SILVALLY_FLYING, ITEM_FLYING_MEMORY, ABILITY_RKS_SYSTEM}, @@ -1226,7 +1424,8 @@ static const struct FormChange sSilvallyFormChangeTable[] = { #endif //P_FAMILY_TYPE_NULL #if P_FAMILY_MINIOR -static const struct FormChange sMiniorRedFormChangeTable[] = { +static const struct FormChange sMiniorRedFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_RED}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_RED, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_RED, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1235,7 +1434,8 @@ static const struct FormChange sMiniorRedFormChangeTable[] = { {FORM_CHANGE_END_BATTLE, SPECIES_MINIOR_CORE_RED}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMiniorBlueFormChangeTable[] = { +static const struct FormChange sMiniorBlueFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_BLUE}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_BLUE, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_BLUE, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1244,7 +1444,8 @@ static const struct FormChange sMiniorBlueFormChangeTable[] = { {FORM_CHANGE_END_BATTLE, SPECIES_MINIOR_CORE_BLUE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMiniorGreenFormChangeTable[] = { +static const struct FormChange sMiniorGreenFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_GREEN}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_GREEN, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_GREEN, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1253,7 +1454,8 @@ static const struct FormChange sMiniorGreenFormChangeTable[] = { {FORM_CHANGE_END_BATTLE, SPECIES_MINIOR_CORE_GREEN}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMiniorIndigoFormChangeTable[] = { +static const struct FormChange sMiniorIndigoFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_INDIGO}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_INDIGO, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_INDIGO, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1262,7 +1464,8 @@ static const struct FormChange sMiniorIndigoFormChangeTable[] = { {FORM_CHANGE_END_BATTLE, SPECIES_MINIOR_CORE_INDIGO}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMiniorOrangeFormChangeTable[] = { +static const struct FormChange sMiniorOrangeFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_ORANGE}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_ORANGE, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_ORANGE, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1271,7 +1474,8 @@ static const struct FormChange sMiniorOrangeFormChangeTable[] = { {FORM_CHANGE_END_BATTLE, SPECIES_MINIOR_CORE_ORANGE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMiniorVioletFormChangeTable[] = { +static const struct FormChange sMiniorVioletFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_MINIOR_CORE_VIOLET}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_METEOR_VIOLET, ABILITY_SHIELDS_DOWN, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_MINIOR_CORE_VIOLET, ABILITY_SHIELDS_DOWN, HP_LOWER_EQ_THAN, 50}, @@ -1292,13 +1496,15 @@ static const struct FormChange sMiniorYellowFormChangeTable[] = { #endif //P_FAMILY_MINIOR #if P_FAMILY_MIMIKYU -static const struct FormChange sMimikyuFormChangeTable[] = { +static const struct FormChange sMimikyuFormChangeTable[] = +{ {FORM_CHANGE_FAINT, SPECIES_MIMIKYU_DISGUISED}, {FORM_CHANGE_END_BATTLE, SPECIES_MIMIKYU_DISGUISED}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sMimikyuTotemFormChangeTable[] = { +static const struct FormChange sMimikyuTotemFormChangeTable[] = +{ {FORM_CHANGE_FAINT, SPECIES_MIMIKYU_TOTEM_DISGUISED}, {FORM_CHANGE_END_BATTLE, SPECIES_MIMIKYU_TOTEM_DISGUISED}, {FORM_CHANGE_TERMINATOR}, @@ -1306,10 +1512,12 @@ static const struct FormChange sMimikyuTotemFormChangeTable[] = { #endif //P_FAMILY_MIMIKYU #if P_FAMILY_DRAMPA -static const struct FormChange sDrampaFormChangeTable[] = { +static const struct FormChange sDrampaFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_DRAMPA_MEGA, ITEM_DRAMPANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DRAMPA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DRAMPA @@ -1321,16 +1529,25 @@ static const struct Fusion sNecrozmaFusionTable[] = { {FUSION_TERMINATOR}, }; -static const struct FormChange sNecrozmaDuskManeFormChangeTable[] = { +static const struct FormChange sNecrozmaDuskManeFormChangeTable[] = +{ #if P_ULTRA_BURST_FORMS {FORM_CHANGE_BATTLE_ULTRA_BURST, SPECIES_NECROZMA_ULTRA, ITEM_ULTRANECROZIUM_Z}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_NECROZMA_DUSK_MANE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sNecrozmaDawnWingsFormChangeTable[] = { +static const struct FormChange sNecrozmaDawnWingsFormChangeTable[] = +{ #if P_ULTRA_BURST_FORMS {FORM_CHANGE_BATTLE_ULTRA_BURST, SPECIES_NECROZMA_ULTRA, ITEM_ULTRANECROZIUM_Z}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_NECROZMA_DAWN_WINGS}, + {FORM_CHANGE_TERMINATOR}, +}; +static const struct FormChange sNecrozmaUltraFormChangeTable[] = +{ + {FORM_CHANGE_END_BATTLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_NECROZMA @@ -1340,6 +1557,7 @@ static const struct FormChange sMagearnaFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MAGEARNA_MEGA, ITEM_MAGEARNITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MAGEARNA}, {FORM_CHANGE_TERMINATOR}, }; @@ -1347,6 +1565,7 @@ static const struct FormChange sMagearnaOriginalFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_MAGEARNA_ORIGINAL_MEGA, ITEM_MAGEARNITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MAGEARNA_ORIGINAL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MAGEARNA @@ -1356,6 +1575,7 @@ static const struct FormChange sZeraoraFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_ZERAORA_MEGA, ITEM_ZERAORITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ZERAORA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ZERAORA @@ -1366,6 +1586,7 @@ static const struct FormChange sMelmetalFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_MELMETAL_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_MELMETAL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MELTAN @@ -1376,6 +1597,7 @@ static const struct FormChange sRillaboomFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_RILLABOOM_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_RILLABOOM}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GROOKEY @@ -1386,6 +1608,7 @@ static const struct FormChange sCinderaceFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CINDERACE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CINDERACE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SCORBUNNY @@ -1396,6 +1619,7 @@ static const struct FormChange sInteleonFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_INTELEON_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_INTELEON}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SOBBLE @@ -1406,6 +1630,7 @@ static const struct FormChange sCorviknightFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CORVIKNIGHT_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CORVIKNIGHT}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ROOKIDEE @@ -1416,6 +1641,7 @@ static const struct FormChange sOrbeetleFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ORBEETLE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ORBEETLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_BLIPBUG @@ -1426,6 +1652,7 @@ static const struct FormChange sDrednawFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DREDNAW_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DREDNAW}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CHEWTLE @@ -1436,6 +1663,7 @@ static const struct FormChange sCoalossalFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COALOSSAL_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_COALOSSAL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_ROLYCOLY @@ -1446,6 +1674,7 @@ static const struct FormChange sFlappleFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_FLAPPLE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_FLAPPLE}, {FORM_CHANGE_TERMINATOR}, }; @@ -1454,6 +1683,7 @@ static const struct FormChange sAppletunFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_APPLETUN_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_APPLETUN}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_APPLIN @@ -1464,12 +1694,14 @@ static const struct FormChange sSandacondaFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_SANDACONDA_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SANDACONDA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SILICOBRA #if P_FAMILY_CRAMORANT -static const struct FormChange sCramorantFormChangeTable[] = { +static const struct FormChange sCramorantFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_CRAMORANT_GULPING, ABILITY_GULP_MISSILE, HP_HIGHER_THAN, 50}, {FORM_CHANGE_BATTLE_HP_PERCENT, SPECIES_CRAMORANT_GORGING, ABILITY_GULP_MISSILE, HP_LOWER_EQ_THAN, 50}, {FORM_CHANGE_HIT_BY_MOVE, SPECIES_CRAMORANT, ABILITY_GULP_MISSILE}, @@ -1486,6 +1718,7 @@ static const struct FormChange sToxtricityAmpedFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_AMPED_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TOXTRICITY_AMPED}, {FORM_CHANGE_TERMINATOR}, }; @@ -1494,6 +1727,7 @@ static const struct FormChange sToxtricityLowKeyFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_TOXTRICITY_LOW_KEY_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TOXTRICITY_LOW_KEY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TOXEL @@ -1504,6 +1738,7 @@ static const struct FormChange sCentiskorchFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_CENTISKORCH_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_CENTISKORCH}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_SIZZLIPEDE @@ -1514,6 +1749,7 @@ static const struct FormChange sHattereneFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_HATTERENE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_HATTERENE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_HATENNA @@ -1524,6 +1760,7 @@ static const struct FormChange sGrimmsnarlFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_GRIMMSNARL_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GRIMMSNARL}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_IMPIDIMP @@ -1534,22 +1771,26 @@ static const struct FormChange sAlcremieFormChangeTable[] = #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_ALCREMIE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_ALCREMIE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_MILCERY #if P_FAMILY_FALINKS -static const struct FormChange sFalinksFormChangeTable[] = { +static const struct FormChange sFalinksFormChangeTable[] = +{ #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_FALINKS_MEGA, ITEM_FALINKSITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_FALINKS}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_FALINKS #if P_FAMILY_EISCUE -static const struct FormChange sEiscueFormChangeTable[] = { - {FORM_CHANGE_BATTLE_WEATHER, SPECIES_EISCUE_ICE, B_WEATHER_HAIL | B_WEATHER_SNOW, ABILITY_ICE_FACE}, +static const struct FormChange sEiscueFormChangeTable[] = +{ + {FORM_CHANGE_BATTLE_WEATHER, SPECIES_EISCUE_ICE, B_WEATHER_ICY_ANY, ABILITY_ICE_FACE}, {FORM_CHANGE_FAINT, SPECIES_EISCUE_ICE}, {FORM_CHANGE_END_BATTLE, SPECIES_EISCUE_ICE}, {FORM_CHANGE_TERMINATOR}, @@ -1557,7 +1798,8 @@ static const struct FormChange sEiscueFormChangeTable[] = { #endif //P_FAMILY_EISCUE #if P_FAMILY_MORPEKO -static const struct FormChange sMorpekoFormChangeTable[] = { +static const struct FormChange sMorpekoFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_TURN_END, SPECIES_MORPEKO_HANGRY, ABILITY_HUNGER_SWITCH}, {FORM_CHANGE_BATTLE_TURN_END, SPECIES_MORPEKO_FULL_BELLY, ABILITY_HUNGER_SWITCH}, {FORM_CHANGE_BATTLE_SWITCH, SPECIES_MORPEKO_FULL_BELLY}, @@ -1568,25 +1810,30 @@ static const struct FormChange sMorpekoFormChangeTable[] = { #endif //P_FAMILY_MORPEKO #if P_FAMILY_CUFANT -static const struct FormChange sCopperajahFormChangeTable[] = { +static const struct FormChange sCopperajahFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_COPPERAJAH_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_COPPERAJAH}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CUFANT #if P_FAMILY_DURALUDON -static const struct FormChange sDuraludonFormChangeTable[] = { +static const struct FormChange sDuraludonFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_DURALUDON_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_DURALUDON}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_DURALUDON #if P_FAMILY_ZACIAN -static const struct FormChange sZacianFormChangeTable[] = { +static const struct FormChange sZacianFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZACIAN_CROWNED, ITEM_RUSTED_SWORD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BLADE}, {FORM_CHANGE_END_BATTLE, SPECIES_ZACIAN_HERO, ITEM_RUSTED_SWORD, MOVE_BEHEMOTH_BLADE, MOVE_IRON_HEAD}, {FORM_CHANGE_TERMINATOR}, @@ -1594,7 +1841,8 @@ static const struct FormChange sZacianFormChangeTable[] = { #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA -static const struct FormChange sZamazentaFormChangeTable[] = { +static const struct FormChange sZamazentaFormChangeTable[] = +{ {FORM_CHANGE_BEGIN_BATTLE, SPECIES_ZAMAZENTA_CROWNED, ITEM_RUSTED_SHIELD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BASH}, {FORM_CHANGE_END_BATTLE, SPECIES_ZAMAZENTA_HERO, ITEM_RUSTED_SHIELD, MOVE_BEHEMOTH_BASH, MOVE_IRON_HEAD}, {FORM_CHANGE_TERMINATOR}, @@ -1602,17 +1850,21 @@ static const struct FormChange sZamazentaFormChangeTable[] = { #endif //P_FAMILY_ZAMAZENTA #if P_FAMILY_KUBFU -static const struct FormChange sUrshifuSingleStrikeFormChangeTable[] = { +static const struct FormChange sUrshifuSingleStrikeFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_SINGLE_STRIKE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_URSHIFU_SINGLE_STRIKE}, {FORM_CHANGE_TERMINATOR}, }; -static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = { +static const struct FormChange sUrshifuRapidStrikeFormChangeTable[] = +{ #if P_GIGANTAMAX_FORMS {FORM_CHANGE_BATTLE_GIGANTAMAX, SPECIES_URSHIFU_RAPID_STRIKE_GMAX}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_URSHIFU_RAPID_STRIKE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_KUBFU @@ -1626,7 +1878,8 @@ static const struct Fusion sCalyrexFusionTable[] = { #endif //P_FAMILY_CALYREX #if P_FAMILY_ENAMORUS -static const struct FormChange sEnamorusFormChangeTable[] = { +static const struct FormChange sEnamorusFormChangeTable[] = +{ {FORM_CHANGE_ITEM_USE, SPECIES_ENAMORUS_INCARNATE, ITEM_REVEAL_GLASS}, {FORM_CHANGE_ITEM_USE, SPECIES_ENAMORUS_THERIAN, ITEM_REVEAL_GLASS}, {FORM_CHANGE_TERMINATOR}, @@ -1638,6 +1891,7 @@ static const struct FormChange sScovillainFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_SCOVILLAIN_MEGA, ITEM_SCOVILLAINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_SCOVILLAIN}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_CAPSAKID @@ -1646,6 +1900,7 @@ static const struct FormChange sScovillainFormChangeTable[] = { static const struct FormChange sPalafinZeroFormChangeTable[] = { {FORM_CHANGE_BATTLE_SWITCH, SPECIES_PALAFIN_HERO}, + {FORM_CHANGE_END_BATTLE, SPECIES_PALAFIN_ZERO}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_FINIZEN @@ -1655,6 +1910,7 @@ static const struct FormChange sGlimmoraFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_GLIMMORA_MEGA, ITEM_GLIMMORANITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_GLIMMORA}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_GLIMMET @@ -1664,18 +1920,21 @@ static const struct FormChange sTatsugiriCurlyFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_TATSUGIRI_CURLY_MEGA, ITEM_TATSUGIRINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TATSUGIRI_CURLY}, {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sTatsugiriDroopyFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_TATSUGIRI_DROOPY_MEGA, ITEM_TATSUGIRINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TATSUGIRI_DROOPY}, {FORM_CHANGE_TERMINATOR}, }; static const struct FormChange sTatsugiriStretchyFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_TATSUGIRI_STRETCHY_MEGA, ITEM_TATSUGIRINITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_TATSUGIRI_STRETCHY}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_TATSUGIRI @@ -1685,12 +1944,14 @@ static const struct FormChange sBaxcaliburFormChangeTable[] = { #if P_GEN_9_MEGA_EVOLUTIONS {FORM_CHANGE_BATTLE_MEGA_EVOLUTION_ITEM, SPECIES_BAXCALIBUR_MEGA, ITEM_BAXCALIBRITE}, #endif + {FORM_CHANGE_END_BATTLE, SPECIES_BAXCALIBUR}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_FRIGIBAX #if P_FAMILY_OGERPON -static const struct FormChange sOgerponFormChangeTable[] = { +static const struct FormChange sOgerponFormChangeTable[] = +{ {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_TEAL, ITEM_NONE}, {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_WELLSPRING, ITEM_WELLSPRING_MASK}, {FORM_CHANGE_ITEM_HOLD, SPECIES_OGERPON_HEARTHFLAME, ITEM_HEARTHFLAME_MASK}, @@ -1701,12 +1962,14 @@ static const struct FormChange sOgerponFormChangeTable[] = { {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_HEARTHFLAME_TERA, TYPE_FIRE}, {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_OGERPON_CORNERSTONE_TERA, TYPE_ROCK}, #endif + {FORM_CHANGE_END_BATTLE}, {FORM_CHANGE_TERMINATOR}, }; #endif //P_FAMILY_OGERPON #if P_FAMILY_TERAPAGOS -static const struct FormChange sTerapagosFormChangeTable[] = { +static const struct FormChange sTerapagosFormChangeTable[] = +{ {FORM_CHANGE_BATTLE_SWITCH, SPECIES_TERAPAGOS_TERASTAL, ABILITY_TERA_SHIFT}, #if P_TERA_FORMS {FORM_CHANGE_BATTLE_TERASTALLIZATION, SPECIES_TERAPAGOS_STELLAR, TYPE_STELLAR}, diff --git a/src/data/pokemon/form_species_tables.h b/src/data/pokemon/form_species_tables.h index 38147177e..44f0f60ee 100644 --- a/src/data/pokemon/form_species_tables.h +++ b/src/data/pokemon/form_species_tables.h @@ -1949,7 +1949,7 @@ static const u16 sLurantisFormSpeciesIdTable[] = { #endif //P_FAMILY_FOMANTIS #if P_FAMILY_SALANDIT -static const u16 sSalanditFormSpeciesIdTable[] = { +static const u16 sSalazzleFormSpeciesIdTable[] = { SPECIES_SALAZZLE, SPECIES_SALAZZLE_TOTEM, FORM_SPECIES_END, diff --git a/src/data/pokemon/special_movesets.json b/src/data/pokemon/special_movesets.json new file mode 100644 index 000000000..892f91173 --- /dev/null +++ b/src/data/pokemon/special_movesets.json @@ -0,0 +1,37 @@ +{ + "universalMoves": + [ + "MOVE_BIDE", + "MOVE_FRUSTRATION", + "MOVE_HIDDEN_POWER", + "MOVE_MIMIC", + "MOVE_NATURAL_GIFT", + "MOVE_RAGE", + "MOVE_RETURN", + "MOVE_SECRET_POWER", + "MOVE_SUBSTITUTE", + "MOVE_TERA_BLAST" + ], + "signatureTeachables": + [ + "MOVE_BADDY_BAD", + "MOVE_BOUNCY_BUBBLE", + "MOVE_BUZZY_BUZZ", + "MOVE_DRAGON_ASCENT", + "MOVE_FLOATY_FALL", + "MOVE_FREEZY_FROST", + "MOVE_GLITZY_GLOW", + "MOVE_RELIC_SONG", + "MOVE_SAPPY_SEED", + "MOVE_SECRET_SWORD", + "MOVE_SIZZLY_SLIDE", + "MOVE_SPARKLY_SWIRL", + "MOVE_SPLISHY_SPLASH", + "MOVE_VOLT_TACKLE", + "MOVE_ZIPPY_ZAP" + ], + "extraTutors": + [ + + ] +} diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 0cd1d5b1a..04abe224a 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -1,4 +1,5 @@ #include "constants/abilities.h" +#include "constants/teaching_types.h" #include "species_info/shared_dex_text.h" #include "species_info/shared_front_pic_anims.h" @@ -100,7 +101,7 @@ const struct SpeciesInfo gSpeciesInfo[] = [SPECIES_NONE] = { .speciesName = _("??????????"), - .cryId = CRY_NONE, + .cryId = CRY_PORYGON, .natDexNum = NATIONAL_DEX_NONE, .categoryName = _("Unknown"), .height = 0, @@ -248,3 +249,8 @@ const struct SpeciesInfo gSpeciesInfo[] = }, */ }; + +const struct EggData gEggDatas[EGG_ID_COUNT] = +{ +#include "egg_data.h" +}; diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 81d02661f..b7b5a445a 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -23,6 +23,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_GRASS), .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_CHLOROPHYLL }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Bulbasaur"), .cryId = CRY_BULBASAUR, .natDexNum = NATIONAL_DEX_BULBASAUR, @@ -93,6 +94,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_GRASS), .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_CHLOROPHYLL }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Ivysaur"), .cryId = CRY_IVYSAUR, .natDexNum = NATIONAL_DEX_IVYSAUR, @@ -142,6 +144,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .evolutions = EVOLUTION({EVO_LEVEL, 32, SPECIES_VENUSAUR}), }, +#if P_UPDATED_EXP_YIELDS >= GEN_8 + #define VENUSAUR_EXP_YIELD 263 +#elif P_UPDATED_EXP_YIELDS >= GEN_5 + #define VENUSAUR_EXP_YIELD 236 +#else + #define VENUSAUR_EXP_YIELD 208 +#endif + [SPECIES_VENUSAUR] = { .baseHP = 80, @@ -152,13 +162,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_GRASS, TYPE_POISON), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 263, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 236, - #else - .expYield = 208, - #endif + .expYield = VENUSAUR_EXP_YIELD, .evYield_SpAttack = 2, .evYield_SpDefense = 1, .genderRatio = PERCENT_FEMALE(12.5), @@ -253,7 +257,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_THICK_FAT, ABILITY_THICK_FAT, ABILITY_THICK_FAT }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Venusaur"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_VENUSAUR_MEGA, + #else + .cryId = CRY_VENUSAUR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_VENUSAUR, .categoryName = _("Seed"), .height = 24, @@ -312,7 +320,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_GRASS, TYPE_POISON), .catchRate = 45, - .expYield = 236, + .expYield = VENUSAUR_EXP_YIELD, .evYield_SpAttack = 2, .evYield_SpDefense = 1, .genderRatio = PERCENT_FEMALE(12.5), @@ -501,23 +509,27 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_CHARIZARD}), }, +#define CHARIZARD_SP_ATK (P_UPDATED_STATS >= GEN_2 ? 109 : 85) + +#if P_UPDATED_EXP_YIELDS >= GEN_8 + #define CHARIZARD_EXP_YIELD 267 +#elif P_UPDATED_EXP_YIELDS >= GEN_5 + #define CHARIZARD_EXP_YIELD 240 +#else + #define CHARIZARD_EXP_YIELD 209 +#endif + [SPECIES_CHARIZARD] = { .baseHP = 78, .baseAttack = 84, .baseDefense = 78, .baseSpeed = 100, - .baseSpAttack = P_UPDATED_STATS >= GEN_2 ? 109 : 85, + .baseSpAttack = CHARIZARD_SP_ATK, .baseSpDefense = 85, .types = MON_TYPES(TYPE_FIRE, TYPE_FLYING), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 267, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 240, - #else - .expYield = 209, - #endif + .expYield = CHARIZARD_EXP_YIELD, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -596,7 +608,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS }, .bodyColor = BODY_COLOR_BLACK, .speciesName = _("Charizard"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_CHARIZARD_MEGA_X, + #else + .cryId = CRY_CHARIZARD, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CHARIZARD, .categoryName = _("Flame"), .height = 17, @@ -663,7 +679,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_DROUGHT, ABILITY_DROUGHT, ABILITY_DROUGHT }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Charizard"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_CHARIZARD_MEGA_Y, + #else + .cryId = CRY_CHARIZARD, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CHARIZARD, .categoryName = _("Flame"), .height = 17, @@ -719,11 +739,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseAttack = 84, .baseDefense = 78, .baseSpeed = 100, - .baseSpAttack = P_UPDATED_STATS >= GEN_2 ? 109 : 85, + .baseSpAttack = CHARIZARD_SP_ATK, .baseSpDefense = 85, .types = MON_TYPES(TYPE_FIRE, TYPE_FLYING), .catchRate = 45, - .expYield = 240, + .expYield = CHARIZARD_EXP_YIELD, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -912,6 +932,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_BLASTOISE}), }, +#define BLASTOISE_SP_DEF (P_UPDATED_STATS >= GEN_2 ? 105 : 85) + +#if P_UPDATED_EXP_YIELDS >= GEN_8 + #define BLASTOISE_EXP_YIELD 265 +#elif P_UPDATED_EXP_YIELDS >= GEN_5 + #define BLASTOISE_EXP_YIELD 239 +#else + #define BLASTOISE_EXP_YIELD 210 +#endif + [SPECIES_BLASTOISE] = { .baseHP = 79, @@ -919,16 +949,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 100, .baseSpeed = 78, .baseSpAttack = 85, - .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 105 : 85, + .baseSpDefense = BLASTOISE_SP_DEF, .types = MON_TYPES(TYPE_WATER), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 265, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 239, - #else - .expYield = 210, - #endif + .expYield = BLASTOISE_EXP_YIELD, .evYield_SpDefense = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -1010,7 +1034,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_MEGA_LAUNCHER, ABILITY_MEGA_LAUNCHER, ABILITY_MEGA_LAUNCHER }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Blastoise"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_BLASTOISE_MEGA, + #else + .cryId = CRY_BLASTOISE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BLASTOISE, .categoryName = _("Shellfish"), .height = 16, @@ -1067,10 +1095,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 100, .baseSpeed = 78, .baseSpAttack = 85, - .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 105 : 85, + .baseSpDefense = BLASTOISE_SP_DEF, .types = MON_TYPES(TYPE_WATER), .catchRate = 45, - .expYield = 239, + .expYield = BLASTOISE_EXP_YIELD, .evYield_SpDefense = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -1188,7 +1216,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Caterpie, gShinyOverworldPalette_Caterpie ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCaterpieLevelUpLearnset, .teachableLearnset = sCaterpieTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_METAPOD}), @@ -1256,7 +1284,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Metapod, gShinyOverworldPalette_Metapod ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sMetapodLevelUpLearnset, .teachableLearnset = sMetapodTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BUTTERFREE}), @@ -1264,7 +1292,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #if P_UPDATED_EXP_YIELDS >= GEN_8 #define BUTTERFREE_EXP_YIELD 198 -#elif P_UPDATED_EXP_YIELDS >= GEN_7 +#elif P_UPDATED_EXP_YIELDS >= GEN_6 #define BUTTERFREE_EXP_YIELD 178 #elif P_UPDATED_EXP_YIELDS >= GEN_5 #define BUTTERFREE_EXP_YIELD 173 @@ -1499,7 +1527,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Weedle, gShinyOverworldPalette_Weedle ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWeedleLevelUpLearnset, .teachableLearnset = sWeedleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_KAKUNA}), @@ -1577,18 +1605,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Kakuna, gShinyOverworldPalette_Kakuna ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sKakunaLevelUpLearnset, .teachableLearnset = sKakunaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEEDRILL}), }, -#define BEEDRILL_ATTACK (P_UPDATED_STATS >= GEN_6 ? 90 : 80) - [SPECIES_BEEDRILL] = { .baseHP = 65, - .baseAttack = BEEDRILL_ATTACK, + .baseAttack = P_UPDATED_STATS >= GEN_6 ? 90 : 80, .baseDefense = 40, .baseSpeed = 75, .baseSpAttack = 45, @@ -1597,7 +1623,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 198, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 178, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 173, @@ -1673,7 +1699,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = [SPECIES_BEEDRILL_MEGA] = { .baseHP = 65, - .baseAttack = BEEDRILL_ATTACK + 60, + .baseAttack = 150, .baseDefense = 40, .baseSpeed = 145, .baseSpAttack = 15, @@ -1692,7 +1718,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_ADAPTABILITY, ABILITY_ADAPTABILITY, ABILITY_ADAPTABILITY }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Beedrill"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_BEEDRILL_MEGA, + #else + .cryId = CRY_BEEDRILL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BEEDRILL, .categoryName = _("Poison Bee"), .height = 14, @@ -1893,21 +1923,19 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .evolutions = EVOLUTION({EVO_LEVEL, 36, SPECIES_PIDGEOT}), }, -#define PIDGEOT_SPEED (P_UPDATED_STATS >= GEN_6 ? 101 : 91) - [SPECIES_PIDGEOT] = { .baseHP = 83, .baseAttack = 80, .baseDefense = 75, - .baseSpeed = PIDGEOT_SPEED, + .baseSpeed = P_UPDATED_STATS >= GEN_6 ? 101 : 91, .baseSpAttack = 70, .baseSpDefense = 70, .types = MON_TYPES(TYPE_NORMAL, TYPE_FLYING), .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 240, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 216, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 211, @@ -1982,7 +2010,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseHP = 83, .baseAttack = 80, .baseDefense = 80, - .baseSpeed = PIDGEOT_SPEED + 20, + .baseSpeed = 121, .baseSpAttack = 135, .baseSpDefense = 80, .types = MON_TYPES(TYPE_NORMAL, TYPE_FLYING), @@ -1997,7 +2025,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_NO_GUARD, ABILITY_NO_GUARD, ABILITY_NO_GUARD }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Pidgeot"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_PIDGEOT_MEGA, + #else + .cryId = CRY_PIDGEOT, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_PIDGEOT, .categoryName = _("Bird"), .height = 22, @@ -2233,7 +2265,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 35, .types = MON_TYPES(TYPE_DARK, TYPE_NORMAL), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 51 : 57, + .expYield = 51, .evYield_Speed = 1, .itemRare = ITEM_PECHA_BERRY, .genderRatio = PERCENT_FEMALE(50), @@ -2302,7 +2334,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_DARK, TYPE_NORMAL), .catchRate = 127, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 145 : 116, + .expYield = 145, .evYield_Speed = 2, .itemRare = ITEM_PECHA_BERRY, .genderRatio = PERCENT_FEMALE(50), @@ -2364,7 +2396,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_DARK, TYPE_NORMAL), .catchRate = 127, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 145 : 116, + .expYield = 145, .evYield_Speed = 2, .itemRare = ITEM_PECHA_BERRY, .genderRatio = PERCENT_FEMALE(50), @@ -2486,6 +2518,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Spearow, gShinyOverworldPalette_Spearow ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sSpearowLevelUpLearnset, .teachableLearnset = sSpearowTeachableLearnset, .eggMoveLearnset = sSpearowEggMoveLearnset, @@ -2718,7 +2751,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #if P_FAMILY_PIKACHU #if P_GEN_2_CROSS_EVOS - [SPECIES_PICHU] = { .baseHP = 20, @@ -2797,14 +2829,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 35, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 41 : 42, + .expYield = 42, .evYield_Speed = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), - .abilities = { ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD }, + .abilities = { ABILITY_STATIC, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_YELLOW, .noFlip = TRUE, .speciesName = _("Pichu"), @@ -2858,6 +2890,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #endif //P_GEN_2_CROSS_EVOS +#define PIKACHU_DEFENSE (P_UPDATED_STATS >= GEN_6 ? 40 : 30) +#define PIKACHU_SP_DEF (P_UPDATED_STATS >= GEN_6 || P_UPDATED_STATS == GEN_1 ? 50 : 40) + #if P_UPDATED_EXP_YIELDS >= GEN_6 #define PIKACHU_EXP_YIELD 112 #elif P_UPDATED_EXP_YIELDS >= GEN_5 @@ -2870,7 +2905,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = PIKACHU_DEFENSE, .baseSpeed = 90, .baseSpAttack = 50, .baseSpDefense = P_UPDATED_STATS >= GEN_6 || P_UPDATED_STATS == GEN_1 ? 50 : 40, @@ -2958,10 +2993,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3010,10 +3045,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3062,10 +3097,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3115,10 +3150,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3168,10 +3203,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3220,10 +3255,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3275,10 +3310,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3332,10 +3367,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3388,10 +3423,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3444,10 +3479,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3500,10 +3535,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3556,10 +3591,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3612,10 +3647,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3669,10 +3704,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = 40, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 ? 50 : 40, + .baseSpDefense = 50, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3728,10 +3763,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = { .baseHP = 35, .baseAttack = 55, - .baseDefense = P_UPDATED_STATS >= GEN_6 ? 40 : 30, + .baseDefense = PIKACHU_DEFENSE, .baseSpeed = 90, .baseSpAttack = 50, - .baseSpDefense = P_UPDATED_STATS >= GEN_6 || P_UPDATED_STATS == GEN_1 ? 50 : 40, + .baseSpDefense = PIKACHU_SP_DEF, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, .expYield = PIKACHU_EXP_YIELD, @@ -3793,7 +3828,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 60, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 190, - .expYield = PIKACHU_EXP_YIELD, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 151 : 86, .evYield_Speed = 2, .itemRare = ITEM_LIGHT_BALL, .genderRatio = PERCENT_FEMALE(50), @@ -3862,11 +3897,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .formSpeciesIdTable = sPikachuFormSpeciesIdTable, }, -#define RAICHU_SPEED (P_UPDATED_STATS >= GEN_6 ? 110 : 100) - #if P_UPDATED_EXP_YIELDS >= GEN_8 #define RAICHU_EXP_YIELD 243 -#elif P_UPDATED_EXP_YIELDS >= GEN_7 +#elif P_UPDATED_EXP_YIELDS >= GEN_6 #define RAICHU_EXP_YIELD 218 #elif P_UPDATED_EXP_YIELDS >= GEN_5 #define RAICHU_EXP_YIELD 214 @@ -3879,7 +3912,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseHP = 60, .baseAttack = 90, .baseDefense = 55, - .baseSpeed = RAICHU_SPEED, + .baseSpeed = P_UPDATED_STATS >= GEN_6 ? 110 : 100, .baseSpAttack = 90, .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 80 : 90, .types = MON_TYPES(TYPE_ELECTRIC), @@ -3962,12 +3995,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseHP = 60, .baseAttack = 85, .baseDefense = 50, - .baseSpeed = RAICHU_SPEED, + .baseSpeed = 110, .baseSpAttack = 95, .baseSpDefense = 85, .types = MON_TYPES(TYPE_ELECTRIC, TYPE_PSYCHIC), .catchRate = 75, - .expYield = RAICHU_EXP_YIELD, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 243 : 218, .evYield_Speed = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 10, @@ -4045,7 +4078,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Raichu"), - .cryId = CRY_RAICHU, // CRY_RAICHU_MEGA_X + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_RAICHU_MEGA_X, + #else + .cryId = CRY_RAICHU, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_RAICHU, .categoryName = _("Mouse"), .height = 12, @@ -4069,28 +4106,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Raichu) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sRaichuLevelUpLearnset, .teachableLearnset = sRaichuTeachableLearnset, @@ -4099,6 +4116,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #endif //P_GEN_9_MEGA_EVOLUTIONS + #if P_GEN_9_MEGA_EVOLUTIONS [SPECIES_RAICHU_MEGA_Y] = { @@ -4120,7 +4138,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_STATIC, ABILITY_NONE, ABILITY_LIGHTNING_ROD }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Raichu"), - .cryId = CRY_RAICHU, // CRY_RAICHU_MEGA_Y + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_RAICHU_MEGA_Y, + #else + .cryId = CRY_RAICHU, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_RAICHU, .categoryName = _("Mouse"), .height = 10, @@ -4144,28 +4166,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Raichu) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sRaichuLevelUpLearnset, .teachableLearnset = sRaichuTeachableLearnset, @@ -4331,7 +4333,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 35, .types = MON_TYPES(TYPE_ICE, TYPE_STEEL), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 60 : 93, + .expYield = 60, .evYield_Defense = 1, .itemRare = ITEM_GRIP_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -4399,7 +4401,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_ICE, TYPE_STEEL), .catchRate = 90, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 158 : 163, + .expYield = 158, .evYield_Defense = 2, .itemRare = ITEM_GRIP_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -4621,7 +4623,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 253, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 227, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 223, @@ -4844,7 +4846,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 253, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 227, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 223, @@ -5085,7 +5087,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 25, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 242, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 217, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 213, @@ -5167,15 +5169,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 110, .types = MON_TYPES(TYPE_FAIRY, TYPE_FLYING), .catchRate = 25, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 242, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 - .expYield = 217, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 213, - #else - .expYield = 129, - #endif .evYield_HP = 3, .itemRare = ITEM_MOON_STONE, .genderRatio = PERCENT_FEMALE(75), @@ -5183,14 +5177,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .friendship = 140, .growthRate = GROWTH_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY), - #if P_UPDATED_ABILITIES >= GEN_4 .abilities = { ABILITY_CUTE_CHARM, ABILITY_MAGIC_GUARD, ABILITY_UNAWARE }, - #else - .abilities = { ABILITY_CUTE_CHARM, ABILITY_NONE, ABILITY_UNAWARE }, - #endif .bodyColor = BODY_COLOR_PINK, .speciesName = _("Clefable"), - .cryId = CRY_CLEFABLE, // CRY_CLEFABLE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_CLEFABLE_MEGA, + #else + .cryId = CRY_CLEFABLE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CLEFABLE, .categoryName = _("Fairy"), .height = 17, @@ -5199,42 +5193,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = "It flies by using the power of\n" "moonlight to control gravity within\n" "a radius of over 32 feet around it."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Clefable) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sClefableLevelUpLearnset, .teachableLearnset = sClefableTeachableLearnset, @@ -5401,7 +5375,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_ICE), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 60 : 63, + .expYield = 60, .evYield_Speed = 1, .itemRare = ITEM_SNOWBALL, .genderRatio = PERCENT_FEMALE(75), @@ -5469,7 +5443,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_ICE, TYPE_FAIRY), .catchRate = 75, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 177 : 178, + .expYield = 177, .evYield_Speed = 1, .evYield_SpDefense = 1, .itemRare = ITEM_SNOWBALL, @@ -5690,11 +5664,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_UPDATED_STATS >= GEN_6 -#define WIGGLYTUFF_SP_ATK 85 + #define WIGGLYTUFF_SP_ATK 85 #elif P_UPDATED_STATS >= GEN_2 -#define WIGGLYTUFF_SP_ATK 75 + #define WIGGLYTUFF_SP_ATK 75 #else -#define WIGGLYTUFF_SP_ATK 50 + #define WIGGLYTUFF_SP_ATK 50 #endif [SPECIES_WIGGLYTUFF] = @@ -5709,7 +5683,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 50, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 218, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 196, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 191, @@ -6161,6 +6135,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_STENCH }, .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, .speciesName = _("Gloom"), .cryId = CRY_GLOOM, .natDexNum = NATIONAL_DEX_GLOOM, @@ -6240,7 +6215,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 245, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 221, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 216, @@ -6329,7 +6304,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 245, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 221, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 216, @@ -6750,15 +6725,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_VENONAT #if P_FAMILY_DIGLETT - -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define DUGTRIO_EXP_YIELD 149 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define DUGTRIO_EXP_YIELD 142 -#else - #define DUGTRIO_EXP_YIELD 153 -#endif - [SPECIES_DIGLETT] = { .baseHP = 10, @@ -6841,7 +6807,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_GROUND), .catchRate = 50, - .expYield = DUGTRIO_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 149, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 142, + #else + .expYield = 153, + #endif .evYield_Speed = 2, .itemRare = ITEM_SOFT_SAND, .genderRatio = PERCENT_FEMALE(50), @@ -6919,7 +6891,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 45, .types = MON_TYPES(TYPE_GROUND, TYPE_STEEL), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 53 : 81, + .expYield = 53, .evYield_Speed = 1, .itemRare = ITEM_SOFT_SAND, .genderRatio = PERCENT_FEMALE(50), @@ -6987,7 +6959,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_GROUND, TYPE_STEEL), .catchRate = 50, - .expYield = DUGTRIO_EXP_YIELD, + .expYield = 149, .evYield_Speed = 2, .itemRare = ITEM_SOFT_SAND, .genderRatio = PERCENT_FEMALE(50), @@ -7047,6 +7019,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_DIGLETT #if P_FAMILY_MEOWTH +#if P_UPDATED_ABILITIES >= GEN_4 + #define MEOWTH_ABILITIES { ABILITY_PICKUP, ABILITY_TECHNICIAN, ABILITY_UNNERVE } +#else + #define MEOWTH_ABILITIES { ABILITY_PICKUP, ABILITY_NONE, ABILITY_UNNERVE } +#endif + [SPECIES_MEOWTH] = { .baseHP = 40, @@ -7065,11 +7043,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), - #if P_UPDATED_ABILITIES >= GEN_4 - .abilities = { ABILITY_PICKUP, ABILITY_TECHNICIAN, ABILITY_UNNERVE }, - #else - .abilities = { ABILITY_PICKUP, ABILITY_NONE, ABILITY_UNNERVE }, - #endif + .abilities = MEOWTH_ABILITIES, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Meowth"), .cryId = CRY_MEOWTH, @@ -7211,7 +7185,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 40, .types = MON_TYPES(TYPE_DARK), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 58 : 69, + .expYield = 58, .evYield_Speed = 1, .itemRare = ITEM_QUICK_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -7279,7 +7253,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_DARK), .catchRate = 90, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 154 : 148, + .expYield = 154, .evYield_Speed = 2, .itemRare = ITEM_QUICK_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -7347,7 +7321,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 40, .types = MON_TYPES(TYPE_STEEL), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 58 : 69, + .expYield = 58, .evYield_Attack = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -7486,7 +7460,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), - .abilities = { ABILITY_PICKUP, ABILITY_TECHNICIAN, ABILITY_UNNERVE }, + .abilities = MEOWTH_ABILITIES, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Meowth"), .cryId = CRY_MEOWTH, @@ -7772,6 +7746,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_NONE, ABILITY_DEFIANT }, #endif .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Primeape"), .cryId = CRY_PRIMEAPE, .natDexNum = NATIONAL_DEX_PRIMEAPE, @@ -7847,6 +7822,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_INNER_FOCUS, ABILITY_DEFIANT }, .bodyColor = BODY_COLOR_GRAY, + .noFlip = TRUE, .speciesName = _("Annihilape"), .cryId = CRY_ANNIHILAPE, .natDexNum = NATIONAL_DEX_ANNIHILAPE, @@ -8047,7 +8023,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 50, .types = MON_TYPES(TYPE_FIRE, TYPE_ROCK), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 70 : 91, + .expYield = 70, .evYield_Attack = 1, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, @@ -8113,7 +8089,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_FIRE, TYPE_ROCK), .catchRate = 75, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 194 : 213, + .expYield = 194, .evYield_Attack = 2, .genderRatio = PERCENT_FEMALE(25), .eggCycles = 20, @@ -8331,7 +8307,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 255, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 230, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 225, @@ -8654,11 +8630,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = }, #if P_UPDATED_STATS >= GEN_6 -#define ALAKAZAM_SP_DEF 95 + #define ALAKAZAM_SP_DEF 95 #elif P_UPDATED_STATS >= GEN_2 -#define ALAKAZAM_SP_DEF 85 + #define ALAKAZAM_SP_DEF 85 #else -#define ALAKAZAM_SP_DEF 135 + #define ALAKAZAM_SP_DEF 135 #endif [SPECIES_ALAKAZAM] = @@ -8673,7 +8649,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 50, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 250, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 225, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 221, @@ -8760,10 +8736,16 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 65, .baseSpeed = 150, .baseSpAttack = 175, - .baseSpDefense = 105, + .baseSpDefense = P_UPDATED_STATS >= GEN_7 ? 105 : 95, .types = MON_TYPES(TYPE_PSYCHIC), .catchRate = 50, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 300, + #elif P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 270, + #else + .expYield = 266, + #endif .evYield_SpAttack = 3, .itemRare = ITEM_TWISTED_SPOON, .genderRatio = PERCENT_FEMALE(25), @@ -8774,7 +8756,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_TRACE, ABILITY_TRACE, ABILITY_TRACE }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Alakazam"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_ALAKAZAM_MEGA, + #else + .cryId = CRY_ALAKAZAM, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ALAKAZAM, .categoryName = _("Psi"), .height = 12, @@ -9222,6 +9208,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_GLUTTONY }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Weepinbell"), .cryId = CRY_WEEPINBELL, .natDexNum = NATIONAL_DEX_WEEPINBELL, @@ -9296,7 +9283,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 245, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 221, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 216, @@ -9311,6 +9298,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_GLUTTONY }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Victreebel"), .cryId = CRY_VICTREEBEL, .natDexNum = NATIONAL_DEX_VICTREEBEL, @@ -9376,15 +9364,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 95, .types = MON_TYPES(TYPE_GRASS, TYPE_POISON), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 245, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 - .expYield = 221, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 216, - #else - .expYield = 191, - #endif .evYield_Attack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -9393,8 +9373,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_GLUTTONY }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Victreebel"), - .cryId = CRY_VICTREEBEL, // CRY_VICTREEBEL_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_VICTREEBEL_MEGA, + #else + .cryId = CRY_VICTREEBEL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_VICTREEBEL, .categoryName = _("Flycatcher"), .height = 45, @@ -9404,42 +9389,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = "has increased due to Mega Evolution,\n" "filling its mouth. If not careful,\n" "the acid will overflow and spill out."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Victreebel) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sVictreebelLevelUpLearnset, .teachableLearnset = sVictreebelTeachableLearnset, @@ -9594,27 +9559,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_TENTACOOL #if P_FAMILY_GEODUDE - -#if P_UPDATED_EXP_YIELDS >= GEN_5 - #define GEODUDE_EXP_YIELD 60 -#elif P_UPDATED_EXP_YIELDS >= GEN_4 - #define GEODUDE_EXP_YIELD 73 -#else - #define GEODUDE_EXP_YIELD 86 -#endif - -#define GOLEM_ATTACK (P_UPDATED_STATS >= GEN_6 ? 120 : 110) - -#if P_UPDATED_EXP_YIELDS >= GEN_8 - #define GOLEM_EXP_YIELD 248 -#elif P_UPDATED_EXP_YIELDS >= GEN_7 - #define GOLEM_EXP_YIELD 223 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define GOLEM_EXP_YIELD 218 -#else - #define GOLEM_EXP_YIELD 177 -#endif - [SPECIES_GEODUDE] = { .baseHP = 40, @@ -9625,7 +9569,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 30, .types = MON_TYPES(TYPE_ROCK, TYPE_GROUND), .catchRate = 255, - .expYield = GEODUDE_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 60, + #elif P_UPDATED_EXP_YIELDS >= GEN_4 + .expYield = 73, + #else + .expYield = 86, + #endif .evYield_Defense = 1, .itemRare = ITEM_EVERSTONE, .genderRatio = PERCENT_FEMALE(50), @@ -9763,14 +9713,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = [SPECIES_GOLEM] = { .baseHP = 80, - .baseAttack = GOLEM_ATTACK, + .baseAttack = P_UPDATED_STATS >= GEN_6 ? 120 : 110, .baseDefense = 130, .baseSpeed = 45, .baseSpAttack = 55, .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 65 : 55, .types = MON_TYPES(TYPE_ROCK, TYPE_GROUND), .catchRate = 45, - .expYield = GOLEM_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 248, + #elif P_UPDATED_EXP_YIELDS >= GEN_6 + .expYield = 223, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 218, + #else + .expYield = 177, + #endif .evYield_Defense = 3, .itemRare = ITEM_EVERSTONE, .genderRatio = PERCENT_FEMALE(50), @@ -9842,7 +9800,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 30, .types = MON_TYPES(TYPE_ROCK, TYPE_ELECTRIC), .catchRate = 255, - .expYield = GEODUDE_EXP_YIELD, + .expYield = 60, .evYield_Defense = 1, .itemRare = ITEM_CELL_BATTERY, .genderRatio = PERCENT_FEMALE(50), @@ -9911,7 +9869,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 45, .types = MON_TYPES(TYPE_ROCK, TYPE_ELECTRIC), .catchRate = 120, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 137 : 134, + .expYield = 137, .evYield_Defense = 2, .itemRare = ITEM_CELL_BATTERY, .genderRatio = PERCENT_FEMALE(50), @@ -9972,14 +9930,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = [SPECIES_GOLEM_ALOLA] = { .baseHP = 80, - .baseAttack = GOLEM_ATTACK, + .baseAttack = 120, .baseDefense = 130, .baseSpeed = 45, .baseSpAttack = 55, .baseSpDefense = 65, .types = MON_TYPES(TYPE_ROCK, TYPE_ELECTRIC), .catchRate = 45, - .expYield = GOLEM_EXP_YIELD, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 248 : 223, .evYield_Defense = 3, .itemCommon = ITEM_CELL_BATTERY, .genderRatio = PERCENT_FEMALE(50), @@ -10187,7 +10145,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_PSYCHIC), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 82 : 152, + .expYield = 82, .evYield_Speed = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10254,7 +10212,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_FAIRY), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 175 : 192, + .expYield = 175, .evYield_Speed = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10399,7 +10357,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .types = MON_TYPES(TYPE_WATER, TYPE_PSYCHIC), .catchRate = 75, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 164, - .evYield_Defense = (P_UPDATED_EVS >= GEN_8) ? 2 : 3, + .evYield_Defense = 2, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10469,7 +10427,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .types = MON_TYPES(TYPE_WATER, TYPE_PSYCHIC), .catchRate = 70, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 164, - .evYield_SpDefense = 3, + .evYield_SpDefense = (P_UPDATED_EVS >= GEN_8) ? 2 : 3, .itemRare = ITEM_KINGS_ROCK, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10610,7 +10568,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 40, .types = MON_TYPES(TYPE_PSYCHIC), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 63 : 99, + .expYield = 63, .evYield_HP = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10691,6 +10649,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_WATER_1), .abilities = { ABILITY_QUICK_DRAW, ABILITY_OWN_TEMPO, ABILITY_REGENERATOR }, .bodyColor = BODY_COLOR_PINK, + .noFlip = TRUE, .speciesName = _("Slowbro"), .cryId = CRY_SLOWBRO, .natDexNum = NATIONAL_DEX_SLOWBRO, @@ -10748,7 +10707,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 110, .types = MON_TYPES(TYPE_POISON, TYPE_PSYCHIC), .catchRate = 70, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 164, + .expYield = 172, .evYield_SpDefense = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10807,6 +10766,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_SLOWPOKE #if P_FAMILY_MAGNEMITE +#define MAGNEMITE_FAMILY_TYPE2 (P_UPDATED_TYPES >= GEN_2 ? TYPE_STEEL : TYPE_ELECTRIC) + [SPECIES_MAGNEMITE] = { .baseHP = 25, @@ -10815,7 +10776,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpeed = 45, .baseSpAttack = 95, .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 55 : 95, - .types = MON_TYPES(TYPE_ELECTRIC, TYPE_STEEL), + .types = MON_TYPES(TYPE_ELECTRIC, MAGNEMITE_FAMILY_TYPE2), .catchRate = 190, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 65 : 89, .evYield_SpAttack = 1, @@ -10887,7 +10848,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpeed = 70, .baseSpAttack = 120, .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 70 : 120, - .types = MON_TYPES(TYPE_ELECTRIC, TYPE_STEEL), + .types = MON_TYPES(TYPE_ELECTRIC, MAGNEMITE_FAMILY_TYPE2), .catchRate = 60, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 163 : 161, .evYield_SpAttack = 2, @@ -10951,7 +10912,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sMagnetonLevelUpLearnset, .teachableLearnset = sMagnetonTeachableLearnset, #if P_GEN_4_CROSS_EVOS - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAGNEZONE, CONDITIONS({IF_IN_MAPSEC, MAPSEC_POWER_PLANT})}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAGNEZONE, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_MAGNEZONE}), #endif }, @@ -11037,27 +10998,23 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_MAGNEMITE #if P_FAMILY_FARFETCHD -#define FARFETCHD_ATTACK (P_UPDATED_STATS >= GEN_7 ? 90 : 65) - -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define FARFETCHD_EXP_YIELD 132 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define FARFETCHD_EXP_YIELD 123 -#else - #define FARFETCHD_EXP_YIELD 94 -#endif - [SPECIES_FARFETCHD] = { .baseHP = 52, - .baseAttack = FARFETCHD_ATTACK, + .baseAttack = P_UPDATED_STATS >= GEN_7 ? 90 : 65, .baseDefense = 55, .baseSpeed = 60, .baseSpAttack = 58, .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 62 : 58, .types = MON_TYPES(TYPE_NORMAL, TYPE_FLYING), .catchRate = 45, - .expYield = FARFETCHD_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 132, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 123, + #else + .expYield = 94, + #endif .evYield_Attack = 1, .itemRare = ITEM_LEEK, .genderRatio = PERCENT_FEMALE(50), @@ -11067,6 +11024,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_FIELD), .abilities = { ABILITY_KEEN_EYE, ABILITY_INNER_FOCUS, ABILITY_DEFIANT }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Farfetch'd"), .cryId = CRY_FARFETCHD, .natDexNum = NATIONAL_DEX_FARFETCHD, @@ -11120,6 +11078,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Farfetchd, gShinyOverworldPalette_Farfetchd ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sFarfetchdLevelUpLearnset, .teachableLearnset = sFarfetchdTeachableLearnset, .eggMoveLearnset = sFarfetchdEggMoveLearnset, @@ -11130,14 +11089,14 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = [SPECIES_FARFETCHD_GALAR] = { .baseHP = 52, - .baseAttack = FARFETCHD_ATTACK + 5, + .baseAttack = 95, .baseDefense = 55, .baseSpeed = 55, .baseSpAttack = 58, .baseSpDefense = 62, .types = MON_TYPES(TYPE_FIGHTING), .catchRate = 45, - .expYield = FARFETCHD_EXP_YIELD, + .expYield = 132, .evYield_Attack = 1, .itemCommon = ITEM_LEEK, .genderRatio = PERCENT_FEMALE(50), @@ -11147,6 +11106,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_FIELD), .abilities = { ABILITY_STEADFAST, ABILITY_NONE, ABILITY_SCRAPPY }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Farfetch'd"), .cryId = CRY_FARFETCHD, .natDexNum = NATIONAL_DEX_FARFETCHD, @@ -11215,6 +11175,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_FIELD), .abilities = { ABILITY_STEADFAST, ABILITY_NONE, ABILITY_SCRAPPY }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Sirfetch'd"), .cryId = CRY_SIRFETCHD, .natDexNum = NATIONAL_DEX_SIRFETCHD, @@ -11341,6 +11302,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = TRACKS_FOOT, sAnimTable_Following ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sDoduoLevelUpLearnset, .teachableLearnset = sDoduoTeachableLearnset, .eggMoveLearnset = sDoduoEggMoveLearnset, @@ -11373,6 +11335,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING), .abilities = { ABILITY_RUN_AWAY, ABILITY_EARLY_BIRD, ABILITY_TANGLED_FEET }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Dodrio"), .cryId = CRY_DODRIO, .natDexNum = NATIONAL_DEX_DODRIO, @@ -11434,6 +11397,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = TRACKS_FOOT, sAnimTable_Following ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sDodrioLevelUpLearnset, .teachableLearnset = sDodrioTeachableLearnset, }, @@ -11744,7 +11708,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 50, .types = MON_TYPES(TYPE_POISON, TYPE_DARK), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 65 : 90, + .expYield = 65, .evYield_HP = 1, .itemRare = ITEM_BLACK_SLUDGE, .genderRatio = PERCENT_FEMALE(50), @@ -11812,7 +11776,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_POISON, TYPE_DARK), .catchRate = 75, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 175 : 157, + .expYield = 175, .evYield_HP = 1, .evYield_Attack = 1, .itemRare = ITEM_BLACK_SLUDGE, @@ -12173,10 +12137,20 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = {EVO_ITEM, ITEM_LINKING_CORD, SPECIES_GENGAR}), }, -#if P_UPDATED_ABILITIES >= GEN_7 -#define GENGAR_ABILITIES {ABILITY_CURSED_BODY, ABILITY_NONE, ABILITY_NONE} +#define GENGAR_SP_DEF (P_UPDATED_STATS >= GEN_2 ? 75 : 130) + +#if P_UPDATED_EXP_YIELDS >= GEN_8 + #define GENGAR_EXP_YIELD 250 +#elif P_UPDATED_EXP_YIELDS >= GEN_5 + #define GENGAR_EXP_YIELD 225 #else -#define GENGAR_ABILITIES {ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE} + #define GENGAR_EXP_YIELD 190 +#endif + +#if P_UPDATED_ABILITIES >= GEN_7 + #define GENGAR_ABILITIES {ABILITY_CURSED_BODY, ABILITY_NONE, ABILITY_NONE} +#else + #define GENGAR_ABILITIES {ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE} #endif [SPECIES_GENGAR] = @@ -12186,16 +12160,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 60, .baseSpeed = 110, .baseSpAttack = 130, - .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 75 : 130, + .baseSpDefense = GENGAR_SP_DEF, .types = MON_TYPES(TYPE_GHOST, TYPE_POISON), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 250, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 225, - #else - .expYield = 190, - #endif + .expYield = GENGAR_EXP_YIELD, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -12275,7 +12243,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_SHADOW_TAG, ABILITY_SHADOW_TAG, ABILITY_SHADOW_TAG }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Gengar"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GENGAR_MEGA, + #else + .cryId = CRY_GENGAR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GENGAR, .categoryName = _("Shadow"), .height = 14, @@ -12332,10 +12304,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 60, .baseSpeed = 110, .baseSpAttack = 130, - .baseSpDefense = P_UPDATED_STATS >= GEN_2 ? 75 : 130, + .baseSpDefense = GENGAR_SP_DEF, .types = MON_TYPES(TYPE_GHOST, TYPE_POISON), .catchRate = 45, - .expYield = 225, + .expYield = GENGAR_EXP_YIELD, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -12565,7 +12537,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_SAND_FORCE, ABILITY_SAND_FORCE, ABILITY_SAND_FORCE }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Steelix"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_STEELIX_MEGA, + #else + .cryId = CRY_STEELIX, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_STEELIX, .categoryName = _("Iron Snake"), .height = 105, @@ -12989,14 +12965,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = #endif //P_FAMILY_KRABBY #if P_FAMILY_VOLTORB -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define ELECTRODE_EXP_YIELD 172 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define ELECTRODE_EXP_YIELD 168 -#else - #define ELECTRODE_EXP_YIELD 150 -#endif - [SPECIES_VOLTORB] = { .baseHP = 40, @@ -13079,7 +13047,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 60, - .expYield = ELECTRODE_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 172, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 168, + #else + .expYield = 150, + #endif .evYield_Speed = 2, .genderRatio = MON_GENDERLESS, .eggCycles = 20, @@ -13150,7 +13124,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 55, .types = MON_TYPES(TYPE_ELECTRIC, TYPE_GRASS), .catchRate = 190, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 66 : 103, + .expYield = 66, .evYield_Speed = 1, .genderRatio = MON_GENDERLESS, .eggCycles = 20, @@ -13211,12 +13185,12 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseHP = 60, .baseAttack = 50, .baseDefense = 70, - .baseSpeed = P_UPDATED_STATS >= GEN_7 ? 150 : 140, + .baseSpeed = 150, .baseSpAttack = 80, .baseSpDefense = 80, .types = MON_TYPES(TYPE_ELECTRIC, TYPE_GRASS), .catchRate = 60, - .expYield = ELECTRODE_EXP_YIELD, + .expYield = 172, .evYield_Speed = 2, .genderRatio = MON_GENDERLESS, .eggCycles = 20, @@ -13294,6 +13268,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_HARVEST }, .bodyColor = BODY_COLOR_PINK, + .noFlip = TRUE, .speciesName = _("Exeggcute"), .cryId = CRY_EXEGGCUTE, .natDexNum = NATIONAL_DEX_EXEGGCUTE, @@ -13351,22 +13326,6 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR_ALOLA, CONDITIONS({IF_REGION, REGION_ALOLA})}), }, -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define EXEGGUTOR_EXP_YIELD 186 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define EXEGGUTOR_EXP_YIELD 182 -#else - #define EXEGGUTOR_EXP_YIELD 212 -#endif - -#if P_UPDATED_STATS >= GEN_7 - #define EXEGGUTOR_SP_DEF 75 -#elif P_UPDATED_STATS >= GEN_2 - #define EXEGGUTOR_SP_DEF 65 -#else - #define EXEGGUTOR_SP_DEF 125 -#endif - [SPECIES_EXEGGUTOR] = { .baseHP = 95, @@ -13374,10 +13333,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 85, .baseSpeed = 55, .baseSpAttack = 125, - .baseSpDefense = EXEGGUTOR_SP_DEF, + #if P_UPDATED_STATS >= GEN_7 + .baseSpDefense = 75, + #elif P_UPDATED_STATS >= GEN_2 + .baseSpDefense = 65, + #else + .baseSpDefense = 125, + #endif .types = MON_TYPES(TYPE_GRASS, TYPE_PSYCHIC), .catchRate = 45, - .expYield = EXEGGUTOR_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 186, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 182, + #else + .expYield = 212, + #endif .evYield_SpAttack = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -13386,6 +13357,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_HARVEST }, .bodyColor = BODY_COLOR_YELLOW, + .noFlip = TRUE, .speciesName = _("Exeggutor"), .cryId = CRY_EXEGGUTOR, .natDexNum = NATIONAL_DEX_EXEGGUTOR, @@ -13442,10 +13414,10 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseDefense = 85, .baseSpeed = 45, .baseSpAttack = 125, - .baseSpDefense = EXEGGUTOR_SP_DEF, + .baseSpDefense = 75, .types = MON_TYPES(TYPE_GRASS, TYPE_DRAGON), .catchRate = 45, - .expYield = EXEGGUTOR_EXP_YIELD, + .expYield = 186, .evYield_SpAttack = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -13454,6 +13426,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_FRISK, ABILITY_NONE, ABILITY_HARVEST }, .bodyColor = BODY_COLOR_YELLOW, + .noFlip = TRUE, .speciesName = _("Exeggutor"), .cryId = CRY_EXEGGUTOR, .natDexNum = NATIONAL_DEX_EXEGGUTOR, @@ -13523,6 +13496,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER), .abilities = { ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD, ABILITY_BATTLE_ARMOR }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Cubone"), .cryId = CRY_CUBONE, .natDexNum = NATIONAL_DEX_CUBONE, @@ -13599,6 +13573,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER), .abilities = { ABILITY_ROCK_HEAD, ABILITY_LIGHTNING_ROD, ABILITY_BATTLE_ARMOR }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Marowak"), .cryId = CRY_MAROWAK, .natDexNum = NATIONAL_DEX_MAROWAK, @@ -13662,7 +13637,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 80, .types = MON_TYPES(TYPE_FIRE, TYPE_GHOST), .catchRate = 75, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 149 : 124, + .expYield = 149, .evYield_Defense = 2, .itemRare = ITEM_THICK_CLUB, .genderRatio = PERCENT_FEMALE(50), @@ -13672,6 +13647,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER), .abilities = { ABILITY_CURSED_BODY, ABILITY_LIGHTNING_ROD, ABILITY_ROCK_HEAD }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Marowak"), .cryId = CRY_MAROWAK, .natDexNum = NATIONAL_DEX_MAROWAK, @@ -14399,7 +14375,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_POISON, TYPE_FAIRY), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 173, + .expYield = 172, .evYield_Defense = 2, .itemRare = ITEM_MISTY_SEED, .genderRatio = PERCENT_FEMALE(50), @@ -14732,7 +14708,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 130, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 110 : 255, .evYield_HP = 1, - .itemCommon = ITEM_OVAL_STONE, + .itemRare = ITEM_OVAL_STONE, .genderRatio = MON_FEMALE, .eggCycles = 40, .friendship = 140, @@ -14804,7 +14780,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .catchRate = 30, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 395 : 255, .evYield_HP = 2, - .itemCommon = ITEM_LUCKY_PUNCH, + .itemCommon = ITEM_OVAL_STONE, .genderRatio = MON_FEMALE, .eggCycles = 40, .friendship = 140, @@ -14875,9 +14851,15 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 135, .types = MON_TYPES(TYPE_NORMAL), .catchRate = 30, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 608 : 255, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 635, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 608, + #else + .expYield = 255, + #endif .evYield_HP = (P_UPDATED_EVS >= GEN_4) ? 3 : 2, - .itemRare = ITEM_LUCKY_EGG, + .itemCommon = ITEM_OVAL_STONE, .genderRatio = MON_FEMALE, .eggCycles = 40, .friendship = 140, @@ -15189,7 +15171,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_PARENTAL_BOND, ABILITY_PARENTAL_BOND, ABILITY_PARENTAL_BOND }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Kangaskhan"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_KANGASKHAN_MEGA, + #else + .cryId = CRY_KANGASKHAN, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_KANGASKHAN, .categoryName = _("Parent"), .height = 22, @@ -15813,7 +15799,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 105, .types = MON_TYPES(TYPE_WATER, TYPE_PSYCHIC), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 182 : 207, + .expYield = 182, .evYield_Speed = 2, .itemCommon = ITEM_STARDUST, .itemRare = ITEM_STAR_PIECE, @@ -15825,7 +15811,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_ILLUMINATE, ABILITY_NATURAL_CURE, ABILITY_ANALYTIC }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Starmie"), - .cryId = CRY_STARMIE, // CRY_STARMIE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_STARMIE_MEGA, + #else + .cryId = CRY_STARMIE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_STARMIE, .categoryName = _("Mysterious"), .height = 23, @@ -15835,42 +15825,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = "humanlike. Whether it's simply\n" "trying to communicate or wants to\n" "supplant humanity is unclear."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Starmie) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sStarmieLevelUpLearnset, .teachableLearnset = sStarmieTeachableLearnset, @@ -16051,7 +16021,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 90, .types = MON_TYPES(TYPE_ICE, TYPE_PSYCHIC), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 161 : 136, + .expYield = 161, .evYield_Speed = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 25, @@ -16127,6 +16097,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_HUMAN_LIKE), .abilities = { ABILITY_TANGLED_FEET, ABILITY_SCREEN_CLEANER, ABILITY_ICE_BODY }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Mr. Rime"), .cryId = CRY_MR_RIME, .natDexNum = NATIONAL_DEX_MR_RIME, @@ -16382,7 +16353,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_TECHNICIAN, ABILITY_TECHNICIAN, ABILITY_TECHNICIAN }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Scizor"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SCIZOR_MEGA, + #else + .cryId = CRY_SCIZOR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SCIZOR, .categoryName = _("Pincer"), .height = 20, @@ -17195,7 +17170,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_AERILATE, ABILITY_AERILATE, ABILITY_AERILATE }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Pinsir"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_PINSIR_MEGA, + #else + .cryId = CRY_PINSIR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_PINSIR, .categoryName = _("Stag Beetle"), .height = 17, @@ -17334,7 +17313,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_FIGHTING), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 211, + .expYield = 172, .evYield_Attack = 2, .genderRatio = MON_MALE, .eggCycles = 20, @@ -17400,7 +17379,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_FIGHTING, TYPE_FIRE), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 211, + .expYield = 172, .evYield_Attack = 2, .genderRatio = MON_MALE, .eggCycles = 20, @@ -17466,7 +17445,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_FIGHTING, TYPE_WATER), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 172 : 211, + .expYield = 172, .evYield_Attack = 2, .genderRatio = MON_MALE, .eggCycles = 20, @@ -17607,7 +17586,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = TRACKS_SPOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sMagikarpLevelUpLearnset, .teachableLearnset = sMagikarpTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_GYARADOS}), @@ -17716,7 +17695,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_MOLD_BREAKER, ABILITY_MOLD_BREAKER, ABILITY_MOLD_BREAKER }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Gyarados"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GYARADOS_MEGA, + #else + .cryId = CRY_GYARADOS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GYARADOS, .categoryName = _("Atrocious"), .height = 65, @@ -17969,20 +17952,28 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Ditto, gShinyOverworldPalette_Ditto ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sDittoLevelUpLearnset, .teachableLearnset = sDittoTeachableLearnset, }, #endif //P_FAMILY_DITTO #if P_FAMILY_EEVEE +#define EEVEE_SP_ATK (P_UPDATED_STATS >= GEN_2 ? 45 : 65) + +#if P_UPDATED_ABILITIES >= GEN_4 + #define EEVEE_ABILITIES { ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION } +#else + #define EEVEE_ABILITIES { ABILITY_RUN_AWAY, ABILITY_NONE, ABILITY_ANTICIPATION } +#endif + [SPECIES_EEVEE] = { .baseHP = 55, .baseAttack = 55, .baseDefense = 50, .baseSpeed = 55, - .baseSpAttack = P_UPDATED_STATS >= GEN_2 ? 45 : 65, + .baseSpAttack = EEVEE_SP_ATK, .baseSpDefense = 65, .types = MON_TYPES(TYPE_NORMAL), .catchRate = 45, @@ -17993,11 +17984,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), - #if P_UPDATED_ABILITIES >= GEN_4 - .abilities = { ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION }, - #else - .abilities = { ABILITY_RUN_AWAY, ABILITY_NONE, ABILITY_ANTICIPATION }, - #endif + .abilities = EEVEE_ABILITIES, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Eevee"), .cryId = CRY_EEVEE, @@ -18082,7 +18069,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseAttack = 55, .baseDefense = 50, .baseSpeed = 55, - .baseSpAttack = P_UPDATED_STATS >= GEN_2 ? 45 : 65, + .baseSpAttack = EEVEE_SP_ATK, .baseSpDefense = 65, .types = MON_TYPES(TYPE_NORMAL), .catchRate = 45, @@ -18093,7 +18080,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), - .abilities = { ABILITY_RUN_AWAY, ABILITY_ADAPTABILITY, ABILITY_ANTICIPATION }, + .abilities = EEVEE_ABILITIES, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Eevee"), .cryId = CRY_EEVEE, @@ -18145,7 +18132,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 85, .types = MON_TYPES(TYPE_NORMAL), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 65 : 92, + .expYield = 87, .evYield_SpDefense = 1, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 35, @@ -19386,7 +19373,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Aerodactyl"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_AERODACTYL_MEGA, + #else + .cryId = CRY_AERODACTYL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_AERODACTYL, .categoryName = _("Fossil"), .height = 21, @@ -19718,7 +19709,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Articuno, gShinyOverworldPalette_Articuno ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sArticunoLevelUpLearnset, .teachableLearnset = sArticunoTeachableLearnset, @@ -19786,7 +19777,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_ArticunoGalar, gShinyOverworldPalette_ArticunoGalar ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isGalarianForm = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sArticunoGalarLevelUpLearnset, @@ -19872,7 +19863,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Zapdos, gShinyOverworldPalette_Zapdos ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZapdosLevelUpLearnset, .teachableLearnset = sZapdosTeachableLearnset, @@ -19939,7 +19930,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_ZapdosGalar, gShinyOverworldPalette_ZapdosGalar ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isGalarianForm = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZapdosGalarLevelUpLearnset, @@ -20049,7 +20040,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Moltres, gShinyOverworldPalette_Moltres ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMoltresLevelUpLearnset, .teachableLearnset = sMoltresTeachableLearnset, @@ -20116,7 +20107,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_MoltresGalar, gShinyOverworldPalette_MoltresGalar ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isGalarianForm = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMoltresGalarLevelUpLearnset, @@ -20355,13 +20346,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .baseSpDefense = 125, .types = MON_TYPES(TYPE_DRAGON, TYPE_FLYING), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 300, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 270, - #else - .expYield = 218, - #endif .evYield_Attack = 3, .itemRare = ITEM_DRAGON_SCALE, .genderRatio = PERCENT_FEMALE(50), @@ -20372,7 +20357,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_INNER_FOCUS, ABILITY_NONE, ABILITY_MULTISCALE }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Dragonite"), - .cryId = CRY_DRAGONITE, // CRY_DRAGONITE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_DRAGONITE_MEGA, + #else + .cryId = CRY_DRAGONITE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DRAGONITE, .categoryName = _("Dragon"), .height = 22, @@ -20382,42 +20371,22 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = "powered up this Pokémon's feelings\n" "of kindness. It finishes off its\n" "opponents with mercy in its heart."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Dragonite) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sDragoniteLevelUpLearnset, .teachableLearnset = sDragoniteTeachableLearnset, @@ -20496,7 +20465,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gOverworldPalette_Mewtwo, gShinyOverworldPalette_Mewtwo ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMewtwoLevelUpLearnset, @@ -20526,7 +20495,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_STEADFAST, ABILITY_STEADFAST, ABILITY_STEADFAST }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Mewtwo"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_MEWTWO_MEGA_X, + #else + .cryId = CRY_MEWTWO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEWTWO, .categoryName = _("Genetic"), .height = 23, @@ -20567,7 +20540,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_MewtwoMegaX ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -20597,7 +20570,11 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .abilities = { ABILITY_INSOMNIA, ABILITY_INSOMNIA, ABILITY_INSOMNIA }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Mewtwo"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_MEWTWO_MEGA_Y, + #else + .cryId = CRY_MEWTWO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEWTWO, .categoryName = _("Genetic"), .height = 15, @@ -20639,7 +20616,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = gShinyOverworldPalette_MewtwoMegaY ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -20727,6 +20704,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .isMythical = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, + .teachingType = ALL_TEACHABLES, .levelUpLearnset = sMewLevelUpLearnset, .teachableLearnset = sMewTeachableLearnset, }, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 3849ab760..b3142f203 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -240,13 +240,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 115, .types = MON_TYPES(TYPE_GRASS, TYPE_FAIRY), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 263, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 236, - #else - .expYield = 208, - #endif .evYield_Defense = 1, .evYield_SpDefense = 2, .genderRatio = PERCENT_FEMALE(12.5), @@ -257,7 +251,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_LEAF_GUARD }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Meganium"), - .cryId = CRY_MEGANIUM, // CRY_MEGANIUM_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MEGANIUM_MEGA, + #else + .cryId = CRY_MEGANIUM, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEGANIUM, .categoryName = _("Herb"), .height = 24, @@ -267,42 +265,22 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = "powerful Solar Beam from its four\n" "flowers. Another name for this is\n" "Mega Sol Cannon."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Meganium) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sMeganiumLevelUpLearnset, .teachableLearnset = sMeganiumTeachableLearnset, @@ -452,14 +430,6 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = {EVO_LEVEL, 36, SPECIES_TYPHLOSION_HISUI, CONDITIONS({IF_REGION, REGION_HISUI})}), }, -#if P_UPDATED_EXP_YIELDS >= GEN_8 - #define TYPHLOSION_EXP_YIELD 267 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define TYPHLOSION_EXP_YIELD 240 -#else - #define TYPHLOSION_EXP_YIELD 209 -#endif - [SPECIES_TYPHLOSION] = { .baseHP = 78, @@ -470,7 +440,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 85, .types = MON_TYPES(TYPE_FIRE), .catchRate = 45, - .expYield = TYPHLOSION_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 267, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 240, + #else + .expYield = 209, + #endif .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -539,7 +515,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 85, .types = MON_TYPES(TYPE_FIRE, TYPE_GHOST), .catchRate = 45, - .expYield = TYPHLOSION_EXP_YIELD, + .expYield = 267, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -827,13 +803,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 93, .types = MON_TYPES(TYPE_WATER, TYPE_DRAGON), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 265, - #elif P_UPDATED_EXP_YIELDS >= GEN_5 - .expYield = 239, - #else - .expYield = 210, - #endif .evYield_Attack = 2, .evYield_Defense = 1, .genderRatio = PERCENT_FEMALE(12.5), @@ -844,7 +814,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_TORRENT, ABILITY_NONE, ABILITY_SHEER_FORCE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Feraligatr"), - .cryId = CRY_FERALIGATR, // CRY_FERALIGATR_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_FERALIGATR_MEGA, + #else + .cryId = CRY_FERALIGATR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_FERALIGATR, .categoryName = _("Double Jaw"), .height = 23, @@ -854,42 +828,22 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = "Pokémon forms a gigantic set of jaws\n" "with a bite 10 times as powerful\n" "as Mega Feraligatr's actual jaws."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Feraligatr) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sFeraligatrLevelUpLearnset, .teachableLearnset = sFeraligatrTeachableLearnset, @@ -1110,6 +1064,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Hoothoot, gShinyOverworldPalette_Hoothoot ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sHoothootLevelUpLearnset, .teachableLearnset = sHoothootTeachableLearnset, .eggMoveLearnset = sHoothootEggMoveLearnset, @@ -1651,7 +1606,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = #endif //P_FAMILY_CHINCHOU #if P_FAMILY_TOGEPI -#define TOGEPI_FAMILY_TYPE (P_UPDATED_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_NORMAL) +#define TOGEPI_FAMILY_TYPE1 (P_UPDATED_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_NORMAL) [SPECIES_TOGEPI] = { @@ -1661,7 +1616,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpeed = 20, .baseSpAttack = 40, .baseSpDefense = 65, - .types = MON_TYPES(TOGEPI_FAMILY_TYPE), + .types = MON_TYPES(TOGEPI_FAMILY_TYPE1), .catchRate = 190, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 49 : 74, .evYield_SpDefense = 1, @@ -1672,6 +1627,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), .abilities = { ABILITY_HUSTLE, ABILITY_SERENE_GRACE, ABILITY_SUPER_LUCK }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Togepi"), .cryId = CRY_TOGEPI, .natDexNum = NATIONAL_DEX_TOGEPI, @@ -1730,7 +1686,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpeed = 40, .baseSpAttack = 80, .baseSpDefense = 105, - .types = MON_TYPES(TOGEPI_FAMILY_TYPE, TYPE_FLYING), + .types = MON_TYPES(TOGEPI_FAMILY_TYPE1, TYPE_FLYING), .catchRate = 75, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 142 : 114, .evYield_SpDefense = 2, @@ -1741,6 +1697,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_FAIRY), .abilities = { ABILITY_HUSTLE, ABILITY_SERENE_GRACE, ABILITY_SUPER_LUCK }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Togetic"), .cryId = CRY_TOGETIC, .natDexNum = NATIONAL_DEX_TOGETIC, @@ -1801,7 +1758,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpeed = 80, .baseSpAttack = 120, .baseSpDefense = 115, - .types = MON_TYPES(TOGEPI_FAMILY_TYPE, TYPE_FLYING), + .types = MON_TYPES(TOGEPI_FAMILY_TYPE1, TYPE_FLYING), .catchRate = 30, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 273, @@ -1942,6 +1899,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Natu, gShinyOverworldPalette_Natu ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sNatuLevelUpLearnset, .teachableLearnset = sNatuTeachableLearnset, .eggMoveLearnset = sNatuEggMoveLearnset, @@ -2052,6 +2010,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MONSTER, EGG_GROUP_FIELD), .abilities = { ABILITY_STATIC, ABILITY_NONE, ABILITY_PLUS }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Mareep"), .cryId = CRY_MAREEP, .natDexNum = NATIONAL_DEX_MAREEP, @@ -2176,13 +2135,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_AMPHAROS}), }, -#define AMPHAROS_DEFENSE (P_UPDATED_STATS >= GEN_6 ? 85 : 75) - [SPECIES_AMPHAROS] = { .baseHP = 90, .baseAttack = 75, - .baseDefense = AMPHAROS_DEFENSE, + .baseDefense = P_UPDATED_STATS >= GEN_6 ? 85 : 75, .baseSpeed = 55, .baseSpAttack = 115, .baseSpDefense = 90, @@ -2190,7 +2147,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 255, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 230, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 225, @@ -2261,7 +2218,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = { .baseHP = 90, .baseAttack = 95, - .baseDefense = AMPHAROS_DEFENSE + 20, + .baseDefense = 105, .baseSpeed = 45, .baseSpAttack = 165, .baseSpDefense = 110, @@ -2277,7 +2234,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_MOLD_BREAKER, ABILITY_MOLD_BREAKER, ABILITY_MOLD_BREAKER }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Ampharos"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_AMPHAROS_MEGA, + #else + .cryId = CRY_AMPHAROS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_AMPHAROS, .categoryName = _("Light"), .height = 14, @@ -2511,6 +2472,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_FAIRY), .abilities = { ABILITY_THICK_FAT, ABILITY_HUGE_POWER, ABILITY_SAP_SIPPER }, .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, .speciesName = _("Azumarill"), .cryId = CRY_AZUMARILL, .natDexNum = NATIONAL_DEX_AZUMARILL, @@ -3637,7 +3599,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 25, .types = MON_TYPES(TYPE_POISON, TYPE_GROUND), .catchRate = 255, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 42 : 52, + .expYield = 42, .evYield_HP = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -3840,6 +3802,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = TRACKS_FOOT, sAnimTable_Following ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sMurkrowLevelUpLearnset, .teachableLearnset = sMurkrowTeachableLearnset, .eggMoveLearnset = sMurkrowEggMoveLearnset, @@ -4138,9 +4101,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Unown, \ gShinyOverworldPalette_Unown, \ ) \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sUnownLevelUpLearnset, \ .teachableLearnset = sUnownTeachableLearnset, \ - .tmIlliterate = TRUE, \ .formSpeciesIdTable = sUnownFormSpeciesIdTable, \ } @@ -4242,7 +4205,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Wynaut, gShinyOverworldPalette_Wynaut ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWynautLevelUpLearnset, .teachableLearnset = sWynautTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 15, SPECIES_WOBBUFFET}), @@ -4331,7 +4294,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWobbuffetLevelUpLearnset, .teachableLearnset = sWobbuffetTeachableLearnset, }, @@ -5151,15 +5114,6 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = #endif //P_FAMILY_SNUBBULL #if P_FAMILY_QWILFISH - -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define QWILFISH_EXP_YIELD 88 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define QWILFISH_EXP_YIELD 86 -#else - #define QWILFISH_EXP_YIELD 100 -#endif - [SPECIES_QWILFISH] = { .baseHP = 65, @@ -5170,7 +5124,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 55, .types = MON_TYPES(TYPE_WATER, TYPE_POISON), .catchRate = 45, - .expYield = QWILFISH_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 88, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 86, + #else + .expYield = 100, + #endif .evYield_Attack = 1, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), @@ -5240,13 +5200,13 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = { .baseHP = 65, .baseAttack = 95, - .baseDefense = P_UPDATED_STATS >= GEN_7 ? 85 : 75, + .baseDefense = 85, .baseSpeed = 85, .baseSpAttack = 55, .baseSpDefense = 55, .types = MON_TYPES(TYPE_DARK, TYPE_POISON), .catchRate = 45, - .expYield = QWILFISH_EXP_YIELD, + .expYield = 88, .evYield_Attack = 1, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), @@ -5256,6 +5216,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_2), .abilities = { ABILITY_POISON_POINT, ABILITY_SWIFT_SWIM, ABILITY_INTIMIDATE }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Qwilfish"), .cryId = CRY_QWILFISH, .natDexNum = NATIONAL_DEX_QWILFISH, @@ -5323,6 +5284,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_2), .abilities = { ABILITY_POISON_POINT, ABILITY_SWIFT_SWIM, ABILITY_INTIMIDATE }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Overqwil"), .cryId = CRY_OVERQWIL, .natDexNum = NATIONAL_DEX_OVERQWIL, @@ -5553,7 +5515,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_SKILL_LINK, ABILITY_SKILL_LINK, ABILITY_SKILL_LINK }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Heracross"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_HERACROSS_MEGA, + #else + .cryId = CRY_HERACROSS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_HERACROSS, .categoryName = _("Single Horn"), .height = 17, @@ -5790,7 +5756,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 75, .types = MON_TYPES(TYPE_FIGHTING, TYPE_POISON), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 86 : 132, + .expYield = 86, .evYield_Speed = 1, .itemRare = ITEM_QUICK_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -5881,6 +5847,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_PRESSURE, ABILITY_UNBURDEN, ABILITY_POISON_TOUCH }, .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, .speciesName = _("Sneasler"), .cryId = CRY_SNEASLER, .natDexNum = NATIONAL_DEX_SNEASLER, @@ -5940,7 +5907,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .catchRate = 120, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 66 : 124, .evYield_Attack = 1, - .itemCommon = ITEM_HONEY, + .itemRare = ITEM_HONEY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, @@ -6109,6 +6076,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_GUTS, ABILITY_BULLETPROOF, ABILITY_UNNERVE }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Ursaluna"), .cryId = CRY_URSALUNA, .natDexNum = NATIONAL_DEX_URSALUNA, @@ -6163,7 +6131,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_GROUND, TYPE_NORMAL), .catchRate = 5, - .expYield = 275, + .expYield = 278, .evYield_SpAttack = 3, .genderRatio = MON_MALE, .eggCycles = 20, @@ -6172,8 +6140,9 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_MINDS_EYE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Ursaluna"), - .cryId = CRY_URSALUNA, + .cryId = CRY_URSALUNA_BLOODMOON, .natDexNum = NATIONAL_DEX_URSALUNA, .categoryName = _("Peat"), .height = 27, @@ -6611,27 +6580,23 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = #endif //P_FAMILY_SWINUB #if P_FAMILY_CORSOLA -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define CORSOLA_EXP_YIELD 144 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define CORSOLA_EXP_YIELD 133 -#else - #define CORSOLA_EXP_YIELD 113 -#endif -#define CORSOLA_HP (P_UPDATED_STATS >= GEN_7 ? 65 : 55) -#define CORSOLA_DEFENSES (P_UPDATED_STATS >= GEN_7 ? 95 : 85) - [SPECIES_CORSOLA] = { - .baseHP = CORSOLA_HP, + .baseHP = P_UPDATED_STATS >= GEN_7 ? 65 : 55, .baseAttack = 55, - .baseDefense = CORSOLA_DEFENSES, + .baseDefense = P_UPDATED_STATS >= GEN_7 ? 95 : 85, .baseSpeed = 35, .baseSpAttack = 65, - .baseSpDefense = CORSOLA_DEFENSES, + .baseSpDefense = P_UPDATED_STATS >= GEN_7 ? 95 : 85, .types = MON_TYPES(TYPE_WATER, TYPE_ROCK), .catchRate = 60, - .expYield = CORSOLA_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_7 + .expYield = 144, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 133, + #else + .expYield = 113, + #endif .evYield_Defense = 1, .evYield_SpDefense = 1, .itemRare = ITEM_LUMINOUS_MOSS, @@ -6697,15 +6662,15 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = #if P_GALARIAN_FORMS [SPECIES_CORSOLA_GALAR] = { - .baseHP = CORSOLA_HP - 5, + .baseHP = 60, .baseAttack = 55, - .baseDefense = CORSOLA_DEFENSES + 5, + .baseDefense = 100, .baseSpeed = 30, .baseSpAttack = 65, - .baseSpDefense = CORSOLA_DEFENSES + 5, + .baseSpDefense = 100, .types = MON_TYPES(TYPE_GHOST), .catchRate = 60, - .expYield = CORSOLA_EXP_YIELD, + .expYield = 144, .evYield_SpDefense = 1, .genderRatio = PERCENT_FEMALE(75), .eggCycles = 20, @@ -6781,6 +6746,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_WATER_3), .abilities = { ABILITY_WEAK_ARMOR, ABILITY_NONE, ABILITY_PERISH_BODY }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Cursola"), .cryId = CRY_CURSOLA, .natDexNum = NATIONAL_DEX_CURSOLA, @@ -7009,6 +6975,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_FIELD), .abilities = { ABILITY_VITAL_SPIRIT, ABILITY_HUSTLE, ABILITY_INSOMNIA }, .bodyColor = BODY_COLOR_RED, + .noFlip = TRUE, .speciesName = _("Delibird"), .cryId = CRY_DELIBIRD, .natDexNum = NATIONAL_DEX_DELIBIRD, @@ -7052,6 +7019,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Delibird, gShinyOverworldPalette_Delibird ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sDelibirdLevelUpLearnset, .teachableLearnset = sDelibirdTeachableLearnset, .eggMoveLearnset = sDelibirdEggMoveLearnset, @@ -7156,6 +7124,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1), .abilities = { ABILITY_SWIFT_SWIM, ABILITY_WATER_ABSORB, ABILITY_WATER_VEIL }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = P_GBA_STYLE_SPECIES_GFX, .speciesName = _("Mantine"), .cryId = CRY_MANTINE, .natDexNum = NATIONAL_DEX_MANTINE, @@ -7219,7 +7188,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 70, .types = MON_TYPES(TYPE_STEEL, TYPE_FLYING), .catchRate = 25, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 163 : 168, + .expYield = 163, .evYield_Defense = 2, .itemRare = ITEM_METAL_COAT, .genderRatio = PERCENT_FEMALE(50), @@ -7290,7 +7259,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_STEEL, TYPE_FLYING), .catchRate = 25, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 163 : 168, + .expYield = 163, .evYield_Defense = 2, .itemRare = ITEM_METAL_COAT, .genderRatio = PERCENT_FEMALE(50), @@ -7301,7 +7270,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_KEEN_EYE, ABILITY_STURDY, ABILITY_WEAK_ARMOR }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Skarmory"), - .cryId = CRY_SKARMORY, // CRY_SKARMORY_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_SKARMORY_MEGA, + #else + .cryId = CRY_SKARMORY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SKARMORY, .categoryName = _("Armor Bird"), .height = 17, @@ -7311,42 +7284,22 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = "its pincers have taken a more\n" "diabolical form, ripping anything\n" "they pierce to shreds."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Skarmory) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sSkarmoryLevelUpLearnset, .teachableLearnset = sSkarmoryTeachableLearnset, @@ -7527,7 +7480,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_SOLAR_POWER, ABILITY_SOLAR_POWER, ABILITY_SOLAR_POWER }, .bodyColor = BODY_COLOR_BLACK, .speciesName = _("Houndoom"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_HOUNDOOM_MEGA, + #else + .cryId = CRY_HOUNDOOM, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_HOUNDOOM, .categoryName = _("Dark"), .height = 19, @@ -7898,6 +7855,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_OWN_TEMPO, ABILITY_NONE, ABILITY_MOODY }, #endif .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Smeargle"), .cryId = CRY_SMEARGLE, .natDexNum = NATIONAL_DEX_SMEARGLE, @@ -7943,7 +7901,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Smeargle, gShinyOverworldPalette_Smeargle ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sSmeargleLevelUpLearnset, .teachableLearnset = sSmeargleTeachableLearnset, }, @@ -8099,7 +8057,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Raikou, gShinyOverworldPalette_Raikou ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRaikouLevelUpLearnset, .teachableLearnset = sRaikouTeachableLearnset, @@ -8180,7 +8138,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Entei, gShinyOverworldPalette_Entei ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnteiLevelUpLearnset, .teachableLearnset = sEnteiTeachableLearnset, @@ -8261,7 +8219,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Suicune, gShinyOverworldPalette_Suicune ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSuicuneLevelUpLearnset, .teachableLearnset = sSuicuneTeachableLearnset, @@ -8503,7 +8461,11 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .abilities = { ABILITY_SAND_STREAM, ABILITY_SAND_STREAM, ABILITY_SAND_STREAM }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Tyranitar"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_TYRANITAR_MEGA, + #else + .cryId = CRY_TYRANITAR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_TYRANITAR, .categoryName = _("Armor"), .height = 25, @@ -8634,7 +8596,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_Lugia, gShinyOverworldPalette_Lugia ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLugiaLevelUpLearnset, @@ -8714,7 +8676,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = gOverworldPalette_HoOh, gShinyOverworldPalette_HoOh ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHoOhLevelUpLearnset, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index dedb25fff..954e2477f 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -241,7 +241,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_LIGHTNING_ROD, ABILITY_LIGHTNING_ROD, ABILITY_LIGHTNING_ROD }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Sceptile"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SCEPTILE_MEGA, + #else + .cryId = CRY_SCEPTILE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SCEPTILE, .categoryName = _("Forest"), .height = 19, @@ -569,7 +573,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_SPEED_BOOST, ABILITY_SPEED_BOOST, ABILITY_SPEED_BOOST }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Blaziken"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_BLAZIKEN_MEGA, + #else + .cryId = CRY_BLAZIKEN, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BLAZIKEN, .categoryName = _("Blaze"), .height = 19, @@ -863,7 +871,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_SWIFT_SWIM, ABILITY_SWIFT_SWIM, ABILITY_SWIFT_SWIM }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Swampert"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SWAMPERT_MEGA, + #else + .cryId = CRY_SWAMPERT, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SWAMPERT, .categoryName = _("Mud Fish"), .height = 19, @@ -924,7 +936,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 30, .types = MON_TYPES(TYPE_DARK), .catchRate = 255, - #if P_UPDATED_EXP_YIELDS >= GEN_7 + #if P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 56, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 44, @@ -1068,14 +1080,6 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = #endif //P_FAMILY_POOCHYENA #if P_FAMILY_ZIGZAGOON -#if P_UPDATED_EXP_YIELDS >= GEN_7 - #define ZIGZAGOON_EXP_YIELD 56 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define ZIGZAGOON_EXP_YIELD 48 -#else - #define ZIGZAGOON_EXP_YIELD 60 -#endif - [SPECIES_ZIGZAGOON] = { .baseHP = 38, @@ -1086,7 +1090,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 41, .types = MON_TYPES(TYPE_NORMAL), .catchRate = 255, - .expYield = ZIGZAGOON_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_6 + .expYield = 56, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 48, + #else + .expYield = 60, + #endif .evYield_Speed = 1, .itemCommon = ITEM_POTION, .itemRare = ITEM_REVIVE, @@ -1241,7 +1251,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 41, .types = MON_TYPES(TYPE_DARK, TYPE_NORMAL), .catchRate = 255, - .expYield = ZIGZAGOON_EXP_YIELD, + .expYield = 56, .evYield_Speed = 1, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, @@ -1308,7 +1318,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 61, .types = MON_TYPES(TYPE_DARK, TYPE_NORMAL), .catchRate = 90, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 147 : 128, + .expYield = 147, .evYield_Speed = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, @@ -1440,7 +1450,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 30, .types = MON_TYPES(TYPE_BUG), .catchRate = 255, - #if P_UPDATED_EXP_YIELDS >= GEN_7 + #if P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 56, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 39, @@ -1501,7 +1511,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Wurmple, gShinyOverworldPalette_Wurmple ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sWurmpleLevelUpLearnset, .teachableLearnset = sWurmpleTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_SILCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_GT, 4})}, @@ -1527,6 +1537,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Silcoon"), .cryId = CRY_SILCOON, .natDexNum = NATIONAL_DEX_SILCOON, @@ -1571,7 +1582,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Silcoon, gShinyOverworldPalette_Silcoon ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sSilcoonLevelUpLearnset, .teachableLearnset = sSilcoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_BEAUTIFLY}), @@ -1589,7 +1600,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 198, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 178, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 173, @@ -1698,6 +1709,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), .abilities = { ABILITY_SHED_SKIN, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Cascoon"), .cryId = CRY_CASCOON, .natDexNum = NATIONAL_DEX_CASCOON, @@ -1744,7 +1756,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Cascoon, gShinyOverworldPalette_Cascoon ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCascoonLevelUpLearnset, .teachableLearnset = sCascoonTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_DUSTOX}), @@ -1946,6 +1958,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_GRASS), .abilities = { ABILITY_SWIFT_SWIM, ABILITY_RAIN_DISH, ABILITY_OWN_TEMPO }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Lombre"), .cryId = CRY_LOMBRE, .natDexNum = NATIONAL_DEX_LOMBRE, @@ -2416,6 +2429,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Taillow, gShinyOverworldPalette_Taillow ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sTaillowLevelUpLearnset, .teachableLearnset = sTaillowTeachableLearnset, .eggMoveLearnset = sTaillowEggMoveLearnset, @@ -2904,7 +2918,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_PIXILATE, ABILITY_PIXILATE, ABILITY_PIXILATE }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Gardevoir"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GARDEVOIR_MEGA, + #else + .cryId = CRY_GARDEVOIR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GARDEVOIR, .categoryName = _("Embrace"), .height = 16, @@ -3053,7 +3071,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_INNER_FOCUS, ABILITY_INNER_FOCUS, ABILITY_INNER_FOCUS }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Gallade"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GALLADE_MEGA, + #else + .cryId = CRY_GALLADE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GALLADE, .categoryName = _("Blade"), .height = 16, @@ -3117,7 +3139,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .catchRate = 200, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 54 : 63, .evYield_Speed = 1, - .itemCommon = ITEM_HONEY, + .itemRare = ITEM_HONEY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = STANDARD_FRIENDSHIP, @@ -3286,6 +3308,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_EFFECT_SPORE, ABILITY_NONE, ABILITY_QUICK_FEET }, #endif .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Shroomish"), .cryId = CRY_SHROOMISH, .natDexNum = NATIONAL_DEX_SHROOMISH, @@ -4034,7 +4057,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 245, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 221, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 216, @@ -4652,7 +4675,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_MAGIC_BOUNCE, ABILITY_MAGIC_BOUNCE, ABILITY_MAGIC_BOUNCE }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Sableye"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SABLEYE_MEGA, + #else + .cryId = CRY_SABLEYE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SABLEYE, .categoryName = _("Darkness"), .height = 5, @@ -4703,11 +4730,6 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = #endif //P_FAMILY_SABLEYE #if P_FAMILY_MAWILE -#if P_UPDATED_TYPES >= GEN_6 - #define MAWILE_TYPES { TYPE_STEEL, TYPE_FAIRY } -#else - #define MAWILE_TYPES { TYPE_STEEL, TYPE_STEEL } -#endif [SPECIES_MAWILE] = { @@ -4717,7 +4739,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpeed = 50, .baseSpAttack = 55, .baseSpDefense = 55, - .types = MAWILE_TYPES, + #if P_UPDATED_TYPES >= GEN_6 + .types = MON_TYPES(TYPE_STEEL, TYPE_FAIRY), + #else + .types = MON_TYPES(TYPE_STEEL), + #endif .catchRate = 45, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 133 : 98, .evYield_Attack = 1, @@ -4794,7 +4820,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpeed = 50, .baseSpAttack = 55, .baseSpDefense = 95, - .types = MAWILE_TYPES, + .types = MON_TYPES(TYPE_STEEL, TYPE_FAIRY), .catchRate = 45, .expYield = 168, .evYield_Attack = 1, @@ -4807,7 +4833,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_HUGE_POWER, ABILITY_HUGE_POWER, ABILITY_HUGE_POWER }, .bodyColor = BODY_COLOR_BLACK, .speciesName = _("Mawile"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_MAWILE_MEGA, + #else + .cryId = CRY_MAWILE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MAWILE, .categoryName = _("Deceiver"), .height = 10, @@ -5100,7 +5130,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_FILTER, ABILITY_FILTER, ABILITY_FILTER }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Aggron"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_AGGRON_MEGA, + #else + .cryId = CRY_AGGRON, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_AGGRON, .categoryName = _("Iron Armor"), .height = 22, @@ -5340,7 +5374,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_PURE_POWER, ABILITY_PURE_POWER, ABILITY_PURE_POWER }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Medicham"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_MEDICHAM_MEGA, + #else + .cryId = CRY_MEDICHAM, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEDICHAM, .categoryName = _("Meditate"), .height = 13, @@ -5554,7 +5592,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_INTIMIDATE, ABILITY_INTIMIDATE, ABILITY_INTIMIDATE }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Manectric"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_MANECTRIC_MEGA, + #else + .cryId = CRY_MANECTRIC, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MANECTRIC, .categoryName = _("Discharge"), .height = 18, @@ -6092,7 +6134,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .catchRate = 75, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 258, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 232, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 227, @@ -6517,7 +6559,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_STRONG_JAW, ABILITY_STRONG_JAW, ABILITY_STRONG_JAW }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Sharpedo"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SHARPEDO_MEGA, + #else + .cryId = CRY_SHARPEDO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SHARPEDO, .categoryName = _("Brutal"), .height = 25, @@ -6913,7 +6959,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_SHEER_FORCE, ABILITY_SHEER_FORCE, ABILITY_SHEER_FORCE }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Camerupt"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_CAMERUPT_MEGA, + #else + .cryId = CRY_CAMERUPT, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CAMERUPT, .categoryName = _("Eruption"), .height = 25, @@ -7232,13 +7282,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_Spinda, .frontPicSize = MON_COORDS_SIZE(48, 64), .frontPicYOffset = 8, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 17), - ANIMCMD_FRAME(1, 23), - ANIMCMD_FRAME(0, 13), - ), + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 17), + ANIMCMD_FRAME(1, 23), + ANIMCMD_FRAME(0, 13), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_JUMPS : ANIM_CIRCLE_INTO_BG, .backPic = gMonBackPic_Spinda, .backPicSize = MON_COORDS_SIZE(56, 56), @@ -7267,6 +7321,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = #endif //P_FAMILY_SPINDA #if P_FAMILY_TRAPINCH +#if P_UPDATED_EGG_GROUPS >= GEN_8 + #define TRAPINCH_FAMILY_EGG_GROUPS MON_EGG_GROUPS(EGG_GROUP_BUG, EGG_GROUP_DRAGON) +#else + #define TRAPINCH_FAMILY_EGG_GROUPS MON_EGG_GROUPS(EGG_GROUP_BUG) +#endif + [SPECIES_TRAPINCH] = { .baseHP = 45, @@ -7284,11 +7344,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_SLOW, - #if P_UPDATED_EGG_GROUPS >= GEN_8 - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG, EGG_GROUP_DRAGON), - #else - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), - #endif + .eggGroups = TRAPINCH_FAMILY_EGG_GROUPS, .abilities = { ABILITY_HYPER_CUTTER, ABILITY_ARENA_TRAP, ABILITY_SHEER_FORCE }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Trapinch"), @@ -7360,11 +7416,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_SLOW, - #if P_UPDATED_EGG_GROUPS >= GEN_8 - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG, EGG_GROUP_DRAGON), - #else - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), - #endif + .eggGroups = TRAPINCH_FAMILY_EGG_GROUPS, .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE, ABILITY_LEVITATE }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Vibrava"), @@ -7443,11 +7495,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_SLOW, - #if P_UPDATED_EGG_GROUPS >= GEN_8 - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG, EGG_GROUP_DRAGON), - #else - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_BUG), - #endif + .eggGroups = TRAPINCH_FAMILY_EGG_GROUPS, .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE, ABILITY_LEVITATE }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Flygon"), @@ -7834,7 +7882,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_PIXILATE, ABILITY_PIXILATE, ABILITY_PIXILATE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Altaria"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_ALTARIA_MEGA, + #else + .cryId = CRY_ALTARIA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ALTARIA, .categoryName = _("Humming"), .height = 15, @@ -8996,6 +9048,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_SWIFT_SWIM, ABILITY_NONE, ABILITY_ADAPTABILITY }, #endif .bodyColor = BODY_COLOR_BROWN, + .noFlip = TRUE, .speciesName = _("Feebas"), .cryId = CRY_FEEBAS, .natDexNum = NATIONAL_DEX_FEEBAS, @@ -9182,13 +9235,17 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformNormal, .frontPicSize = MON_COORDS_SIZE(24, 32), .frontPicYOffset = 17, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 24), - ANIMCMD_FRAME(1, 24), - ANIMCMD_FRAME(0, 24), - ), + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ANIMCMD_FRAME(1, 24), + ANIMCMD_FRAME(0, 24), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif .frontAnimId = ANIM_H_SLIDE_WOBBLE, .enemyMonElevation = 16, .backPic = gMonBackPic_CastformNormal, @@ -9257,21 +9314,25 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSunny, .frontPicSize = MON_COORDS_SIZE(40, 48), .frontPicYOffset = 9, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_GROW_VIBRATE, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSunny, .backPicSize = MON_COORDS_SIZE(56, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_SHAKE_GLOW_RED, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_SHAKE_GLOW_RED, .palette = gMonPalette_CastformSunny, .shinyPalette = gMonShinyPalette_CastformSunny, .iconSprite = gMonIcon_CastformSunny, @@ -9334,19 +9395,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformRainy, .frontPicSize = MON_COORDS_SIZE(32, 48), .frontPicYOffset = 9, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 22), - ANIMCMD_FRAME(1, 22), - ANIMCMD_FRAME(0, 11), - ), - .frontAnimId = ANIM_SWING_CONVEX_FAST, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 22), + ANIMCMD_FRAME(1, 22), + ANIMCMD_FRAME(0, 11), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_SWING_CONVEX_FAST, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformRainy, .backPicSize = MON_COORDS_SIZE(40, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_SHRINK_GROW_VIBRATE, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_SHRINK_GROW_VIBRATE, .palette = gMonPalette_CastformRainy, .shinyPalette = gMonShinyPalette_CastformRainy, .iconSprite = gMonIcon_CastformRainy, @@ -9391,6 +9456,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY, EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_FORECAST, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Castform"), .cryId = CRY_CASTFORM, .natDexNum = NATIONAL_DEX_CASTFORM, @@ -9409,19 +9475,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_CastformSnowy, .frontPicSize = MON_COORDS_SIZE(40, 56), .frontPicYOffset = 8, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 5), - ANIMCMD_FRAME(1, 12), - ANIMCMD_FRAME(0, 12), - ANIMCMD_FRAME(1, 29), - ANIMCMD_FRAME(0, 12), - ), - .frontAnimId = ANIM_V_STRETCH, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 29), + ANIMCMD_FRAME(0, 12), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_SLIDE_WOBBLE : ANIM_V_STRETCH, .enemyMonElevation = 5, .backPic = gMonBackPic_CastformSnowy, .backPicSize = MON_COORDS_SIZE(56, 64), .backPicYOffset = 0, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_CONVEX_DOUBLE_ARC : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_CastformSnowy, .shinyPalette = gMonShinyPalette_CastformSnowy, .iconSprite = gMonIcon_CastformSnowy, @@ -9627,6 +9697,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_INSOMNIA, ABILITY_NONE, ABILITY_CURSED_BODY }, #endif .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Banette"), .cryId = CRY_BANETTE, .natDexNum = NATIONAL_DEX_BANETTE, @@ -9703,8 +9774,13 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_PRANKSTER, ABILITY_PRANKSTER, ABILITY_PRANKSTER }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Banette"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_BANETTE_MEGA, + #else + .cryId = CRY_BANETTE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BANETTE, .categoryName = _("Marionette"), .height = 12, @@ -10271,7 +10347,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Chimecho"), - .cryId = CRY_CHIMECHO, // CRY_CHIMECHO_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_CHIMECHO_MEGA, + #else + .cryId = CRY_CHIMECHO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CHIMECHO, .categoryName = _("Wind Chime"), .height = 12, @@ -10295,28 +10375,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Chimecho) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sChimechoLevelUpLearnset, .teachableLearnset = sChimechoTeachableLearnset, @@ -10428,7 +10488,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .bodyColor = BODY_COLOR_WHITE, .noFlip = TRUE, .speciesName = _("Absol"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_ABSOL_MEGA, + #else + .cryId = CRY_ABSOL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ABSOL, .categoryName = _("Disaster"), .height = 12, @@ -10500,7 +10564,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .bodyColor = BODY_COLOR_WHITE, .noFlip = TRUE, .speciesName = _("Absol"), - .cryId = CRY_ABSOL, //CRY_ABSOL_MEGA_Z + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_ABSOL_MEGA_Z, + #else + .cryId = CRY_ABSOL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ABSOL, .categoryName = _("Disaster"), .height = 12, @@ -10524,28 +10592,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Absol) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sAbsolLevelUpLearnset, .teachableLearnset = sAbsolTeachableLearnset, @@ -10735,7 +10783,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_REFRIGERATE, ABILITY_REFRIGERATE, ABILITY_REFRIGERATE }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Glalie"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GLALIE_MEGA, + #else + .cryId = CRY_GLALIE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GLALIE, .categoryName = _("Face"), .height = 21, @@ -10866,7 +10918,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_ICE, TYPE_GHOST), .catchRate = 75, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 168 : 187, + .expYield = 168, .evYield_Speed = 2, .genderRatio = MON_FEMALE, .eggCycles = 20, @@ -10876,7 +10928,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_SNOW_CLOAK, ABILITY_NONE, ABILITY_CURSED_BODY }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Froslass"), - .cryId = CRY_FROSLASS, // CRY_FROSLASS_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_FROSLASS_MEGA, + #else + .cryId = CRY_FROSLASS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_FROSLASS, .categoryName = _("Snow Land"), .height = 26, @@ -10886,42 +10942,22 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = "air imbued with ghost energy to\n" "freeze even insubstantial things,\n" "such as flames or the wind."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Froslass) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sFroslassLevelUpLearnset, .teachableLearnset = sFroslassTeachableLearnset, @@ -11790,7 +11826,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_AERILATE, ABILITY_AERILATE, ABILITY_AERILATE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Salamence"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_SALAMENCE_MEGA, + #else + .cryId = CRY_SALAMENCE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SALAMENCE, .categoryName = _("Dragon"), .height = 18, @@ -11861,6 +11901,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MINERAL), .abilities = { ABILITY_CLEAR_BODY, ABILITY_NONE, ABILITY_LIGHT_METAL }, .bodyColor = BODY_COLOR_BLUE, + .noFlip = TRUE, .speciesName = _("Beldum"), .cryId = CRY_BELDUM, .natDexNum = NATIONAL_DEX_BELDUM, @@ -11908,7 +11949,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Beldum, gShinyOverworldPalette_Beldum ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBeldumLevelUpLearnset, .teachableLearnset = sBeldumTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_METANG}), @@ -12085,7 +12126,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS, ABILITY_TOUGH_CLAWS }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Metagross"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_METAGROSS_MEGA, + #else + .cryId = CRY_METAGROSS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_METAGROSS, .categoryName = _("Iron Leg"), .height = 25, @@ -12208,7 +12253,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Regirock, gShinyOverworldPalette_Regirock ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegirockLevelUpLearnset, .teachableLearnset = sRegirockTeachableLearnset, @@ -12287,7 +12332,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Regice, gShinyOverworldPalette_Regice ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegiceLevelUpLearnset, .teachableLearnset = sRegiceTeachableLearnset, @@ -12367,7 +12412,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Registeel, gShinyOverworldPalette_Registeel ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegisteelLevelUpLearnset, .teachableLearnset = sRegisteelTeachableLearnset, @@ -12447,7 +12492,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Latias, gShinyOverworldPalette_Latias ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiasLevelUpLearnset, .teachableLearnset = sLatiasTeachableLearnset, @@ -12476,7 +12521,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE, ABILITY_LEVITATE }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Latias"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_LATIAS_MEGA, + #else + .cryId = CRY_LATIAS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_LATIAS, .categoryName = _("Eon"), .height = 18, @@ -12518,7 +12567,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_LatiasMega ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isMegaEvolution = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiasLevelUpLearnset, @@ -12602,7 +12651,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Latios, gShinyOverworldPalette_Latios ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiosLevelUpLearnset, .teachableLearnset = sLatiosTeachableLearnset, @@ -12631,7 +12680,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .abilities = { ABILITY_LEVITATE, ABILITY_LEVITATE, ABILITY_LEVITATE }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Latios"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_LATIOS_MEGA, + #else + .cryId = CRY_LATIOS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_LATIOS, .categoryName = _("Eon"), .height = 23, @@ -12673,7 +12726,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_LatiosMega ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isMegaEvolution = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLatiosLevelUpLearnset, @@ -12757,7 +12810,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Kyogre, gShinyOverworldPalette_Kyogre ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyogreLevelUpLearnset, @@ -12827,7 +12880,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_KyogrePrimal ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -12911,7 +12964,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Groudon, gShinyOverworldPalette_Groudon ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGroudonLevelUpLearnset, @@ -12982,7 +13035,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_GroudonPrimal ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isPrimalReversion = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -13004,7 +13057,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpAttack = 150, .baseSpDefense = 90, .types = MON_TYPES(TYPE_DRAGON, TYPE_FLYING), - .catchRate = 45, + .catchRate = 3, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 340, #elif P_UPDATED_EXP_YIELDS >= GEN_5 @@ -13069,7 +13122,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gOverworldPalette_Rayquaza, gShinyOverworldPalette_Rayquaza ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRayquazaLevelUpLearnset, @@ -13088,7 +13141,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .baseSpAttack = 180, .baseSpDefense = 100, .types = MON_TYPES(TYPE_DRAGON, TYPE_FLYING), - .catchRate = 45, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 390 : 351, .evYield_Attack = 2, .evYield_SpAttack = 1, @@ -13142,7 +13195,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = gShinyOverworldPalette_RayquazaMega ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isMegaEvolution = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -13278,22 +13331,31 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .categoryName = _("DNA"), .height = 17, .weight = 608, - .description = gDeoxysNormalPokedexText, + .description = COMPOUND_STRING( + "Deoxys emerged from a virus that came\n" + "from space. It is highly intelligent and\n" + "can shoot lasers from the crystalline\n" + "organ on its chest."), .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 290, .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysNormal, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysNormal, .backPicSize = MON_COORDS_SIZE(64, 56), .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 2 : 6, @@ -13349,26 +13411,34 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .categoryName = _("DNA"), .height = 17, .weight = 608, - .description = gDeoxysNormalPokedexText, + .description = COMPOUND_STRING( + "This Deoxys has transformed into its\n" + "aggressive guise. It can fool enemies\n" + "by altering its appearance."), .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 290, .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysAttack, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysAttack, - .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 1, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 56) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 1, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysAttack, .shinyPalette = gMonShinyPalette_DeoxysAttack, .iconSprite = gMonIcon_DeoxysAttack, @@ -13419,26 +13489,34 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .categoryName = _("DNA"), .height = 17, .weight = 608, - .description = gDeoxysNormalPokedexText, + .description = COMPOUND_STRING( + "When it changes form, an aurora\n" + "appears. It absorbs attacks by\n" + "altering its cellular structure."), .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 290, .trainerOffset = 2, .frontPic = gMonFrontPic_DeoxysDefense, - .frontPicSize = MON_COORDS_SIZE(56, 64), - .frontPicYOffset = 0, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + .frontPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 64) : MON_COORDS_SIZE(56, 64), + .frontPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 1 : 0, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysDefense, .backPicSize = MON_COORDS_SIZE(64, 56), - .backPicYOffset = 8, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 7 : 8, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysDefense, .shinyPalette = gMonShinyPalette_DeoxysDefense, .iconSprite = gMonIcon_DeoxysDefense, @@ -13490,7 +13568,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .categoryName = _("DNA"), .height = 17, .weight = 608, - .description = gDeoxysNormalPokedexText, + .description = COMPOUND_STRING( + "A Pokémon that mutated from an\n" + "extraterrestrial virus exposed to a laser\n" + "beam. Its body is configured for superior \n" + "agility and speed."), .pokemonScale = 256, .pokemonOffset = 0, .trainerScale = 290, @@ -13498,18 +13580,23 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .frontPic = gMonFrontPic_DeoxysSpeed, .frontPicSize = MON_COORDS_SIZE(64, 64), .frontPicYOffset = 1, - .frontAnimFrames = ANIM_FRAMES( - ANIMCMD_FRAME(0, 16), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 26), - ANIMCMD_FRAME(1, 16), - ANIMCMD_FRAME(0, 16), - ), - .frontAnimId = ANIM_GROW_VIBRATE, + #if !P_GBA_STYLE_SPECIES_GFX + .frontAnimFrames = ANIM_FRAMES( + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 26), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ), + #else + .frontAnimFrames = sAnims_SingleFramePlaceHolder, + #endif + .frontAnimId = P_GBA_STYLE_SPECIES_GFX ? ANIM_H_PIVOT : ANIM_GROW_VIBRATE, + .enemyMonElevation = P_GBA_STYLE_SPECIES_GFX ? 8 : 0, .backPic = gMonBackPic_DeoxysSpeed, - .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 0, - .backAnimId = BACK_ANIM_TRIANGLE_DOWN, + .backPicSize = P_GBA_STYLE_SPECIES_GFX ? MON_COORDS_SIZE(64, 48) : MON_COORDS_SIZE(64, 64), + .backPicYOffset = P_GBA_STYLE_SPECIES_GFX ? 9 : 0, + .backAnimId = P_GBA_STYLE_SPECIES_GFX ? BACK_ANIM_SHRINK_GROW_VIBRATE : BACK_ANIM_TRIANGLE_DOWN, .palette = gMonPalette_DeoxysSpeed, .shinyPalette = gMonShinyPalette_DeoxysSpeed, .iconSprite = gMonIcon_DeoxysSpeed, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 8eaa6d712..f818c69ba 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -752,6 +752,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sStarlyLevelUpLearnset, .teachableLearnset = sStarlyTeachableLearnset, .eggMoveLearnset = sStarlyEggMoveLearnset, @@ -850,7 +851,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 243, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 218, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 214, @@ -954,7 +955,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_INTIMIDATE, ABILITY_NONE, ABILITY_RECKLESS }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Staraptor"), - .cryId = CRY_STARAPTOR, //CRY_STARAPTOR_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_STARAPTOR_MEGA, + #else + .cryId = CRY_STARAPTOR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_STARAPTOR, .categoryName = _("Predator"), .height = 19, @@ -978,28 +983,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Staraptor) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sStaraptorLevelUpLearnset, .teachableLearnset = sStaraptorTeachableLearnset, @@ -1268,7 +1253,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sKricketotLevelUpLearnset, .teachableLearnset = sKricketotTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 10, SPECIES_KRICKETUNE}), @@ -1950,7 +1935,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyPlant, gShinyOverworldPalette_BurmyPlant ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2019,7 +2004,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmySandy, gShinyOverworldPalette_BurmySandy ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2088,7 +2073,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_BurmyTrash, gShinyOverworldPalette_BurmyTrash ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBurmyLevelUpLearnset, .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, @@ -2377,7 +2362,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .catchRate = 120, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 49 : 63, .evYield_Speed = 1, - .itemRare = ITEM_HONEY, + .itemCommon = ITEM_HONEY, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 15, .friendship = STANDARD_FRIENDSHIP, @@ -2445,7 +2430,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = TRACKS_FOOT, sAnimTable_Following ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sCombeeLevelUpLearnset, .teachableLearnset = sCombeeTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 21, SPECIES_VESPIQUEN, CONDITIONS({IF_GENDER, MON_FEMALE})}), @@ -2799,6 +2784,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY, EGG_GROUP_GRASS), .abilities = { ABILITY_CHLOROPHYLL, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PINK, + .noFlip = TRUE, .speciesName = _("Cherubi"), .cryId = CRY_CHERUBI, .natDexNum = NATIONAL_DEX_CHERUBI, @@ -2875,6 +2861,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FAIRY, EGG_GROUP_GRASS), .abilities = { ABILITY_FLOWER_GIFT, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Cherrim"), .cryId = CRY_CHERRIM, .natDexNum = NATIONAL_DEX_CHERRIM, @@ -3274,6 +3261,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_AFTERMATH, ABILITY_UNBURDEN, ABILITY_FLARE_BOOST }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Drifloon"), .cryId = CRY_DRIFLOON, .natDexNum = NATIONAL_DEX_DRIFLOON, @@ -3345,6 +3333,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_AFTERMATH, ABILITY_UNBURDEN, ABILITY_FLARE_BOOST }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Drifblim"), .cryId = CRY_DRIFBLIM, .natDexNum = NATIONAL_DEX_DRIFBLIM, @@ -3557,7 +3546,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_SCRAPPY, ABILITY_SCRAPPY, ABILITY_SCRAPPY }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Lopunny"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_LOPUNNY_MEGA, + #else + .cryId = CRY_LOPUNNY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_LOPUNNY, .categoryName = _("Rabbit"), .height = 13, @@ -4118,6 +4111,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Chatot, gShinyOverworldPalette_Chatot ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sChatotLevelUpLearnset, .teachableLearnset = sChatotTeachableLearnset, .eggMoveLearnset = sChatotEggMoveLearnset, @@ -4145,6 +4139,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_PRESSURE, ABILITY_NONE, ABILITY_INFILTRATOR }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Spiritomb"), .cryId = CRY_SPIRITOMB, .natDexNum = NATIONAL_DEX_SPIRITOMB, @@ -4467,7 +4462,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_SAND_FORCE, ABILITY_SAND_FORCE, ABILITY_SAND_FORCE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Garchomp"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_GARCHOMP_MEGA, + #else + .cryId = CRY_GARCHOMP, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GARCHOMP, .categoryName = _("Mach"), .height = 19, @@ -4514,6 +4513,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formSpeciesIdTable = sGarchompFormSpeciesIdTable, .formChangeTable = sGarchompFormChangeTable, }, +#endif //P_MEGA_EVOLUTIONS #if P_GEN_9_MEGA_EVOLUTIONS [SPECIES_GARCHOMP_MEGA_Z] = @@ -4542,7 +4542,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_SAND_VEIL, ABILITY_NONE, ABILITY_ROUGH_SKIN }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Garchomp"), - .cryId = CRY_GARCHOMP, //CRY_GARCHOMP_MEGA_Z + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_GARCHOMP, //CRY_GARCHOMP_MEGA_Z (unreleased) + #else + .cryId = CRY_GARCHOMP, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GARCHOMP, .categoryName = _("Mach"), .height = 19, @@ -4566,28 +4570,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Garchomp) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGarchompLevelUpLearnset, .teachableLearnset = sGarchompTeachableLearnset, @@ -4595,7 +4579,6 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .formChangeTable = sGarchompFormChangeTable, }, #endif //P_GEN_9_MEGA_EVOLUTIONS -#endif //P_MEGA_EVOLUTIONS #endif //P_FAMILY_GIBLE #if P_FAMILY_RIOLU @@ -4760,7 +4743,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_ADAPTABILITY, ABILITY_ADAPTABILITY, ABILITY_ADAPTABILITY }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Lucario"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_LUCARIO_MEGA, + #else + .cryId = CRY_LUCARIO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_LUCARIO, .categoryName = _("Aura"), .height = 13, @@ -4831,7 +4818,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_STEADFAST, ABILITY_INNER_FOCUS, ABILITY_JUSTIFIED }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Lucario"), + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_LUCARIO_MEGA_Z, + #else .cryId = CRY_LUCARIO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_LUCARIO, .categoryName = _("Aura"), .height = 13, @@ -4855,28 +4846,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Lucario) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sLucarioLevelUpLearnset, .teachableLearnset = sLucarioTeachableLearnset, @@ -5398,6 +5369,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_GRASS), .abilities = { ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Carnivine"), .cryId = CRY_CARNIVINE, .natDexNum = NATIONAL_DEX_CARNIVINE, @@ -5819,7 +5791,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_SNOW_WARNING, ABILITY_SNOW_WARNING, ABILITY_SNOW_WARNING }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Abomasnow"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_ABOMASNOW_MEGA, + #else + .cryId = CRY_ABOMASNOW, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ABOMASNOW, .categoryName = _("Frost Tree"), .height = 27, @@ -5870,6 +5846,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #endif //P_FAMILY_SNOVER #if P_FAMILY_ROTOM +#define ROTOM_FAMILY_TYPES { TYPE_ELECTRIC, TYPE_GHOST } + [SPECIES_ROTOM] = { .baseHP = 50, @@ -5878,7 +5856,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 91, .baseSpAttack = 95, .baseSpDefense = 77, - .types = MON_TYPES(TYPE_ELECTRIC, TYPE_GHOST), + .types = ROTOM_FAMILY_TYPES, .catchRate = 45, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_5) ? 154 : 132, .evYield_Speed = 1, @@ -5959,7 +5937,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 86, .baseSpAttack = 105, .baseSpDefense = 107, + #if P_UPDATED_TYPES >= GEN_5 .types = MON_TYPES(TYPE_ELECTRIC, TYPE_FIRE), + #else + .types = ROTOM_FAMILY_TYPES, + #endif .catchRate = 45, .expYield = ROTOM_APPLIANCE_EXP_YIELD, .evYield_Speed = 1, @@ -6030,7 +6012,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 86, .baseSpAttack = 105, .baseSpDefense = 107, + #if P_UPDATED_TYPES >= GEN_5 .types = MON_TYPES(TYPE_ELECTRIC, TYPE_WATER), + #else + .types = ROTOM_FAMILY_TYPES, + #endif .catchRate = 45, .expYield = ROTOM_APPLIANCE_EXP_YIELD, .evYield_Speed = 1, @@ -6102,7 +6088,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 86, .baseSpAttack = 105, .baseSpDefense = 107, + #if P_UPDATED_TYPES >= GEN_5 .types = MON_TYPES(TYPE_ELECTRIC, TYPE_ICE), + #else + .types = ROTOM_FAMILY_TYPES, + #endif .catchRate = 45, .expYield = ROTOM_APPLIANCE_EXP_YIELD, .evYield_Speed = 1, @@ -6172,7 +6162,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 86, .baseSpAttack = 105, .baseSpDefense = 107, + #if P_UPDATED_TYPES >= GEN_5 .types = MON_TYPES(TYPE_ELECTRIC, TYPE_FLYING), + #else + .types = ROTOM_FAMILY_TYPES, + #endif .catchRate = 45, .expYield = ROTOM_APPLIANCE_EXP_YIELD, .evYield_Speed = 1, @@ -6267,7 +6261,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpeed = 86, .baseSpAttack = 105, .baseSpDefense = 107, + #if P_UPDATED_TYPES >= GEN_5 .types = MON_TYPES(TYPE_ELECTRIC, TYPE_GRASS), + #else + .types = ROTOM_FAMILY_TYPES, + #endif .catchRate = 45, .expYield = ROTOM_APPLIANCE_EXP_YIELD, .evYield_Speed = 1, @@ -6405,7 +6403,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Uxie, gShinyOverworldPalette_Uxie ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUxieLevelUpLearnset, .teachableLearnset = sUxieTeachableLearnset, @@ -6490,7 +6488,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Mesprit, gShinyOverworldPalette_Mesprit ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMespritLevelUpLearnset, .teachableLearnset = sMespritTeachableLearnset, @@ -6569,7 +6567,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Azelf, gShinyOverworldPalette_Azelf ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sAzelfLevelUpLearnset, .teachableLearnset = sAzelfTeachableLearnset, @@ -6577,14 +6575,6 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #endif //P_FAMILY_AZELF #if P_FAMILY_DIALGA -#if P_UPDATED_EXP_YIELDS >= GEN_8 - #define DIALGA_EXP_YIELD 340 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define DIALGA_EXP_YIELD 306 -#else - #define DIALGA_EXP_YIELD 220 -#endif - [SPECIES_DIALGA] = { .baseHP = 100, @@ -6595,7 +6585,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_STEEL, TYPE_DRAGON), .catchRate = 3, - .expYield = DIALGA_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 340, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 306, + #else + .expYield = 220, + #endif .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6647,7 +6643,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Dialga, gShinyOverworldPalette_Dialga ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDialgaLevelUpLearnset, @@ -6666,7 +6662,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpDefense = 120, .types = MON_TYPES(TYPE_STEEL, TYPE_DRAGON), .catchRate = 3, - .expYield = DIALGA_EXP_YIELD, + .expYield = 340, .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6715,7 +6711,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_DialgaOrigin, gShinyOverworldPalette_DialgaOrigin ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sDialgaLevelUpLearnset, @@ -6726,14 +6722,6 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = #endif //P_FAMILY_DIALGA #if P_FAMILY_PALKIA -#if P_UPDATED_EXP_YIELDS >= GEN_8 - #define PALKIA_EXP_YIELD 340 -#elif P_UPDATED_EXP_YIELDS >= GEN_5 - #define PALKIA_EXP_YIELD 306 -#else - #define PALKIA_EXP_YIELD 220 -#endif - [SPECIES_PALKIA] = { .baseHP = 90, @@ -6744,7 +6732,13 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpDefense = 120, .types = MON_TYPES(TYPE_WATER, TYPE_DRAGON), .catchRate = 3, - .expYield = PALKIA_EXP_YIELD, + #if P_UPDATED_EXP_YIELDS >= GEN_8 + .expYield = 340, + #elif P_UPDATED_EXP_YIELDS >= GEN_5 + .expYield = 306, + #else + .expYield = 220, + #endif .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6796,7 +6790,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Palkia, gShinyOverworldPalette_Palkia ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPalkiaLevelUpLearnset, @@ -6815,7 +6809,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpDefense = 120, .types = MON_TYPES(TYPE_WATER, TYPE_DRAGON), .catchRate = 3, - .expYield = PALKIA_EXP_YIELD, + .expYield = 340, .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6864,7 +6858,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_PalkiaOrigin, gShinyOverworldPalette_PalkiaOrigin ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPalkiaLevelUpLearnset, @@ -6944,7 +6938,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Heatran, gShinyOverworldPalette_Heatran ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHeatranLevelUpLearnset, .teachableLearnset = sHeatranTeachableLearnset, @@ -6979,7 +6973,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_FLASH_FIRE, ABILITY_NONE, ABILITY_FLAME_BODY }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Heatran"), - .cryId = CRY_HEATRAN, //CRY_HEATRAN_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_HEATRAN_MEGA, + #else + .cryId = CRY_HEATRAN, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_HEATRAN, .categoryName = _("Lava Dome"), .height = 28, @@ -7003,30 +7001,10 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Heatran) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sHeatranLevelUpLearnset, .teachableLearnset = sHeatranTeachableLearnset, @@ -7105,7 +7083,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Regigigas, gShinyOverworldPalette_Regigigas ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegigigasLevelUpLearnset, .teachableLearnset = sRegigigasTeachableLearnset, @@ -7184,7 +7162,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_GiratinaAltered, gShinyOverworldPalette_GiratinaAltered ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGiratinaLevelUpLearnset, @@ -7259,7 +7237,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_GiratinaOrigin, gShinyOverworldPalette_GiratinaOrigin ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGiratinaLevelUpLearnset, @@ -7280,7 +7258,9 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .baseSpDefense = P_UPDATED_STATS >= GEN_9 ? 120 : 130, .types = MON_TYPES(TYPE_PSYCHIC), .catchRate = 3, - #if P_UPDATED_EXP_YIELDS >= GEN_8 + #if P_UPDATED_EXP_YIELDS >= GEN_9 + .expYield = 290, + #elif P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 300, #elif P_UPDATED_EXP_YIELDS >= GEN_5 .expYield = 270, @@ -7343,7 +7323,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = gOverworldPalette_Cresselia, gShinyOverworldPalette_Cresselia ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCresseliaLevelUpLearnset, .teachableLearnset = sCresseliaTeachableLearnset, @@ -7503,6 +7483,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sManaphyLevelUpLearnset, .teachableLearnset = sManaphyTeachableLearnset, + .eggId = EGG_ID_MANAPHY, }, #endif //P_FAMILY_MANAPHY @@ -7533,6 +7514,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_NO_EGGS_DISCOVERED), .abilities = { ABILITY_BAD_DREAMS, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Darkrai"), .cryId = CRY_DARKRAI, .natDexNum = NATIONAL_DEX_DARKRAI, @@ -7615,7 +7597,11 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .abilities = { ABILITY_BAD_DREAMS, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLACK, .speciesName = _("Darkrai"), - .cryId = CRY_DARKRAI, //CRY_DARKRAI_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_DARKRAI_MEGA, + #else + .cryId = CRY_DARKRAI, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DARKRAI, .categoryName = _("Pitch-Black"), .height = 30, @@ -7639,28 +7625,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Darkrai) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .isMythical = TRUE, .isFrontierBanned = TRUE, @@ -7828,6 +7794,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = ) .isMythical = TRUE, .isFrontierBanned = TRUE, + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sShayminSkyLevelUpLearnset, .teachableLearnset = sShayminSkyTeachableLearnset, diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index d8d85a76a..d4c838403 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -527,7 +527,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 110, .types = MON_TYPES(TYPE_FIRE, TYPE_FIGHTING), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 264 : 238, + .expYield = 264, .evYield_Attack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -538,7 +538,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .bodyColor = BODY_COLOR_RED, .noFlip = TRUE, .speciesName = _("Emboar"), - .cryId = CRY_EMBOAR, // CRY_EMBOAR_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_EMBOAR_MEGA, + #else + .cryId = CRY_EMBOAR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_EMBOAR, .categoryName = _("Fire Pig"), .height = 18, @@ -548,42 +552,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "shaped like a serpentine spear,\n" "it rushes in to save its\n" "imperiled allies."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Emboar) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sEmboarLevelUpLearnset, .teachableLearnset = sEmboarTeachableLearnset, @@ -816,7 +800,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 65, .types = MON_TYPES(TYPE_WATER, TYPE_DARK), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 264 : 238, + .expYield = 264, .evYield_Attack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -1171,7 +1155,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 250, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 225, #else .expYield = 221, @@ -2002,6 +1986,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Pidove, gShinyOverworldPalette_Pidove ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sPidoveLevelUpLearnset, .teachableLearnset = sPidoveTeachableLearnset, .eggMoveLearnset = sPidoveEggMoveLearnset, @@ -2088,7 +2073,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 244, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 220, #else .expYield = 215, @@ -2477,7 +2462,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 258, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 232, #else .expYield = 227, @@ -2870,7 +2855,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .bodyColor = BODY_COLOR_GRAY, .noFlip = TRUE, .speciesName = _("Excadrill"), - .cryId = CRY_EXCADRILL, // CRY_EXCADRILL_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_EXCADRILL_MEGA, + #else + .cryId = CRY_EXCADRILL, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_EXCADRILL, .categoryName = _("Subterrene"), .height = 9, @@ -2880,42 +2869,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "head together to form a streamlined\n" "shape and spins at high speeds,\n" "it can destroy anything."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Excadrill) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sExcadrillLevelUpLearnset, .teachableLearnset = sExcadrillTeachableLearnset, @@ -3021,7 +2990,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .abilities = { ABILITY_HEALER, ABILITY_HEALER, ABILITY_HEALER }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Audino"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_AUDINO_MEGA, + #else + .cryId = CRY_AUDINO, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_AUDINO, .categoryName = _("Hearing"), .height = 15, @@ -3433,7 +3406,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 255, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 229, #else .expYield = 225, @@ -3795,7 +3768,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 250, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 225, #else .expYield = 221, @@ -4025,7 +3998,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 243, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 218, #else .expYield = 214, @@ -4103,13 +4076,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 99, .types = MON_TYPES(TYPE_BUG, TYPE_POISON), .catchRate = 45, - #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 243, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 - .expYield = 218, - #else - .expYield = 214, - #endif .evYield_Speed = 3, .itemRare = ITEM_POISON_BARB, .genderRatio = PERCENT_FEMALE(50), @@ -4120,7 +4087,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .abilities = { ABILITY_POISON_POINT, ABILITY_SWARM, ABILITY_SPEED_BOOST }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Scolipede"), - .cryId = CRY_SCOLIPEDE, // CRY_SCOLIPEDE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_SCOLIPEDE_MEGA, + #else + .cryId = CRY_SCOLIPEDE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SCOLIPEDE, .categoryName = _("Megapede"), .height = 32, @@ -4129,42 +4100,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "Its deadly venom gives off a faint\n" "glow. The venom affects Scolipede's\n" "mind, honing its viciousness."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Scolipede) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sScolipedeLevelUpLearnset, .teachableLearnset = sScolipedeTeachableLearnset, @@ -4175,11 +4126,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = #endif //P_FAMILY_VENIPEDE #if P_FAMILY_COTTONEE -#if P_UPDATED_TYPES >= GEN_6 - #define COTTONEE_FAMILY_TYPES { TYPE_GRASS, TYPE_FAIRY } -#else - #define COTTONEE_FAMILY_TYPES { TYPE_GRASS, TYPE_GRASS } -#endif +#define COTTONEE_FAMILY_TYPE2 (P_UPDATED_TYPES >= GEN_6 ? TYPE_FAIRY : TYPE_GRASS) [SPECIES_COTTONEE] = { @@ -4189,7 +4136,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpeed = 66, .baseSpAttack = 37, .baseSpDefense = 50, - .types = COTTONEE_FAMILY_TYPES, + .types = MON_TYPES(TYPE_GRASS, COTTONEE_FAMILY_TYPE2), .catchRate = 190, .expYield = 56, .evYield_Speed = 1, @@ -4265,7 +4212,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpeed = 116, .baseSpAttack = 77, .baseSpDefense = 75, - .types = COTTONEE_FAMILY_TYPES, + .types = MON_TYPES(TYPE_GRASS, COTTONEE_FAMILY_TYPE2), .catchRate = 75, .expYield = 168, .evYield_Speed = 2, @@ -5029,7 +4976,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .catchRate = 45, #if P_UPDATED_EXP_YIELDS >= GEN_8 .expYield = 260, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 + #elif P_UPDATED_EXP_YIELDS >= GEN_6 .expYield = 234, #else .expYield = 229, @@ -5245,7 +5192,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 105, .types = MON_TYPES(TYPE_FIRE, TYPE_PSYCHIC), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_7) ? 189 : 168, + .expYield = 189, .evYield_SpAttack = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -5437,7 +5384,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 55, .types = MON_TYPES(TYPE_ICE, TYPE_FIRE), .catchRate = 60, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_7) ? 189 : 168, + .expYield = 189, .evYield_SpAttack = 2, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -5446,6 +5393,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_GORILLA_TACTICS, ABILITY_NONE, ABILITY_ZEN_MODE }, .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Darmanitan"), .cryId = CRY_DARMANITAN, .natDexNum = NATIONAL_DEX_DARMANITAN, @@ -5875,7 +5823,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .abilities = { ABILITY_SHED_SKIN, ABILITY_MOXIE, ABILITY_INTIMIDATE }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Scrafty"), + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_SCRAFTY_MEGA, + #else .cryId = CRY_SCRAFTY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SCRAFTY, .categoryName = _("Hoodlum"), .height = 11, @@ -5885,42 +5837,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "shed skin to turn white, growing\n" "tough and supple. Of course, this\n" "Pokémon is still as feisty as ever."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Scrafty) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sScraftyLevelUpLearnset, .teachableLearnset = sScraftyTeachableLearnset, @@ -6169,6 +6101,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MINERAL, EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_WANDERING_SPIRIT, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Yamask"), .cryId = CRY_YAMASK, .natDexNum = NATIONAL_DEX_YAMASK, @@ -6237,6 +6170,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_MINERAL, EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_WANDERING_SPIRIT, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GRAY, + .noFlip = TRUE, .speciesName = _("Runerigus"), .cryId = CRY_RUNERIGUS, .natDexNum = NATIONAL_DEX_RUNERIGUS, @@ -6493,6 +6427,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Archen, gShinyOverworldPalette_Archen ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sArchenLevelUpLearnset, .teachableLearnset = sArchenTeachableLearnset, .eggMoveLearnset = sArchenEggMoveLearnset, @@ -7008,6 +6943,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_ILLUSION, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GRAY, + .noFlip = TRUE, .speciesName = _("Zoroark"), .cryId = CRY_ZOROARK, .natDexNum = NATIONAL_DEX_ZOROARK, @@ -7145,7 +7081,6 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FIELD), .abilities = { ABILITY_CUTE_CHARM, ABILITY_TECHNICIAN, ABILITY_SKILL_LINK }, .bodyColor = BODY_COLOR_GRAY, - .noFlip = TRUE, .speciesName = _("Cinccino"), .cryId = CRY_CINCCINO, .natDexNum = NATIONAL_DEX_CINCCINO, @@ -7701,6 +7636,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Ducklett, gShinyOverworldPalette_Ducklett ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sDucklettLevelUpLearnset, .teachableLearnset = sDucklettTeachableLearnset, .eggMoveLearnset = sDucklettEggMoveLearnset, @@ -7948,6 +7884,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .abilities = { ABILITY_ICE_BODY, ABILITY_NONE, ABILITY_WEAK_ARMOR }, #endif .bodyColor = BODY_COLOR_WHITE, + .noFlip = TRUE, .speciesName = _("Vanilluxe"), .cryId = CRY_VANILLUXE, .natDexNum = NATIONAL_DEX_VANILLUXE, @@ -9712,7 +9649,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Tynamo, gShinyOverworldPalette_Tynamo ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sTynamoLevelUpLearnset, .teachableLearnset = sTynamoTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 39, SPECIES_EELEKTRIK}), @@ -9873,7 +9810,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 90, .types = MON_TYPES(TYPE_ELECTRIC), .catchRate = 30, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 258 : 232, + .expYield = 258 , .evYield_Attack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -9883,7 +9820,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .abilities = { ABILITY_LEVITATE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Eelektross"), - .cryId = CRY_EELEKTROSS, // CRY_EELEKTROSS_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_EELEKTROSS_MEGA, + #else + .cryId = CRY_EELEKTROSS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_EELEKTROSS, .categoryName = _("EleFish"), .height = 30, @@ -9893,42 +9834,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "electricity it did before Mega\n" "Evolving. It discharges this energy\n" "from its false Eelektrik made of mucus."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Eelektross) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sEelektrossLevelUpLearnset, .teachableLearnset = sEelektrossTeachableLearnset, @@ -10315,7 +10236,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 110, .types = MON_TYPES(TYPE_GHOST, TYPE_FIRE), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 260 : 234, + .expYield = 260, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, @@ -10324,8 +10245,13 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_FLASH_FIRE, ABILITY_FLAME_BODY, ABILITY_INFILTRATOR }, .bodyColor = BODY_COLOR_BLACK, + .noFlip = TRUE, .speciesName = _("Chandelure"), - .cryId = CRY_CHANDELURE, // CRY_CHANDELURE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_CHANDELURE_MEGA, + #else + .cryId = CRY_CHANDELURE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CHANDELURE, .categoryName = _("Luring"), .height = 25, @@ -10335,42 +10261,22 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = "our world with the afterlife.\n" "This Pokémon draws in hatred and\n" "converts it into power."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Chandelure) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sChandelureLevelUpLearnset, .teachableLearnset = sChandelureTeachableLearnset, @@ -11034,6 +10940,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_WATER_1, EGG_GROUP_AMORPHOUS), .abilities = { ABILITY_MIMICRY, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GREEN, + .noFlip = TRUE, .speciesName = _("Stunfisk"), .cryId = CRY_STUNFISK, .natDexNum = NATIONAL_DEX_STUNFISK, @@ -11463,7 +11370,11 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .bodyColor = BODY_COLOR_GREEN, .noFlip = TRUE, .speciesName = _("Golurk"), - .cryId = CRY_GOLURK, //CRY_GOLURK_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_GOLURK_MEGA, + #else + .cryId = CRY_GOLURK, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GOLURK, .categoryName = _("Automaton"), .height = 40, @@ -11486,28 +11397,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Golurk) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGolurkLevelUpLearnset, .teachableLearnset = sGolurkTeachableLearnset, @@ -11864,6 +11755,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Rufflet, gShinyOverworldPalette_Rufflet ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sRuffletLevelUpLearnset, .teachableLearnset = sRuffletTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 54, SPECIES_BRAVIARY, CONDITIONS({IF_NOT_REGION, REGION_HISUI})}, @@ -12071,6 +11963,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Vullaby, gShinyOverworldPalette_Vullaby ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sVullabyLevelUpLearnset, .teachableLearnset = sVullabyTeachableLearnset, .eggMoveLearnset = sVullabyEggMoveLearnset, @@ -12723,7 +12616,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Cobalion, gShinyOverworldPalette_Cobalion ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCobalionLevelUpLearnset, .teachableLearnset = sCobalionTeachableLearnset, @@ -12798,7 +12691,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Terrakion, gShinyOverworldPalette_Terrakion ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerrakionLevelUpLearnset, .teachableLearnset = sTerrakionTeachableLearnset, @@ -12868,7 +12761,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Virizion, gShinyOverworldPalette_Virizion ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sVirizionLevelUpLearnset, .teachableLearnset = sVirizionTeachableLearnset, @@ -12959,7 +12852,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_TornadusIncarnate, gShinyOverworldPalette_TornadusIncarnate ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTornadusLevelUpLearnset, .teachableLearnset = sTornadusTeachableLearnset, @@ -13032,7 +12925,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_TornadusTherian, gShinyOverworldPalette_TornadusTherian ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTornadusLevelUpLearnset, .teachableLearnset = sTornadusTeachableLearnset, @@ -13125,7 +13018,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_ThundurusIncarnate, gShinyOverworldPalette_ThundurusIncarnate ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sThundurusLevelUpLearnset, .teachableLearnset = sThundurusTeachableLearnset, @@ -13210,7 +13103,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_ThundurusTherian, gShinyOverworldPalette_ThundurusTherian ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sThundurusLevelUpLearnset, .teachableLearnset = sThundurusTeachableLearnset, @@ -13282,7 +13175,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Reshiram, gShinyOverworldPalette_Reshiram ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sReshiramLevelUpLearnset, @@ -13353,7 +13246,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Zekrom, gShinyOverworldPalette_Zekrom ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZekromLevelUpLearnset, @@ -13445,7 +13338,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_LandorusIncarnate, gShinyOverworldPalette_LandorusIncarnate ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLandorusLevelUpLearnset, .teachableLearnset = sLandorusTeachableLearnset, @@ -13518,7 +13411,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_LandorusTherian, gShinyOverworldPalette_LandorusTherian ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLandorusLevelUpLearnset, .teachableLearnset = sLandorusTeachableLearnset, @@ -13595,7 +13488,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_Kyurem, gShinyOverworldPalette_Kyurem ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKyuremLevelUpLearnset, @@ -13614,13 +13507,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 100, .types = MON_TYPES(TYPE_DRAGON, TYPE_ICE), .catchRate = 3, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 350, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 - .expYield = 315, - #else - .expYield = 297, - #endif + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 350 : 315, .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -13673,7 +13560,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_KyuremWhite, gShinyOverworldPalette_KyuremWhite ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -13692,13 +13579,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .baseSpDefense = 90, .types = MON_TYPES(TYPE_DRAGON, TYPE_ICE), .catchRate = 3, - #if P_UPDATED_EXP_YIELDS >= GEN_8 - .expYield = 350, - #elif P_UPDATED_EXP_YIELDS >= GEN_7 - .expYield = 315, - #else - .expYield = 297, - #endif + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 350 : 315, .evYield_Attack = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -13751,7 +13632,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = gOverworldPalette_KyuremBlack, gShinyOverworldPalette_KyuremBlack ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 0571574e3..52c57c9ce 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -225,7 +225,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 115, .types = MON_TYPES(TYPE_GRASS, TYPE_FIGHTING), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 265 : 239, + .expYield = 265, .evYield_Defense = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -235,7 +235,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_OVERGROW, ABILITY_NONE, ABILITY_BULLETPROOF }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Chesnaught"), + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_CHESNAUGHT_MEGA, + #else .cryId = CRY_CHESNAUGHT, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CHESNAUGHT, .categoryName = _("Spiny Armor"), .height = 16, @@ -244,42 +248,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "It has fortified armor and a\n" "will to defend at all costs.\n" "Both are absurdly strong."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Chesnaught) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sChesnaughtLevelUpLearnset, .teachableLearnset = sChesnaughtTeachableLearnset, @@ -515,7 +499,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 125, .types = MON_TYPES(TYPE_FIRE, TYPE_PSYCHIC), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 267 : 240, + .expYield = 267, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -525,7 +509,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_BLAZE, ABILITY_NONE, ABILITY_MAGICIAN }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Delphox"), - .cryId = CRY_DELPHOX, // CRY_DELPHOX_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_DELPHOX_MEGA, + #else + .cryId = CRY_DELPHOX, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DELPHOX, .categoryName = _("Fox"), .height = 15, @@ -535,42 +523,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "dazzle its opponents before\n" "incinerating them with a\n" "huge fireball."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Delphox) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sDelphoxLevelUpLearnset, .teachableLearnset = sDelphoxTeachableLearnset, @@ -855,7 +823,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 71, .types = MON_TYPES(TYPE_WATER, TYPE_DARK), .catchRate = 45, - .expYield = 288, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 320 : 288, .evYield_Speed = 3, .genderRatio = MON_MALE, .eggCycles = 20, @@ -926,7 +894,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 81, .types = MON_TYPES(TYPE_WATER, TYPE_DARK), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 265 : 239, + .expYield = 265, .evYield_Speed = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 20, @@ -937,7 +905,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .bodyColor = BODY_COLOR_BLUE, .noFlip = TRUE, .speciesName = _("Greninja"), - .cryId = CRY_GRENINJA, // CRY_GRENINJA_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_GRENINJA_MEGA, + #else + .cryId = CRY_GRENINJA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GRENINJA, .categoryName = _("Ninja"), .height = 15, @@ -947,42 +919,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "shuriken at high speed to make it\n" "float, then clings to it upside\n" "down to catch opponents unawares."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Greninja) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sGreninjaLevelUpLearnset, .teachableLearnset = sGreninjaTeachableLearnset, @@ -1195,6 +1147,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Fletchling, gShinyOverworldPalette_Fletchling ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sFletchlingLevelUpLearnset, .teachableLearnset = sFletchlingTeachableLearnset, .eggMoveLearnset = sFletchlingEggMoveLearnset, @@ -1399,7 +1352,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Scatterbug, \ gShinyOverworldPalette_Scatterbug \ ) \ - .tmIlliterate = TRUE, \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sScatterbugLevelUpLearnset, \ .teachableLearnset = sScatterbugTeachableLearnset, \ .eggMoveLearnset = sScatterbugEggMoveLearnset, \ @@ -1483,7 +1436,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Spewpa, \ gShinyOverworldPalette_Spewpa \ ) \ - .tmIlliterate = TRUE, \ + .teachingType = TM_ILLITERATE, \ .levelUpLearnset = sSpewpaLevelUpLearnset, \ .teachableLearnset = sSpewpaTeachableLearnset, \ .formSpeciesIdTable = sSpewpaFormSpeciesIdTable, \ @@ -1580,6 +1533,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from frigid lands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_POLAR] = { VIVILLON_MISC_INFO(Polar, BODY_COLOR_BLUE, 0), @@ -1589,6 +1543,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from snowy lands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_TUNDRA] = { VIVILLON_MISC_INFO(Tundra, BODY_COLOR_BLUE, 0), @@ -1598,6 +1553,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from lands of severe cold.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_CONTINENTAL] = { VIVILLON_MISC_INFO(Continental, BODY_COLOR_YELLOW, 2), @@ -1607,6 +1563,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from lands of vast space.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_GARDEN] = { VIVILLON_MISC_INFO(Garden, BODY_COLOR_GREEN, 1), @@ -1616,6 +1573,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from verdant lands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_ELEGANT] = { VIVILLON_MISC_INFO(Elegant, BODY_COLOR_PURPLE, 0), @@ -1625,6 +1583,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands with distinct seasons.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_MEADOW] = { VIVILLON_MISC_INFO(Meadow, BODY_COLOR_PINK, 0), @@ -1634,6 +1593,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands where flowers bloom.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_MODERN] = { VIVILLON_MISC_INFO(Modern, BODY_COLOR_RED, 2), @@ -1643,6 +1603,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from sun-drenched lands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_MARINE] = { VIVILLON_MISC_INFO(Marine, BODY_COLOR_BLUE, 0), @@ -1652,6 +1613,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands with ocean breezes.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_ARCHIPELAGO] = { VIVILLON_MISC_INFO(Archipelago, BODY_COLOR_BROWN, 0), @@ -1661,6 +1623,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from places with many islands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_HIGH_PLAINS] = { VIVILLON_MISC_INFO(HighPlains, BODY_COLOR_BROWN, 0), @@ -1670,6 +1633,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from lands with little rain.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_SANDSTORM] = { VIVILLON_MISC_INFO(Sandstorm, BODY_COLOR_BROWN, 1), @@ -1679,6 +1643,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from parched lands.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_RIVER] = { VIVILLON_MISC_INFO(River, BODY_COLOR_BROWN, 2), @@ -1688,6 +1653,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands where large rivers flow.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_MONSOON] = { VIVILLON_MISC_INFO(Monsoon, BODY_COLOR_GRAY, 0), @@ -1697,6 +1663,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands with intense rainfall.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_SAVANNA] = { VIVILLON_MISC_INFO(Savanna, BODY_COLOR_GREEN, 0), @@ -1706,6 +1673,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands with a tropical climate.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_SUN] = { VIVILLON_MISC_INFO(Sun, BODY_COLOR_RED, 0), @@ -1715,6 +1683,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from lands bathed in light.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_OCEAN] = { VIVILLON_MISC_INFO(Ocean, BODY_COLOR_RED, 0), @@ -1724,6 +1693,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands of perpetual summer.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_JUNGLE] = { VIVILLON_MISC_INFO(Jungle, BODY_COLOR_GREEN, 0), @@ -1733,6 +1703,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "form is from lands of tropical rainforests.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_FANCY] = { VIVILLON_MISC_INFO(Fancy, BODY_COLOR_PINK, 1), @@ -1742,6 +1713,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This form is from a mysterious land.\n" "It scatters toxic color scales in battle."), }, + [SPECIES_VIVILLON_POKEBALL] = { VIVILLON_MISC_INFO(PokeBall, BODY_COLOR_RED, 2), @@ -1927,7 +1899,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_RIVALRY, ABILITY_UNNERVE, ABILITY_MOXIE }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Pyroar"), - .cryId = CRY_PYROAR, // CRY_PYROAR_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_PYROAR_MEGA, + #else + .cryId = CRY_PYROAR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_PYROAR, .categoryName = _("Royal"), .height = 15, @@ -1937,42 +1913,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "than 18,000 degrees Fahrenheit.\n" "It swings around its grand, blazing\n" "mane as it protects its allies."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Pyroar) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sPyroarLevelUpLearnset, .teachableLearnset = sPyroarTeachableLearnset, @@ -2052,6 +2008,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "begins flying around in search of a\n" "flower it likes."), }, + [SPECIES_FLABEBE_YELLOW] = { FLABEBE_MISC_INFO(Yellow, YELLOW, 1), @@ -2061,6 +2018,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "within flowers. This Pokémon is\n" "particularly fond of yellow flowers."), }, + [SPECIES_FLABEBE_ORANGE] = { FLABEBE_MISC_INFO(Orange, ORANGE, 0), @@ -2070,6 +2028,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "return. This Pokémon likes orange\n" "flowers best of all."), }, + [SPECIES_FLABEBE_BLUE] = { FLABEBE_MISC_INFO(Blue, BLUE, 0), @@ -2079,6 +2038,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "power emanating from its flower\n" "and bobs along lightly through the air."), }, + [SPECIES_FLABEBE_WHITE] = { FLABEBE_MISC_INFO(White, WHITE, 1), @@ -2160,6 +2120,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "into flowers and draw forth their\n" "latent potential."), }, + [SPECIES_FLOETTE_YELLOW] = { FLOETTE_NORMAL_INFO(Yellow, YELLOW, 1), @@ -2169,6 +2130,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "This power then becomes the moves\n" "Floette uses to protect itself."), }, + [SPECIES_FLOETTE_ORANGE] = { FLOETTE_NORMAL_INFO(Orange, ORANGE, 0), @@ -2178,6 +2140,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "flowers, compared to flowers of other\n" "colors."), }, + [SPECIES_FLOETTE_BLUE] = { FLOETTE_NORMAL_INFO(Blue, BLUE, 0), @@ -2187,6 +2150,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "will bring them back to its territory\n" "and care for them."), }, + [SPECIES_FLOETTE_WHITE] = { FLOETTE_NORMAL_INFO(White, WHITE, 1), @@ -2196,6 +2160,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "without mercy. This Floette takes\n" "particularly good care of white flowers."), }, + [SPECIES_FLOETTE_ETERNAL] = { FLOETTE_MISC_INFO(Eternal, ETERNAL, 0), @@ -2222,6 +2187,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .backPicYOffset = 2, .levelUpLearnset = sFloetteEternalLevelUpLearnset, .teachableLearnset = sFloetteEternalTeachableLearnset, + .formChangeTable = sFloetteEternalFormChangeTable, }, #define FLORGES_MISC_INFO(Form, iconPal) \ @@ -2290,6 +2256,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "draws forth the power of the red\n" "flowers around its neck."), }, + [SPECIES_FLORGES_YELLOW] = { FLORGES_MISC_INFO(Yellow, 1), @@ -2299,6 +2266,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "ruthlessly punishes anyone who\n" "tramples on flowering plants."), }, + [SPECIES_FLORGES_ORANGE] = { FLORGES_MISC_INFO(Orange, 0), @@ -2308,6 +2276,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "care for their castles' exquisite\n" "gardens."), }, + [SPECIES_FLORGES_BLUE] = { FLORGES_MISC_INFO(Blue, 0), @@ -2316,6 +2285,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "expensive in the past, so paintings\n" "of blue Florges are highly valuable."), }, + [SPECIES_FLORGES_WHITE] = { FLORGES_MISC_INFO(White, 0), @@ -2347,7 +2317,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_FLOWER_VEIL, ABILITY_NONE, ABILITY_SYMBIOSIS }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Floette"), - .cryId = CRY_FLOETTE_ETERNAL, // CRY_FLOETTE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_FLOETTE_MEGA, + #else + .cryId = CRY_FLOETTE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_FLOETTE, .categoryName = _("Single Bloom"), // height @@ -2357,42 +2331,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "all the energy from Mega\n" "Evolution. The flower now attacks\n" "enemies on its own."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Floette) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sFloetteEternalLevelUpLearnset, .teachableLearnset = sFloetteEternalTeachableLearnset, @@ -2987,7 +2941,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_KEEN_EYE, ABILITY_INFILTRATOR, ABILITY_PRANKSTER }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Meowstic"), - .cryId = CRY_MEOWSTIC, //CRY_MEOWSTIC_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MEOWSTIC_MEGA, + #else + .cryId = CRY_MEOWSTIC, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEOWSTIC, .categoryName = _("Constraint"), .height = 8, @@ -3011,35 +2969,15 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Meowstic) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sMeowsticMLevelUpLearnset, .teachableLearnset = sMeowsticMTeachableLearnset, .formSpeciesIdTable = sMeowsticFormSpeciesIdTable, .formChangeTable = sMeowsticMFormChangeTable, }, - + [SPECIES_MEOWSTIC_F_MEGA] = { .baseHP = 74, @@ -3060,7 +2998,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_KEEN_EYE, ABILITY_INFILTRATOR, ABILITY_COMPETITIVE }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Meowstic"), - .cryId = CRY_MEOWSTIC, //CRY_MEOWSTIC_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MEOWSTIC_MEGA, + #else + .cryId = CRY_MEOWSTIC, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MEOWSTIC, .categoryName = _("Constraint"), .height = 8, @@ -3084,28 +3026,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Meowstic) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sMeowsticFLevelUpLearnset, .teachableLearnset = sMeowsticFTeachableLearnset, @@ -3852,7 +3774,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_CONTRARY, ABILITY_SUCTION_CUPS, ABILITY_INFILTRATOR }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Malamar"), - .cryId = CRY_MALAMAR, // CRY_MALAMAR_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MALAMAR_MEGA, + #else + .cryId = CRY_MALAMAR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MALAMAR, .categoryName = _("Overturning"), .height = 29, @@ -3862,42 +3788,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "overwrite the personality and\n" "memories of others-and to\n" "control them."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Malamar) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sMalamarLevelUpLearnset, .teachableLearnset = sMalamarTeachableLearnset, @@ -4071,7 +3977,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .bodyColor = BODY_COLOR_BROWN, .noFlip = TRUE, .speciesName = _("Barbaracle"), - .cryId = CRY_BARBARACLE, // CRY_BARBARACLE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_BARBARACLE_MEGA, + #else + .cryId = CRY_BARBARACLE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BARBARACLE, .categoryName = _("Collective"), .height = 22, @@ -4080,42 +3990,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "It uses its many arms to toy\n" "with its opponents. This\n" "keeps the head extremely busy."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Barbaracle) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sBarbaracleLevelUpLearnset, .teachableLearnset = sBarbaracleTeachableLearnset, @@ -4291,7 +4181,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_POISON_POINT, ABILITY_POISON_TOUCH, ABILITY_ADAPTABILITY }, .bodyColor = BODY_COLOR_BROWN, .speciesName = _("Dragalge"), - .cryId = CRY_DRAGALGE, // CRY_DRAGALGE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_DRAGALGE_MEGA, + #else + .cryId = CRY_DRAGALGE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DRAGALGE, .categoryName = _("Mock Kelp"), .height = 21, @@ -4301,42 +4195,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "regenerative power of cells to run\n" "wild. The liquid is deadly poison\n" "to everything other than itself."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Dragalge) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sDragalgeLevelUpLearnset, .teachableLearnset = sDragalgeTeachableLearnset, @@ -4983,6 +4857,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Hawlucha, gShinyOverworldPalette_Hawlucha ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sHawluchaLevelUpLearnset, .teachableLearnset = sHawluchaTeachableLearnset, .eggMoveLearnset = sHawluchaEggMoveLearnset, @@ -5012,7 +4887,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_LIMBER, ABILITY_UNBURDEN, ABILITY_MOLD_BREAKER }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Hawlucha"), - .cryId = CRY_HAWLUCHA, // CRY_HAWLUCHA_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_HAWLUCHA_MEGA, + #else + .cryId = CRY_HAWLUCHA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_HAWLUCHA, .categoryName = _("Wrestling"), .height = 10, @@ -5021,42 +4900,22 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "Mega Evolution has pumped up all\n" "its muscles. Hawlucha flexes to\n" "show off its strength."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Hawlucha) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sHawluchaLevelUpLearnset, .teachableLearnset = sHawluchaTeachableLearnset, @@ -5447,6 +5306,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .eggGroups = MON_EGG_GROUPS(EGG_GROUP_DRAGON), .abilities = { ABILITY_SAP_SIPPER, ABILITY_SHELL_ARMOR, ABILITY_GOOEY }, .bodyColor = BODY_COLOR_PURPLE, + .noFlip = TRUE, .speciesName = _("Sliggoo"), .cryId = CRY_SLIGGOO, .natDexNum = NATIONAL_DEX_SLIGGOO, @@ -5506,7 +5366,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 150, .types = MON_TYPES(TYPE_DRAGON, TYPE_STEEL), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, + .expYield = 300, .evYield_SpDefense = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 40, @@ -6527,6 +6387,12 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = #endif //P_FAMILY_BERGMITE #if P_FAMILY_NOIBAT +#if P_UPDATED_EGG_GROUPS >= GEN_8 + #define NOIBAT_EGG_GROUPS MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_DRAGON) +#else + #define NOIBAT_EGG_GROUPS MON_EGG_GROUPS(EGG_GROUP_FLYING) +#endif + [SPECIES_NOIBAT] = { .baseHP = 40, @@ -6543,11 +6409,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - #if P_UPDATED_EGG_GROUPS >= GEN_8 - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_DRAGON), - #else - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING), - #endif + .eggGroups = NOIBAT_EGG_GROUPS, .abilities = { ABILITY_FRISK, ABILITY_INFILTRATOR, ABILITY_TELEPATHY }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Noibat"), @@ -6622,11 +6484,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, .growthRate = GROWTH_MEDIUM_FAST, - #if P_UPDATED_EGG_GROUPS >= GEN_8 - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING, EGG_GROUP_DRAGON), - #else - .eggGroups = MON_EGG_GROUPS(EGG_GROUP_FLYING), - #endif + .eggGroups = NOIBAT_EGG_GROUPS, .abilities = { ABILITY_FRISK, ABILITY_INFILTRATOR, ABILITY_TELEPATHY }, .bodyColor = BODY_COLOR_PURPLE, .speciesName = _("Noivern"), @@ -6733,7 +6591,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_XerneasNeutral, gShinyOverworldPalette_XerneasNeutral ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sXerneasLevelUpLearnset, @@ -6797,7 +6655,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_XerneasNeutral, gShinyOverworldPalette_XerneasNeutral ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sXerneasLevelUpLearnset, @@ -6873,7 +6731,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Yveltal, gShinyOverworldPalette_Yveltal ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sYveltalLevelUpLearnset, @@ -6938,7 +6796,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Zygarde50, gShinyOverworldPalette_Zygarde50 ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -6946,6 +6804,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .formSpeciesIdTable = sZygardeFormSpeciesIdTable, .formChangeTable = sZygarde50AuraBreakFormChangeTable, }, + [SPECIES_ZYGARDE_50_POWER_CONSTRUCT] = { .baseHP = 108, @@ -7002,7 +6861,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Zygarde50, gShinyOverworldPalette_Zygarde50 ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -7010,6 +6869,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .formSpeciesIdTable = sZygardeFormSpeciesIdTable, .formChangeTable = sZygarde50PowerConstructFormChangeTable, }, + [SPECIES_ZYGARDE_10_AURA_BREAK] = { .baseHP = 54, @@ -7066,7 +6926,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Zygarde10, gShinyOverworldPalette_Zygarde10 ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -7131,7 +6991,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_Zygarde10, gShinyOverworldPalette_Zygarde10 ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -7204,7 +7064,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = gOverworldPalette_ZygardeComplete, gShinyOverworldPalette_ZygardeComplete ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZygardeLevelUpLearnset, @@ -7224,7 +7084,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 85, .types = MON_TYPES(TYPE_DRAGON, TYPE_GROUND), .catchRate = 3, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 354 : 319, + .expYield = 354, .evYield_HP = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -7235,7 +7095,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .bodyColor = BODY_COLOR_BLACK, .noFlip = TRUE, .speciesName = _("Zygarde"), - .cryId = CRY_ZYGARDE_COMPLETE, // CRY_ZYGARDE_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_ZYGARDE_MEGA, + #else + .cryId = CRY_ZYGARDE_COMPLETE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ZYGARDE, .categoryName = _("Order"), .height = 77, @@ -7245,43 +7109,24 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = "during an unprecedented crisis,\n" "Zygarde Mega Evolves and calms the\n" "situation with its unmatched power."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Zygarde) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, + .isRestrictedLegendary = TRUE, .levelUpLearnset = sZygardeLevelUpLearnset, .teachableLearnset = sZygardeTeachableLearnset, .formSpeciesIdTable = sZygardeFormSpeciesIdTable, @@ -7375,7 +7220,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .baseSpDefense = 110, .types = MON_TYPES(TYPE_ROCK, TYPE_FAIRY), .catchRate = 3, - .expYield = 315, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 350 : 315, .evYield_Defense = 1, .evYield_SpDefense = 2, .genderRatio = MON_GENDERLESS, @@ -7386,7 +7231,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .abilities = { ABILITY_MAGIC_BOUNCE, ABILITY_MAGIC_BOUNCE, ABILITY_MAGIC_BOUNCE }, .bodyColor = BODY_COLOR_PINK, .speciesName = _("Diancie"), + #if P_MODIFIED_MEGA_CRIES .cryId = CRY_DIANCIE_MEGA, + #else + .cryId = CRY_DIANCIE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DIANCIE, .categoryName = _("Jewel"), .height = 11, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index baf8e5378..63c832a7e 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -66,6 +66,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Rowlet, gShinyOverworldPalette_Rowlet ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sRowletLevelUpLearnset, .teachableLearnset = sRowletTeachableLearnset, .eggMoveLearnset = sRowletEggMoveLearnset, @@ -219,7 +220,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpDefense = 95, .types = MON_TYPES(TYPE_GRASS, TYPE_FIGHTING), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 265 : 239, + .expYield = 265, .evYield_Attack = 3, .genderRatio = PERCENT_FEMALE(12.5), .eggCycles = 15, @@ -677,7 +678,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .catchRate = 255, .expYield = 53, .evYield_Attack = 1, - .itemRare = ITEM_ORAN_BERRY, + .itemCommon = ITEM_ORAN_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = STANDARD_FRIENDSHIP, @@ -729,6 +730,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Pikipek, gShinyOverworldPalette_Pikipek ) + .isSkyBattleBanned = B_SKY_BATTLE_STRICT_ELIGIBILITY, .levelUpLearnset = sPikipekLevelUpLearnset, .teachableLearnset = sPikipekTeachableLearnset, .eggMoveLearnset = sPikipekEggMoveLearnset, @@ -817,7 +819,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .catchRate = 45, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 243 : 218, .evYield_Attack = 3, - .itemRare = ITEM_RAWST_BERRY, + .itemCommon = ITEM_SITRUS_BERRY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, .friendship = STANDARD_FRIENDSHIP, @@ -1273,7 +1275,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpDefense = 75, .types = MON_TYPES(TYPE_BUG, TYPE_ELECTRIC), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 250 : 225, + .expYield = 225, .evYield_SpAttack = 3, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 15, @@ -1491,7 +1493,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_HYPER_CUTTER, ABILITY_IRON_FIST, ABILITY_ANGER_POINT }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Crabominable"), - .cryId = CRY_CRABOMINABLE, //CRY_CRABOMINABLE_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_CRABOMINABLE_MEGA, + #else + .cryId = CRY_CRABOMINABLE, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_CRABOMINABLE, .categoryName = _("Woolly Crab"), .height = 26, @@ -1514,28 +1520,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Crabominable) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sCrabominableLevelUpLearnset, .teachableLearnset = sCrabominableTeachableLearnset, @@ -1828,7 +1814,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .catchRate = 190, .expYield = 61, .evYield_Speed = 1, - .itemRare = ITEM_HONEY, + .itemCommon = ITEM_HONEY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, @@ -1929,7 +1915,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .catchRate = 75, .expYield = 162, .evYield_Speed = 2, - .itemRare = ITEM_HONEY, + .itemCommon = ITEM_HONEY, .genderRatio = PERCENT_FEMALE(50), .eggCycles = 20, .friendship = STANDARD_FRIENDSHIP, @@ -3423,7 +3409,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .levelUpLearnset = sSalazzleLevelUpLearnset, .teachableLearnset = sSalazzleTeachableLearnset, - .formSpeciesIdTable = sSalanditFormSpeciesIdTable, + .formSpeciesIdTable = sSalazzleFormSpeciesIdTable, }, [SPECIES_SALAZZLE_TOTEM] = @@ -3486,7 +3472,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSalazzleLevelUpLearnset, .teachableLearnset = sSalazzleTeachableLearnset, - .formSpeciesIdTable = sSalanditFormSpeciesIdTable, + .formSpeciesIdTable = sSalazzleFormSpeciesIdTable, }, #endif //P_FAMILY_SALANDIT @@ -4194,7 +4180,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_EMERGENCY_EXIT, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Golisopod"), - .cryId = CRY_GOLISOPOD, //CRY_GOLISOPOD_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_GOLISOPOD_MEGA, + #else + .cryId = CRY_GOLISOPOD, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GOLISOPOD, .categoryName = _("Hard Scale"), .height = 23, @@ -4218,28 +4208,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Golisopod) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGolisopodLevelUpLearnset, .teachableLearnset = sGolisopodTeachableLearnset, @@ -4445,6 +4415,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Pyukumuku, gShinyOverworldPalette_Pyukumuku ) + .teachingType = TM_ILLITERATE, .levelUpLearnset = sPyukumukuLevelUpLearnset, .teachableLearnset = sPyukumukuTeachableLearnset, .eggMoveLearnset = sPyukumukuEggMoveLearnset, @@ -4511,7 +4482,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_TypeNull, gShinyOverworldPalette_TypeNull ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTypeNullLevelUpLearnset, .teachableLearnset = sTypeNullTeachableLearnset, @@ -4528,7 +4499,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpDefense = 95, \ .types = MON_TYPES(type), \ .catchRate = 3, \ - .expYield = 257, \ + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 285 : 257, \ .evYield_HP = 3, \ .genderRatio = MON_GENDERLESS, \ .eggCycles = 120, \ @@ -4575,7 +4546,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Silvally, \ gShinyOverworldPalette_Silvally \ ) \ - .isLegendary = TRUE, \ + .isSubLegendary = TRUE, \ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ .levelUpLearnset = sSilvallyLevelUpLearnset, \ .teachableLearnset = sSilvallyTeachableLearnset, \ @@ -4610,7 +4581,6 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .expYield = 154, \ .evYield_Defense = 1, \ .evYield_SpDefense = 1, \ - .itemRare = ITEM_STAR_PIECE, \ .genderRatio = MON_GENDERLESS, \ .eggCycles = 25, \ .friendship = STANDARD_FRIENDSHIP, \ @@ -4633,7 +4603,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .teachableLearnset = sMiniorTeachableLearnset, \ .formSpeciesIdTable = sMiniorFormSpeciesIdTable -#define MINIOR_METEOR_SPECIES_INFO(Form) \ +#define MINIOR_METEOR_SPECIES_INFO(Form, heldItem) \ { \ .baseHP = 60, \ .baseAttack = 60, \ @@ -4641,6 +4611,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpeed = 60, \ .baseSpAttack = 60, \ .baseSpDefense = 100, \ + .itemCommon = heldItem, \ .weight = 400, \ .description = gMiniorMeteorPokedexText, \ .frontPic = gMonFrontPic_MiniorMeteor, \ @@ -4672,7 +4643,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = MINIOR_MISC_INFO(BODY_COLOR_BROWN), \ } -#define MINIOR_CORE_SPECIES_INFO(Form, color, iconPal) \ +#define MINIOR_CORE_SPECIES_INFO(Form, color, iconPal, heldItem)\ { \ .baseHP = 60, \ .baseAttack = 100, \ @@ -4680,6 +4651,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpeed = 120, \ .baseSpAttack = 100, \ .baseSpDefense = 60, \ + .itemCommon = heldItem, \ .weight = 3, \ .description = gMiniorCorePokedexText, \ .frontPic = gMonFrontPic_MiniorCore, \ @@ -4702,20 +4674,20 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = MINIOR_MISC_INFO(color), \ } - [SPECIES_MINIOR_METEOR_RED] = MINIOR_METEOR_SPECIES_INFO(Red), - [SPECIES_MINIOR_METEOR_ORANGE] = MINIOR_METEOR_SPECIES_INFO(Orange), - [SPECIES_MINIOR_METEOR_YELLOW] = MINIOR_METEOR_SPECIES_INFO(Yellow), - [SPECIES_MINIOR_METEOR_GREEN] = MINIOR_METEOR_SPECIES_INFO(Green), - [SPECIES_MINIOR_METEOR_BLUE] = MINIOR_METEOR_SPECIES_INFO(Blue), - [SPECIES_MINIOR_METEOR_INDIGO] = MINIOR_METEOR_SPECIES_INFO(Indigo), - [SPECIES_MINIOR_METEOR_VIOLET] = MINIOR_METEOR_SPECIES_INFO(Violet), - [SPECIES_MINIOR_CORE_RED] = MINIOR_CORE_SPECIES_INFO(Red, BODY_COLOR_RED, 0), - [SPECIES_MINIOR_CORE_ORANGE] = MINIOR_CORE_SPECIES_INFO(Orange, BODY_COLOR_RED, 0), - [SPECIES_MINIOR_CORE_YELLOW] = MINIOR_CORE_SPECIES_INFO(Yellow, BODY_COLOR_YELLOW, 0), - [SPECIES_MINIOR_CORE_GREEN] = MINIOR_CORE_SPECIES_INFO(Green, BODY_COLOR_GREEN, 1), - [SPECIES_MINIOR_CORE_BLUE] = MINIOR_CORE_SPECIES_INFO(Blue, BODY_COLOR_BLUE, 0), - [SPECIES_MINIOR_CORE_INDIGO] = MINIOR_CORE_SPECIES_INFO(Indigo, BODY_COLOR_BLUE, 0), - [SPECIES_MINIOR_CORE_VIOLET] = MINIOR_CORE_SPECIES_INFO(Violet, BODY_COLOR_PURPLE, 2), + [SPECIES_MINIOR_METEOR_RED] = MINIOR_METEOR_SPECIES_INFO(Red, ITEM_HARD_STONE), + [SPECIES_MINIOR_METEOR_ORANGE] = MINIOR_METEOR_SPECIES_INFO(Orange, ITEM_HARD_STONE), + [SPECIES_MINIOR_METEOR_YELLOW] = MINIOR_METEOR_SPECIES_INFO(Yellow, ITEM_FLOAT_STONE), + [SPECIES_MINIOR_METEOR_GREEN] = MINIOR_METEOR_SPECIES_INFO(Green, ITEM_FLOAT_STONE), + [SPECIES_MINIOR_METEOR_BLUE] = MINIOR_METEOR_SPECIES_INFO(Blue, ITEM_HARD_STONE), + [SPECIES_MINIOR_METEOR_INDIGO] = MINIOR_METEOR_SPECIES_INFO(Indigo, ITEM_HARD_STONE), + [SPECIES_MINIOR_METEOR_VIOLET] = MINIOR_METEOR_SPECIES_INFO(Violet, ITEM_FLOAT_STONE), + [SPECIES_MINIOR_CORE_RED] = MINIOR_CORE_SPECIES_INFO(Red, BODY_COLOR_RED, 0, ITEM_HARD_STONE), + [SPECIES_MINIOR_CORE_ORANGE] = MINIOR_CORE_SPECIES_INFO(Orange, BODY_COLOR_RED, 0, ITEM_HARD_STONE), + [SPECIES_MINIOR_CORE_YELLOW] = MINIOR_CORE_SPECIES_INFO(Yellow, BODY_COLOR_YELLOW, 0, ITEM_FLOAT_STONE), + [SPECIES_MINIOR_CORE_GREEN] = MINIOR_CORE_SPECIES_INFO(Green, BODY_COLOR_GREEN, 1, ITEM_FLOAT_STONE), + [SPECIES_MINIOR_CORE_BLUE] = MINIOR_CORE_SPECIES_INFO(Blue, BODY_COLOR_BLUE, 0, ITEM_HARD_STONE), + [SPECIES_MINIOR_CORE_INDIGO] = MINIOR_CORE_SPECIES_INFO(Indigo, BODY_COLOR_BLUE, 0, ITEM_HARD_STONE), + [SPECIES_MINIOR_CORE_VIOLET] = MINIOR_CORE_SPECIES_INFO(Violet, BODY_COLOR_PURPLE, 2, ITEM_FLOAT_STONE), #endif //P_FAMILY_MINIOR #if P_FAMILY_KOMALA @@ -5383,7 +5355,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_BERSERK, ABILITY_SAP_SIPPER, ABILITY_CLOUD_NINE }, .bodyColor = BODY_COLOR_WHITE, .speciesName = _("Drampa"), - .cryId = CRY_DRAMPA, // CRY_DRAMPA_MEGA, + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_DRAMPA_MEGA, + #else + .cryId = CRY_DRAMPA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_DRAMPA, .categoryName = _("Imposing"), .height = 3, @@ -5393,42 +5369,22 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = "invigorated, allowing it to regain\n" "its youth. It manipulates the\n" "atmosphere to summon storms."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Drampa) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sDrampaLevelUpLearnset, .teachableLearnset = sDrampaTeachableLearnset, @@ -5715,7 +5671,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpDefense = 105, .types = MON_TYPES(TYPE_DRAGON, TYPE_FIGHTING), .catchRate = 45, - .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, + .expYield = 270, .evYield_Defense = 3, .itemCommon = ITEM_RAZOR_CLAW, .genderRatio = PERCENT_FEMALE(50), @@ -5844,7 +5800,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_TapuKoko, gShinyOverworldPalette_TapuKoko ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuKokoLevelUpLearnset, .teachableLearnset = sTapuKokoTeachableLearnset, @@ -5916,7 +5872,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_TapuLele, gShinyOverworldPalette_TapuLele ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuLeleLevelUpLearnset, .teachableLearnset = sTapuLeleTeachableLearnset, @@ -5990,7 +5946,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_TapuBulu, gShinyOverworldPalette_TapuBulu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuBuluLevelUpLearnset, .teachableLearnset = sTapuBuluTeachableLearnset, @@ -6063,7 +6019,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_TapuFini, gShinyOverworldPalette_TapuFini ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTapuFiniLevelUpLearnset, .teachableLearnset = sTapuFiniTeachableLearnset, @@ -6080,7 +6036,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 29, .baseSpDefense = 31, .types = MON_TYPES(TYPE_PSYCHIC), - .catchRate = 45, + .catchRate = 3, .expYield = 40, .evYield_HP = 1, .genderRatio = MON_GENDERLESS, @@ -6131,8 +6087,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Cosmog, gShinyOverworldPalette_Cosmog ) - .isLegendary = TRUE, - .tmIlliterate = TRUE, + .isRestrictedLegendary = TRUE, + .teachingType = TM_ILLITERATE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmogLevelUpLearnset, @@ -6149,7 +6105,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 29, .baseSpDefense = 131, .types = MON_TYPES(TYPE_PSYCHIC), - .catchRate = 45, + .catchRate = 3, .expYield = 140, .evYield_Defense = 1, .evYield_SpDefense = 1, @@ -6201,8 +6157,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Cosmoem, gShinyOverworldPalette_Cosmoem ) - .isLegendary = TRUE, - .tmIlliterate = TRUE, + .isRestrictedLegendary = TRUE, + .teachingType = TM_ILLITERATE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmoemLevelUpLearnset, @@ -6220,7 +6176,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 113, .baseSpDefense = 89, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_STEEL), - .catchRate = 45, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 340 : 306, .evYield_Attack = 3, .genderRatio = MON_GENDERLESS, @@ -6270,7 +6226,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Solgaleo, gShinyOverworldPalette_Solgaleo ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSolgaleoLevelUpLearnset, @@ -6286,7 +6242,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 137, .baseSpDefense = 107, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_GHOST), - .catchRate = 45, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 340 : 306, .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, @@ -6337,7 +6293,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Lunala, gShinyOverworldPalette_Lunala ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sLunalaLevelUpLearnset, @@ -6829,7 +6785,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 127, .baseSpDefense = 89, .types = MON_TYPES(TYPE_PSYCHIC), - .catchRate = 255, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 300 : 270, .evYield_Attack = 1, .evYield_SpAttack = 2, @@ -6882,7 +6838,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_Necrozma, gShinyOverworldPalette_Necrozma ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sNecrozmaLevelUpLearnset, @@ -6900,7 +6856,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 113, .baseSpDefense = 109, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_STEEL), - .catchRate = 255, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 340 : 306, .evYield_Attack = 3, .genderRatio = MON_GENDERLESS, @@ -6951,7 +6907,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_NecrozmaDuskMane, gShinyOverworldPalette_NecrozmaDuskMane ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -6970,7 +6926,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 157, .baseSpDefense = 127, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_GHOST), - .catchRate = 255, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 340 : 306, .evYield_SpAttack = 3, .genderRatio = MON_GENDERLESS, @@ -7022,7 +6978,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gOverworldPalette_NecrozmaDawnWings, gShinyOverworldPalette_NecrozmaDawnWings ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -7042,7 +6998,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .baseSpAttack = 167, .baseSpDefense = 97, .types = MON_TYPES(TYPE_PSYCHIC, TYPE_DRAGON), - .catchRate = 255, + .catchRate = 3, .expYield = (P_UPDATED_EXP_YIELDS >= GEN_8) ? 377 : 339, .evYield_Attack = 1, .evYield_Speed = 1, @@ -7098,7 +7054,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = gShinyOverworldPalette_NecrozmaUltra ) #endif //OW_BATTLE_ONLY_FORMS - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isUltraBurst = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, @@ -7106,6 +7062,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sNecrozmaLevelUpLearnset, .teachableLearnset = sNecrozmaTeachableLearnset, .formSpeciesIdTable = sNecrozmaFormSpeciesIdTable, + .formChangeTable = sNecrozmaUltraFormChangeTable, }, #endif //P_ULTRA_BURST_FORMS #endif //P_FUSION_FORMS @@ -7179,6 +7136,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .formSpeciesIdTable = sMagearnaFormSpeciesIdTable, .formChangeTable = sMagearnaFormChangeTable, }, + [SPECIES_MAGEARNA_ORIGINAL] = { .baseHP = 80, @@ -7268,7 +7226,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_SOUL_HEART, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Magearna"), - .cryId = CRY_MAGEARNA, //CRY_MAGEARNA_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MAGEARNA_MEGA, + #else + .cryId = CRY_MAGEARNA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MAGEARNA, .categoryName = _("Artificial"), .height = 13, @@ -7292,28 +7254,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Magearna) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .isMythical = TRUE, .isFrontierBanned = TRUE, @@ -7323,6 +7265,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .formSpeciesIdTable = sMagearnaFormSpeciesIdTable, .formChangeTable = sMagearnaFormChangeTable, }, + [SPECIES_MAGEARNA_ORIGINAL_MEGA] = { .baseHP = 80, @@ -7343,7 +7286,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_SOUL_HEART, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_GRAY, .speciesName = _("Magearna"), - .cryId = CRY_MAGEARNA, //CRY_MAGEARNA_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_MAGEARNA_MEGA, + #else + .cryId = CRY_MAGEARNA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_MAGEARNA, .categoryName = _("Artificial"), .height = 13, @@ -7367,28 +7314,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Magearna) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .isMythical = TRUE, .isFrontierBanned = TRUE, @@ -7831,7 +7758,11 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .abilities = { ABILITY_VOLT_ABSORB, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Zeraora"), - .cryId = CRY_ZERAORA, //CRY_ZERAORA_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_ZERAORA_MEGA, + #else + .cryId = CRY_ZERAORA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_ZERAORA, .categoryName = _("Thunderclap"), .height = 15, @@ -7855,28 +7786,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Zeraora) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .isMythical = TRUE, .isFrontierBanned = TRUE, diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 04dc82f49..dfcd8a93f 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -1230,7 +1230,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Blipbug, gShinyOverworldPalette_Blipbug ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sBlipbugLevelUpLearnset, .teachableLearnset = sBlipbugTeachableLearnset, .eggMoveLearnset = sBlipbugEggMoveLearnset, @@ -2461,7 +2461,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Applin, gShinyOverworldPalette_Applin ) - .tmIlliterate = TRUE, + .teachingType = TM_ILLITERATE, .levelUpLearnset = sApplinLevelUpLearnset, .teachableLearnset = sApplinTeachableLearnset, .eggMoveLearnset = sApplinEggMoveLearnset, @@ -3125,7 +3125,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_GULP_MISSILE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Cramorant"), - .cryId = CRY_CRAMORANT, + .cryId = CRY_CRAMORANT_GULPING, .natDexNum = NATIONAL_DEX_CRAMORANT, .categoryName = _("Gulp"), .height = 8, @@ -3182,7 +3182,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_GULP_MISSILE, ABILITY_NONE, ABILITY_NONE }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Cramorant"), - .cryId = CRY_CRAMORANT, + .cryId = CRY_CRAMORANT_GULPING, .natDexNum = NATIONAL_DEX_CRAMORANT, .categoryName = _("Gulp"), .height = 8, @@ -5267,7 +5267,11 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .abilities = { ABILITY_BATTLE_ARMOR, ABILITY_NONE, ABILITY_DEFIANT }, .bodyColor = BODY_COLOR_YELLOW, .speciesName = _("Falinks"), + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_FALINKS_MEGA, + #else .cryId = CRY_FALINKS, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_FALINKS, .categoryName = _("Formation"), .height = 16, @@ -5277,42 +5281,22 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = "ultimate battle formation, which\n" "can be achieved only if the troopers\n" "and brass have the strongest of bonds."), - .frontPic = gMonFrontPic_CircledQuestionMark, - .frontPicSize = MON_COORDS_SIZE(40, 40), - .frontPicYOffset = 12, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, - .frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, - .backPic = gMonBackPic_CircledQuestionMark, - .backPicSize = MON_COORDS_SIZE(40, 40), - .backPicYOffset = 12, - .backAnimId = BACK_ANIM_NONE, - .palette = gMonPalette_CircledQuestionMark, - .shinyPalette = gMonShinyPalette_CircledQuestionMark, - .iconSprite = gMonIcon_QuestionMark, - .iconPalIndex = 0, + //.frontPic = gMonFrontPic_CircledQuestionMark, + //.frontPicSize = MON_COORDS_SIZE(40, 40), + //.frontPicYOffset = 12, + //.frontAnimFrames = sAnims_TwoFramePlaceHolder, + //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + //.backPic = gMonBackPic_CircledQuestionMark, + //.backPicSize = MON_COORDS_SIZE(40, 40), + //.backPicYOffset = 12, + //.backAnimId = BACK_ANIM_NONE, + //.palette = gMonPalette_CircledQuestionMark, + //.shinyPalette = gMonShinyPalette_CircledQuestionMark, + //.iconSprite = gMonIcon_QuestionMark, + //.iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) - SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS + FOOTPRINT(Falinks) + //SHADOW(-1, 0, SHADOW_SIZE_M) .isMegaEvolution = TRUE, .levelUpLearnset = sFalinksLevelUpLearnset, .teachableLearnset = sFalinksTeachableLearnset, @@ -6824,7 +6808,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .baseSpDefense = 115, .types = MON_TYPES(TYPE_FAIRY), .catchRate = 10, - .expYield = 335, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_9) ? 330 : 335, .evYield_Speed = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6872,7 +6856,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_ZacianHero, gShinyOverworldPalette_ZacianHero ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZacianLevelUpLearnset, @@ -6891,7 +6875,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .baseSpDefense = 115, .types = MON_TYPES(TYPE_FAIRY, TYPE_STEEL), .catchRate = 10, - .expYield = 360, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_9) ? 350 : 360, .evYield_Speed = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -6940,7 +6924,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_ZacianCrowned, gShinyOverworldPalette_ZacianCrowned ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZacianLevelUpLearnset, @@ -6961,7 +6945,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .baseSpDefense = 115, .types = MON_TYPES(TYPE_FIGHTING), .catchRate = 10, - .expYield = 335, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_9) ? 330 : 335, .evYield_Speed = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -7010,7 +6994,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_ZamazentaHero, gShinyOverworldPalette_ZamazentaHero ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZamazentaLevelUpLearnset, @@ -7029,7 +7013,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .baseSpDefense = P_UPDATED_STATS >= GEN_9 ? 140 : 145, .types = MON_TYPES(TYPE_FIGHTING, TYPE_STEEL), .catchRate = 10, - .expYield = 360, + .expYield = (P_UPDATED_EXP_YIELDS >= GEN_9) ? 350 : 360, .evYield_Speed = 3, .genderRatio = MON_GENDERLESS, .eggCycles = 120, @@ -7078,7 +7062,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_ZamazentaCrowned, gShinyOverworldPalette_ZamazentaCrowned ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sZamazentaLevelUpLearnset, @@ -7149,7 +7133,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Eternatus, gShinyOverworldPalette_Eternatus ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEternatusLevelUpLearnset, @@ -7208,7 +7192,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(-3, 20, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(Eternatus) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEternatusLevelUpLearnset, @@ -7276,7 +7260,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Kubfu, gShinyOverworldPalette_Kubfu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKubfuLevelUpLearnset, .teachableLearnset = sKubfuTeachableLearnset, @@ -7345,7 +7329,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Urshifu, gShinyOverworldPalette_Urshifu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuSingleStrikeLevelUpLearnset, .teachableLearnset = sUrshifuSingleStrikeTeachableLearnset, @@ -7404,12 +7388,13 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(1, 13, SHADOW_SIZE_L) FOOTPRINT(Urshifu) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isGigantamax = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuSingleStrikeLevelUpLearnset, .teachableLearnset = sUrshifuSingleStrikeTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, + .formChangeTable = sUrshifuSingleStrikeFormChangeTable, }, #endif //P_GIGANTAMAX_FORMS @@ -7472,7 +7457,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Urshifu, gShinyOverworldPalette_Urshifu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuRapidStrikeLevelUpLearnset, .teachableLearnset = sUrshifuRapidStrikeTeachableLearnset, @@ -7531,12 +7516,13 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(2, 13, SHADOW_SIZE_M) FOOTPRINT(Urshifu) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .isGigantamax = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sUrshifuRapidStrikeLevelUpLearnset, .teachableLearnset = sUrshifuRapidStrikeTeachableLearnset, .formSpeciesIdTable = sUrshifuFormSpeciesIdTable, + .formChangeTable = sUrshifuRapidStrikeFormChangeTable, }, #endif //P_GIGANTAMAX_FORMS #endif //P_FAMILY_KUBFU @@ -7609,6 +7595,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .teachableLearnset = sZarudeTeachableLearnset, .formSpeciesIdTable = sZarudeFormSpeciesIdTable, }, + [SPECIES_ZARUDE_DADA] = { .baseHP = 105, @@ -7729,7 +7716,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Regieleki, gShinyOverworldPalette_Regieleki ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegielekiLevelUpLearnset, .teachableLearnset = sRegielekiTeachableLearnset, @@ -7797,7 +7784,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Regidrago, gShinyOverworldPalette_Regidrago ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sRegidragoLevelUpLearnset, .teachableLearnset = sRegidragoTeachableLearnset, @@ -7863,7 +7850,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Glastrier, gShinyOverworldPalette_Glastrier ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sGlastrierLevelUpLearnset, .teachableLearnset = sGlastrierTeachableLearnset, @@ -7930,7 +7917,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Spectrier, gShinyOverworldPalette_Spectrier ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sSpectrierLevelUpLearnset, .teachableLearnset = sSpectrierTeachableLearnset, @@ -7997,7 +7984,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_Calyrex, gShinyOverworldPalette_Calyrex ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCalyrexLevelUpLearnset, @@ -8065,7 +8052,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_CalyrexIce, gShinyOverworldPalette_CalyrexIce ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -8133,7 +8120,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_CalyrexShadow, gShinyOverworldPalette_CalyrexShadow ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .cannotBeTraded = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, @@ -8205,7 +8192,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_EnamorusIncarnate, gShinyOverworldPalette_EnamorusIncarnate ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, @@ -8272,7 +8259,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = gOverworldPalette_EnamorusTherian, gShinyOverworldPalette_EnamorusTherian ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sEnamorusLevelUpLearnset, .teachableLearnset = sEnamorusTeachableLearnset, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 57e8eab64..1bbb6a525 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -1364,6 +1364,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .teachableLearnset = sMausholdTeachableLearnset, .formSpeciesIdTable = sMausholdFormSpeciesIdTable, }, + [SPECIES_MAUSHOLD_FOUR] = { .baseHP = 74, @@ -2129,7 +2130,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Naclstack, .iconPalIndex = 2, .pokemonJumpType = PKMN_JUMP_TYPE_SLOW, - SHADOW(0, 5, SHADOW_SIZE_L) + SHADOW(0, 2, SHADOW_SIZE_L) FOOTPRINT(Naclstack) OVERWORLD( sPicTable_Naclstack, @@ -2193,7 +2194,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_Garganacl, .iconPalIndex = 2, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - SHADOW(0, 13, SHADOW_SIZE_L) + SHADOW(0, 9, SHADOW_SIZE_L) FOOTPRINT(Garganacl) OVERWORLD( sPicTable_Garganacl, @@ -3406,7 +3407,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_CHLOROPHYLL, ABILITY_INSOMNIA, ABILITY_MOODY }, .bodyColor = BODY_COLOR_GREEN, .speciesName = _("Scovillain"), - .cryId = CRY_SCOVILLAIN, //CRY_SCOVILLAIN_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_SCOVILLAIN_MEGA, + #else + .cryId = CRY_SCOVILLAIN, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_SCOVILLAIN, .categoryName = _("Spicy Pepper"), .height = 12, @@ -3429,28 +3434,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Scovillain) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sScovillainLevelUpLearnset, .teachableLearnset = sScovillainTeachableLearnset, @@ -4720,7 +4705,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_TOXIC_DEBRIS, ABILITY_NONE, ABILITY_CORROSION }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Glimmora"), - .cryId = CRY_GLIMMORA, //CRY_GLIMMORA_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_GLIMMORA_MEGA, + #else + .cryId = CRY_GLIMMORA, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_GLIMMORA, .categoryName = _("Ore"), .height = 15, @@ -4744,28 +4733,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Glimmora) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sGlimmoraLevelUpLearnset, .teachableLearnset = sGlimmoraTeachableLearnset, @@ -5453,7 +5422,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_STORM_DRAIN, ABILITY_NONE, ABILITY_STORM_DRAIN }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Tatsugiri"), - .cryId = CRY_TATSUGIRI_CURLY, //CRY_TATSUGIRI_CURLY_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_TATSUGIRI_MEGA, + #else + .cryId = CRY_TATSUGIRI_CURLY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_TATSUGIRI, .categoryName = _("Mimicry"), .height = 6, @@ -5477,28 +5450,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Tatsugiri) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sTatsugiriLevelUpLearnset, .teachableLearnset = sTatsugiriTeachableLearnset, @@ -5527,7 +5480,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_STORM_DRAIN, ABILITY_NONE, ABILITY_STORM_DRAIN }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Tatsugiri"), - .cryId = CRY_TATSUGIRI_DROOPY, //CRY_TATSUGIRI_DROOPY_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_TATSUGIRI_MEGA, + #else + .cryId = CRY_TATSUGIRI_DROOPY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_TATSUGIRI, .categoryName = _("Mimicry"), .height = 6, @@ -5551,28 +5508,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Tatsugiri) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sTatsugiriLevelUpLearnset, .teachableLearnset = sTatsugiriTeachableLearnset, @@ -5601,7 +5538,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_STORM_DRAIN, ABILITY_NONE, ABILITY_STORM_DRAIN }, .bodyColor = BODY_COLOR_RED, .speciesName = _("Tatsugiri"), - .cryId = CRY_TATSUGIRI_STRETCHY, //CRY_TATSUGIRI_STRETCHY_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_TATSUGIRI_MEGA, + #else + .cryId = CRY_TATSUGIRI_STRETCHY, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_TATSUGIRI, .categoryName = _("Mimicry"), .height = 6, @@ -5625,28 +5566,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Tatsugiri) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sTatsugiriLevelUpLearnset, .teachableLearnset = sTatsugiriTeachableLearnset, @@ -6681,7 +6602,11 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .abilities = { ABILITY_THERMAL_EXCHANGE, ABILITY_NONE, ABILITY_ICE_BODY }, .bodyColor = BODY_COLOR_BLUE, .speciesName = _("Baxcalibur"), - .cryId = CRY_BAXCALIBUR, //CRY_BAXCALIBUR_MEGA + #if P_MODIFIED_MEGA_CRIES + .cryId = CRY_BAXCALIBUR_MEGA, + #else + .cryId = CRY_BAXCALIBUR, + #endif // P_MODIFIED_MEGA_CRIES .natDexNum = NATIONAL_DEX_BAXCALIBUR, .categoryName = _("Ice Dragon"), .height = 21, @@ -6705,28 +6630,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .iconSprite = gMonIcon_QuestionMark, .iconPalIndex = 0, .pokemonJumpType = PKMN_JUMP_TYPE_NONE, - FOOTPRINT(QuestionMark) + FOOTPRINT(Baxcalibur) SHADOW(-1, 0, SHADOW_SIZE_M) - #if OW_BATTLE_ONLY_FORMS - .overworldData = { - .tileTag = TAG_NONE, - .paletteTag = OBJ_EVENT_PAL_TAG_SUBSTITUTE, - .reflectionPaletteTag = OBJ_EVENT_PAL_TAG_NONE, - .size = 512, - .width = 32, - .height = 32, - .paletteSlot = PALSLOT_NPC_1, - .shadowSize = SHADOW_SIZE_M, - .inanimate = FALSE, - .compressed = COMP, - .tracks = TRACKS_FOOT, - .oam = &gObjectEventBaseOam_32x32, - .subspriteTables = sOamTables_32x32, - .anims = sAnimTable_Following, - .images = sPicTable_Substitute, - .affineAnims = gDummySpriteAffineAnimTable, - }, - #endif //OW_BATTLE_ONLY_FORMS .isMegaEvolution = TRUE, .levelUpLearnset = sBaxcaliburLevelUpLearnset, .teachableLearnset = sBaxcaliburTeachableLearnset, @@ -6982,7 +6887,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_WoChien, gShinyOverworldPalette_WoChien ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sWoChienLevelUpLearnset, .teachableLearnset = sWoChienTeachableLearnset, @@ -7049,7 +6954,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_ChienPao, gShinyOverworldPalette_ChienPao ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sChienPaoLevelUpLearnset, .teachableLearnset = sChienPaoTeachableLearnset, @@ -7116,7 +7021,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_TingLu, gShinyOverworldPalette_TingLu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTingLuLevelUpLearnset, .teachableLearnset = sTingLuTeachableLearnset, @@ -7184,7 +7089,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_ChiYu, gShinyOverworldPalette_ChiYu ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sChiYuLevelUpLearnset, .teachableLearnset = sChiYuTeachableLearnset, @@ -7385,7 +7290,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_Koraidon, gShinyOverworldPalette_Koraidon ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKoraidonLevelUpLearnset, @@ -7454,7 +7359,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_Miraidon, gShinyOverworldPalette_Miraidon ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMiraidonLevelUpLearnset, @@ -7660,6 +7565,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .evolutions = EVOLUTION({EVO_ITEM, ITEM_UNREMARKABLE_TEACUP, SPECIES_SINISTCHA_UNREMARKABLE}), .formSpeciesIdTable = sPoltchageistFormSpeciesIdTable, }, + [SPECIES_POLTCHAGEIST_ARTISAN] = { .baseHP = 40, @@ -7790,6 +7696,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .teachableLearnset = sSinistchaTeachableLearnset, .formSpeciesIdTable = sSinistchaFormSpeciesIdTable, }, + [SPECIES_SINISTCHA_MASTERPIECE] = { .baseHP = 71, @@ -7916,7 +7823,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_Okidogi, gShinyOverworldPalette_Okidogi ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sOkidogiLevelUpLearnset, .teachableLearnset = sOkidogiTeachableLearnset, @@ -7983,7 +7890,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_Munkidori, gShinyOverworldPalette_Munkidori ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sMunkidoriLevelUpLearnset, .teachableLearnset = sMunkidoriTeachableLearnset, @@ -8050,7 +7957,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_Fezandipiti, gShinyOverworldPalette_Fezandipiti ) - .isLegendary = TRUE, + .isSubLegendary = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sFezandipitiLevelUpLearnset, .teachableLearnset = sFezandipitiTeachableLearnset, @@ -8118,7 +8025,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .teachableLearnset = sOgerponTeachableLearnset, \ .formSpeciesIdTable = sOgerponFormSpeciesIdTable, \ .formChangeTable = sOgerponFormChangeTable, \ - .isLegendary = TRUE, \ + .isSubLegendary = TRUE, \ .isTeraForm = isTeraform, \ .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } @@ -8464,7 +8371,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_TerapagosNormal, gShinyOverworldPalette_TerapagosNormal ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerapagosLevelUpLearnset, @@ -8535,7 +8442,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = gOverworldPalette_TerapagosTerastal, gShinyOverworldPalette_TerapagosTerastal ) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTerapagosLevelUpLearnset, @@ -8595,7 +8502,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .pokemonJumpType = PKMN_JUMP_TYPE_NONE, SHADOW(0, 12, SHADOW_SIZE_L) FOOTPRINT(TerapagosStellar) - .isLegendary = TRUE, + .isRestrictedLegendary = TRUE, .isTeraForm = TRUE, .isFrontierBanned = TRUE, .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, diff --git a/src/data/pokemon/species_info/shared_dex_text.h b/src/data/pokemon/species_info/shared_dex_text.h index 370b00409..c85b2570d 100644 --- a/src/data/pokemon/species_info/shared_dex_text.h +++ b/src/data/pokemon/species_info/shared_dex_text.h @@ -43,13 +43,6 @@ const u8 gUnownPokedexText[] = _( "it is a mystery as to which came first,\n" "the ancient writings or the various Unown."); -// Gen 3 families -const u8 gDeoxysNormalPokedexText[] = _( - "Deoxys emerged from a virus that came\n" - "from space. It is highly intelligent and\n" - "can shoot lasers from the crystalline\n" - "organ on its chest."); - // Gen 4 families const u8 gMothimPokedexText[] = _( "It does not keep a nest. While it\n" diff --git a/src/data/pokemon/teachable_learnsets.h b/src/data/pokemon/teachable_learnsets.h index 9493b065f..887687c64 100644 --- a/src/data/pokemon/teachable_learnsets.h +++ b/src/data/pokemon/teachable_learnsets.h @@ -2,177 +2,163 @@ // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py // -// *************************************************** // -// TM/HM moves found in "include/constants/tms_hms.h": // -// - MOVE_FOCUS_PUNCH // -// - MOVE_DRAGON_CLAW // -// - MOVE_WATER_PULSE // -// - MOVE_CALM_MIND // -// - MOVE_ROAR // -// - MOVE_TOXIC // -// - MOVE_HAIL // -// - MOVE_BULK_UP // -// - MOVE_BULLET_SEED // -// - MOVE_HIDDEN_POWER // -// - MOVE_SUNNY_DAY // -// - MOVE_TAUNT // -// - MOVE_ICE_BEAM // -// - MOVE_BLIZZARD // -// - MOVE_HYPER_BEAM // -// - MOVE_LIGHT_SCREEN // -// - MOVE_PROTECT // -// - MOVE_RAIN_DANCE // -// - MOVE_GIGA_DRAIN // -// - MOVE_SAFEGUARD // -// - MOVE_FRUSTRATION // -// - MOVE_SOLAR_BEAM // -// - MOVE_IRON_TAIL // -// - MOVE_THUNDERBOLT // -// - MOVE_THUNDER // -// - MOVE_EARTHQUAKE // -// - MOVE_RETURN // -// - MOVE_DIG // -// - MOVE_PSYCHIC // -// - MOVE_SHADOW_BALL // -// - MOVE_BRICK_BREAK // -// - MOVE_DOUBLE_TEAM // -// - MOVE_REFLECT // -// - MOVE_SHOCK_WAVE // -// - MOVE_FLAMETHROWER // -// - MOVE_SLUDGE_BOMB // -// - MOVE_SANDSTORM // -// - MOVE_FIRE_BLAST // -// - MOVE_ROCK_TOMB // -// - MOVE_AERIAL_ACE // -// - MOVE_TORMENT // -// - MOVE_FACADE // -// - MOVE_SECRET_POWER // -// - MOVE_REST // -// - MOVE_ATTRACT // -// - MOVE_THIEF // -// - MOVE_STEEL_WING // -// - MOVE_SKILL_SWAP // -// - MOVE_SNATCH // -// - MOVE_OVERHEAT // -// - MOVE_CUT // -// - MOVE_FLY // -// - MOVE_SURF // -// - MOVE_STRENGTH // -// - MOVE_FLASH // -// - MOVE_ROCK_SMASH // -// - MOVE_WATERFALL // -// - MOVE_DIVE // -// *************************************************** // -// Tutor moves found from map scripts: // -// - MOVE_BODY_SLAM // -// - MOVE_COUNTER // -// - MOVE_DOUBLE_EDGE // -// - MOVE_DREAM_EATER // -// - MOVE_EXPLOSION // -// - MOVE_MEGA_KICK // -// - MOVE_MEGA_PUNCH // -// - MOVE_METRONOME // -// - MOVE_MIMIC // -// - MOVE_ROCK_SLIDE // -// - MOVE_SEISMIC_TOSS // -// - MOVE_SOFT_BOILED // -// - MOVE_SUBSTITUTE // -// - MOVE_SWORDS_DANCE // -// - MOVE_THUNDER_WAVE // -// *************************************************** // -// Near-universal moves found from sUniversalMoves: // -// - MOVE_BIDE // -// - MOVE_FRUSTRATION // -// - MOVE_HIDDEN_POWER // -// - MOVE_MIMIC // -// - MOVE_NATURAL_GIFT // -// - MOVE_RAGE // -// - MOVE_RETURN // -// - MOVE_SECRET_POWER // -// - MOVE_SUBSTITUTE // -// - MOVE_TERA_BLAST // -// *************************************************** // +// ********************************************************* // +// TM/HM moves found in "include/constants/tms_hms.h": // +// - MOVE_AERIAL_ACE // +// - MOVE_ATTRACT // +// - MOVE_BLIZZARD // +// - MOVE_BRICK_BREAK // +// - MOVE_BULK_UP // +// - MOVE_BULLET_SEED // +// - MOVE_CALM_MIND // +// - MOVE_CUT // +// - MOVE_DIG // +// - MOVE_DIVE // +// - MOVE_DOUBLE_TEAM // +// - MOVE_DRAGON_CLAW // +// - MOVE_EARTHQUAKE // +// - MOVE_FACADE // +// - MOVE_FIRE_BLAST // +// - MOVE_FLAMETHROWER // +// - MOVE_FLASH // +// - MOVE_FLY // +// - MOVE_FOCUS_PUNCH // +// - MOVE_FRUSTRATION // +// - MOVE_GIGA_DRAIN // +// - MOVE_HAIL // +// - MOVE_HIDDEN_POWER // +// - MOVE_HYPER_BEAM // +// - MOVE_ICE_BEAM // +// - MOVE_IRON_TAIL // +// - MOVE_LIGHT_SCREEN // +// - MOVE_OVERHEAT // +// - MOVE_PROTECT // +// - MOVE_PSYCHIC // +// - MOVE_RAIN_DANCE // +// - MOVE_REFLECT // +// - MOVE_REST // +// - MOVE_RETURN // +// - MOVE_ROAR // +// - MOVE_ROCK_SMASH // +// - MOVE_ROCK_TOMB // +// - MOVE_SAFEGUARD // +// - MOVE_SANDSTORM // +// - MOVE_SECRET_POWER // +// - MOVE_SHADOW_BALL // +// - MOVE_SHOCK_WAVE // +// - MOVE_SKILL_SWAP // +// - MOVE_SLUDGE_BOMB // +// - MOVE_SNATCH // +// - MOVE_SOLAR_BEAM // +// - MOVE_STEEL_WING // +// - MOVE_STRENGTH // +// - MOVE_SUNNY_DAY // +// - MOVE_SURF // +// - MOVE_TAUNT // +// - MOVE_THIEF // +// - MOVE_THUNDER // +// - MOVE_THUNDERBOLT // +// - MOVE_TORMENT // +// - MOVE_TOXIC // +// - MOVE_WATERFALL // +// - MOVE_WATER_PULSE // +// ********************************************************* // +// Tutor moves found from map scripts: // +// ********************************************************* // +// Near-universal moves found in data/special_movesets.json: // +// - MOVE_BIDE // +// - MOVE_FRUSTRATION // +// - MOVE_HIDDEN_POWER // +// - MOVE_MIMIC // +// - MOVE_NATURAL_GIFT // +// - MOVE_RAGE // +// - MOVE_RETURN // +// - MOVE_SECRET_POWER // +// - MOVE_SUBSTITUTE // +// - MOVE_TERA_BLAST // +// ********************************************************* // static const u16 sNoneTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - #if P_FAMILY_BULBASAUR static const u16 sBulbasaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sIvysaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sVenusaurTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -182,33 +168,29 @@ static const u16 sVenusaurTeachableLearnset[] = { static const u16 sCharmanderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -216,46 +198,38 @@ static const u16 sCharmanderTeachableLearnset[] = { static const u16 sCharmeleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sCharizardTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -264,25 +238,24 @@ static const u16 sCharizardTeachableLearnset[] = { MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -292,28 +265,25 @@ static const u16 sCharizardTeachableLearnset[] = { static const u16 sSquirtleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -325,28 +295,25 @@ static const u16 sSquirtleTeachableLearnset[] = { static const u16 sWartortleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -354,35 +321,31 @@ static const u16 sWartortleTeachableLearnset[] = { MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sBlastoiseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -400,23 +363,24 @@ static const u16 sCaterpieTeachableLearnset[] = { static const u16 sMetapodTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - static const u16 sButterfreeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -441,20 +405,22 @@ static const u16 sBeedrillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -465,14 +431,17 @@ static const u16 sBeedrillTeachableLearnset[] = { static const u16 sPidgeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -483,14 +452,17 @@ static const u16 sPidgeyTeachableLearnset[] = { static const u16 sPidgeottoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -501,15 +473,18 @@ static const u16 sPidgeottoTeachableLearnset[] = { static const u16 sPidgeotTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -522,19 +497,20 @@ static const u16 sPidgeotTeachableLearnset[] = { static const u16 sRattataTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -543,40 +519,37 @@ static const u16 sRattataTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sRaticateTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -585,16 +558,18 @@ static const u16 sRaticateTeachableLearnset[] = { static const u16 sRattataAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -611,24 +586,25 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -642,13 +618,16 @@ static const u16 sRaticateAlolaTeachableLearnset[] = { static const u16 sSpearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -659,14 +638,17 @@ static const u16 sSpearowTeachableLearnset[] = { static const u16 sFearowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -678,19 +660,20 @@ static const u16 sFearowTeachableLearnset[] = { #if P_FAMILY_EKANS static const u16 sEkansTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, @@ -703,20 +686,21 @@ static const u16 sEkansTeachableLearnset[] = { static const u16 sArbokTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, @@ -732,97 +716,86 @@ static const u16 sArbokTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sPichuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sPikachuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sRaichuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -830,33 +803,32 @@ static const u16 sRaichuTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sRaichuAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SURF, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -867,28 +839,26 @@ static const u16 sRaichuAlolaTeachableLearnset[] = { static const u16 sSandshrewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -897,29 +867,27 @@ static const u16 sSandshrewTeachableLearnset[] = { static const u16 sSandslashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -930,26 +898,24 @@ static const u16 sSandshrewAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -959,27 +925,25 @@ static const u16 sSandslashAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -992,20 +956,21 @@ static const u16 sNidoranFTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -1022,20 +987,21 @@ static const u16 sNidorinaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -1052,33 +1018,30 @@ static const u16 sNidoqueenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -1098,20 +1061,21 @@ static const u16 sNidoqueenTeachableLearnset[] = { static const u16 sNidoranMTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -1127,20 +1091,21 @@ static const u16 sNidoranMTeachableLearnset[] = { static const u16 sNidorinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -1156,33 +1121,30 @@ static const u16 sNidorinoTeachableLearnset[] = { static const u16 sNidokingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -1205,86 +1167,73 @@ static const u16 sNidokingTeachableLearnset[] = { static const u16 sCleffaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sClefairyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -1293,46 +1242,40 @@ static const u16 sClefairyTeachableLearnset[] = { static const u16 sClefableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -1342,20 +1285,22 @@ static const u16 sClefableTeachableLearnset[] = { #if P_FAMILY_VULPIX static const u16 sVulpixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1363,23 +1308,24 @@ static const u16 sVulpixTeachableLearnset[] = { static const u16 sNinetalesTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -1391,20 +1337,22 @@ static const u16 sNinetalesTeachableLearnset[] = { static const u16 sVulpixAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1412,14 +1360,13 @@ static const u16 sVulpixAlolaTeachableLearnset[] = { static const u16 sNinetalesAlolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -1427,8 +1374,10 @@ static const u16 sNinetalesAlolaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1440,66 +1389,57 @@ static const u16 sNinetalesAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sIgglybuffTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sJigglypuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -1511,42 +1451,36 @@ static const u16 sJigglypuffTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sWigglytuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -1558,7 +1492,6 @@ static const u16 sWigglytuffTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -1569,14 +1502,17 @@ static const u16 sWigglytuffTeachableLearnset[] = { static const u16 sZubatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -1588,19 +1524,21 @@ static const u16 sZubatTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sGolbatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -1617,15 +1555,18 @@ static const u16 sGolbatTeachableLearnset[] = { static const u16 sCrobatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -1645,61 +1586,64 @@ static const u16 sOddishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sGloomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sVileplumeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1709,19 +1653,21 @@ static const u16 sBellossomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -1732,26 +1678,26 @@ static const u16 sBellossomTeachableLearnset[] = { static const u16 sParasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1760,27 +1706,27 @@ static const u16 sParasTeachableLearnset[] = { static const u16 sParasectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1790,15 +1736,18 @@ static const u16 sParasectTeachableLearnset[] = { #if P_FAMILY_VENONAT static const u16 sVenonatTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, @@ -1811,17 +1760,19 @@ static const u16 sVenonatTeachableLearnset[] = { static const u16 sVenomothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, @@ -1836,22 +1787,22 @@ static const u16 sVenomothTeachableLearnset[] = { static const u16 sDiglettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1860,23 +1811,23 @@ static const u16 sDiglettTeachableLearnset[] = { static const u16 sDugtrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1886,19 +1837,20 @@ static const u16 sDugtrioTeachableLearnset[] = { static const u16 sDiglettAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1907,21 +1859,21 @@ static const u16 sDiglettAlolaTeachableLearnset[] = { static const u16 sDugtrioAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -1933,18 +1885,19 @@ static const u16 sDugtrioAlolaTeachableLearnset[] = { static const u16 sMeowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -1953,7 +1906,6 @@ static const u16 sMeowthTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -1963,20 +1915,21 @@ static const u16 sMeowthTeachableLearnset[] = { static const u16 sPersianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -1985,7 +1938,6 @@ static const u16 sPersianTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -1996,16 +1948,17 @@ static const u16 sPersianTeachableLearnset[] = { static const u16 sMeowthAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -2014,7 +1967,6 @@ static const u16 sMeowthAlolaTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -2024,18 +1976,19 @@ static const u16 sMeowthAlolaTeachableLearnset[] = { static const u16 sPersianAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -2044,7 +1997,6 @@ static const u16 sPersianAlolaTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -2056,19 +2008,19 @@ static const u16 sPersianAlolaTeachableLearnset[] = { static const u16 sMeowthGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -2079,20 +2031,20 @@ static const u16 sMeowthGalarTeachableLearnset[] = { static const u16 sPerrserkerTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, @@ -2107,30 +2059,27 @@ static const u16 sPsyduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_STRENGTH, MOVE_SURF, @@ -2146,31 +2095,28 @@ static const u16 sGolduckTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_STRENGTH, MOVE_SURF, @@ -2187,28 +2133,24 @@ static const u16 sGolduckTeachableLearnset[] = { static const u16 sMankeyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -2222,29 +2164,25 @@ static const u16 sMankeyTeachableLearnset[] = { static const u16 sPrimeapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -2257,24 +2195,22 @@ static const u16 sPrimeapeTeachableLearnset[] = { #if P_GEN_9_CROSS_EVOS static const u16 sAnnihilapeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -2290,21 +2226,23 @@ static const u16 sAnnihilapeTeachableLearnset[] = { static const u16 sGrowlitheTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -2315,22 +2253,24 @@ static const u16 sGrowlitheTeachableLearnset[] = { static const u16 sArcanineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -2342,43 +2282,45 @@ static const u16 sArcanineTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sGrowlitheHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sArcanineHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -2391,19 +2333,21 @@ static const u16 sArcanineHisuiTeachableLearnset[] = { static const u16 sPoliwagTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -2415,27 +2359,24 @@ static const u16 sPoliwagTeachableLearnset[] = { static const u16 sPoliwhirlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, @@ -2448,31 +2389,27 @@ static const u16 sPoliwhirlTeachableLearnset[] = { static const u16 sPoliwrathTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TAUNT, @@ -2487,28 +2424,25 @@ static const u16 sPoliwrathTeachableLearnset[] = { static const u16 sPolitoedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, @@ -2523,27 +2457,23 @@ static const u16 sPolitoedTeachableLearnset[] = { #if P_FAMILY_ABRA static const u16 sAbraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -2551,36 +2481,30 @@ static const u16 sAbraTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sKadabraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -2588,37 +2512,31 @@ static const u16 sKadabraTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sAlakazamTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -2626,7 +2544,6 @@ static const u16 sAlakazamTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -2636,29 +2553,25 @@ static const u16 sAlakazamTeachableLearnset[] = { #if P_FAMILY_MACHOP static const u16 sMachopTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -2668,62 +2581,53 @@ static const u16 sMachopTeachableLearnset[] = { static const u16 sMachokeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sMachampTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -2737,18 +2641,20 @@ static const u16 sBellsproutTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -2756,44 +2662,45 @@ static const u16 sBellsproutTeachableLearnset[] = { static const u16 sWeepinbellTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sVictreebelTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -2806,20 +2713,22 @@ static const u16 sTentacoolTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -2832,21 +2741,23 @@ static const u16 sTentacruelTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -2858,27 +2769,23 @@ static const u16 sTentacruelTeachableLearnset[] = { #if P_FAMILY_GEODUDE static const u16 sGeodudeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -2887,27 +2794,23 @@ static const u16 sGeodudeTeachableLearnset[] = { static const u16 sGravelerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -2916,30 +2819,25 @@ static const u16 sGravelerTeachableLearnset[] = { static const u16 sGolemTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -2949,94 +2847,82 @@ static const u16 sGolemTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sGeodudeAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGravelerAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGolemAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -3046,17 +2932,19 @@ static const u16 sGolemAlolaTeachableLearnset[] = { #if P_FAMILY_PONYTA static const u16 sPonytaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -3066,22 +2954,23 @@ static const u16 sPonytaTeachableLearnset[] = { static const u16 sRapidashTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -3089,33 +2978,36 @@ static const u16 sRapidashTeachableLearnset[] = { #if P_GALARIAN_FORMS static const u16 sPonytaGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sRapidashGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -3125,19 +3017,18 @@ static const u16 sRapidashGalarTeachableLearnset[] = { static const u16 sSlowpokeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -3146,13 +3037,14 @@ static const u16 sSlowpokeTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -3163,43 +3055,38 @@ static const u16 sSlowbroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -3210,45 +3097,39 @@ static const u16 sSlowbroTeachableLearnset[] = { static const u16 sSlowkingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -3260,7 +3141,6 @@ static const u16 sSlowkingTeachableLearnset[] = { static const u16 sSlowpokeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, @@ -3268,7 +3148,9 @@ static const u16 sSlowpokeGalarTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -3276,12 +3158,13 @@ static const u16 sSlowpokeGalarTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -3290,36 +3173,34 @@ static const u16 sSlowpokeGalarTeachableLearnset[] = { static const u16 sSlowbroGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -3330,7 +3211,6 @@ static const u16 sSlowbroGalarTeachableLearnset[] = { static const u16 sSlowkingGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, @@ -3339,26 +3219,26 @@ static const u16 sSlowkingGalarTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -3370,68 +3250,70 @@ static const u16 sSlowkingGalarTeachableLearnset[] = { #if P_FAMILY_MAGNEMITE static const u16 sMagnemiteTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMagnetonTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_4_CROSS_EVOS static const u16 sMagnezoneTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -3442,19 +3324,20 @@ static const u16 sMagnezoneTeachableLearnset[] = { static const u16 sFarfetchdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -3463,33 +3346,33 @@ static const u16 sFarfetchdTeachableLearnset[] = { #if P_GALARIAN_FORMS static const u16 sFarfetchdGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; static const u16 sSirfetchdTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -3499,39 +3382,40 @@ static const u16 sSirfetchdTeachableLearnset[] = { static const u16 sDoduoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sDodrioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -3544,18 +3428,20 @@ static const u16 sDodrioTeachableLearnset[] = { static const u16 sSeelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, @@ -3568,19 +3454,21 @@ static const u16 sSeelTeachableLearnset[] = { static const u16 sDewgongTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_THIEF, @@ -3594,21 +3482,21 @@ static const u16 sDewgongTeachableLearnset[] = { #if P_FAMILY_GRIMER static const u16 sGrimerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_METRONOME, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -3625,25 +3513,25 @@ static const u16 sGrimerTeachableLearnset[] = { static const u16 sMukTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -3661,23 +3549,23 @@ static const u16 sMukTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sGrimerAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -3693,24 +3581,24 @@ static const u16 sGrimerAlolaTeachableLearnset[] = { static const u16 sMukAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -3731,16 +3619,18 @@ static const u16 sShellderTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -3751,13 +3641,12 @@ static const u16 sShellderTeachableLearnset[] = { static const u16 sCloysterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -3765,6 +3654,8 @@ static const u16 sCloysterTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TORMENT, MOVE_TOXIC, @@ -3778,14 +3669,16 @@ static const u16 sCloysterTeachableLearnset[] = { static const u16 sGastlyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -3803,15 +3696,16 @@ static const u16 sGastlyTeachableLearnset[] = { static const u16 sHaunterTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_METRONOME, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -3825,29 +3719,23 @@ static const u16 sHaunterTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sGengarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -3858,7 +3746,6 @@ static const u16 sGengarTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -3868,21 +3755,21 @@ static const u16 sGengarTeachableLearnset[] = { #if P_FAMILY_ONIX static const u16 sOnixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -3894,23 +3781,23 @@ static const u16 sOnixTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sSteelixTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -3924,70 +3811,59 @@ static const u16 sSteelixTeachableLearnset[] = { #if P_FAMILY_DROWZEE static const u16 sDrowzeeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sHypnoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -3998,25 +3874,25 @@ static const u16 sHypnoTeachableLearnset[] = { static const u16 sKrabbyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -4026,26 +3902,26 @@ static const u16 sKrabbyTeachableLearnset[] = { static const u16 sKinglerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -4055,45 +3931,47 @@ static const u16 sKinglerTeachableLearnset[] = { #if P_FAMILY_VOLTORB static const u16 sVoltorbTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sElectrodeTeachableLearnset[] = { - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4102,40 +3980,42 @@ static const u16 sElectrodeTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sVoltorbHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sElectrodeHisuiTeachableLearnset[] = { MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -4145,24 +4025,24 @@ static const u16 sElectrodeHisuiTeachableLearnset[] = { static const u16 sExeggcuteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4170,29 +4050,28 @@ static const u16 sExeggcuteTeachableLearnset[] = { static const u16 sExeggutorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4201,18 +4080,16 @@ static const u16 sExeggutorTeachableLearnset[] = { #if P_ALOLAN_FORMS static const u16 sExeggutorAlolaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -4220,11 +4097,12 @@ static const u16 sExeggutorAlolaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4237,31 +4115,27 @@ static const u16 sCuboneTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4271,32 +4145,28 @@ static const u16 sMarowakTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4307,32 +4177,28 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -4346,22 +4212,19 @@ static const u16 sMarowakAlolaTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sTyrogueTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -4369,31 +4232,25 @@ static const u16 sTyrogueTeachableLearnset[] = { MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sHitmonleeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -4402,28 +4259,23 @@ static const u16 sHitmonleeTeachableLearnset[] = { static const u16 sHitmonchanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -4434,24 +4286,21 @@ static const u16 sHitmonchanTeachableLearnset[] = { static const u16 sHitmontopTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -4465,39 +4314,34 @@ static const u16 sHitmontopTeachableLearnset[] = { static const u16 sLickitungTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -4510,38 +4354,34 @@ static const u16 sLickitungTeachableLearnset[] = { static const u16 sLickilickyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -4555,16 +4395,18 @@ static const u16 sLickilickyTeachableLearnset[] = { #if P_FAMILY_KOFFING static const u16 sKoffingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -4580,17 +4422,19 @@ static const u16 sKoffingTeachableLearnset[] = { static const u16 sWeezingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -4607,17 +4451,18 @@ static const u16 sWeezingTeachableLearnset[] = { #if P_GALARIAN_FORMS static const u16 sWeezingGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, @@ -4635,70 +4480,64 @@ static const u16 sWeezingGalarTeachableLearnset[] = { static const u16 sRhyhornTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sRhydonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -4710,36 +4549,33 @@ static const u16 sRhydonTeachableLearnset[] = { static const u16 sRhyperiorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -4754,82 +4590,71 @@ static const u16 sRhyperiorTeachableLearnset[] = { static const u16 sHappinyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sChanseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -4839,49 +4664,42 @@ static const u16 sChanseyTeachableLearnset[] = { static const u16 sBlisseyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -4892,24 +4710,25 @@ static const u16 sBlisseyTeachableLearnset[] = { #if P_FAMILY_TANGELA static const u16 sTangelaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4919,7 +4738,6 @@ static const u16 sTangelaTeachableLearnset[] = { static const u16 sTangrowthTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, @@ -4927,20 +4745,22 @@ static const u16 sTangrowthTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -4953,34 +4773,31 @@ static const u16 sKangaskhanTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -5001,14 +4818,17 @@ static const u16 sHorseaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -5020,15 +4840,18 @@ static const u16 sSeadraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -5040,17 +4863,19 @@ static const u16 sSeadraTeachableLearnset[] = { static const u16 sKingdraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -5064,40 +4889,41 @@ static const u16 sKingdraTeachableLearnset[] = { static const u16 sGoldeenTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sSeakingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -5110,11 +4936,12 @@ static const u16 sStaryuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -5122,11 +4949,12 @@ static const u16 sStaryuTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -5138,12 +4966,12 @@ static const u16 sStarmieTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BULK_UP, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -5152,12 +4980,13 @@ static const u16 sStarmieTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -5172,17 +5001,20 @@ static const u16 sMimeJrTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -5193,38 +5025,32 @@ static const u16 sMimeJrTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sMrMimeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -5235,7 +5061,6 @@ static const u16 sMrMimeTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5245,23 +5070,23 @@ static const u16 sMrMimeTeachableLearnset[] = { static const u16 sMrMimeGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -5270,30 +5095,29 @@ static const u16 sMrMimeGalarTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sMrRimeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -5302,7 +5126,6 @@ static const u16 sMrRimeTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -5314,21 +5137,22 @@ static const u16 sScytherTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5340,23 +5164,24 @@ static const u16 sScizorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5368,21 +5193,21 @@ static const u16 sKleavorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_UNAVAILABLE, }; @@ -5394,26 +5219,22 @@ static const u16 sKleavorTeachableLearnset[] = { static const u16 sSmoochumTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_THIEF, @@ -5422,33 +5243,28 @@ static const u16 sSmoochumTeachableLearnset[] = { MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sJynxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_TAUNT, @@ -5464,65 +5280,57 @@ static const u16 sJynxTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sElekidTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sElectabuzzTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -5530,38 +5338,35 @@ static const u16 sElectabuzzTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sElectivireTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5573,54 +5378,48 @@ static const u16 sElectivireTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sMagbyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_2_CROSS_EVOS - static const u16 sMagmarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -5632,28 +5431,26 @@ static const u16 sMagmarTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sMagmortarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -5671,27 +5468,26 @@ static const u16 sMagmortarTeachableLearnset[] = { static const u16 sPinsirTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5702,24 +5498,25 @@ static const u16 sPinsirTeachableLearnset[] = { static const u16 sTaurosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -5736,19 +5533,20 @@ static const u16 sTaurosTeachableLearnset[] = { #if P_PALDEAN_FORMS static const u16 sTaurosPaldeaCombatTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THIEF, @@ -5756,41 +5554,43 @@ static const u16 sTaurosPaldeaCombatTeachableLearnset[] = { }; static const u16 sTaurosPaldeaBlazeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sTaurosPaldeaAquaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_WATER_PULSE, @@ -5803,19 +5603,18 @@ static const u16 sTaurosPaldeaAquaTeachableLearnset[] = { static const u16 sMagikarpTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - static const u16 sGyaradosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -5823,16 +5622,17 @@ static const u16 sGyaradosTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATERFALL, @@ -5845,14 +5645,13 @@ static const u16 sGyaradosTeachableLearnset[] = { static const u16 sLaprasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -5861,9 +5660,11 @@ static const u16 sLaprasTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -5886,35 +5687,36 @@ static const u16 sDittoTeachableLearnset[] = { #if P_FAMILY_EEVEE static const u16 sEeveeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sVaporeonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -5922,8 +5724,10 @@ static const u16 sVaporeonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -5937,13 +5741,13 @@ static const u16 sVaporeonTeachableLearnset[] = { static const u16 sJolteonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -5951,29 +5755,30 @@ static const u16 sJolteonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlareonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, @@ -5981,12 +5786,13 @@ static const u16 sFlareonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -5995,15 +5801,14 @@ static const u16 sFlareonTeachableLearnset[] = { #if P_GEN_2_CROSS_EVOS static const u16 sEspeonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -6012,28 +5817,28 @@ static const u16 sEspeonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sUmbreonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -6042,15 +5847,16 @@ static const u16 sUmbreonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -6061,27 +5867,28 @@ static const u16 sUmbreonTeachableLearnset[] = { static const u16 sLeafeonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -6090,21 +5897,23 @@ static const u16 sLeafeonTeachableLearnset[] = { static const u16 sGlaceonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -6118,14 +5927,14 @@ static const u16 sGlaceonTeachableLearnset[] = { #if P_GEN_6_CROSS_EVOS static const u16 sSylveonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -6134,9 +5943,11 @@ static const u16 sSylveonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, @@ -6151,11 +5962,11 @@ static const u16 sSylveonTeachableLearnset[] = { static const u16 sPorygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -6164,6 +5975,8 @@ static const u16 sPorygonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -6171,7 +5984,6 @@ static const u16 sPorygonTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6180,11 +5992,11 @@ static const u16 sPorygonTeachableLearnset[] = { static const u16 sPorygon2TeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -6192,6 +6004,8 @@ static const u16 sPorygon2TeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -6199,7 +6013,6 @@ static const u16 sPorygon2TeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6208,11 +6021,11 @@ static const u16 sPorygon2TeachableLearnset[] = { static const u16 sPorygonZTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -6220,6 +6033,8 @@ static const u16 sPorygonZTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -6227,7 +6042,6 @@ static const u16 sPorygonZTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6239,21 +6053,22 @@ static const u16 sPorygonZTeachableLearnset[] = { static const u16 sOmanyteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -6265,23 +6080,23 @@ static const u16 sOmanyteTeachableLearnset[] = { static const u16 sOmastarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -6296,22 +6111,23 @@ static const u16 sKabutoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -6324,30 +6140,28 @@ static const u16 sKabutopsTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -6360,7 +6174,6 @@ static const u16 sKabutopsTeachableLearnset[] = { static const u16 sAerodactylTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -6368,17 +6181,20 @@ static const u16 sAerodactylTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -6395,29 +6211,26 @@ static const u16 sAerodactylTeachableLearnset[] = { static const u16 sMunchlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -6432,36 +6245,31 @@ static const u16 sMunchlaxTeachableLearnset[] = { MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sSnorlaxTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -6481,11 +6289,12 @@ static const u16 sSnorlaxTeachableLearnset[] = { static const u16 sArticunoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -6493,9 +6302,11 @@ static const u16 sArticunoTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -6507,9 +6318,10 @@ static const u16 sArticunoTeachableLearnset[] = { static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -6517,6 +6329,8 @@ static const u16 sArticunoGalarTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STEEL_WING, @@ -6529,27 +6343,29 @@ static const u16 sArticunoGalarTeachableLearnset[] = { #if P_FAMILY_ZAPDOS static const u16 sZapdosTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6559,18 +6375,19 @@ static const u16 sZapdosGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -6582,22 +6399,25 @@ static const u16 sZapdosGalarTeachableLearnset[] = { #if P_FAMILY_MOLTRES static const u16 sMoltresTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -6610,12 +6430,16 @@ static const u16 sMoltresGalarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -6630,13 +6454,13 @@ static const u16 sMoltresGalarTeachableLearnset[] = { static const u16 sDratiniTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -6645,13 +6469,14 @@ static const u16 sDratiniTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -6661,13 +6486,13 @@ static const u16 sDratiniTeachableLearnset[] = { static const u16 sDragonairTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -6676,13 +6501,14 @@ static const u16 sDragonairTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -6693,11 +6519,9 @@ static const u16 sDragoniteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -6706,24 +6530,24 @@ static const u16 sDragoniteTeachableLearnset[] = { MOVE_FLAMETHROWER, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_STRENGTH, @@ -6731,7 +6555,6 @@ static const u16 sDragoniteTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -6743,40 +6566,35 @@ static const u16 sDragoniteTeachableLearnset[] = { static const u16 sMewtwoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -6787,7 +6605,6 @@ static const u16 sMewtwoTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -6796,8 +6613,65 @@ static const u16 sMewtwoTeachableLearnset[] = { #endif //P_FAMILY_MEWTWO #if P_FAMILY_MEW -// Instead of reading this array for Mew, it checks for exceptions in CanLearnTeachableMove instead. static const u16 sMewTeachableLearnset[] = { + MOVE_AERIAL_ACE, + MOVE_ATTRACT, + MOVE_BLIZZARD, + MOVE_BRICK_BREAK, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_CALM_MIND, + MOVE_CUT, + MOVE_DIG, + MOVE_DIVE, + MOVE_DOUBLE_TEAM, + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FIRE_BLAST, + MOVE_FLAMETHROWER, + MOVE_FLASH, + MOVE_FLY, + MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_GIGA_DRAIN, + MOVE_HAIL, + MOVE_HIDDEN_POWER, + MOVE_HYPER_BEAM, + MOVE_ICE_BEAM, + MOVE_IRON_TAIL, + MOVE_LIGHT_SCREEN, + MOVE_OVERHEAT, + MOVE_PROTECT, + MOVE_PSYCHIC, + MOVE_RAIN_DANCE, + MOVE_REFLECT, + MOVE_REST, + MOVE_RETURN, + MOVE_ROAR, + MOVE_ROCK_SMASH, + MOVE_ROCK_TOMB, + MOVE_SAFEGUARD, + MOVE_SANDSTORM, + MOVE_SECRET_POWER, + MOVE_SHADOW_BALL, + MOVE_SHOCK_WAVE, + MOVE_SKILL_SWAP, + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_SOLAR_BEAM, + MOVE_STEEL_WING, + MOVE_STRENGTH, + MOVE_SUNNY_DAY, + MOVE_SURF, + MOVE_TAUNT, + MOVE_THIEF, + MOVE_THUNDER, + MOVE_THUNDERBOLT, + MOVE_TORMENT, + MOVE_TOXIC, + MOVE_WATERFALL, + MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MEW @@ -6805,78 +6679,77 @@ static const u16 sMewTeachableLearnset[] = { #if P_FAMILY_CHIKORITA static const u16 sChikoritaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sBayleefTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sMeganiumTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -6886,19 +6759,21 @@ static const u16 sMeganiumTeachableLearnset[] = { static const u16 sCyndaquilTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -6907,22 +6782,24 @@ static const u16 sCyndaquilTeachableLearnset[] = { static const u16 sQuilavaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -6932,30 +6809,27 @@ static const u16 sQuilavaTeachableLearnset[] = { static const u16 sTyphlosionTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -6967,24 +6841,25 @@ static const u16 sTyphlosionTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sTyphlosionHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -6998,30 +6873,26 @@ static const u16 sTotodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -7033,33 +6904,29 @@ static const u16 sCroconawTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -7071,35 +6938,31 @@ static const u16 sFeraligatrTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -7112,20 +6975,22 @@ static const u16 sFeraligatrTeachableLearnset[] = { static const u16 sSentretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -7142,22 +7007,24 @@ static const u16 sSentretTeachableLearnset[] = { static const u16 sFurretTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -7178,17 +7045,19 @@ static const u16 sHoothootTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STEEL_WING, @@ -7201,20 +7070,21 @@ static const u16 sHoothootTeachableLearnset[] = { static const u16 sNoctowlTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STEEL_WING, @@ -7230,52 +7100,51 @@ static const u16 sLedybaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sLedianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -7285,16 +7154,18 @@ static const u16 sLedianTeachableLearnset[] = { #if P_FAMILY_SPINARAK static const u16 sSpinarakTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -7305,21 +7176,22 @@ static const u16 sSpinarakTeachableLearnset[] = { static const u16 sAriadosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -7331,20 +7203,22 @@ static const u16 sChinchouTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -7355,21 +7229,23 @@ static const u16 sLanturnTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -7381,34 +7257,28 @@ static const u16 sLanturnTeachableLearnset[] = { static const u16 sTogepiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7417,39 +7287,33 @@ static const u16 sTogepiTeachableLearnset[] = { static const u16 sTogeticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, - MOVE_SOFT_BOILED, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7459,36 +7323,33 @@ static const u16 sTogeticTeachableLearnset[] = { static const u16 sTogekissTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7501,40 +7362,40 @@ static const u16 sNatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sXatuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -7542,13 +7403,14 @@ static const u16 sXatuTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7557,91 +7419,86 @@ static const u16 sXatuTeachableLearnset[] = { #if P_FAMILY_MAREEP static const u16 sMareepTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sFlaaffyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sAmpharosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7652,17 +7509,19 @@ static const u16 sAmpharosTeachableLearnset[] = { static const u16 sAzurillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -7670,30 +7529,27 @@ static const u16 sAzurillTeachableLearnset[] = { MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS - static const u16 sMarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -7705,27 +7561,25 @@ static const u16 sMarillTeachableLearnset[] = { static const u16 sAzumarillTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -7739,51 +7593,45 @@ static const u16 sAzumarillTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sBonslyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sSudowoodoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -7799,19 +7647,21 @@ static const u16 sHoppipTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -7821,19 +7671,21 @@ static const u16 sSkiploomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -7843,20 +7695,22 @@ static const u16 sJumpluffTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -7867,25 +7721,21 @@ static const u16 sJumpluffTeachableLearnset[] = { static const u16 sAipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -7896,7 +7746,6 @@ static const u16 sAipomTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7907,21 +7756,21 @@ static const u16 sAmbipomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -7932,7 +7781,6 @@ static const u16 sAmbipomTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -7945,20 +7793,22 @@ static const u16 sSunkernTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7967,21 +7817,23 @@ static const u16 sSunfloraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -7991,20 +7843,21 @@ static const u16 sSunfloraTeachableLearnset[] = { static const u16 sYanmaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8014,21 +7867,22 @@ static const u16 sYanmaTeachableLearnset[] = { static const u16 sYanmegaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8040,26 +7894,26 @@ static const u16 sYanmegaTeachableLearnset[] = { static const u16 sWooperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, @@ -8067,36 +7921,32 @@ static const u16 sWooperTeachableLearnset[] = { MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sQuagsireTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, @@ -8109,18 +7959,18 @@ static const u16 sQuagsireTeachableLearnset[] = { #if P_PALDEAN_FORMS static const u16 sWooperPaldeaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, @@ -8130,19 +7980,19 @@ static const u16 sWooperPaldeaTeachableLearnset[] = { }; static const u16 sClodsireTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, @@ -8158,23 +8008,24 @@ static const u16 sMurkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8185,23 +8036,24 @@ static const u16 sHonchkrowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8214,16 +8066,18 @@ static const u16 sMisdreavusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -8233,7 +8087,6 @@ static const u16 sMisdreavusTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8245,14 +8098,17 @@ static const u16 sMismagiusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -8262,7 +8118,6 @@ static const u16 sMismagiusTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8272,6 +8127,7 @@ static const u16 sMismagiusTeachableLearnset[] = { #if P_FAMILY_UNOWN static const u16 sUnownTeachableLearnset[] = { + MOVE_HIDDEN_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_UNOWN @@ -8279,14 +8135,11 @@ static const u16 sUnownTeachableLearnset[] = { #if P_FAMILY_WOBBUFFET #if P_GEN_3_CROSS_EVOS static const u16 sWynautTeachableLearnset[] = { - MOVE_COUNTER, MOVE_SAFEGUARD, MOVE_UNAVAILABLE, }; #endif //P_GEN_3_CROSS_EVOS - static const u16 sWobbuffetTeachableLearnset[] = { - MOVE_COUNTER, MOVE_SAFEGUARD, MOVE_UNAVAILABLE, }; @@ -8295,14 +8148,13 @@ static const u16 sWobbuffetTeachableLearnset[] = { #if P_FAMILY_GIRAFARIG static const u16 sGirafarigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -8311,7 +8163,9 @@ static const u16 sGirafarigTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -8320,18 +8174,17 @@ static const u16 sGirafarigTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sFarigirafTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -8339,14 +8192,15 @@ static const u16 sFarigirafTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -8355,24 +8209,23 @@ static const u16 sFarigirafTeachableLearnset[] = { #if P_FAMILY_PINECO static const u16 sPinecoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -8382,29 +8235,27 @@ static const u16 sPinecoTeachableLearnset[] = { static const u16 sForretressTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -8414,27 +8265,26 @@ static const u16 sForretressTeachableLearnset[] = { static const u16 sDunsparceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -8443,7 +8293,6 @@ static const u16 sDunsparceTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -8452,22 +8301,23 @@ static const u16 sDunsparceTeachableLearnset[] = { #if P_GEN_9_CROSS_EVOS static const u16 sDudunsparceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -8485,27 +8335,26 @@ static const u16 sGligarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -8518,27 +8367,27 @@ static const u16 sGliscorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -8551,29 +8400,26 @@ static const u16 sGliscorTeachableLearnset[] = { #if P_FAMILY_SNUBBULL static const u16 sSnubbullTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -8584,7 +8430,6 @@ static const u16 sSnubbullTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -8593,33 +8438,29 @@ static const u16 sSnubbullTeachableLearnset[] = { static const u16 sGranbullTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -8630,7 +8471,6 @@ static const u16 sGranbullTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -8643,22 +8483,22 @@ static const u16 sQwilfishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -8668,16 +8508,18 @@ static const u16 sQwilfishTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sQwilfishHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, @@ -8687,17 +8529,19 @@ static const u16 sQwilfishHisuiTeachableLearnset[] = { static const u16 sOverqwilTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, @@ -8710,20 +8554,21 @@ static const u16 sOverqwilTeachableLearnset[] = { #if P_FAMILY_SHUCKLE static const u16 sShuckleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -8736,30 +8581,28 @@ static const u16 sShuckleTeachableLearnset[] = { static const u16 sHeracrossTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -8773,30 +8616,28 @@ static const u16 sSneaselTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -8812,31 +8653,29 @@ static const u16 sWeavileTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -8852,19 +8691,21 @@ static const u16 sSneaselHisuiTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -8876,22 +8717,23 @@ static const u16 sSneaslerTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -8904,67 +8746,56 @@ static const u16 sSneaslerTeachableLearnset[] = { static const u16 sTeddiursaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sUrsaringTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -8975,52 +8806,47 @@ static const u16 sUrsaringTeachableLearnset[] = { #if P_GEN_8_CROSS_EVOS static const u16 sUrsalunaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -9031,22 +8857,23 @@ static const u16 sUrsalunaBloodmoonTeachableLearnset[] = { #if P_FAMILY_SLUGMA static const u16 sSlugmaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -9054,24 +8881,24 @@ static const u16 sSlugmaTeachableLearnset[] = { static const u16 sMagcargoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -9084,39 +8911,39 @@ static const u16 sMagcargoTeachableLearnset[] = { static const u16 sSwinubTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sPiloswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -9124,11 +8951,12 @@ static const u16 sPiloswineTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -9138,13 +8966,13 @@ static const u16 sPiloswineTeachableLearnset[] = { static const u16 sMamoswineTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -9152,11 +8980,12 @@ static const u16 sMamoswineTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -9168,15 +8997,14 @@ static const u16 sMamoswineTeachableLearnset[] = { static const u16 sCorsolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -9184,11 +9012,12 @@ static const u16 sCorsolaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -9202,13 +9031,14 @@ static const u16 sCorsolaTeachableLearnset[] = { static const u16 sCorsolaGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -9216,10 +9046,11 @@ static const u16 sCorsolaGalarTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -9230,13 +9061,14 @@ static const u16 sCorsolaGalarTeachableLearnset[] = { static const u16 sCursolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -9245,10 +9077,11 @@ static const u16 sCursolaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -9264,49 +9097,51 @@ static const u16 sRemoraidTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BULLET_SEED, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sOctilleryTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BULLET_SEED, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -9319,23 +9154,21 @@ static const u16 sDelibirdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_THIEF, MOVE_TOXIC, @@ -9351,16 +9184,18 @@ static const u16 sMantykeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -9368,26 +9203,26 @@ static const u16 sMantykeTeachableLearnset[] = { MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sMantineTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -9400,24 +9235,24 @@ static const u16 sMantineTeachableLearnset[] = { static const u16 sSkarmoryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -9429,21 +9264,21 @@ static const u16 sSkarmoryTeachableLearnset[] = { #if P_FAMILY_HOUNDOUR static const u16 sHoundourTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -9455,25 +9290,24 @@ static const u16 sHoundourTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sHoundoomTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -9491,48 +9325,47 @@ static const u16 sHoundoomTeachableLearnset[] = { #if P_FAMILY_PHANPY static const u16 sPhanpyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sDonphanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -9544,15 +9377,14 @@ static const u16 sDonphanTeachableLearnset[] = { #if P_FAMILY_STANTLER static const u16 sStantlerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -9561,7 +9393,9 @@ static const u16 sStantlerTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -9570,19 +9404,18 @@ static const u16 sStantlerTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #if P_GEN_8_CROSS_EVOS static const u16 sWyrdeerTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -9591,7 +9424,9 @@ static const u16 sWyrdeerTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -9599,7 +9434,6 @@ static const u16 sWyrdeerTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_8_CROSS_EVOS @@ -9615,28 +9449,24 @@ static const u16 sSmeargleTeachableLearnset[] = { static const u16 sMiltankTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -9645,7 +9475,6 @@ static const u16 sMiltankTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -9654,14 +9483,14 @@ static const u16 sMiltankTeachableLearnset[] = { #if P_FAMILY_RAIKOU static const u16 sRaikouTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -9669,16 +9498,17 @@ static const u16 sRaikouTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9686,16 +9516,16 @@ static const u16 sRaikouTeachableLearnset[] = { #if P_FAMILY_ENTEI static const u16 sEnteiTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, @@ -9703,9 +9533,11 @@ static const u16 sEnteiTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -9718,15 +9550,15 @@ static const u16 sEnteiTeachableLearnset[] = { #if P_FAMILY_SUICUNE static const u16 sSuicuneTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -9734,9 +9566,11 @@ static const u16 sSuicuneTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -9750,22 +9584,23 @@ static const u16 sSuicuneTeachableLearnset[] = { #if P_FAMILY_LARVITAR static const u16 sLarvitarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_TORMENT, @@ -9776,22 +9611,23 @@ static const u16 sLarvitarTeachableLearnset[] = { static const u16 sPupitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_TORMENT, @@ -9803,12 +9639,9 @@ static const u16 sTyranitarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -9816,20 +9649,20 @@ static const u16 sTyranitarTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -9837,7 +9670,6 @@ static const u16 sTyranitarTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -9849,18 +9681,17 @@ static const u16 sTyranitarTeachableLearnset[] = { static const u16 sLugiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -9870,10 +9701,12 @@ static const u16 sLugiaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -9883,7 +9716,6 @@ static const u16 sLugiaTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -9894,18 +9726,17 @@ static const u16 sLugiaTeachableLearnset[] = { #if P_FAMILY_HO_OH static const u16 sHoOhTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -9914,10 +9745,12 @@ static const u16 sHoOhTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -9926,7 +9759,6 @@ static const u16 sHoOhTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -9937,29 +9769,28 @@ static const u16 sCelebiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -9970,32 +9801,28 @@ static const u16 sCelebiTeachableLearnset[] = { static const u16 sTreeckoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10004,32 +9831,28 @@ static const u16 sTreeckoTeachableLearnset[] = { static const u16 sGrovyleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10038,36 +9861,32 @@ static const u16 sGrovyleTeachableLearnset[] = { static const u16 sSceptileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10078,94 +9897,80 @@ static const u16 sSceptileTeachableLearnset[] = { static const u16 sTorchicTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sCombuskenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sBlazikenTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10176,23 +9981,23 @@ static const u16 sBlazikenTeachableLearnset[] = { static const u16 sMudkipTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -10204,29 +10009,26 @@ static const u16 sMudkipTeachableLearnset[] = { static const u16 sMarshtompTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -10238,31 +10040,28 @@ static const u16 sMarshtompTeachableLearnset[] = { static const u16 sSwampertTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -10275,18 +10074,19 @@ static const u16 sSwampertTeachableLearnset[] = { #if P_FAMILY_POOCHYENA static const u16 sPoochyenaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SUNNY_DAY, @@ -10299,19 +10099,20 @@ static const u16 sPoochyenaTeachableLearnset[] = { static const u16 sMightyenaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STRENGTH, @@ -10328,18 +10129,20 @@ static const u16 sMightyenaTeachableLearnset[] = { static const u16 sZigzagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, @@ -10347,7 +10150,6 @@ static const u16 sZigzagoonTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -10356,20 +10158,22 @@ static const u16 sZigzagoonTeachableLearnset[] = { static const u16 sLinooneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, @@ -10378,7 +10182,6 @@ static const u16 sLinooneTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -10388,16 +10191,17 @@ static const u16 sLinooneTeachableLearnset[] = { static const u16 sZigzagoonGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -10405,24 +10209,24 @@ static const u16 sZigzagoonGalarTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sLinooneGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -10430,28 +10234,26 @@ static const u16 sLinooneGalarTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sObstagoonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_SURF, @@ -10459,7 +10261,6 @@ static const u16 sObstagoonTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GALARIAN_FORMS @@ -10473,20 +10274,22 @@ static const u16 sWurmpleTeachableLearnset[] = { static const u16 sSilcoonTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - static const u16 sBeautiflyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -10498,20 +10301,22 @@ static const u16 sBeautiflyTeachableLearnset[] = { static const u16 sCascoonTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - static const u16 sDustoxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, @@ -10526,23 +10331,23 @@ static const u16 sDustoxTeachableLearnset[] = { static const u16 sLotadTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -10552,67 +10357,59 @@ static const u16 sLotadTeachableLearnset[] = { static const u16 sLombreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sLudicoloTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -10624,86 +10421,80 @@ static const u16 sLudicoloTeachableLearnset[] = { #if P_FAMILY_SEEDOT static const u16 sSeedotTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sNuzleafTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sShiftryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -10716,14 +10507,16 @@ static const u16 sShiftryTeachableLearnset[] = { static const u16 sTaillowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -10734,15 +10527,17 @@ static const u16 sTaillowTeachableLearnset[] = { static const u16 sSwellowTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -10756,15 +10551,18 @@ static const u16 sWingullTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_SURF, @@ -10779,17 +10577,19 @@ static const u16 sPelipperTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_SURF, @@ -10804,24 +10604,22 @@ static const u16 sPelipperTeachableLearnset[] = { #if P_FAMILY_RALTS static const u16 sRaltsTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -10830,7 +10628,6 @@ static const u16 sRaltsTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10838,25 +10635,23 @@ static const u16 sRaltsTeachableLearnset[] = { static const u16 sKirliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -10865,7 +10660,6 @@ static const u16 sKirliaTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10873,25 +10667,23 @@ static const u16 sKirliaTeachableLearnset[] = { static const u16 sGardevoirTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -10900,7 +10692,6 @@ static const u16 sGardevoirTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10910,43 +10701,39 @@ static const u16 sGardevoirTeachableLearnset[] = { static const u16 sGalladeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -10958,15 +10745,18 @@ static const u16 sGalladeTeachableLearnset[] = { static const u16 sSurskitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -10982,16 +10772,19 @@ static const u16 sMasquerainTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -11007,23 +10800,24 @@ static const u16 sMasquerainTeachableLearnset[] = { #if P_FAMILY_SHROOMISH static const u16 sShroomishTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11031,37 +10825,33 @@ static const u16 sShroomishTeachableLearnset[] = { static const u16 sBreloomTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11072,28 +10862,24 @@ static const u16 sSlakothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11111,31 +10897,27 @@ static const u16 sVigorothTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11145,7 +10927,6 @@ static const u16 sVigorothTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11155,32 +10936,28 @@ static const u16 sSlakingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11190,7 +10967,6 @@ static const u16 sSlakingTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11202,14 +10978,17 @@ static const u16 sNincadaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -11222,19 +11001,21 @@ static const u16 sNinjaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -11244,16 +11025,18 @@ static const u16 sShedinjaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -11267,21 +11050,19 @@ static const u16 sShedinjaTeachableLearnset[] = { static const u16 sWhismurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11294,27 +11075,24 @@ static const u16 sWhismurTeachableLearnset[] = { static const u16 sLoudredTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11330,28 +11108,25 @@ static const u16 sLoudredTeachableLearnset[] = { static const u16 sExploudTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11369,26 +11144,22 @@ static const u16 sExploudTeachableLearnset[] = { #if P_FAMILY_MAKUHITA static const u16 sMakuhitaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, @@ -11400,27 +11171,23 @@ static const u16 sMakuhitaTeachableLearnset[] = { static const u16 sHariyamaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, @@ -11434,25 +11201,24 @@ static const u16 sHariyamaTeachableLearnset[] = { #if P_FAMILY_NOSEPASS static const u16 sNosepassTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -11461,26 +11227,25 @@ static const u16 sNosepassTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sProbopassTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -11492,27 +11257,27 @@ static const u16 sProbopassTeachableLearnset[] = { static const u16 sSkittyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11521,22 +11286,23 @@ static const u16 sSkittyTeachableLearnset[] = { static const u16 sDelcattyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11544,7 +11310,6 @@ static const u16 sDelcattyTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11555,34 +11320,30 @@ static const u16 sDelcattyTeachableLearnset[] = { static const u16 sSableyeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -11590,7 +11351,6 @@ static const u16 sSableyeTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -11601,34 +11361,30 @@ static const u16 sSableyeTeachableLearnset[] = { #if P_FAMILY_MAWILE static const u16 sMawileTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -11640,22 +11396,23 @@ static const u16 sMawileTeachableLearnset[] = { static const u16 sAronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -11667,22 +11424,23 @@ static const u16 sAronTeachableLearnset[] = { static const u16 sLaironTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -11695,12 +11453,9 @@ static const u16 sAggronTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -11708,20 +11463,20 @@ static const u16 sAggronTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -11730,7 +11485,6 @@ static const u16 sAggronTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11741,30 +11495,25 @@ static const u16 sAggronTeachableLearnset[] = { static const u16 sMedititeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STRENGTH, @@ -11774,35 +11523,29 @@ static const u16 sMedititeTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sMedichamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_STRENGTH, @@ -11817,36 +11560,37 @@ static const u16 sMedichamTeachableLearnset[] = { #if P_FAMILY_ELECTRIKE static const u16 sElectrikeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sManectricTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -11854,13 +11598,14 @@ static const u16 sManectricTeachableLearnset[] = { MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11869,26 +11614,22 @@ static const u16 sManectricTeachableLearnset[] = { #if P_FAMILY_PLUSLE static const u16 sPlusleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11897,25 +11638,21 @@ static const u16 sPlusleTeachableLearnset[] = { #if P_FAMILY_MINUN static const u16 sMinunTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -11925,23 +11662,20 @@ static const u16 sMinunTeachableLearnset[] = { static const u16 sVolbeatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11950,7 +11684,6 @@ static const u16 sVolbeatTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11959,23 +11692,20 @@ static const u16 sVolbeatTeachableLearnset[] = { static const u16 sIllumiseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -11983,7 +11713,6 @@ static const u16 sIllumiseTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -11994,44 +11723,46 @@ static const u16 sIllumiseTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sBudewTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sRoseliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -12039,22 +11770,24 @@ static const u16 sRoseliaTeachableLearnset[] = { #if P_GEN_4_CROSS_EVOS static const u16 sRoseradeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -12064,20 +11797,19 @@ static const u16 sRoseradeTeachableLearnset[] = { #if P_FAMILY_GULPIN static const u16 sGulpinTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -12085,34 +11817,29 @@ static const u16 sGulpinTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sSwalotTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -12120,9 +11847,7 @@ static const u16 sSwalotTeachableLearnset[] = { MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -12134,14 +11859,17 @@ static const u16 sCarvanhaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_THIEF, @@ -12156,19 +11884,22 @@ static const u16 sSharpedoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TAUNT, @@ -12185,20 +11916,22 @@ static const u16 sSharpedoTeachableLearnset[] = { static const u16 sWailmerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -12210,21 +11943,23 @@ static const u16 sWailmerTeachableLearnset[] = { static const u16 sWailordTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -12237,50 +11972,50 @@ static const u16 sWailordTeachableLearnset[] = { #if P_FAMILY_NUMEL static const u16 sNumelTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sCameruptTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -12292,23 +12027,23 @@ static const u16 sCameruptTeachableLearnset[] = { #if P_FAMILY_TORKOAL static const u16 sTorkoalTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -12321,13 +12056,12 @@ static const u16 sTorkoalTeachableLearnset[] = { #if P_FAMILY_SPOINK static const u16 sSpoinkTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -12335,6 +12069,8 @@ static const u16 sSpoinkTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -12342,7 +12078,6 @@ static const u16 sSpoinkTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -12350,29 +12085,25 @@ static const u16 sSpoinkTeachableLearnset[] = { static const u16 sGrumpigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_SEISMIC_TOSS, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -12380,7 +12111,6 @@ static const u16 sGrumpigTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -12390,29 +12120,24 @@ static const u16 sGrumpigTeachableLearnset[] = { #if P_FAMILY_SPINDA static const u16 sSpindaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -12429,20 +12154,21 @@ static const u16 sSpindaTeachableLearnset[] = { #if P_FAMILY_TRAPINCH static const u16 sTrapinchTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -12453,22 +12179,23 @@ static const u16 sTrapinchTeachableLearnset[] = { static const u16 sVibravaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, @@ -12480,9 +12207,7 @@ static const u16 sVibravaTeachableLearnset[] = { static const u16 sFlygonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -12490,17 +12215,18 @@ static const u16 sFlygonTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, @@ -12513,59 +12239,53 @@ static const u16 sFlygonTeachableLearnset[] = { #if P_FAMILY_CACNEA static const u16 sCacneaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_PUNCH, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sCacturneTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -12577,17 +12297,18 @@ static const u16 sCacturneTeachableLearnset[] = { static const u16 sSwabluTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -12599,25 +12320,26 @@ static const u16 sSwabluTeachableLearnset[] = { static const u16 sAltariaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -12632,42 +12354,37 @@ static const u16 sZangooseTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -12677,26 +12394,27 @@ static const u16 sZangooseTeachableLearnset[] = { #if P_FAMILY_SEVIPER static const u16 sSeviperTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -12707,16 +12425,14 @@ static const u16 sSeviperTeachableLearnset[] = { #if P_FAMILY_LUNATONE static const u16 sLunatoneTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -12725,10 +12441,11 @@ static const u16 sLunatoneTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_TOXIC, @@ -12738,17 +12455,15 @@ static const u16 sLunatoneTeachableLearnset[] = { #if P_FAMILY_SOLROCK static const u16 sSolrockTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -12757,15 +12472,15 @@ static const u16 sSolrockTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -12776,18 +12491,20 @@ static const u16 sBarboachTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_TOXIC, @@ -12800,22 +12517,23 @@ static const u16 sWhiscashTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, @@ -12831,26 +12549,25 @@ static const u16 sCorphishTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -12863,28 +12580,27 @@ static const u16 sCrawdauntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -12898,13 +12614,12 @@ static const u16 sCrawdauntTeachableLearnset[] = { static const u16 sBaltoyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -12912,10 +12627,11 @@ static const u16 sBaltoyTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -12927,13 +12643,12 @@ static const u16 sBaltoyTeachableLearnset[] = { static const u16 sClaydolTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -12942,11 +12657,12 @@ static const u16 sClaydolTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -12960,49 +12676,49 @@ static const u16 sClaydolTeachableLearnset[] = { #if P_FAMILY_LILEEP static const u16 sLileepTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sCradilyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13012,21 +12728,21 @@ static const u16 sCradilyTeachableLearnset[] = { static const u16 sAnorithTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -13035,26 +12751,25 @@ static const u16 sAnorithTeachableLearnset[] = { static const u16 sArmaldoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -13066,32 +12781,34 @@ static const u16 sFeebasTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sMiloticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -13099,7 +12816,9 @@ static const u16 sMiloticTeachableLearnset[] = { MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -13112,19 +12831,21 @@ static const u16 sMiloticTeachableLearnset[] = { static const u16 sCastformTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -13132,7 +12853,6 @@ static const u16 sCastformTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -13144,30 +12864,26 @@ static const u16 sKecleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -13178,7 +12894,6 @@ static const u16 sKecleonTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -13188,29 +12903,27 @@ static const u16 sKecleonTeachableLearnset[] = { #if P_FAMILY_SHUPPET static const u16 sShuppetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -13218,30 +12931,28 @@ static const u16 sShuppetTeachableLearnset[] = { static const u16 sBanetteTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -13252,18 +12963,19 @@ static const u16 sBanetteTeachableLearnset[] = { static const u16 sDuskullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -13278,30 +12990,25 @@ static const u16 sDuskullTeachableLearnset[] = { static const u16 sDusclopsTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -13318,27 +13025,25 @@ static const u16 sDusclopsTeachableLearnset[] = { static const u16 sDusknoirTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -13357,29 +13062,30 @@ static const u16 sDusknoirTeachableLearnset[] = { static const u16 sTropiusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13390,53 +13096,54 @@ static const u16 sTropiusTeachableLearnset[] = { static const u16 sChinglingTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; #endif //P_GEN_4_CROSS_EVOS - static const u16 sChimechoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -13448,39 +13155,36 @@ static const u16 sAbsolTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -13492,18 +13196,20 @@ static const u16 sAbsolTeachableLearnset[] = { static const u16 sSnoruntTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -13513,21 +13219,22 @@ static const u16 sSnoruntTeachableLearnset[] = { static const u16 sGlalieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_TAUNT, MOVE_TORMENT, @@ -13540,12 +13247,12 @@ static const u16 sGlalieTeachableLearnset[] = { static const u16 sFroslassTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -13554,14 +13261,15 @@ static const u16 sFroslassTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -13574,21 +13282,22 @@ static const u16 sFroslassTeachableLearnset[] = { static const u16 sSphealTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -13600,22 +13309,23 @@ static const u16 sSphealTeachableLearnset[] = { static const u16 sSealeoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -13627,26 +13337,26 @@ static const u16 sSealeoTeachableLearnset[] = { static const u16 sWalreinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -13658,16 +13368,18 @@ static const u16 sWalreinTeachableLearnset[] = { static const u16 sClamperlTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -13678,18 +13390,20 @@ static const u16 sClamperlTeachableLearnset[] = { static const u16 sHuntailTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SURF, MOVE_TOXIC, @@ -13701,19 +13415,21 @@ static const u16 sHuntailTeachableLearnset[] = { static const u16 sGorebyssTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SURF, MOVE_TOXIC, @@ -13727,24 +13443,25 @@ static const u16 sGorebyssTeachableLearnset[] = { static const u16 sRelicanthTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -13758,15 +13475,18 @@ static const u16 sLuvdiscTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -13779,22 +13499,23 @@ static const u16 sLuvdiscTeachableLearnset[] = { static const u16 sBagonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -13804,22 +13525,23 @@ static const u16 sBagonTeachableLearnset[] = { static const u16 sShelgonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -13829,10 +13551,8 @@ static const u16 sShelgonTeachableLearnset[] = { static const u16 sSalamenceTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -13840,15 +13560,18 @@ static const u16 sSalamenceTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -13864,16 +13587,15 @@ static const u16 sBeldumTeachableLearnset[] = { static const u16 sMetangTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -13881,10 +13603,11 @@ static const u16 sMetangTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -13895,16 +13618,15 @@ static const u16 sMetangTeachableLearnset[] = { static const u16 sMetagrossTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -13912,10 +13634,11 @@ static const u16 sMetagrossTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -13927,33 +13650,28 @@ static const u16 sMetagrossTeachableLearnset[] = { #if P_FAMILY_REGIROCK static const u16 sRegirockTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13962,33 +13680,28 @@ static const u16 sRegirockTeachableLearnset[] = { #if P_FAMILY_REGICE static const u16 sRegiceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -13997,33 +13710,28 @@ static const u16 sRegiceTeachableLearnset[] = { #if P_FAMILY_REGISTEEL static const u16 sRegisteelTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -14033,18 +13741,17 @@ static const u16 sRegisteelTeachableLearnset[] = { static const u16 sLatiasTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -14053,9 +13760,11 @@ static const u16 sLatiasTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -14064,7 +13773,6 @@ static const u16 sLatiasTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14076,18 +13784,17 @@ static const u16 sLatiasTeachableLearnset[] = { static const u16 sLatiosTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -14096,9 +13803,11 @@ static const u16 sLatiosTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -14107,7 +13816,6 @@ static const u16 sLatiosTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14118,31 +13826,31 @@ static const u16 sLatiosTeachableLearnset[] = { #if P_FAMILY_KYOGRE static const u16 sKyogreTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14153,13 +13861,10 @@ static const u16 sKyogreTeachableLearnset[] = { #if P_FAMILY_GROUDON static const u16 sGroudonTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -14167,28 +13872,26 @@ static const u16 sGroudonTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -14198,11 +13901,9 @@ static const u16 sGroudonTeachableLearnset[] = { static const u16 sRayquazaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -14210,6 +13911,8 @@ static const u16 sRayquazaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -14217,20 +13920,19 @@ static const u16 sRayquazaTeachableLearnset[] = { MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14241,32 +13943,29 @@ static const u16 sRayquazaTeachableLearnset[] = { #if P_FAMILY_JIRACHI static const u16 sJirachiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -14276,16 +13975,15 @@ static const u16 sJirachiTeachableLearnset[] = { #if P_FAMILY_DEOXYS static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -14294,11 +13992,11 @@ static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -14309,7 +14007,6 @@ static const u16 sDeoxysNormalTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -14318,32 +14015,28 @@ static const u16 sDeoxysNormalTeachableLearnset[] = { static const u16 sDeoxysAttackTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -14354,7 +14047,6 @@ static const u16 sDeoxysAttackTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -14363,32 +14055,28 @@ static const u16 sDeoxysAttackTeachableLearnset[] = { static const u16 sDeoxysDefenseTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -14399,7 +14087,6 @@ static const u16 sDeoxysDefenseTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -14408,32 +14095,28 @@ static const u16 sDeoxysDefenseTeachableLearnset[] = { static const u16 sDeoxysSpeedTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -14444,7 +14127,6 @@ static const u16 sDeoxysSpeedTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -14455,83 +14137,85 @@ static const u16 sDeoxysSpeedTeachableLearnset[] = { #if P_FAMILY_TURTWIG static const u16 sTurtwigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sGrotleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sTorterraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -14543,26 +14227,25 @@ static const u16 sChimcharTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -14575,26 +14258,25 @@ static const u16 sMonfernoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -14605,34 +14287,32 @@ static const u16 sMonfernoTeachableLearnset[] = { static const u16 sInfernapeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -14650,16 +14330,19 @@ static const u16 sPiplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -14675,16 +14358,19 @@ static const u16 sPrinplupTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -14697,29 +14383,29 @@ static const u16 sEmpoleonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14731,48 +14417,55 @@ static const u16 sEmpoleonTeachableLearnset[] = { static const u16 sStarlyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sStaraviaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sStaraptorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -14787,56 +14480,57 @@ static const u16 sBidoofTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sBibarelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -14848,7 +14542,6 @@ static const u16 sBibarelTeachableLearnset[] = { static const u16 sKricketotTeachableLearnset[] = { MOVE_UNAVAILABLE, }; - static const u16 sKricketuneTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, @@ -14857,15 +14550,18 @@ static const u16 sKricketuneTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -14875,71 +14571,74 @@ static const u16 sKricketuneTeachableLearnset[] = { #if P_FAMILY_SHINX static const u16 sShinxTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sLuxioTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sLuxrayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -14949,28 +14648,28 @@ static const u16 sLuxrayTeachableLearnset[] = { static const u16 sCranidosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -14981,11 +14680,9 @@ static const u16 sCranidosTeachableLearnset[] = { static const u16 sRampardosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -14993,22 +14690,24 @@ static const u16 sRampardosTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -15021,25 +14720,25 @@ static const u16 sRampardosTeachableLearnset[] = { static const u16 sShieldonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -15054,15 +14753,14 @@ static const u16 sShieldonTeachableLearnset[] = { static const u16 sBastiodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -15070,11 +14768,12 @@ static const u16 sBastiodonTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -15089,6 +14788,7 @@ static const u16 sBastiodonTeachableLearnset[] = { #if P_FAMILY_BURMY static const u16 sBurmyTeachableLearnset[] = { + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_UNAVAILABLE, }; @@ -15098,16 +14798,19 @@ static const u16 sWormadamPlantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15121,19 +14824,22 @@ static const u16 sWormadamSandyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15147,16 +14853,19 @@ static const u16 sWormadamTrashTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15170,16 +14879,19 @@ static const u16 sMothimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15202,10 +14914,14 @@ static const u16 sVespiquenTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -15224,18 +14940,21 @@ static const u16 sPachirisuTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15252,15 +14971,19 @@ static const u16 sBuizelTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TAUNT, @@ -15270,30 +14993,30 @@ static const u16 sBuizelTeachableLearnset[] = { MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sFloatzelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TAUNT, @@ -15310,17 +15033,19 @@ static const u16 sFloatzelTeachableLearnset[] = { static const u16 sCherubiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15328,18 +15053,20 @@ static const u16 sCherubiTeachableLearnset[] = { static const u16 sCherrimTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15349,19 +15076,20 @@ static const u16 sCherrimTeachableLearnset[] = { static const u16 sShellosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -15372,24 +15100,25 @@ static const u16 sShellosTeachableLearnset[] = { static const u16 sGastrodonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, @@ -15404,19 +15133,20 @@ static const u16 sGastrodonTeachableLearnset[] = { static const u16 sDrifloonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -15424,7 +15154,6 @@ static const u16 sDrifloonTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15432,20 +15161,21 @@ static const u16 sDrifloonTeachableLearnset[] = { static const u16 sDrifblimTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -15453,7 +15183,6 @@ static const u16 sDrifblimTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15464,24 +15193,24 @@ static const u16 sBunearyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -15492,28 +15221,27 @@ static const u16 sLopunnyTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -15526,15 +15254,17 @@ static const u16 sGlameowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -15552,20 +15282,21 @@ static const u16 sGlameowTeachableLearnset[] = { static const u16 sPuruglyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -15584,21 +15315,22 @@ static const u16 sPuruglyTeachableLearnset[] = { #if P_FAMILY_STUNKY static const u16 sStunkyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -15612,22 +15344,23 @@ static const u16 sStunkyTeachableLearnset[] = { static const u16 sSkuntankTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -15643,23 +15376,24 @@ static const u16 sSkuntankTeachableLearnset[] = { #if P_FAMILY_BRONZOR static const u16 sBronzorTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15669,14 +15403,13 @@ static const u16 sBronzorTeachableLearnset[] = { }; static const u16 sBronzongTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -15684,11 +15417,12 @@ static const u16 sBronzongTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -15706,9 +15440,13 @@ static const u16 sChatotTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -15722,18 +15460,20 @@ static const u16 sChatotTeachableLearnset[] = { #if P_FAMILY_SPIRITOMB static const u16 sSpiritombTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -15752,90 +15492,88 @@ static const u16 sSpiritombTeachableLearnset[] = { static const u16 sGibleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sGabiteTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sGarchompTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15847,25 +15585,24 @@ static const u16 sRioluTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -15873,33 +15610,30 @@ static const u16 sRioluTeachableLearnset[] = { static const u16 sLucarioTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -15909,44 +15643,45 @@ static const u16 sLucarioTeachableLearnset[] = { #if P_FAMILY_HIPPOPOTAS static const u16 sHippopotasTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sHippowdonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -15965,17 +15700,20 @@ static const u16 sSkorupiTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -15993,20 +15731,22 @@ static const u16 sDrapionTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -16021,20 +15761,20 @@ static const u16 sCroagunkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -16046,34 +15786,32 @@ static const u16 sCroagunkTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sToxicroakTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -16090,14 +15828,17 @@ static const u16 sCarnivineTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -16112,12 +15853,16 @@ static const u16 sFinneonTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -16125,7 +15870,6 @@ static const u16 sFinneonTeachableLearnset[] = { MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sLumineonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, @@ -16134,13 +15878,17 @@ static const u16 sLumineonTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THIEF, MOVE_TOXIC, @@ -16154,61 +15902,58 @@ static const u16 sLumineonTeachableLearnset[] = { static const u16 sSnoverTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sAbomasnowTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -16218,14 +15963,17 @@ static const u16 sAbomasnowTeachableLearnset[] = { #if P_FAMILY_ROTOM static const u16 sRotomTeachableLearnset[] = { MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -16233,7 +15981,6 @@ static const u16 sRotomTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16243,21 +15990,23 @@ static const u16 sRotomTeachableLearnset[] = { static const u16 sUxieTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -16265,7 +16014,6 @@ static const u16 sUxieTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -16276,30 +16024,30 @@ static const u16 sUxieTeachableLearnset[] = { static const u16 sMespritTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -16309,25 +16057,25 @@ static const u16 sMespritTeachableLearnset[] = { #if P_FAMILY_AZELF static const u16 sAzelfTeachableLearnset[] = { MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -16335,7 +16083,6 @@ static const u16 sAzelfTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -16347,7 +16094,6 @@ static const u16 sAzelfTeachableLearnset[] = { static const u16 sDialgaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -16358,6 +16104,8 @@ static const u16 sDialgaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -16365,18 +16113,18 @@ static const u16 sDialgaTeachableLearnset[] = { MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16386,7 +16134,6 @@ static const u16 sDialgaTeachableLearnset[] = { static const u16 sPalkiaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -16398,25 +16145,27 @@ static const u16 sPalkiaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -16427,23 +16176,24 @@ static const u16 sPalkiaTeachableLearnset[] = { #if P_FAMILY_HEATRAN static const u16 sHeatranTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -16457,29 +16207,27 @@ static const u16 sHeatranTeachableLearnset[] = { #if P_FAMILY_REGIGIGAS static const u16 sRegigigasTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16488,24 +16236,26 @@ static const u16 sRegigigasTeachableLearnset[] = { #if P_FAMILY_GIRATINA static const u16 sGiratinaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, @@ -16513,7 +16263,6 @@ static const u16 sGiratinaTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16522,12 +16271,12 @@ static const u16 sGiratinaTeachableLearnset[] = { #if P_FAMILY_CRESSELIA static const u16 sCresseliaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -16536,14 +16285,15 @@ static const u16 sCresseliaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16556,12 +16306,16 @@ static const u16 sPhioneTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -16576,7 +16330,9 @@ static const u16 sManaphyTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -16585,7 +16341,9 @@ static const u16 sManaphyTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SURF, @@ -16604,31 +16362,31 @@ static const u16 sDarkraiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -16639,19 +16397,21 @@ static const u16 sDarkraiTeachableLearnset[] = { static const u16 sShayminLandTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16659,19 +16419,21 @@ static const u16 sShayminLandTeachableLearnset[] = { static const u16 sShayminSkyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16681,25 +16443,24 @@ static const u16 sShayminSkyTeachableLearnset[] = { static const u16 sArceusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -16710,13 +16471,13 @@ static const u16 sArceusTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -16724,11 +16485,9 @@ static const u16 sArceusTeachableLearnset[] = { MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -16739,22 +16498,23 @@ static const u16 sArceusTeachableLearnset[] = { #if P_FAMILY_VICTINI static const u16 sVictiniTeachableLearnset[] = { MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -16763,7 +16523,6 @@ static const u16 sVictiniTeachableLearnset[] = { MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -16776,21 +16535,23 @@ static const u16 sSnivyTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -16803,21 +16564,23 @@ static const u16 sServineTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -16827,28 +16590,29 @@ static const u16 sServineTeachableLearnset[] = { static const u16 sSerperiorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -16859,20 +16623,22 @@ static const u16 sSerperiorTeachableLearnset[] = { #if P_FAMILY_TEPIG static const u16 sTepigTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -16883,24 +16649,25 @@ static const u16 sTepigTeachableLearnset[] = { static const u16 sPigniteTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -16911,26 +16678,27 @@ static const u16 sPigniteTeachableLearnset[] = { static const u16 sEmboarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -16950,15 +16718,18 @@ static const u16 sOshawottTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -16977,15 +16748,18 @@ static const u16 sDewottTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -16998,24 +16772,26 @@ static const u16 sSamurottTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -17028,19 +16804,21 @@ static const u16 sSamurottTeachableLearnset[] = { static const u16 sSamurottHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_WATERFALL, @@ -17058,14 +16836,17 @@ static const u16 sPatratTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDERBOLT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17076,28 +16857,28 @@ static const u16 sWatchogTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17110,17 +16891,20 @@ static const u16 sLillipupTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17131,19 +16915,22 @@ static const u16 sHerdierTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17154,13 +16941,17 @@ static const u16 sStoutlandTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, @@ -17168,7 +16959,6 @@ static const u16 sStoutlandTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17180,18 +16970,20 @@ static const u16 sPurrloinTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17202,20 +16994,22 @@ static const u16 sLiepardTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17233,13 +17027,16 @@ static const u16 sPansageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17259,14 +17056,17 @@ static const u16 sSimisageTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17288,13 +17088,16 @@ static const u16 sPansearTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17314,14 +17117,17 @@ static const u16 sSimisearTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17343,15 +17149,18 @@ static const u16 sPanpourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_THIEF, @@ -17372,16 +17181,19 @@ static const u16 sSimipourTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_THIEF, @@ -17398,22 +17210,23 @@ static const u16 sMunnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17423,9 +17236,10 @@ static const u16 sMusharnaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -17433,13 +17247,13 @@ static const u16 sMusharnaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17453,9 +17267,13 @@ static const u16 sPidoveTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17469,26 +17287,33 @@ static const u16 sTranquillTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sUnfezantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17500,47 +17325,49 @@ static const u16 sUnfezantTeachableLearnset[] = { #if P_FAMILY_BLITZLE static const u16 sBlitzleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sZebstrikaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17551,14 +17378,16 @@ static const u16 sRoggenrolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17568,14 +17397,16 @@ static const u16 sBoldoreTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17585,15 +17416,17 @@ static const u16 sGigalithTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_TOXIC, @@ -17607,25 +17440,27 @@ static const u16 sWoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_STEEL_WING, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17636,11 +17471,12 @@ static const u16 sSwoobatTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -17648,14 +17484,15 @@ static const u16 sSwoobatTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_STEEL_WING, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -17669,20 +17506,21 @@ static const u16 sDrilburTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17690,25 +17528,25 @@ static const u16 sDrilburTeachableLearnset[] = { static const u16 sExcadrillTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17718,29 +17556,28 @@ static const u16 sExcadrillTeachableLearnset[] = { static const u16 sAudinoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -17749,7 +17586,6 @@ static const u16 sAudinoTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -17760,20 +17596,19 @@ static const u16 sTimburrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17786,20 +17621,19 @@ static const u16 sGurdurrTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17810,25 +17644,23 @@ static const u16 sGurdurrTeachableLearnset[] = { static const u16 sConkeldurrTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17843,10 +17675,14 @@ static const u16 sTympoleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, @@ -17859,11 +17695,15 @@ static const u16 sPalpitoadTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_TOXIC, @@ -17880,16 +17720,17 @@ static const u16 sSeismitoadTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, @@ -17902,7 +17743,6 @@ static const u16 sSeismitoadTeachableLearnset[] = { #if P_FAMILY_THROH static const u16 sThrohTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, @@ -17910,15 +17750,15 @@ static const u16 sThrohTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17932,20 +17772,20 @@ static const u16 sSawkTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -17960,15 +17800,18 @@ static const u16 sSewaddleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -17980,15 +17823,18 @@ static const u16 sSwadloonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -18002,21 +17848,23 @@ static const u16 sLeavannyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18025,13 +17873,16 @@ static const u16 sLeavannyTeachableLearnset[] = { #if P_FAMILY_VENIPEDE static const u16 sVenipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -18041,13 +17892,16 @@ static const u16 sVenipedeTeachableLearnset[] = { static const u16 sWhirlipedeTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -18059,23 +17913,24 @@ static const u16 sScolipedeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18085,13 +17940,16 @@ static const u16 sScolipedeTeachableLearnset[] = { static const u16 sCottoneeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -18102,16 +17960,19 @@ static const u16 sCottoneeTeachableLearnset[] = { static const u16 sWhimsicottTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -18128,13 +17989,16 @@ static const u16 sPetililTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -18146,18 +18010,20 @@ static const u16 sLilligantTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18168,17 +18034,18 @@ static const u16 sLilligantHisuiTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_HISUIAN_FORMS @@ -18190,15 +18057,18 @@ static const u16 sBasculinTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CUT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_TOXIC, @@ -18210,12 +18080,15 @@ static const u16 sBasculinTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sBasculinWhiteStripedTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -18225,14 +18098,17 @@ static const u16 sBasculinWhiteStripedTeachableLearnset[] = { static const u16 sBasculegionTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SURF, MOVE_WATERFALL, @@ -18246,23 +18122,23 @@ static const u16 sBasculegionTeachableLearnset[] = { static const u16 sSandileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_TAUNT, @@ -18275,27 +18151,25 @@ static const u16 sSandileTeachableLearnset[] = { static const u16 sKrokorokTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, @@ -18309,29 +18183,27 @@ static const u16 sKrokorokTeachableLearnset[] = { static const u16 sKrookodileTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, @@ -18353,15 +18225,16 @@ static const u16 sDarumakaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -18374,7 +18247,6 @@ static const u16 sDarumakaTeachableLearnset[] = { static const u16 sDarmanitanTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, @@ -18384,17 +18256,18 @@ static const u16 sDarmanitanTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -18416,14 +18289,15 @@ static const u16 sDarumakaGalarTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -18434,7 +18308,6 @@ static const u16 sDarumakaGalarTeachableLearnset[] = { static const u16 sDarmanitanGalarTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, @@ -18443,16 +18316,17 @@ static const u16 sDarmanitanGalarTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -18469,11 +18343,15 @@ static const u16 sMaractusTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -18485,21 +18363,22 @@ static const u16 sMaractusTeachableLearnset[] = { static const u16 sDwebbleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18507,22 +18386,23 @@ static const u16 sDwebbleTeachableLearnset[] = { static const u16 sCrustleTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18533,23 +18413,22 @@ static const u16 sScraggyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, @@ -18563,33 +18442,29 @@ static const u16 sScraggyTeachableLearnset[] = { static const u16 sScraftyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -18604,10 +18479,11 @@ static const u16 sSigilyphTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -18616,14 +18492,15 @@ static const u16 sSigilyphTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18634,14 +18511,17 @@ static const u16 sYamaskTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -18655,15 +18535,18 @@ static const u16 sCofagrigusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -18679,14 +18562,17 @@ static const u16 sYamaskGalarTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_THIEF, @@ -18698,15 +18584,18 @@ static const u16 sRunerigusTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_TAUNT, @@ -18720,21 +18609,23 @@ static const u16 sRunerigusTeachableLearnset[] = { static const u16 sTirtougaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -18746,22 +18637,24 @@ static const u16 sTirtougaTeachableLearnset[] = { static const u16 sCarracostaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -18781,14 +18674,17 @@ static const u16 sArchenTeachableLearnset[] = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_TAUNT, MOVE_TORMENT, @@ -18806,15 +18702,18 @@ static const u16 sArcheopsTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_TAUNT, MOVE_TORMENT, @@ -18828,12 +18727,15 @@ static const u16 sTrubbishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -18843,17 +18745,19 @@ static const u16 sTrubbishTeachableLearnset[] = { static const u16 sGarbodorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -18869,20 +18773,22 @@ static const u16 sZoruaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -18893,29 +18799,28 @@ static const u16 sZoruaTeachableLearnset[] = { static const u16 sZoroarkTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -18930,11 +18835,15 @@ static const u16 sZoruaHisuiTeachableLearnset[] = { MOVE_DIG, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_TAUNT, @@ -18945,23 +18854,25 @@ static const u16 sZoruaHisuiTeachableLearnset[] = { static const u16 sZoroarkHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DIG, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -18978,16 +18889,19 @@ static const u16 sMinccinoTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -18997,22 +18911,24 @@ static const u16 sCinccinoTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19023,18 +18939,20 @@ static const u16 sGothitaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19042,7 +18960,6 @@ static const u16 sGothitaTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19052,19 +18969,20 @@ static const u16 sGothoritaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19072,7 +18990,6 @@ static const u16 sGothoritaTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19080,24 +18997,24 @@ static const u16 sGothoritaTeachableLearnset[] = { static const u16 sGothitelleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19105,7 +19022,6 @@ static const u16 sGothitelleTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19117,26 +19033,26 @@ static const u16 sSolosisTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_THUNDER, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19145,52 +19061,51 @@ static const u16 sDuosionTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_THUNDER, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sReuniclusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19198,7 +19113,6 @@ static const u16 sReuniclusTeachableLearnset[] = { MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19209,15 +19123,18 @@ static const u16 sDucklettTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, MOVE_TOXIC, @@ -19229,16 +19146,19 @@ static const u16 sSwannaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, MOVE_TOXIC, @@ -19252,14 +19172,17 @@ static const u16 sVanilliteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -19270,14 +19193,17 @@ static const u16 sVanillishTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -19288,15 +19214,18 @@ static const u16 sVanilluxeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -19307,50 +19236,51 @@ static const u16 sVanilluxeTeachableLearnset[] = { #if P_FAMILY_DEERLING static const u16 sDeerlingTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSawsbuckTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19364,17 +19294,20 @@ static const u16 sEmolgaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19384,16 +19317,17 @@ static const u16 sEmolgaTeachableLearnset[] = { static const u16 sKarrablastTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19401,18 +19335,19 @@ static const u16 sKarrablastTeachableLearnset[] = { static const u16 sEscavalierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_COUNTER, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19422,15 +19357,18 @@ static const u16 sEscavalierTeachableLearnset[] = { #if P_FAMILY_FOONGUS static const u16 sFoongusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -19440,16 +19378,19 @@ static const u16 sFoongusTeachableLearnset[] = { static const u16 sAmoongussTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -19464,17 +19405,20 @@ static const u16 sFrillishTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -19485,24 +19429,26 @@ static const u16 sFrillishTeachableLearnset[] = { MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; - static const u16 sJellicentTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_DIVE, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -19519,12 +19465,13 @@ static const u16 sJellicentTeachableLearnset[] = { static const u16 sAlomomolaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -19532,7 +19479,9 @@ static const u16 sAlomomolaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SURF, @@ -19550,16 +19499,19 @@ static const u16 sJoltikTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19570,17 +19522,20 @@ static const u16 sGalvantulaTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19591,17 +19546,19 @@ static const u16 sFerroseedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19612,22 +19569,23 @@ static const u16 sFerrothornTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19637,14 +19595,17 @@ static const u16 sFerrothornTeachableLearnset[] = { static const u16 sKlinkTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19652,14 +19613,17 @@ static const u16 sKlinkTeachableLearnset[] = { static const u16 sKlangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19667,15 +19631,18 @@ static const u16 sKlangTeachableLearnset[] = { static const u16 sKlinklangTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19684,33 +19651,33 @@ static const u16 sKlinklangTeachableLearnset[] = { #if P_FAMILY_TYNAMO static const u16 sTynamoTeachableLearnset[] = { MOVE_PROTECT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sEelektrikTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sEelektrossTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -19720,23 +19687,25 @@ static const u16 sEelektrossTeachableLearnset[] = { MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATERFALL, MOVE_UNAVAILABLE, @@ -19748,18 +19717,20 @@ static const u16 sElgyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19767,7 +19738,6 @@ static const u16 sElgyemTeachableLearnset[] = { MOVE_STEEL_WING, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19776,9 +19746,10 @@ static const u16 sBeheeyemTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -19786,9 +19757,10 @@ static const u16 sBeheeyemTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -19796,7 +19768,6 @@ static const u16 sBeheeyemTeachableLearnset[] = { MOVE_STEEL_WING, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -19807,16 +19778,19 @@ static const u16 sLitwickTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -19831,16 +19805,19 @@ static const u16 sLampentTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -19855,17 +19832,20 @@ static const u16 sChandelureTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -19882,25 +19862,26 @@ static const u16 sAxewTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19910,25 +19891,26 @@ static const u16 sFraxureTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19937,30 +19919,29 @@ static const u16 sFraxureTeachableLearnset[] = { static const u16 sHaxorusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -19972,22 +19953,22 @@ static const u16 sCubchooTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TAUNT, @@ -20001,32 +19982,30 @@ static const u16 sBearticTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -20039,11 +20018,11 @@ static const u16 sBearticTeachableLearnset[] = { static const u16 sCryogonalTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -20051,6 +20030,8 @@ static const u16 sCryogonalTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -20061,14 +20042,16 @@ static const u16 sCryogonalTeachableLearnset[] = { #if P_FAMILY_SHELMET static const u16 sShelmetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20076,16 +20059,18 @@ static const u16 sShelmetTeachableLearnset[] = { static const u16 sAccelgorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20100,18 +20085,20 @@ static const u16 sStunfiskTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -20120,19 +20107,20 @@ static const u16 sStunfiskTeachableLearnset[] = { #if P_GALARIAN_FORMS static const u16 sStunfiskGalarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -20150,18 +20138,18 @@ static const u16 sMienfooTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20174,23 +20162,22 @@ static const u16 sMienshaoTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20201,7 +20188,6 @@ static const u16 sMienshaoTeachableLearnset[] = { static const u16 sDruddigonTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, @@ -20209,16 +20195,18 @@ static const u16 sDruddigonTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -20234,28 +20222,27 @@ static const u16 sDruddigonTeachableLearnset[] = { #if P_FAMILY_GOLETT static const u16 sGolettTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STRENGTH, @@ -20266,30 +20253,29 @@ static const u16 sGolettTeachableLearnset[] = { }; static const u16 sGolurkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -20311,17 +20297,19 @@ static const u16 sPawniardTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20335,18 +20323,20 @@ static const u16 sBisharpTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SNATCH, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20358,16 +20348,18 @@ static const u16 sKingambitTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_UNAVAILABLE, }; @@ -20378,21 +20370,22 @@ static const u16 sKingambitTeachableLearnset[] = { static const u16 sBouffalantTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20403,19 +20396,20 @@ static const u16 sBouffalantTeachableLearnset[] = { static const u16 sRuffletTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -20426,20 +20420,21 @@ static const u16 sRuffletTeachableLearnset[] = { static const u16 sBraviaryTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -20450,20 +20445,21 @@ static const u16 sBraviaryTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sBraviaryHisuiTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -20476,15 +20472,18 @@ static const u16 sVullabyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STEEL_WING, @@ -20500,17 +20499,20 @@ static const u16 sMandibuzzTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_STEEL_WING, @@ -20527,7 +20529,6 @@ static const u16 sMandibuzzTeachableLearnset[] = { static const u16 sHeatmorTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, @@ -20535,13 +20536,17 @@ static const u16 sHeatmorTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -20560,14 +20565,16 @@ static const u16 sDurantTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -20576,20 +20583,22 @@ static const u16 sDurantTeachableLearnset[] = { #if P_FAMILY_DEINO static const u16 sDeinoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20597,20 +20606,22 @@ static const u16 sDeinoTeachableLearnset[] = { static const u16 sZweilousTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20618,23 +20629,25 @@ static const u16 sZweilousTeachableLearnset[] = { static const u16 sHydreigonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_STRENGTH, @@ -20642,7 +20655,6 @@ static const u16 sHydreigonTeachableLearnset[] = { MOVE_SURF, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20652,20 +20664,22 @@ static const u16 sHydreigonTeachableLearnset[] = { #if P_FAMILY_LARVESTA static const u16 sLarvestaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -20675,15 +20689,15 @@ static const u16 sLarvestaTeachableLearnset[] = { static const u16 sVolcaronaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -20691,7 +20705,9 @@ static const u16 sVolcaronaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -20702,27 +20718,27 @@ static const u16 sVolcaronaTeachableLearnset[] = { #if P_FAMILY_COBALION static const u16 sCobalionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -20731,26 +20747,26 @@ static const u16 sCobalionTeachableLearnset[] = { #if P_FAMILY_TERRAKION static const u16 sTerrakionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20760,28 +20776,29 @@ static const u16 sTerrakionTeachableLearnset[] = { #if P_FAMILY_VIRIZION static const u16 sVirizionTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20792,21 +20809,23 @@ static const u16 sVirizionTeachableLearnset[] = { static const u16 sTornadusTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -20821,19 +20840,22 @@ static const u16 sTornadusTeachableLearnset[] = { #if P_FAMILY_THUNDURUS static const u16 sThundurusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -20842,7 +20864,6 @@ static const u16 sThundurusTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20851,15 +20872,15 @@ static const u16 sThundurusTeachableLearnset[] = { #if P_FAMILY_RESHIRAM static const u16 sReshiramTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -20868,11 +20889,12 @@ static const u16 sReshiramTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, @@ -20885,16 +20907,16 @@ static const u16 sReshiramTeachableLearnset[] = { #if P_FAMILY_ZEKROM static const u16 sZekromTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FLASH, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -20902,11 +20924,12 @@ static const u16 sZekromTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, @@ -20914,7 +20937,6 @@ static const u16 sZekromTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -20923,30 +20945,30 @@ static const u16 sZekromTeachableLearnset[] = { #if P_FAMILY_LANDORUS static const u16 sLandorusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -20957,13 +20979,14 @@ static const u16 sLandorusTeachableLearnset[] = { static const u16 sKyuremTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -20972,11 +20995,12 @@ static const u16 sKyuremTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STEEL_WING, MOVE_STRENGTH, @@ -20992,22 +21016,24 @@ static const u16 sKeldeoTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -21020,29 +21046,29 @@ static const u16 sMeloettaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21053,12 +21079,13 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -21066,11 +21093,12 @@ static const u16 sGenesectTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21080,7 +21108,6 @@ static const u16 sGenesectTeachableLearnset[] = { static const u16 sChespinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, @@ -21090,21 +21117,23 @@ static const u16 sChespinTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -21113,7 +21142,6 @@ static const u16 sChespinTeachableLearnset[] = { static const u16 sQuilladinTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, @@ -21123,21 +21151,23 @@ static const u16 sQuilladinTeachableLearnset[] = { MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -21146,35 +21176,35 @@ static const u16 sQuilladinTeachableLearnset[] = { static const u16 sChesnaughtTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -21187,10 +21217,11 @@ static const u16 sFennekinTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -21198,7 +21229,9 @@ static const u16 sFennekinTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -21212,10 +21245,11 @@ static const u16 sBraixenTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -21223,7 +21257,9 @@ static const u16 sBraixenTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -21239,21 +21275,23 @@ static const u16 sDelphoxTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -21271,19 +21309,21 @@ static const u16 sFroakieTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SURF, @@ -21300,23 +21340,24 @@ static const u16 sFrogadierTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -21330,24 +21371,25 @@ static const u16 sGreninjaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, MOVE_BRICK_BREAK, - MOVE_COUNTER, MOVE_CUT, MOVE_DIG, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -21367,17 +21409,19 @@ static const u16 sBunnelbyTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, @@ -21386,7 +21430,6 @@ static const u16 sBunnelbyTeachableLearnset[] = { static const u16 sDiggersbyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -21395,21 +21438,21 @@ static const u16 sDiggersbyTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TORMENT, MOVE_TOXIC, @@ -21421,18 +21464,20 @@ static const u16 sDiggersbyTeachableLearnset[] = { static const u16 sFletchlingTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -21442,20 +21487,22 @@ static const u16 sFletchlingTeachableLearnset[] = { static const u16 sFletchinderTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -21466,22 +21513,24 @@ static const u16 sTalonflameTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -21505,17 +21554,20 @@ static const u16 sVivillonTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -21527,20 +21579,22 @@ static const u16 sVivillonTeachableLearnset[] = { #if P_FAMILY_LITLEO static const u16 sLitleoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -21550,24 +21604,25 @@ static const u16 sLitleoTeachableLearnset[] = { MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sPyroarTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -21586,13 +21641,17 @@ static const u16 sFlabebeTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -21605,14 +21664,17 @@ static const u16 sFloetteTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -21626,15 +21688,18 @@ static const u16 sFloetteEternalTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -21648,15 +21713,18 @@ static const u16 sFlorgesTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -21668,22 +21736,23 @@ static const u16 sFlorgesTeachableLearnset[] = { #if P_FAMILY_SKIDDO static const u16 sSkiddoTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -21695,24 +21764,25 @@ static const u16 sSkiddoTeachableLearnset[] = { static const u16 sGogoatTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -21726,7 +21796,6 @@ static const u16 sGogoatTeachableLearnset[] = { static const u16 sPanchamTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -21734,22 +21803,21 @@ static const u16 sPanchamTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -21759,7 +21827,6 @@ static const u16 sPanchamTeachableLearnset[] = { static const u16 sPangoroTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -21769,24 +21836,23 @@ static const u16 sPangoroTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -21799,20 +21865,22 @@ static const u16 sPangoroTeachableLearnset[] = { static const u16 sFurfrouTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21824,9 +21892,10 @@ static const u16 sEspurrTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -21834,14 +21903,15 @@ static const u16 sEspurrTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -21853,9 +21923,10 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -21864,7 +21935,9 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -21872,7 +21945,6 @@ static const u16 sMeowsticMTeachableLearnset[] = { MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -21884,9 +21956,10 @@ static const u16 sMeowsticFTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -21895,14 +21968,15 @@ static const u16 sMeowsticFTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -21918,14 +21992,16 @@ static const u16 sHonedgeTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21937,14 +22013,16 @@ static const u16 sDoubladeTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21956,17 +22034,19 @@ static const u16 sAegislashTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -21977,15 +22057,18 @@ static const u16 sSpritzeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, @@ -21998,17 +22081,19 @@ static const u16 sAromatisseTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THUNDER, @@ -22024,19 +22109,21 @@ static const u16 sSwirlixTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDERBOLT, MOVE_TOXIC, @@ -22047,21 +22134,22 @@ static const u16 sSlurpuffTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, @@ -22080,13 +22168,16 @@ static const u16 sInkayTeachableLearnset[] = { MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, @@ -22108,6 +22199,8 @@ static const u16 sMalamarTeachableLearnset[] = { MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -22115,7 +22208,8 @@ static const u16 sMalamarTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SNATCH, MOVE_SUNNY_DAY, @@ -22139,19 +22233,21 @@ static const u16 sBinacleTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -22174,20 +22270,22 @@ static const u16 sBarbaracleTeachableLearnset[] = { MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -22204,11 +22302,15 @@ static const u16 sSkrelpTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -22226,12 +22328,16 @@ static const u16 sDragalgeTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, @@ -22254,15 +22360,17 @@ static const u16 sClauncherTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -22273,22 +22381,23 @@ static const u16 sClauncherTeachableLearnset[] = { static const u16 sClawitzerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_WATERFALL, @@ -22305,19 +22414,21 @@ static const u16 sHelioptileTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22329,24 +22440,24 @@ static const u16 sHelioliskTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22356,21 +22467,23 @@ static const u16 sHelioliskTeachableLearnset[] = { static const u16 sTyruntTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -22380,22 +22493,24 @@ static const u16 sTyruntTeachableLearnset[] = { static const u16 sTyrantrumTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -22407,13 +22522,13 @@ static const u16 sTyrantrumTeachableLearnset[] = { static const u16 sAmauraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -22422,14 +22537,14 @@ static const u16 sAmauraTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -22438,14 +22553,14 @@ static const u16 sAmauraTeachableLearnset[] = { static const u16 sAurorusTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -22455,15 +22570,15 @@ static const u16 sAurorusTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -22474,7 +22589,6 @@ static const u16 sAurorusTeachableLearnset[] = { static const u16 sHawluchaTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CUT, @@ -22483,19 +22597,19 @@ static const u16 sHawluchaTeachableLearnset[] = { MOVE_FACADE, MOVE_FLY, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -22513,18 +22627,21 @@ static const u16 sDedenneTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -22532,14 +22649,13 @@ static const u16 sDedenneTeachableLearnset[] = { #if P_FAMILY_CARBINK static const u16 sCarbinkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -22547,10 +22663,11 @@ static const u16 sCarbinkTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -22561,15 +22678,16 @@ static const u16 sCarbinkTeachableLearnset[] = { #if P_FAMILY_GOOMY static const u16 sGoomyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, @@ -22583,16 +22701,17 @@ static const u16 sGoomyTeachableLearnset[] = { static const u16 sSliggooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, @@ -22607,8 +22726,6 @@ static const u16 sSliggooTeachableLearnset[] = { static const u16 sGoodraTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, @@ -22616,18 +22733,19 @@ static const u16 sGoodraTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_STRENGTH, @@ -22643,17 +22761,18 @@ static const u16 sGoodraTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sSliggooHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, @@ -22666,23 +22785,24 @@ static const u16 sSliggooHisuiTeachableLearnset[] = { static const u16 sGoodraHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_SURF, @@ -22702,6 +22822,8 @@ static const u16 sKlefkiTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -22709,11 +22831,12 @@ static const u16 sKlefkiTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -22726,17 +22849,19 @@ static const u16 sPhantumpTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -22753,19 +22878,21 @@ static const u16 sTrevenantTeachableLearnset[] = { MOVE_CUT, MOVE_DIG, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -22782,20 +22909,21 @@ static const u16 sPumpkabooTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -22810,21 +22938,22 @@ static const u16 sGourgeistTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -22840,20 +22969,21 @@ static const u16 sGourgeistTeachableLearnset[] = { static const u16 sBergmiteTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -22864,23 +22994,24 @@ static const u16 sBergmiteTeachableLearnset[] = { static const u16 sAvaluggTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SURF, MOVE_TOXIC, @@ -22891,20 +23022,21 @@ static const u16 sAvaluggTeachableLearnset[] = { #if P_HISUIAN_FORMS static const u16 sAvaluggHisuiTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -22920,13 +23052,16 @@ static const u16 sNoibatTeachableLearnset[] = { MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SOLAR_BEAM, @@ -22943,21 +23078,22 @@ static const u16 sNoibatTeachableLearnset[] = { static const u16 sNoivernTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SOLAR_BEAM, @@ -22974,13 +23110,14 @@ static const u16 sNoivernTeachableLearnset[] = { #if P_FAMILY_XERNEAS static const u16 sXerneasTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -22988,12 +23125,12 @@ static const u16 sXerneasTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23002,19 +23139,20 @@ static const u16 sXerneasTeachableLearnset[] = { #if P_FAMILY_YVELTAL static const u16 sYveltalTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CUT, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -23028,20 +23166,22 @@ static const u16 sYveltalTeachableLearnset[] = { #if P_FAMILY_ZYGARDE static const u16 sZygardeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STRENGTH, MOVE_SUNNY_DAY, @@ -23052,25 +23192,25 @@ static const u16 sZygardeTeachableLearnset[] = { #if P_FAMILY_DIANCIE static const u16 sDiancieTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -23083,10 +23223,11 @@ static const u16 sHoopaConfinedTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -23094,9 +23235,11 @@ static const u16 sHoopaConfinedTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -23105,7 +23248,6 @@ static const u16 sHoopaConfinedTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23115,10 +23257,11 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -23126,9 +23269,11 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, @@ -23137,7 +23282,6 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23146,27 +23290,27 @@ static const u16 sHoopaUnboundTeachableLearnset[] = { #if P_FAMILY_VOLCANION static const u16 sVolcanionTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CUT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_STRENGTH, @@ -23185,16 +23329,19 @@ static const u16 sRowletTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23205,16 +23352,19 @@ static const u16 sDartrixTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23225,18 +23375,21 @@ static const u16 sDecidueyeTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23250,17 +23403,20 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -23270,19 +23426,20 @@ static const u16 sDecidueyeHisuiTeachableLearnset[] = { #if P_FAMILY_LITTEN static const u16 sLittenTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -23291,19 +23448,20 @@ static const u16 sLittenTeachableLearnset[] = { static const u16 sTorracatTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -23313,26 +23471,25 @@ static const u16 sTorracatTeachableLearnset[] = { static const u16 sIncineroarTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -23348,12 +23505,16 @@ static const u16 sPopplioTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -23364,16 +23525,19 @@ static const u16 sPopplioTeachableLearnset[] = { static const u16 sBrionneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -23384,12 +23548,13 @@ static const u16 sBrionneTeachableLearnset[] = { static const u16 sPrimarinaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -23399,6 +23564,8 @@ static const u16 sPrimarinaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SURF, MOVE_TOXIC, @@ -23417,12 +23584,15 @@ static const u16 sPikipekTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23436,12 +23606,15 @@ static const u16 sTrumbeakTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23455,14 +23628,17 @@ static const u16 sToucannonTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23473,16 +23649,19 @@ static const u16 sToucannonTeachableLearnset[] = { static const u16 sYungoosTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -23494,21 +23673,23 @@ static const u16 sYungoosTeachableLearnset[] = { static const u16 sGumshoosTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -23525,13 +23706,16 @@ static const u16 sGrubbinTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23541,14 +23725,17 @@ static const u16 sCharjabugTeachableLearnset[] = { MOVE_DIG, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23559,16 +23746,19 @@ static const u16 sVikavoltTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23577,7 +23767,6 @@ static const u16 sVikavoltTeachableLearnset[] = { #if P_FAMILY_CRABRAWLER static const u16 sCrabrawlerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, @@ -23585,12 +23774,15 @@ static const u16 sCrabrawlerTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, @@ -23600,7 +23792,6 @@ static const u16 sCrabrawlerTeachableLearnset[] = { static const u16 sCrabominableTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, @@ -23608,15 +23799,18 @@ static const u16 sCrabominableTeachableLearnset[] = { MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_TOXIC, @@ -23632,14 +23826,17 @@ static const u16 sOricorioTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23652,14 +23849,17 @@ static const u16 sCutieflyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -23672,15 +23872,18 @@ static const u16 sRibombeeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -23693,19 +23896,19 @@ static const u16 sRibombeeTeachableLearnset[] = { #if P_FAMILY_ROCKRUFF static const u16 sRockruffTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23713,22 +23916,22 @@ static const u16 sRockruffTeachableLearnset[] = { static const u16 sLycanrocMiddayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23736,26 +23939,23 @@ static const u16 sLycanrocMiddayTeachableLearnset[] = { static const u16 sLycanrocMidnightTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23763,22 +23963,21 @@ static const u16 sLycanrocMidnightTeachableLearnset[] = { static const u16 sLycanrocDuskTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -23789,16 +23988,19 @@ static const u16 sLycanrocDuskTeachableLearnset[] = { static const u16 sWishiwashiTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -23813,12 +24015,16 @@ static const u16 sMareanieTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SURF, @@ -23830,17 +24036,20 @@ static const u16 sMareanieTeachableLearnset[] = { static const u16 sToxapexTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SURF, @@ -23853,20 +24062,19 @@ static const u16 sToxapexTeachableLearnset[] = { #if P_FAMILY_MUDBRAY static const u16 sMudbrayTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -23875,21 +24083,20 @@ static const u16 sMudbrayTeachableLearnset[] = { static const u16 sMudsdaleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -23903,11 +24110,15 @@ static const u16 sDewpiderTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -23918,18 +24129,21 @@ static const u16 sDewpiderTeachableLearnset[] = { static const u16 sAraquanidTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TOXIC, MOVE_WATERFALL, @@ -23944,13 +24158,16 @@ static const u16 sFomantisTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23962,15 +24179,18 @@ static const u16 sLurantisTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23980,18 +24200,20 @@ static const u16 sLurantisTeachableLearnset[] = { static const u16 sMorelullTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -23999,20 +24221,22 @@ static const u16 sMorelullTeachableLearnset[] = { static const u16 sShiinoticTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLASH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24026,16 +24250,19 @@ static const u16 sSalanditTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24043,23 +24270,25 @@ static const u16 sSalanditTeachableLearnset[] = { static const u16 sSalazzleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24072,20 +24301,19 @@ static const u16 sStuffulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24094,25 +24322,23 @@ static const u16 sStuffulTeachableLearnset[] = { static const u16 sBewearTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_STRENGTH, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24125,12 +24351,16 @@ static const u16 sBounsweetTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -24142,12 +24372,16 @@ static const u16 sSteeneeTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -24159,14 +24393,17 @@ static const u16 sTsareenaTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -24182,12 +24419,16 @@ static const u16 sComfeyTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -24200,24 +24441,23 @@ static const u16 sComfeyTeachableLearnset[] = { #if P_FAMILY_ORANGURU static const u16 sOranguruTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SNATCH, @@ -24234,26 +24474,23 @@ static const u16 sOranguruTeachableLearnset[] = { static const u16 sPassimianTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SNATCH, @@ -24270,10 +24507,14 @@ static const u16 sWimpodTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_TOXIC, @@ -24290,18 +24531,20 @@ static const u16 sGolisopodTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATERFALL, @@ -24316,14 +24559,17 @@ static const u16 sSandygastTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -24334,19 +24580,21 @@ static const u16 sSandygastTeachableLearnset[] = { static const u16 sPalossandTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -24359,7 +24607,6 @@ static const u16 sPalossandTeachableLearnset[] = { #if P_FAMILY_PYUKUMUKU static const u16 sPyukumukuTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_HAIL, MOVE_LIGHT_SCREEN, @@ -24377,49 +24624,48 @@ static const u16 sPyukumukuTeachableLearnset[] = { #if P_FAMILY_TYPE_NULL static const u16 sTypeNullTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sSilvallyTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24429,21 +24675,22 @@ static const u16 sSilvallyTeachableLearnset[] = { static const u16 sMiniorTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24453,21 +24700,21 @@ static const u16 sMiniorTeachableLearnset[] = { #if P_FAMILY_KOMALA static const u16 sKomalaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24477,24 +24724,24 @@ static const u16 sKomalaTeachableLearnset[] = { #if P_FAMILY_TURTONATOR static const u16 sTurtonatorTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -24509,16 +24756,19 @@ static const u16 sTogedemaruTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24529,25 +24779,26 @@ static const u16 sMimikyuTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24561,8 +24812,9 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, @@ -24572,10 +24824,11 @@ static const u16 sBruxishTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SNATCH, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -24589,7 +24842,6 @@ static const u16 sBruxishTeachableLearnset[] = { static const u16 sDrampaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, @@ -24598,15 +24850,18 @@ static const u16 sDrampaTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, @@ -24615,7 +24870,6 @@ static const u16 sDrampaTeachableLearnset[] = { MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -24630,17 +24884,19 @@ static const u16 sDhelmiseTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24651,24 +24907,24 @@ static const u16 sDhelmiseTeachableLearnset[] = { static const u16 sJangmoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24677,28 +24933,25 @@ static const u16 sJangmoOTeachableLearnset[] = { static const u16 sHakamoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24707,32 +24960,29 @@ static const u16 sHakamoOTeachableLearnset[] = { static const u16 sKommoOTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TOXIC, MOVE_WATER_PULSE, @@ -24747,21 +24997,24 @@ static const u16 sTapuKokoTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_STEEL_WING, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24773,13 +25026,17 @@ static const u16 sTapuLeleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, @@ -24801,21 +25058,22 @@ static const u16 sTapuBuluTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_TOXIC, @@ -24830,6 +25088,8 @@ static const u16 sTapuFiniTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -24837,7 +25097,9 @@ static const u16 sTapuFiniTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SURF, MOVE_TAUNT, @@ -24859,14 +25121,14 @@ static const u16 sCosmoemTeachableLearnset[] = { }; static const u16 sSolgaleoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -24874,16 +25136,16 @@ static const u16 sSolgaleoTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24893,9 +25155,10 @@ static const u16 sLunalaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_DREAM_EATER, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -24904,15 +25167,16 @@ static const u16 sLunalaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24920,22 +25184,23 @@ static const u16 sLunalaTeachableLearnset[] = { #if P_FAMILY_NIHILEGO static const u16 sNihilegoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -24943,19 +25208,19 @@ static const u16 sNihilegoTeachableLearnset[] = { #if P_FAMILY_BUZZWOLE static const u16 sBuzzwoleTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -24968,10 +25233,14 @@ static const u16 sPheromosaTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_TAUNT, @@ -24986,18 +25255,21 @@ static const u16 sXurkitreeTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25005,20 +25277,20 @@ static const u16 sXurkitreeTeachableLearnset[] = { #if P_FAMILY_CELESTEELA static const u16 sCelesteelaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_TOXIC, @@ -25033,10 +25305,13 @@ static const u16 sKartanaTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_CUT, MOVE_DOUBLE_TEAM, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25044,7 +25319,6 @@ static const u16 sKartanaTeachableLearnset[] = { #if P_FAMILY_GUZZLORD static const u16 sGuzzlordTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, @@ -25052,14 +25326,15 @@ static const u16 sGuzzlordTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_THIEF, @@ -25071,27 +25346,27 @@ static const u16 sGuzzlordTeachableLearnset[] = { #if P_FAMILY_NECROZMA static const u16 sNecrozmaTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25099,12 +25374,12 @@ static const u16 sNecrozmaTeachableLearnset[] = { #if P_FAMILY_MAGEARNA static const u16 sMagearnaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, @@ -25112,13 +25387,14 @@ static const u16 sMagearnaTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SHOCK_WAVE, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MAGEARNA @@ -25128,17 +25404,17 @@ static const u16 sMarshadowTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_CALM_MIND, - MOVE_COUNTER, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SNATCH, MOVE_THIEF, @@ -25150,9 +25426,13 @@ static const u16 sMarshadowTeachableLearnset[] = { #if P_FAMILY_POIPOLE static const u16 sPoipoleTeachableLearnset[] = { MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SNATCH, MOVE_TOXIC, @@ -25167,10 +25447,14 @@ static const u16 sNaganadelTeachableLearnset[] = { MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SNATCH, @@ -25183,19 +25467,19 @@ static const u16 sNaganadelTeachableLearnset[] = { #if P_FAMILY_STAKATAKA static const u16 sStakatakaTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_TOXIC, MOVE_UNAVAILABLE, @@ -25206,16 +25490,19 @@ static const u16 sStakatakaTeachableLearnset[] = { static const u16 sBlacephalonTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -25236,18 +25523,19 @@ static const u16 sZeraoraTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SNATCH, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25256,31 +25544,33 @@ static const u16 sZeraoraTeachableLearnset[] = { #if P_FAMILY_MELTAN static const u16 sMeltanTeachableLearnset[] = { MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; static const u16 sMelmetalTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -25289,18 +25579,18 @@ static const u16 sMelmetalTeachableLearnset[] = { #if P_FAMILY_GROOKEY static const u16 sGrookeyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -25308,19 +25598,18 @@ static const u16 sGrookeyTeachableLearnset[] = { static const u16 sThwackeyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -25328,24 +25617,23 @@ static const u16 sThwackeyTeachableLearnset[] = { static const u16 sRillaboomTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_STRENGTH, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -25355,15 +25643,16 @@ static const u16 sRillaboomTeachableLearnset[] = { #if P_FAMILY_SCORBUNNY static const u16 sScorbunnyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -25372,17 +25661,17 @@ static const u16 sScorbunnyTeachableLearnset[] = { static const u16 sRabootTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -25390,19 +25679,19 @@ static const u16 sRabootTeachableLearnset[] = { static const u16 sCinderaceTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -25414,12 +25703,16 @@ static const u16 sSobbleTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25431,12 +25724,16 @@ static const u16 sDrizzileTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25449,18 +25746,20 @@ static const u16 sInteleonTeachableLearnset[] = { MOVE_DIVE, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25471,35 +25770,36 @@ static const u16 sInteleonTeachableLearnset[] = { #if P_FAMILY_SKWOVET static const u16 sSkwovetTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sGreedentTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_UNAVAILABLE, }; @@ -25511,9 +25811,13 @@ static const u16 sRookideeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -25524,9 +25828,13 @@ static const u16 sCorvisquireTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -25536,18 +25844,20 @@ static const u16 sCorvisquireTeachableLearnset[] = { static const u16 sCorviknightTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -25565,12 +25875,16 @@ static const u16 sDottlerTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -25581,14 +25895,18 @@ static const u16 sOrbeetleTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -25601,8 +25919,12 @@ static const u16 sNickitTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_TORMENT, @@ -25613,10 +25935,14 @@ static const u16 sThievulTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_TAUNT, MOVE_THIEF, @@ -25630,10 +25956,14 @@ static const u16 sGossifleurTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -25643,11 +25973,15 @@ static const u16 sEldegossTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -25657,27 +25991,26 @@ static const u16 sEldegossTeachableLearnset[] = { #if P_FAMILY_WOOLOO static const u16 sWoolooTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_THUNDER_WAVE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sDubwoolTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WOOLOO @@ -25685,13 +26018,15 @@ static const u16 sDubwoolTeachableLearnset[] = { #if P_FAMILY_CHEWTLE static const u16 sChewtleTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25701,24 +26036,23 @@ static const u16 sChewtleTeachableLearnset[] = { static const u16 sDrednawTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_WATERFALL, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -25729,14 +26063,16 @@ static const u16 sDrednawTeachableLearnset[] = { static const u16 sYamperTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -25744,15 +26080,17 @@ static const u16 sBoltundTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_YAMPER @@ -25760,57 +26098,58 @@ static const u16 sBoltundTeachableLearnset[] = { #if P_FAMILY_ROLYCOLY static const u16 sRolycolyTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sCarkolTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sCoalossalTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -25829,29 +26168,35 @@ static const u16 sFlappleTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; - static const u16 sAppletunTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -25859,31 +26204,36 @@ static const u16 sAppletunTeachableLearnset[] = { #if P_GEN_9_CROSS_EVOS static const u16 sDipplinTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sHydrappleTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -25894,30 +26244,34 @@ static const u16 sHydrappleTeachableLearnset[] = { #if P_FAMILY_SILICOBRA static const u16 sSilicobraTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sSandacondaTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SILICOBRA @@ -25930,11 +26284,15 @@ static const u16 sCramorantTeachableLearnset[] = { MOVE_DIVE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_STEEL_WING, MOVE_SURF, MOVE_THIEF, @@ -25948,11 +26306,14 @@ static const u16 sArrokudaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25964,13 +26325,16 @@ static const u16 sBarraskewdaTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -25982,8 +26346,12 @@ static const u16 sBarraskewdaTeachableLearnset[] = { static const u16 sToxelTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; @@ -25991,13 +26359,14 @@ static const u16 sToxtricityAmpedTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, @@ -26005,22 +26374,21 @@ static const u16 sToxtricityAmpedTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; - static const u16 sToxtricityLowKeyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, @@ -26028,7 +26396,6 @@ static const u16 sToxtricityLowKeyTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_UNAVAILABLE, }; @@ -26038,8 +26405,12 @@ static const u16 sToxtricityLowKeyTeachableLearnset[] = { static const u16 sSizzlipedeTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -26049,10 +26420,14 @@ static const u16 sCentiskorchTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -26062,16 +26437,17 @@ static const u16 sCentiskorchTeachableLearnset[] = { #if P_FAMILY_CLOBBOPUS static const u16 sClobbopusTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIVE, MOVE_FACADE, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_WATERFALL, MOVE_UNAVAILABLE, @@ -26079,18 +26455,19 @@ static const u16 sClobbopusTeachableLearnset[] = { static const u16 sGrapploctTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, MOVE_DIVE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SEISMIC_TOSS, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_WATERFALL, @@ -26102,11 +26479,14 @@ static const u16 sGrapploctTeachableLearnset[] = { static const u16 sSinisteaTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, - MOVE_METRONOME, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_UNAVAILABLE, @@ -26115,14 +26495,17 @@ static const u16 sSinisteaTeachableLearnset[] = { static const u16 sPolteageistTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_UNAVAILABLE, @@ -26134,16 +26517,18 @@ static const u16 sHatennaTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -26151,16 +26536,18 @@ static const u16 sHattremTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -26168,19 +26555,20 @@ static const u16 sHattereneTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SWORDS_DANCE, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_HATENNA @@ -26189,16 +26577,16 @@ static const u16 sHattereneTeachableLearnset[] = { static const u16 sImpidimpTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_UNAVAILABLE, }; @@ -26206,38 +26594,37 @@ static const u16 sImpidimpTeachableLearnset[] = { static const u16 sMorgremTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_UNAVAILABLE, }; static const u16 sGrimmsnarlTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_UNAVAILABLE, }; @@ -26247,8 +26634,12 @@ static const u16 sGrimmsnarlTeachableLearnset[] = { static const u16 sMilceryTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; @@ -26256,14 +26647,17 @@ static const u16 sAlcremieTeachableLearnset[] = { MOVE_ATTRACT, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, }; @@ -26271,20 +26665,20 @@ static const u16 sAlcremieTeachableLearnset[] = { #if P_FAMILY_FALINKS static const u16 sFalinksTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FALINKS @@ -26292,16 +26686,18 @@ static const u16 sFalinksTeachableLearnset[] = { #if P_FAMILY_PINCURCHIN static const u16 sPincurchinTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PINCURCHIN @@ -26310,8 +26706,12 @@ static const u16 sPincurchinTeachableLearnset[] = { static const u16 sSnomTeachableLearnset[] = { MOVE_ATTRACT, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; @@ -26320,15 +26720,19 @@ static const u16 sFrosmothTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SNOM @@ -26336,17 +26740,18 @@ static const u16 sFrosmothTeachableLearnset[] = { #if P_FAMILY_STONJOURNER static const u16 sStonjournerTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -26356,17 +26761,19 @@ static const u16 sStonjournerTeachableLearnset[] = { static const u16 sEiscueTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -26377,13 +26784,15 @@ static const u16 sEiscueTeachableLearnset[] = { #if P_FAMILY_INDEEDEE static const u16 sIndeedeeMTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_FACADE, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_UNAVAILABLE, @@ -26391,16 +26800,18 @@ static const u16 sIndeedeeMTeachableLearnset[] = { static const u16 sIndeedeeFTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_UNAVAILABLE, @@ -26412,15 +26823,17 @@ static const u16 sMorpekoTeachableLearnset[] = { MOVE_ATTRACT, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TORMENT, MOVE_UNAVAILABLE, }; @@ -26429,39 +26842,39 @@ static const u16 sMorpekoTeachableLearnset[] = { #if P_FAMILY_CUFANT static const u16 sCufantTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, - MOVE_MEGA_KICK, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_UNAVAILABLE, }; static const u16 sCopperajahTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_STRENGTH, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -26471,26 +26884,25 @@ static const u16 sCopperajahTeachableLearnset[] = { #if P_FAMILY_DRACOZOLT static const u16 sDracozoltTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DRACOZOLT @@ -26498,41 +26910,41 @@ static const u16 sDracozoltTeachableLearnset[] = { #if P_FAMILY_ARCTOZOLT static const u16 sArctozoltTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ARCTOZOLT #if P_FAMILY_DRACOVISH static const u16 sDracovishTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_UNAVAILABLE, @@ -26542,17 +26954,19 @@ static const u16 sDracovishTeachableLearnset[] = { #if P_FAMILY_ARCTOVISH static const u16 sArctovishTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIVE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_UNAVAILABLE, @@ -26562,50 +26976,48 @@ static const u16 sArctovishTeachableLearnset[] = { #if P_FAMILY_DURALUDON static const u16 sDuraludonTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #if P_GEN_9_CROSS_EVOS static const u16 sArchaludonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_GEN_9_CROSS_EVOS @@ -26616,24 +27028,30 @@ static const u16 sDreepyTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, - MOVE_THUNDER_WAVE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sDrakloakTeachableLearnset[] = { MOVE_ATTRACT, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_STEEL_WING, MOVE_SUNNY_DAY, @@ -26641,26 +27059,27 @@ static const u16 sDrakloakTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sDragapultTeachableLearnset[] = { MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_DOUBLE_TEAM, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_STEEL_WING, @@ -26669,32 +27088,34 @@ static const u16 sDragapultTeachableLearnset[] = { MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_DREEPY #if P_FAMILY_ZACIAN static const u16 sZacianTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ZACIAN #if P_FAMILY_ZAMAZENTA static const u16 sZamazentaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_LIGHT_SCREEN, @@ -26702,9 +27123,11 @@ static const u16 sZamazentaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -26713,17 +27136,20 @@ static const u16 sZamazentaTeachableLearnset[] = { #if P_FAMILY_ETERNATUS static const u16 sEternatusTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, @@ -26737,68 +27163,59 @@ static const u16 sEternatusTeachableLearnset[] = { static const u16 sKubfuTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sUrshifuSingleStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_UNAVAILABLE, }; - static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_ATTRACT, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_WATERFALL, MOVE_UNAVAILABLE, @@ -26808,27 +27225,25 @@ static const u16 sUrshifuRapidStrikeTeachableLearnset[] = { #if P_FAMILY_ZARUDE static const u16 sZarudeTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, - MOVE_MEGA_KICK, - MOVE_MEGA_PUNCH, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -26837,35 +27252,38 @@ static const u16 sZarudeTeachableLearnset[] = { #if P_FAMILY_REGIELEKI static const u16 sRegielekiTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIELEKI #if P_FAMILY_REGIDRAGO static const u16 sRegidragoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_REGIDRAGO @@ -26873,16 +27291,17 @@ static const u16 sRegidragoTeachableLearnset[] = { #if P_FAMILY_GLASTRIER static const u16 sGlastrierTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_TORMENT, MOVE_UNAVAILABLE, @@ -26891,14 +27310,16 @@ static const u16 sGlastrierTeachableLearnset[] = { #if P_FAMILY_SPECTRIER static const u16 sSpectrierTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -26910,15 +27331,18 @@ static const u16 sCalyrexTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -26928,47 +27352,48 @@ static const u16 sCalyrexTeachableLearnset[] = { #if P_FUSION_FORMS static const u16 sCalyrexIceTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, MOVE_HAIL, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_TORMENT, MOVE_UNAVAILABLE, }; static const u16 sCalyrexShadowTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -26981,16 +27406,19 @@ static const u16 sCalyrexShadowTeachableLearnset[] = { #if P_FAMILY_ENAMORUS static const u16 sEnamorusTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -27003,9 +27431,13 @@ static const u16 sEnamorusTeachableLearnset[] = { static const u16 sSprigatitoTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -27015,9 +27447,13 @@ static const u16 sFloragatoTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -27029,10 +27465,14 @@ static const u16 sMeowscaradaTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_DOUBLE_TEAM, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SOLAR_BEAM, @@ -27044,45 +27484,54 @@ static const u16 sMeowscaradaTeachableLearnset[] = { #if P_FAMILY_FUECOCO static const u16 sFuecocoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sCrocalorTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sSkeledirgeTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -27094,9 +27543,13 @@ static const u16 sSkeledirgeTeachableLearnset[] = { static const u16 sQuaxlyTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_UNAVAILABLE, }; @@ -27104,9 +27557,13 @@ static const u16 sQuaxlyTeachableLearnset[] = { static const u16 sQuaxwellTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -27116,15 +27573,16 @@ static const u16 sQuaquavalTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -27133,29 +27591,33 @@ static const u16 sQuaquavalTeachableLearnset[] = { #if P_FAMILY_LECHONK static const u16 sLechonkTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_UNAVAILABLE, }; static const u16 sOinkologneTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -27164,14 +27626,16 @@ static const u16 sOinkologneTeachableLearnset[] = { #if P_FAMILY_TAROUNTULA static const u16 sTarountulaTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -27179,16 +27643,18 @@ static const u16 sTarountulaTeachableLearnset[] = { static const u16 sSpidopsTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -27198,11 +27664,14 @@ static const u16 sSpidopsTeachableLearnset[] = { #if P_FAMILY_NYMBLE static const u16 sNymbleTeachableLearnset[] = { - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -27211,14 +27680,15 @@ static const u16 sNymbleTeachableLearnset[] = { static const u16 sLokixTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -27229,14 +27699,17 @@ static const u16 sLokixTeachableLearnset[] = { static const u16 sPawmiTeachableLearnset[] = { MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27244,14 +27717,17 @@ static const u16 sPawmoTeachableLearnset[] = { MOVE_DIG, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27259,20 +27735,21 @@ static const u16 sPawmotTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_PAWMI @@ -27282,15 +27759,17 @@ static const u16 sTandemausTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -27299,16 +27778,18 @@ static const u16 sMausholdTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BULLET_SEED, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -27316,28 +27797,32 @@ static const u16 sMausholdTeachableLearnset[] = { #if P_FAMILY_FIDOUGH static const u16 sFidoughTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sDachsbunTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -27347,9 +27832,13 @@ static const u16 sDachsbunTeachableLearnset[] = { static const u16 sSmolivTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -27358,9 +27847,13 @@ static const u16 sSmolivTeachableLearnset[] = { static const u16 sDollivTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -27369,14 +27862,17 @@ static const u16 sDollivTeachableLearnset[] = { static const u16 sArbolivaTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SAFEGUARD, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, @@ -27386,12 +27882,15 @@ static const u16 sArbolivaTeachableLearnset[] = { #if P_FAMILY_SQUAWKABILLY static const u16 sSquawkabillyTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -27402,51 +27901,54 @@ static const u16 sSquawkabillyTeachableLearnset[] = { #if P_FAMILY_NACLI static const u16 sNacliTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sNaclstackTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; static const u16 sGarganaclTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, - MOVE_EXPLOSION, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -27457,9 +27959,13 @@ static const u16 sCharcadetTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -27469,12 +27975,16 @@ static const u16 sArmarougeTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -27489,14 +27999,17 @@ static const u16 sCeruledgeTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -27504,28 +28017,34 @@ static const u16 sCeruledgeTeachableLearnset[] = { #if P_FAMILY_TADBULB static const u16 sTadbulbTeachableLearnset[] = { + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sBelliboltTeachableLearnset[] = { + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_TOXIC, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -27537,11 +28056,14 @@ static const u16 sWattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; @@ -27549,26 +28071,31 @@ static const u16 sKilowattrelTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_WATTREL #if P_FAMILY_MASCHIFF static const u16 sMaschiffTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -27576,15 +28103,17 @@ static const u16 sMaschiffTeachableLearnset[] = { }; static const u16 sMabosstiffTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -27595,15 +28124,16 @@ static const u16 sMabosstiffTeachableLearnset[] = { #if P_FAMILY_SHROODLE static const u16 sShroodleTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -27612,15 +28142,16 @@ static const u16 sShroodleTeachableLearnset[] = { static const u16 sGrafaiaiTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, - MOVE_METRONOME, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -27632,9 +28163,13 @@ static const u16 sGrafaiaiTeachableLearnset[] = { static const u16 sBramblinTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_THIEF, @@ -27644,10 +28179,14 @@ static const u16 sBramblinTeachableLearnset[] = { static const u16 sBrambleghastTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_THIEF, @@ -27658,12 +28197,16 @@ static const u16 sBrambleghastTeachableLearnset[] = { #if P_FAMILY_TOEDSCOOL static const u16 sToedscoolTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_TAUNT, @@ -27673,13 +28216,17 @@ static const u16 sToedscoolTeachableLearnset[] = { static const u16 sToedscruelTeachableLearnset[] = { MOVE_BULLET_SEED, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_TAUNT, @@ -27690,20 +28237,21 @@ static const u16 sToedscruelTeachableLearnset[] = { #if P_FAMILY_KLAWF static const u16 sKlawfTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_THIEF, MOVE_UNAVAILABLE, }; @@ -27713,10 +28261,14 @@ static const u16 sKlawfTeachableLearnset[] = { static const u16 sCapsakidTeachableLearnset[] = { MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -27728,12 +28280,16 @@ static const u16 sScovillainTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -27745,9 +28301,13 @@ static const u16 sScovillainTeachableLearnset[] = { static const u16 sRellorTeachableLearnset[] = { MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -27757,6 +28317,8 @@ static const u16 sRabscaTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -27764,9 +28326,11 @@ static const u16 sRabscaTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SAFEGUARD, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SLUDGE_BOMB, @@ -27780,13 +28344,17 @@ static const u16 sRabscaTeachableLearnset[] = { static const u16 sFlittleTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -27795,10 +28363,10 @@ static const u16 sFlittleTeachableLearnset[] = { static const u16 sEspathraTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, @@ -27806,7 +28374,9 @@ static const u16 sEspathraTeachableLearnset[] = { MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, MOVE_SUNNY_DAY, @@ -27818,54 +28388,54 @@ static const u16 sEspathraTeachableLearnset[] = { #if P_FAMILY_TINKATINK static const u16 sTinkatinkTeachableLearnset[] = { MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatuffTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; static const u16 sTinkatonTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_SMASH, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SKILL_SWAP, - MOVE_SWORDS_DANCE, MOVE_THIEF, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_TINKATINK @@ -27875,11 +28445,15 @@ static const u16 sWiglettTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -27889,12 +28463,16 @@ static const u16 sWugtrioTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_DIG, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, @@ -27906,13 +28484,16 @@ static const u16 sBombirdierTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -27924,14 +28505,16 @@ static const u16 sBombirdierTeachableLearnset[] = { #if P_FAMILY_FINIZEN static const u16 sFinizenTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_COUNTER, MOVE_DIVE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -27940,17 +28523,19 @@ static const u16 sFinizenTeachableLearnset[] = { static const u16 sPalafinTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIVE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_WATERFALL, @@ -27961,13 +28546,15 @@ static const u16 sPalafinTeachableLearnset[] = { #if P_FAMILY_VAROOM static const u16 sVaroomTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -27978,15 +28565,17 @@ static const u16 sVaroomTeachableLearnset[] = { }; static const u16 sRevavroomTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -28000,16 +28589,18 @@ static const u16 sRevavroomTeachableLearnset[] = { #if P_FAMILY_CYCLIZAR static const u16 sCyclizarTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THIEF, @@ -28020,34 +28611,37 @@ static const u16 sCyclizarTeachableLearnset[] = { #if P_FAMILY_ORTHWORM static const u16 sOrthwormTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_IRON_TAIL, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_ORTHWORM #if P_FAMILY_GLIMMET static const u16 sGlimmetTeachableLearnset[] = { - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -28055,17 +28649,19 @@ static const u16 sGlimmetTeachableLearnset[] = { }; static const u16 sGlimmoraTeachableLearnset[] = { - MOVE_EXPLOSION, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, @@ -28077,13 +28673,16 @@ static const u16 sGlimmoraTeachableLearnset[] = { #if P_FAMILY_GREAVARD static const u16 sGreavardTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -28092,14 +28691,17 @@ static const u16 sGreavardTeachableLearnset[] = { static const u16 sHoundstoneTeachableLearnset[] = { MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_THIEF, @@ -28114,11 +28716,13 @@ static const u16 sFlamigoTeachableLearnset[] = { MOVE_DOUBLE_TEAM, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_MEGA_KICK, MOVE_PROTECT, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, @@ -28129,30 +28733,34 @@ static const u16 sFlamigoTeachableLearnset[] = { #if P_FAMILY_CETODDLE static const u16 sCetoddleTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; static const u16 sCetitanTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -28161,14 +28769,16 @@ static const u16 sCetitanTeachableLearnset[] = { #if P_FAMILY_VELUZA static const u16 sVeluzaTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -28178,16 +28788,17 @@ static const u16 sVeluzaTeachableLearnset[] = { #if P_FAMILY_DONDOZO static const u16 sDondozoTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIVE, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_WATERFALL, MOVE_WATER_PULSE, @@ -28197,12 +28808,15 @@ static const u16 sDondozoTeachableLearnset[] = { #if P_FAMILY_TATSUGIRI static const u16 sTatsugiriTeachableLearnset[] = { - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SURF, MOVE_TAUNT, MOVE_WATER_PULSE, @@ -28212,20 +28826,21 @@ static const u16 sTatsugiriTeachableLearnset[] = { #if P_FAMILY_GREAT_TUSK static const u16 sGreatTuskTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -28235,30 +28850,30 @@ static const u16 sGreatTuskTeachableLearnset[] = { #if P_FAMILY_SCREAM_TAIL static const u16 sScreamTailTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BULK_UP, MOVE_CALM_MIND, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_WATER_PULSE, MOVE_UNAVAILABLE, }; @@ -28266,14 +28881,16 @@ static const u16 sScreamTailTeachableLearnset[] = { #if P_FAMILY_BRUTE_BONNET static const u16 sBruteBonnetTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -28285,15 +28902,18 @@ static const u16 sBruteBonnetTeachableLearnset[] = { #if P_FAMILY_FLUTTER_MANE static const u16 sFlutterManeTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FLUTTER_MANE @@ -28301,18 +28921,20 @@ static const u16 sFlutterManeTeachableLearnset[] = { #if P_FAMILY_SLITHER_WING static const u16 sSlitherWingTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -28320,35 +28942,38 @@ static const u16 sSlitherWingTeachableLearnset[] = { #if P_FAMILY_SANDY_SHOCKS static const u16 sSandyShocksTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_SANDY_SHOCKS #if P_FAMILY_IRON_TREADS static const u16 sIronTreadsTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_UNAVAILABLE, }; @@ -28357,13 +28982,16 @@ static const u16 sIronTreadsTeachableLearnset[] = { #if P_FAMILY_IRON_BUNDLE static const u16 sIronBundleTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_THIEF, MOVE_WATER_PULSE, @@ -28373,20 +29001,18 @@ static const u16 sIronBundleTeachableLearnset[] = { #if P_FAMILY_IRON_HANDS static const u16 sIronHandsTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, - MOVE_METRONOME, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, - MOVE_SEISMIC_TOSS, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_THUNDER, MOVE_THUNDERBOLT, MOVE_UNAVAILABLE, @@ -28395,18 +29021,20 @@ static const u16 sIronHandsTeachableLearnset[] = { #if P_FAMILY_IRON_JUGULIS static const u16 sIronJugulisTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -28418,12 +29046,16 @@ static const u16 sIronMothTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TOXIC, @@ -28434,29 +29066,28 @@ static const u16 sIronMothTeachableLearnset[] = { #if P_FAMILY_IRON_THORNS static const u16 sIronThornsTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_THORNS @@ -28464,60 +29095,69 @@ static const u16 sIronThornsTeachableLearnset[] = { #if P_FAMILY_FRIGIBAX static const u16 sFrigibaxTeachableLearnset[] = { MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_DIG, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sArctibaxTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; static const u16 sBaxcaliburTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BLIZZARD, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_FRIGIBAX #if P_FAMILY_GIMMIGHOUL static const u16 sGimmighoulTeachableLearnset[] = { + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_THIEF, MOVE_UNAVAILABLE, @@ -28525,34 +29165,40 @@ static const u16 sGimmighoulTeachableLearnset[] = { static const u16 sGholdengoTeachableLearnset[] = { MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_THIEF, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_GIMMIGHOUL #if P_FAMILY_WO_CHIEN static const u16 sWoChienTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BULLET_SEED, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, @@ -28566,11 +29212,14 @@ static const u16 sChienPaoTeachableLearnset[] = { MOVE_BLIZZARD, MOVE_BRICK_BREAK, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -28578,17 +29227,18 @@ static const u16 sChienPaoTeachableLearnset[] = { #if P_FAMILY_TING_LU static const u16 sTingLuTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, - MOVE_ROCK_SLIDE, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -28600,6 +29250,8 @@ static const u16 sChiYuTeachableLearnset[] = { MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, @@ -28607,6 +29259,8 @@ static const u16 sChiYuTeachableLearnset[] = { MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -28616,21 +29270,22 @@ static const u16 sChiYuTeachableLearnset[] = { #if P_FAMILY_ROARING_MOON static const u16 sRoaringMoonTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_UNAVAILABLE, @@ -28643,45 +29298,46 @@ static const u16 sIronValiantTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_CALM_MIND, MOVE_DOUBLE_TEAM, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SKILL_SWAP, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_VALIANT #if P_FAMILY_KORAIDON static const u16 sKoraidonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_SMASH, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -28689,39 +29345,42 @@ static const u16 sKoraidonTeachableLearnset[] = { #if P_FAMILY_MIRAIDON static const u16 sMiraidonTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, MOVE_DRAGON_CLAW, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_MIRAIDON #if P_FAMILY_WALKING_WAKE static const u16 sWalkingWakeTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_SURF, MOVE_WATERFALL, @@ -28735,14 +29394,16 @@ static const u16 sIronLeavesTeachableLearnset[] = { MOVE_AERIAL_ACE, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -28751,10 +29412,14 @@ static const u16 sIronLeavesTeachableLearnset[] = { #if P_FAMILY_POLTCHAGEIST static const u16 sPoltchageistTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, @@ -28762,11 +29427,15 @@ static const u16 sPoltchageistTeachableLearnset[] = { static const u16 sSinistchaTeachableLearnset[] = { MOVE_CALM_MIND, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REFLECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SOLAR_BEAM, MOVE_UNAVAILABLE, @@ -28775,19 +29444,20 @@ static const u16 sSinistchaTeachableLearnset[] = { #if P_FAMILY_OKIDOGI static const u16 sOkidogiTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_BULK_UP, - MOVE_COUNTER, MOVE_DIG, - MOVE_DOUBLE_EDGE, MOVE_FACADE, MOVE_FOCUS_PUNCH, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, MOVE_ROCK_TOMB, + MOVE_SECRET_POWER, MOVE_SLUDGE_BOMB, MOVE_TAUNT, MOVE_THIEF, @@ -28800,12 +29470,15 @@ static const u16 sOkidogiTeachableLearnset[] = { static const u16 sMunkidoriTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, - MOVE_METRONOME, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_TAUNT, @@ -28822,13 +29495,16 @@ static const u16 sFezandipitiTeachableLearnset[] = { MOVE_CALM_MIND, MOVE_FACADE, MOVE_FLY, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_LIGHT_SCREEN, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_THIEF, MOVE_TOXIC, @@ -28840,17 +29516,19 @@ static const u16 sFezandipitiTeachableLearnset[] = { static const u16 sOgerponTeachableLearnset[] = { MOVE_BRICK_BREAK, MOVE_BULLET_SEED, - MOVE_COUNTER, MOVE_FACADE, + MOVE_FRUSTRATION, MOVE_GIGA_DRAIN, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, - MOVE_SWORDS_DANCE, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -28858,18 +29536,20 @@ static const u16 sOgerponTeachableLearnset[] = { #if P_FAMILY_GOUGING_FIRE static const u16 sGougingFireTeachableLearnset[] = { - MOVE_BODY_SLAM, - MOVE_DOUBLE_EDGE, MOVE_DRAGON_CLAW, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FIRE_BLAST, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_OVERHEAT, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SUNNY_DAY, MOVE_UNAVAILABLE, }; @@ -28877,22 +29557,23 @@ static const u16 sGougingFireTeachableLearnset[] = { #if P_FAMILY_RAGING_BOLT static const u16 sRagingBoltTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, + MOVE_SECRET_POWER, MOVE_SHOCK_WAVE, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_TAUNT, MOVE_THUNDER, MOVE_THUNDERBOLT, - MOVE_THUNDER_WAVE, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_RAGING_BOLT @@ -28900,19 +29581,19 @@ static const u16 sRagingBoltTeachableLearnset[] = { #if P_FAMILY_IRON_BOULDER static const u16 sIronBoulderTeachableLearnset[] = { MOVE_AERIAL_ACE, - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, - MOVE_COUNTER, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, + MOVE_RETURN, MOVE_ROCK_TOMB, MOVE_SANDSTORM, - MOVE_SWORDS_DANCE, + MOVE_SECRET_POWER, MOVE_TAUNT, MOVE_UNAVAILABLE, }; @@ -28920,35 +29601,37 @@ static const u16 sIronBoulderTeachableLearnset[] = { #if P_FAMILY_IRON_CROWN static const u16 sIronCrownTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_BRICK_BREAK, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_FACADE, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_PROTECT, MOVE_PSYCHIC, MOVE_REST, - MOVE_SWORDS_DANCE, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_UNAVAILABLE, }; #endif //P_FAMILY_IRON_CROWN #if P_FAMILY_TERAPAGOS static const u16 sTerapagosTeachableLearnset[] = { - MOVE_BODY_SLAM, MOVE_CALM_MIND, - MOVE_DOUBLE_EDGE, MOVE_EARTHQUAKE, MOVE_FACADE, MOVE_FLAMETHROWER, + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_HYPER_BEAM, MOVE_ICE_BEAM, MOVE_PROTECT, MOVE_RAIN_DANCE, MOVE_REST, + MOVE_RETURN, MOVE_ROAR, - MOVE_ROCK_SLIDE, + MOVE_SECRET_POWER, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY, MOVE_SURF, @@ -28962,8 +29645,12 @@ static const u16 sTerapagosTeachableLearnset[] = { #if P_FAMILY_PECHARUNT static const u16 sPecharuntTeachableLearnset[] = { + MOVE_FRUSTRATION, + MOVE_HIDDEN_POWER, MOVE_PROTECT, MOVE_REST, + MOVE_RETURN, + MOVE_SECRET_POWER, MOVE_SHADOW_BALL, MOVE_SLUDGE_BOMB, MOVE_TOXIC, diff --git a/src/data/tutor_moves.h b/src/data/tutor_moves.h new file mode 100644 index 000000000..d6f2e602c --- /dev/null +++ b/src/data/tutor_moves.h @@ -0,0 +1,6 @@ +// DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py +// Needed by tutor moves relearner! + +const u16 gTutorMoves[] = { + MOVE_UNAVAILABLE +}; diff --git a/src/daycare.c b/src/daycare.c index a636a1a94..7c0be10f6 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -762,6 +762,8 @@ static u16 GetEggSpecies(u16 species) found = FALSE; for (j = 1; j < NUM_SPECIES; j++) { + if (!IsSpeciesEnabled(j)) + continue; const struct Evolution *evolutions = GetSpeciesEvolutions(j); if (evolutions == NULL) continue; @@ -1351,7 +1353,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) u8 metLocation; u8 isEgg; - CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateRandomMonWithIVs(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS); metLevel = 0; ball = BALL_POKE; language = LANGUAGE_JAPANESE; @@ -1378,7 +1380,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare * u8 language; personality = daycare->offspringPersonality; - CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMonWithIVs(mon, species, EGG_HATCH_LEVEL, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -1874,7 +1876,7 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) isModernFatefulEncounter = GetMonData(egg, MON_DATA_MODERN_FATEFUL_ENCOUNTER); ball = GetMonData(egg, MON_DATA_POKEBALL); - CreateMon(temp, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMonWithIVs(temp, species, EGG_HATCH_LEVEL, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); for (i = 0; i < MAX_MON_MOVES; i++) SetMonData(temp, MON_DATA_MOVE1 + i, &moves[i]); diff --git a/src/debug.c b/src/debug.c index cb29f71d9..aa82f3e0b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2089,7 +2089,7 @@ static void Debug_Display_ItemInfo(u32 itemId, u32 digit, u8 windowId) else if (CheckIfItemIsTMHMOrEvolutionStone(itemId) == 1) { end = StringCopy(end, COMPOUND_STRING(" None")); - } + } WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); @@ -2868,9 +2868,8 @@ static void DebugAction_Give_Pokemon_ComplexCreateMon(u8 taskId) //https://githu } //Nature - if (nature == NUM_NATURES || nature == 0xFF) - nature = Random() % NUM_NATURES; - CreateMonWithNature(&mon, species, level, USE_RANDOM_IVS, nature); + u32 personality = GetMonPersonality(species, MON_GENDER_RANDOM, nature, RANDOM_UNOWN_LETTER); + CreateMon(&mon, species, level, personality, OTID_STRUCT_PLAYER_ID); //Shininess SetMonData(&mon, MON_DATA_IS_SHINY, &isShiny); @@ -3125,14 +3124,11 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) static void DebugAction_PCBag_Fill_PCBoxes_Fast(u8 taskId) //Credit: Sierraffinity { int boxId, boxPosition; - u32 personality; struct BoxPokemon boxMon; u16 species = SPECIES_BULBASAUR; u8 speciesName[POKEMON_NAME_LENGTH + 1]; - personality = Random32(); - - CreateBoxMon(&boxMon, species, 100, USE_RANDOM_IVS, FALSE, personality, OT_ID_PLAYER_ID, 0); + CreateBoxMon(&boxMon, species, 100, Random32(), OTID_STRUCT_PLAYER_ID); for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) { @@ -3170,7 +3166,7 @@ static void DebugAction_PCBag_Fill_PCBoxes_Slow(u8 taskId) { if (!spaceAvailable) PlayBGM(MUS_MYSTERY_GIFT); - CreateBoxMon(&boxMon, species, 100, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateBoxMon(&boxMon, species, 100, Random32(), OTID_STRUCT_PLAYER_ID); gPokemonStoragePtr->boxes[boxId][boxPosition] = boxMon; species = (species < NUM_SPECIES - 1) ? species + 1 : 1; spaceAvailable = TRUE; diff --git a/src/field_specials.c b/src/field_specials.c index c3fb7cbcb..fa40bf0db 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -231,13 +231,13 @@ bool8 PlayerHasGrassPokemonInParty(void) static bool32 IsBuildingPCTile(u32 tileId) { - return GetPrimaryTileset(gMapHeader.mapLayout) == &gTileset_Building + return GetPrimaryTileset(gMapHeader.mapLayout) == &gTileset_Building && (tileId == METATILE_Building_PCOn || tileId == METATILE_Building_PCOff); } static bool32 IsPlayerHousePCTile(u32 tileId) { - return (GetSecondaryTileset(gMapHeader.mapLayout) == &gTileset_GenericBuilding1 + return (GetSecondaryTileset(gMapHeader.mapLayout) == &gTileset_GenericBuilding1 && (tileId == METATILE_GenericBuilding1_PlayersPCOn || tileId == METATILE_GenericBuilding1_PlayersPCOff)); } @@ -492,14 +492,6 @@ bool8 IsThereRoomInAnyBoxForMorePokemon(void) return FALSE; } -bool8 IsPokerusInParty(void) -{ - if (!CheckPartyPokerus(gPlayerParty, 0x3F)) - return FALSE; - else - return TRUE; -} - #define tXtrans data[0] #define tTimer data[1] #define tNremain data[2] @@ -577,7 +569,7 @@ u16 ScriptGetPartyMonSpecies(void) bool8 IsMonOTNameNotPlayers(void) { GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); - + if (!StringCompare(gSaveBlock2Ptr->playerName, gStringVar1)) return FALSE; else @@ -823,36 +815,36 @@ static const u8 sFloorNameWidthPadding[] = { static const u16 sElevatorWindowMetatilesGoingUp[][3] = { { - METATILE_SilphCo_ElevatorWindow_Top0, - METATILE_SilphCo_ElevatorWindow_Top1, + METATILE_SilphCo_ElevatorWindow_Top0, + METATILE_SilphCo_ElevatorWindow_Top1, METATILE_SilphCo_ElevatorWindow_Top2 }, { - METATILE_SilphCo_ElevatorWindow_Mid0, - METATILE_SilphCo_ElevatorWindow_Mid1, + METATILE_SilphCo_ElevatorWindow_Mid0, + METATILE_SilphCo_ElevatorWindow_Mid1, METATILE_SilphCo_ElevatorWindow_Mid2 }, { - METATILE_SilphCo_ElevatorWindow_Bottom0, - METATILE_SilphCo_ElevatorWindow_Bottom1, + METATILE_SilphCo_ElevatorWindow_Bottom0, + METATILE_SilphCo_ElevatorWindow_Bottom1, METATILE_SilphCo_ElevatorWindow_Bottom2 } }; static const u16 sElevatorWindowMetatilesGoingDown[][3] = { { - METATILE_SilphCo_ElevatorWindow_Top0, - METATILE_SilphCo_ElevatorWindow_Top2, + METATILE_SilphCo_ElevatorWindow_Top0, + METATILE_SilphCo_ElevatorWindow_Top2, METATILE_SilphCo_ElevatorWindow_Top1 }, { - METATILE_SilphCo_ElevatorWindow_Mid0, - METATILE_SilphCo_ElevatorWindow_Mid2, + METATILE_SilphCo_ElevatorWindow_Mid0, + METATILE_SilphCo_ElevatorWindow_Mid2, METATILE_SilphCo_ElevatorWindow_Mid1 }, { - METATILE_SilphCo_ElevatorWindow_Bottom0, - METATILE_SilphCo_ElevatorWindow_Bottom2, + METATILE_SilphCo_ElevatorWindow_Bottom0, + METATILE_SilphCo_ElevatorWindow_Bottom2, METATILE_SilphCo_ElevatorWindow_Bottom1 } }; @@ -1216,7 +1208,7 @@ void ListMenu(void) if (QL_AvoidDisplay(QL_DestroyAbortedDisplay) == TRUE) return; - + taskId = CreateTask(Task_CreateScriptListMenu, 8); task = &gTasks[taskId]; switch (gSpecialVar_0x8004) @@ -1303,7 +1295,7 @@ void ListMenu(void) } static const u8 *const sListMenuLabels[][12] = { - [LISTMENU_BADGES] = + [LISTMENU_BADGES] = { gText_BoulderBadge, gText_CascadeBadge, @@ -1314,8 +1306,8 @@ static const u8 *const sListMenuLabels[][12] = { gText_VolcanoBadge, gText_EarthBadge, gOtherText_Exit, - }, - [LISTMENU_SILPHCO_FLOORS] = + }, + [LISTMENU_SILPHCO_FLOORS] = { gText_11F, gText_10F, @@ -1329,14 +1321,14 @@ static const u8 *const sListMenuLabels[][12] = { gText_2F, gText_1F, gOtherText_Exit, - }, + }, [LISTMENU_ROCKET_HIDEOUT_FLOORS] = // Unncessary, MULTICHOICE_ROCKET_HIDEOUT_ELEVATOR is used instead { gText_B1F, gText_B2F, gText_B4F, gOtherText_Exit, - }, + }, [LISTMENU_DEPT_STORE_FLOORS] = // Unncessary, MULTICHOICE_DEPT_STORE_ELEVATOR is used instead { gText_5F, @@ -1345,15 +1337,15 @@ static const u8 *const sListMenuLabels[][12] = { gText_2F, gText_1F, gOtherText_Exit, - }, + }, [LISTMENU_WIRELESS_LECTURE_HEADERS] = // Unnecessary, MULTICHOICE_LINKED_DIRECT_UNION is used instead { gText_LinkedGamePlay, gText_DirectCorner, gText_UnionRoom, gOtherText_Quit, - }, - [LISTMENU_BERRY_POWDER] = + }, + [LISTMENU_BERRY_POWDER] = { gText_Energypowder_50, gText_EnergyRoot_80, @@ -1367,7 +1359,7 @@ static const u8 *const sListMenuLabels[][12] = { gText_HpUp_1000, gText_PpUp_3000, gOtherText_Exit, - }, + }, [LISTMENU_TRAINER_TOWER_FLOORS] = // Unnecessary, MULTICHOICE_ROOFTOP_B1F is used instead { gText_Rooftop, @@ -1640,7 +1632,7 @@ u8 ContextNpcGetTextColor(void) gfxId = gObjectEvents[objEventId].graphicsId; else gfxId = gObjectEvents[gSelectedObjectEvent].graphicsId; - + if (gfxId & OBJ_EVENT_MON) return GetFollowerTextColor(); @@ -2301,12 +2293,12 @@ bool8 CapeBrinkGetMoveToTeachLeadPokemon(void) // 8007 = Index of lead mon // to specialvar = whether a move can be taught in the first place u8 i, leadMonSlot, moveCount = 0; - u16 moveId, tutorFlag; + u16 moveId, tutorFlag; struct Pokemon *leadMon; - + leadMonSlot = GetLeadMonIndex(); leadMon = &gPlayerParty[leadMonSlot]; - + if (GetMonData(leadMon, MON_DATA_FRIENDSHIP) != 255) return FALSE; @@ -2325,14 +2317,14 @@ bool8 CapeBrinkGetMoveToTeachLeadPokemon(void) default: return FALSE; } - + StringCopy(gStringVar2, gMovesInfo[moveId].name); if (!I_REUSABLE_TMS && FlagGet(tutorFlag) == TRUE) return FALSE; - + for (i = 0; i < MAX_MON_MOVES; i++) moveCount += (GetMonData(leadMon, MON_DATA_MOVE1 + i) != MOVE_NONE); - + gSpecialVar_0x8005 = moveId; gSpecialVar_0x8006 = moveCount; gSpecialVar_0x8007 = leadMonSlot; @@ -2572,7 +2564,7 @@ bool8 PlayerPartyContainsSpeciesWithPlayerID(void) u8 i; for (i = 0; i < playerCount; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004 + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) == gSpecialVar_0x8004 && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL)) return TRUE; } diff --git a/src/generational_changes.c b/src/generational_changes.c index 1ad29aa67..a045d14f8 100644 --- a/src/generational_changes.c +++ b/src/generational_changes.c @@ -2,18 +2,119 @@ #include "generational_changes.h" #include "malloc.h" #include "constants/generational_changes.h" +#include "config/pokerus.h" + +#define UNPACK_BATTLE_CONFIG_GEN_CHANGES(_name, _field, ...) ._field = B_##_name, +#define UNPACK_POKEMON_CONFIG_GEN_CHANGES(_name, _field, ...) ._field = P_##_name, + +const struct GenChanges sConfigChanges = +{ + BATTLE_CONFIG_DEFINITIONS(UNPACK_BATTLE_CONFIG_GEN_CHANGES) + POKEMON_CONFIG_DEFINITIONS(UNPACK_POKEMON_CONFIG_GEN_CHANGES) + /* Expands to: + .critChance = B_CRIT_CHANCE, + .critMultiplier = B_CRIT_MULTIPLIER, + */ +}; #if TESTING -EWRAM_DATA u8 *gGenerationalChangesTestOverride = NULL; +EWRAM_DATA struct GenChanges *gConfigChangesTestOverride = NULL; +#define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return gConfigChangesTestOverride->_field; +#define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_CLAMPER(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: clampedValue = min(GET_CONFIG_MAXIMUM(_typeMaxValue), newValue); break; +#define UNPACK_CONFIG_SETTERS(_name, _field, _typeMaxValue, ...) case CONFIG_##_name: gConfigChangesTestOverride->_field = clampedValue; break; +#else + +#define UNPACK_CONFIG_OVERRIDE_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_GETTERS(_name, _field, ...) case CONFIG_##_name: return sConfigChanges._field; +#define UNPACK_CONFIG_CLAMPER(_name, _field, ...) case CONFIG_##_name: return 0; +#define UNPACK_CONFIG_SETTERS(_name, _field, ...) case CONFIG_##_name: return; +#endif + +u32 GetConfig(enum ConfigTag _genConfig) +{ +#if TESTING + if (gConfigChangesTestOverride == NULL) + { + switch (_genConfig) + { + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_GETTERS) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_GETTERS) + /* Expands to: + case CONFIG_CRIT_CHANCE: + return gConfigChangesTestOverride->critChance; + */ + default: + return 0; + } + } + else +#endif + { + switch (_genConfig) + { + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_OVERRIDE_GETTERS) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_OVERRIDE_GETTERS) + /* Expands to: + case CONFIG_CRIT_CHANCE: + return sConfigChanges.critChance; + */ + default: // Invalid config tag + return 0; + } + } +} + +#if TESTING +u32 GetClampedValue(enum ConfigTag _genConfig, u32 newValue) +{ + u32 clampedValue = 0; + switch(_genConfig) + { + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_CLAMPER) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_CLAMPER) + default: + return 0; + } + return clampedValue; +} +#endif + +void SetConfig(enum ConfigTag _genConfig, u32 _value) +{ +#if TESTING + // Clamping is done here instead of the switch due to an internal compiler error! + u32 clampedValue = GetClampedValue(_genConfig, _value); + switch (_genConfig) + { + BATTLE_CONFIG_DEFINITIONS(UNPACK_CONFIG_SETTERS) + POKEMON_CONFIG_DEFINITIONS(UNPACK_CONFIG_SETTERS) + /* Expands to: + #if TESTING + case CONFIG_CRIT_CHANCE: + gConfigChangesTestOverride->critChance = clampedValue; + break; + #else + case CONFIG_CRIT_CHANCE: + return; + #endif + */ + default: // Invalid config tag + return; + } +#endif +} + +#if TESTING void TestInitConfigData(void) { - gGenerationalChangesTestOverride = Alloc(sizeof(sGenerationalChanges)); - memcpy(gGenerationalChangesTestOverride, sGenerationalChanges, sizeof(sGenerationalChanges)); + gConfigChangesTestOverride = Alloc(sizeof(sConfigChanges)); + memcpy(gConfigChangesTestOverride, &sConfigChanges, sizeof(sConfigChanges)); } void TestFreeConfigData(void) { - TRY_FREE_AND_SET_NULL(gGenerationalChangesTestOverride) + TRY_FREE_AND_SET_NULL(gConfigChangesTestOverride) } #endif diff --git a/src/overworld.c b/src/overworld.c index 966898812..a00e9de6a 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -1,6 +1,7 @@ #include "global.h" #include "gflib.h" #include "io_reg.h" +#include "battle_util.h" #include "cable_club.h" #include "clock.h" #include "credits.h" @@ -337,13 +338,7 @@ void Overworld_ResetStateAfterDigEscRope(void) #if B_RESET_FLAGS_VARS_AFTER_WHITEOUT == TRUE void Overworld_ResetBattleFlagsAndVars(void) { - #if B_VAR_STARTING_STATUS != 0 - VarSet(B_VAR_STARTING_STATUS, 0); - #endif - - #if B_VAR_STARTING_STATUS_TIMER != 0 - VarSet(B_VAR_STARTING_STATUS_TIMER, 0); - #endif + ResetStartingStatuses(); #if B_VAR_WILD_AI_FLAGS != 0 VarSet(B_VAR_WILD_AI_FLAGS,0); @@ -1304,7 +1299,7 @@ static const int sUnusedData[] = { 44 }; -const struct Coords32 gDirectionToVectors[] = +const struct Coords32 gDirectionToVectors[] = { [DIR_NONE] = { 0, 0}, [DIR_SOUTH] = { 0, 1}, diff --git a/src/ow_synchronize.c b/src/ow_synchronize.c new file mode 100644 index 000000000..e06c2e495 --- /dev/null +++ b/src/ow_synchronize.c @@ -0,0 +1,114 @@ +#include "global.h" +#include "ow_synchronize.h" +#include "pokemon.h" +#include "random.h" +#include "constants/pokemon.h" + +static UNUSED bool32 HasHalfChance(u32 species); +static UNUSED bool32 HasTwoThirdsChance(u32 species); +static UNUSED bool32 IsFalse(u32 species); +static UNUSED bool32 IsTrue(u32 species); +static UNUSED bool32 IsTrueIfUndiscoveredEggGroup(u32 species); + +const static bool32 (*sSynchronizeModes[]) (u32) = +{ +#if OW_SYNCHRONIZE_NATURE == GEN_3 + [WILDMON_ORIGIN] = HasHalfChance, + [STATIC_WILDMON_ORIGIN] = IsFalse, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsFalse, +#elif OW_SYNCHRONIZE_NATURE <= GEN_5 + [WILDMON_ORIGIN] = HasHalfChance, + [STATIC_WILDMON_ORIGIN] = HasHalfChance, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsFalse, +#elif OW_SYNCHRONIZE_NATURE == GEN_6 + [WILDMON_ORIGIN] = HasHalfChance, + [STATIC_WILDMON_ORIGIN] = HasHalfChance, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsTrueIfUndiscoveredEggGroup, +#elif OW_SYNCHRONIZE_NATURE == GEN_7 + [WILDMON_ORIGIN] = HasHalfChance, + [STATIC_WILDMON_ORIGIN] = HasHalfChance, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsTrue, +#elif OW_SYNCHRONIZE_NATURE == GEN_8 + [WILDMON_ORIGIN] = IsTrue, + [STATIC_WILDMON_ORIGIN] = IsFalse, + [ROAMER_ORIGIN] = IsTrue, + [GIFTMON_ORIGIN] = IsFalse, +#else + [WILDMON_ORIGIN] = IsFalse, + [STATIC_WILDMON_ORIGIN] = IsFalse, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsFalse, +#endif +}; + +const static bool32 (*sCuteCharmModes[]) (u32) = +{ + [WILDMON_ORIGIN] = HasTwoThirdsChance, + [STATIC_WILDMON_ORIGIN] = HasTwoThirdsChance, + [ROAMER_ORIGIN] = IsFalse, + [GIFTMON_ORIGIN] = IsFalse, +}; + +static UNUSED bool32 HasHalfChance(u32 species) +{ + return Random() % 2; +} + +static UNUSED bool32 HasTwoThirdsChance(u32 species) +{ + return Random() % 3; +} + +static UNUSED bool32 IsFalse(u32 species) +{ + return FALSE; +} + +static UNUSED bool32 IsTrue(u32 species) +{ + return TRUE; +} + +static UNUSED bool32 IsTrueIfUndiscoveredEggGroup(u32 species) +{ + return (gSpeciesInfo[species].eggGroups[0] == EGG_GROUP_NO_EGGS_DISCOVERED); +} + +static bool32 IsSynchronizeActive(void) +{ + return ((!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) + && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE)); +} + +static bool32 IsCuteCharmActive(void) +{ + return ((!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) + && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM)); +} + +u32 GetSynchronizedNature(enum GeneratedMonOrigin origin, u32 species) +{ + if (!IsSynchronizeActive()) + return NATURE_RANDOM; + if (!(sSynchronizeModes[origin](species))) + return NATURE_RANDOM; + return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % NUM_NATURES; +} + +u32 GetSynchronizedGender(enum GeneratedMonOrigin origin, u32 species) +{ + if (!IsCuteCharmActive()) + return MON_GENDER_RANDOM; + if (!(sCuteCharmModes[origin](species))) + return MON_GENDER_RANDOM; + u8 leadingMonGender = GetMonGender(&gPlayerParty[0]); + // misses mon is genderless check, although no genderless mon can have cute charm as ability + if (leadingMonGender == MON_FEMALE) + return MON_MALE; + else + return MON_FEMALE; +} diff --git a/src/party_menu.c b/src/party_menu.c index 3b88fafa2..202249c77 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -59,6 +59,7 @@ #include "trade.h" #include "trainer_pokemon_sprites.h" #include "union_room.h" +#include "pokerus.h" #include "constants/abilities.h" #include "constants/battle.h" #include "constants/easy_chat.h" @@ -2002,7 +2003,7 @@ u8 GetMonAilment(struct Pokemon *mon) ailment = GetAilmentFromStatus(GetMonData(mon, MON_DATA_STATUS)); if (ailment != AILMENT_NONE) return ailment; - if (CheckPartyPokerus(mon, 0)) + if (ShouldPokemonShowActivePokerus(mon)) return AILMENT_PKRS; return AILMENT_NONE; } diff --git a/src/pokeball.c b/src/pokeball.c index 114ad88ad..ae112b51b 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -11,6 +11,7 @@ #include "sprite.h" #include "task.h" #include "trig.h" +#include "test_runner.h" #include "util.h" #include "data.h" #include "item.h" @@ -262,7 +263,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_STRANGE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -272,7 +272,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_POKE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -282,7 +281,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_GREAT_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -292,7 +290,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_ULTRA_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -302,7 +299,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_MASTER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -312,7 +308,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_PREMIER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -322,7 +317,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_HEAL_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -332,7 +326,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_NET_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -342,7 +335,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_NEST_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -352,7 +344,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_DIVE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -362,7 +353,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_DUSK_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -372,7 +362,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_TIMER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -382,7 +371,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_QUICK_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -392,7 +380,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_REPEAT_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -402,7 +389,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_LUXURY_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -412,7 +398,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_LEVEL_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -422,7 +407,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_LURE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -432,7 +416,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_MOON_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -442,7 +425,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_FRIEND_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -452,7 +434,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_LOVE_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -462,7 +443,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_FAST_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -472,7 +452,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_HEAVY_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -482,7 +461,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_DREAM_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -492,7 +470,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_SAFARI_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -502,7 +479,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_SPORT_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -512,7 +488,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_PARK_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -522,7 +497,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_BEAST_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, @@ -532,12 +506,17 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .paletteTag = GFX_TAG_CHERISH_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, - .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, }; +#define tFrames data[0] +#define tPan data[1] +#define tThrowId data[2] +#define tBattler data[3] +#define tOpponentBattler data[4] + const u16 gBallItemIds[POKEBALL_COUNT] = { [BALL_STRANGE] = ITEM_STRANGE_BALL, @@ -570,12 +549,6 @@ const u16 gBallItemIds[POKEBALL_COUNT] = [BALL_CHERISH] = ITEM_CHERISH_BALL, }; -#define tFrames data[0] -#define tPan data[1] -#define tThrowId data[2] -#define tBattler data[3] -#define tOpponentBattler data[4] - u8 DoPokeballSendOutAnimation(u32 battler, s16 pan, u8 kindOfThrow) { u8 taskId; @@ -597,8 +570,8 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) { u32 throwCaseId, ballId, battler, ballSpriteId; bool32 notSendOut = FALSE; - u32 throwXoffset = (B_ENEMY_THROW_BALLS >= GEN_6) ? 24 : 0; - s32 throwYoffset = (B_ENEMY_THROW_BALLS >= GEN_6) ? -16 : 24; + u32 throwXoffset = (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? 24 : 0; + s32 throwYoffset = (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? -16 : 24; if (gTasks[taskId].tFrames == 0) { @@ -675,7 +648,7 @@ static inline void DoPokeballSendOutSoundEffect(u32 battler) static inline void *GetOpponentMonSendOutCallback(void) { - return (B_ENEMY_THROW_BALLS >= GEN_6) ? SpriteCB_MonSendOut_1 : SpriteCB_OpponentMonSendOut; + return (B_ENEMY_THROW_BALLS >= GEN_6 && !gTestRunnerHeadless) ? SpriteCB_MonSendOut_1 : SpriteCB_OpponentMonSendOut; } // This sequence of functions is very similar to those that get run when @@ -1205,7 +1178,7 @@ static void SpriteCB_MonSendOut_2(struct Sprite *sprite) u32 r7; bool32 rightPosition = (IsBattlerPlayer(sprite->sBattler)) ? B_POSITION_PLAYER_RIGHT : B_POSITION_OPPONENT_RIGHT; - if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80) + if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80 && !gTestRunnerHeadless) { s16 r4; @@ -1246,7 +1219,8 @@ static void SpriteCB_MonSendOut_2(struct Sprite *sprite) sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive - && sprite->sBattler == GetBattlerAtPosition(rightPosition)) + && sprite->sBattler == GetBattlerAtPosition(rightPosition) + && !gTestRunnerHeadless) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; @@ -1269,12 +1243,15 @@ static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite) static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite) { + if (gTestRunnerHeadless) + sprite->data[0] = 15; sprite->data[0]++; if (sprite->data[0] > 15) { sprite->data[0] = 0; if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive - && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) + && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + && !gTestRunnerHeadless) sprite->callback = SpriteCB_ReleaseMon2FromBall; else sprite->callback = SpriteCB_ReleaseMonFromBall; @@ -1507,7 +1484,7 @@ static void SpriteCB_TradePokeballEnd(struct Sprite *sprite) #undef sTimer // Unreferenced here and in RS, but used in FRLG, possibly by mistake. -void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) +static void UNUSED DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) { DestroySpriteAndFreeResources(sprite); } @@ -1534,7 +1511,7 @@ void StartHealthboxSlideIn(u8 battler) healthboxSprite->y2 = -healthboxSprite->y2; } gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); - if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) + if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT && !gTestRunnerHeadless) healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; } diff --git a/src/pokemon.c b/src/pokemon.c index 58986a87d..c896793ae 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2,7 +2,7 @@ #include "malloc.h" // #include "apprentice.h" #include "battle.h" -#include "battle_ai_switch_items.h" +#include "battle_ai_util.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_message.h" @@ -11,6 +11,7 @@ #include "battle_setup.h" #include "battle_tower.h" #include "battle_z_move.h" +#include "caps.h" #include "data.h" #include "daycare.h" #include "dexnav.h" @@ -22,14 +23,14 @@ #include "field_weather.h" #include "fishing.h" #include "follower_npc.h" +// #include "frontier_util.h" #include "graphics.h" #include "item.h" -#include "caps.h" #include "link.h" +#include "m4a.h" #include "main.h" // #include "move_relearner.h" #include "overworld.h" -#include "m4a.h" #include "party_menu.h" #include "pokedex.h" // #include "pokeblock.h" @@ -38,6 +39,7 @@ #include "pokemon_icon.h" #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" +#include "pokerus.h" #include "random.h" #include "recorded_battle.h" #include "regions.h" @@ -53,8 +55,8 @@ #include "constants/abilities.h" // #include "constants/battle_frontier.h" #include "constants/battle_move_effects.h" -#include "constants/battle_script_commands.h" #include "constants/battle_partner.h" +#include "constants/battle_script_commands.h" #include "constants/battle_string_ids.h" #include "constants/cries.h" #include "constants/event_objects.h" @@ -75,7 +77,7 @@ struct SpeciesItem { u16 species; - u16 item; + enum Item item; }; static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); @@ -98,9 +100,7 @@ EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA u16 gFollowerSteps = 0; #include "data/abilities.h" -#if P_TUTOR_MOVES_ARRAY #include "data/tutor_moves.h" -#endif // P_TUTOR_MOVES_ARRAY // Used in an unreferenced function in RS. // Unreferenced here and in FRLG. @@ -1197,48 +1197,108 @@ void ZeroEnemyPartyMons(void) ZeroMonData(&gEnemyParty[i]); } -void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +void CreateRandomMon(struct Pokemon *mon, u16 species, u8 level) +{ + CreateRandomMonWithIVs(mon, species, level, USE_RANDOM_IVS); +} + +void CreateRandomMonWithIVs(struct Pokemon *mon, u16 species, u8 level, u8 fixedIv) +{ + CreateMonWithIVs(mon, species, level, Random32(), OTID_STRUCT_PLAYER_ID, fixedIv); + GiveMonInitialMoveset(mon); +} + +void CreateMon(struct Pokemon *mon, u16 species, u8 level, u32 personality, struct OriginalTrainerId trainerId) { u32 mail; ZeroMonData(mon); - CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); + CreateBoxMon(&mon->box, species, level, personality, trainerId); SetMonData(mon, MON_DATA_LEVEL, &level); mail = MAIL_NONE; SetMonData(mon, MON_DATA_MAIL, &mail); +} + +void CreateMonWithIVs(struct Pokemon *mon, u16 species, u8 level, u32 personality, struct OriginalTrainerId trainerId, u8 fixedIV) +{ + CreateMon(mon, species, level, personality, trainerId); + SetBoxMonIVs(&mon->box, fixedIV); CalculateMonStats(mon); } -void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +void SetBoxMonIVs(struct BoxPokemon *mon, u8 fixedIV) { - u8 speciesName[POKEMON_NAME_LENGTH + 1]; - u32 personality = Random32(); - u32 value; - u16 checksum; - u8 i; + u32 i, value; enum Stat availableIVs[NUM_STATS]; enum Stat selectedIvs[NUM_STATS]; + + if (fixedIV < USE_RANDOM_IVS) + { + for (i = 0; i < NUM_STATS; i++) + SetBoxMonData(mon, MON_DATA_HP_IV + i, &fixedIV); + return; + } + + u32 iv; + u32 ivRandom = Random32(); + u32 species = GetBoxMonData(mon, MON_DATA_SPECIES); + value = (u16)ivRandom; + + iv = value & MAX_IV_MASK; + SetBoxMonData(mon, MON_DATA_HP_IV, &iv); + iv = (value & (MAX_IV_MASK << 5)) >> 5; + SetBoxMonData(mon, MON_DATA_ATK_IV, &iv); + iv = (value & (MAX_IV_MASK << 10)) >> 10; + SetBoxMonData(mon, MON_DATA_DEF_IV, &iv); + + value = (u16)(ivRandom >> 16); + + iv = value & MAX_IV_MASK; + SetBoxMonData(mon, MON_DATA_SPEED_IV, &iv); + iv = (value & (MAX_IV_MASK << 5)) >> 5; + SetBoxMonData(mon, MON_DATA_SPATK_IV, &iv); + iv = (value & (MAX_IV_MASK << 10)) >> 10; + SetBoxMonData(mon, MON_DATA_SPDEF_IV, &iv); + + if (gSpeciesInfo[species].perfectIVCount != 0) + { + iv = MAX_PER_STAT_IVS; + // Initialize a list of IV indices. + for (i = 0; i < NUM_STATS; i++) + availableIVs[i] = i; + + // Select the IVs that will be perfected. + for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) + { + u8 index = Random() % (NUM_STATS - i); + selectedIvs[i] = availableIVs[index]; + RemoveIVIndexFromList(availableIVs, index); + SetBoxMonData(mon, MON_DATA_HP_IV + selectedIvs[i], &iv); + } + } +} + +void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u32 personality, struct OriginalTrainerId trainerId) +{ + u8 speciesName[POKEMON_NAME_LENGTH + 1]; + u32 value; + u16 checksum; bool32 isShiny; ZeroBoxMonData(boxMon); - // Determine original trainer ID - if (otIdType == OT_ID_RANDOM_NO_SHINY) + if (trainerId.method == OT_ID_RANDOM_NO_SHINY) { value = Random32(); isShiny = FALSE; } - else if (otIdType == OT_ID_PRESET) + else if (trainerId.method == OT_ID_PRESET) { - value = fixedOtId; - isShiny = GET_SHINY_VALUE(value, hasFixedPersonality ? fixedPersonality : personality) < SHINY_ODDS; + value = trainerId.value; + isShiny = GET_SHINY_VALUE(value, personality) < SHINY_ODDS; } else // Player is the OT { - value = gSaveBlock2Ptr->playerTrainerId[0] - | (gSaveBlock2Ptr->playerTrainerId[1] << 8) - | (gSaveBlock2Ptr->playerTrainerId[2] << 16) - | (gSaveBlock2Ptr->playerTrainerId[3] << 24); - + value = READ_OTID_FROM_SAVE; if (P_FLAG_FORCE_NO_SHINY != 0 && FlagGet(P_FLAG_FORCE_NO_SHINY)) { isShiny = FALSE; @@ -1266,19 +1326,17 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, if (gDexNavSpecies) totalRerolls += CalculateDexNavShinyRolls(); - while (GET_SHINY_VALUE(value, personality) >= SHINY_ODDS && totalRerolls > 0) + u32 shinyPersonality = personality; + while (GET_SHINY_VALUE(value, shinyPersonality) >= SHINY_ODDS && totalRerolls > 0) { - personality = Random32(); + shinyPersonality = Random32(); totalRerolls--; } - isShiny = GET_SHINY_VALUE(value, personality) < SHINY_ODDS; + isShiny = GET_SHINY_VALUE(value, shinyPersonality) < SHINY_ODDS; } } - if (hasFixedPersonality) - personality = fixedPersonality; - SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality); SetBoxMonData(boxMon, MON_DATA_OT_ID, &value); @@ -1301,201 +1359,73 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); - enum Type teraType = (boxMon->personality & 0x1) == 0 ? GetSpeciesType(species, 0) : GetSpeciesType(species, 1); + value = boxMon->personality & 0x1; + u32 teraType = value == 0 ? GetSpeciesType(species, 0) : GetSpeciesType(species, 1); SetBoxMonData(boxMon, MON_DATA_TERA_TYPE, &teraType); - - if (fixedIV < USE_RANDOM_IVS) - { - SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); - } - else - { - u32 iv; - u32 ivRandom = Random32(); - value = (u16)ivRandom; - - iv = value & MAX_IV_MASK; - SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); - iv = (value & (MAX_IV_MASK << 5)) >> 5; - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); - iv = (value & (MAX_IV_MASK << 10)) >> 10; - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); - - value = (u16)(ivRandom >> 16); - - iv = value & MAX_IV_MASK; - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); - iv = (value & (MAX_IV_MASK << 5)) >> 5; - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); - iv = (value & (MAX_IV_MASK << 10)) >> 10; - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); - - if (gSpeciesInfo[species].perfectIVCount != 0) - { - iv = MAX_PER_STAT_IVS; - // Initialize a list of IV indices. - for (i = 0; i < NUM_STATS; i++) - { - availableIVs[i] = i; - } - - // Select the IVs that will be perfected. - for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) - { - u8 index = Random() % (NUM_STATS - i); - selectedIvs[i] = availableIVs[index]; - RemoveIVIndexFromList(availableIVs, index); - } - for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) - { - switch (selectedIvs[i]) - { - case STAT_HP: - SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); - break; - case STAT_ATK: - SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); - break; - case STAT_DEF: - SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); - break; - case STAT_SPEED: - SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); - break; - case STAT_SPATK: - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); - break; - case STAT_SPDEF: - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); - break; - default: - break; - } - } - } - } - + //using gen 3-4 ability formula, it was changed in later gens if (GetSpeciesAbility(species, 1)) - { - value = personality & 1; SetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, &value); - } - - GiveBoxMonInitialMoveset(boxMon); } -void CreateMonWithNature(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 nature) +static bool32 IsValidGender(u32 gender) { - u32 personality; + switch (gender) + { + case MON_MALE: + case MON_FEMALE: + case MON_GENDERLESS: + case MON_GENDER_RANDOM: + return TRUE; + default: + return FALSE; + } +} +u32 GetMonPersonality(u16 species, u8 gender, u8 nature, u8 unownLetter) +{ + u32 personality, actualLetter; + + assertf(IsValidGender(gender), "invalid gender: %d", gender) + { + gender = MON_GENDER_RANDOM; + } + + assertf(nature <= NATURE_RANDOM, "invalid nature: %d", nature) + { + nature = NATURE_RANDOM; + } + + assertf(unownLetter <= NUM_UNOWN_FORMS, "invalid letter: %d", unownLetter) + { + unownLetter = RANDOM_UNOWN_LETTER; + } + + //gender outside valid gender ratios for species is not asserted because it could be triggered by cute charm do { personality = Random32(); + actualLetter = GET_UNOWN_LETTER(personality); } - while (nature != GetNatureFromPersonality(personality)); - - CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0); -} - -void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 gender, u8 nature, u8 unownLetter) -{ - u32 personality; - - if ((u8)(unownLetter - 1) < NUM_UNOWN_FORMS) - { - u16 actualLetter; - - do - { - personality = Random32(); - actualLetter = GET_UNOWN_LETTER(personality); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality) - || actualLetter != unownLetter - 1); - } - else - { - do - { - personality = Random32(); - } - while (nature != GetNatureFromPersonality(personality) - || gender != GetGenderFromSpeciesAndPersonality(species, personality)); - } - - CreateMon(mon, species, level, fixedIV, TRUE, personality, OT_ID_PLAYER_ID, 0); + while ((nature != GetNatureFromPersonality(personality) && nature != NATURE_RANDOM) + || (gender != GetGenderFromSpeciesAndPersonality(species, personality) && gender != MON_GENDER_RANDOM) + || ((actualLetter != unownLetter - 1) && unownLetter > 0)); + return personality; } // Used to create the Old Man's Weedle? void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) { - u32 personality; - u32 otId; - - do - { - otId = Random32(); - personality = Random32(); - } - while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); - CreateMon(mon, species, level, USE_RANDOM_IVS, TRUE, personality, OT_ID_PRESET, otId); + u32 personality = GetMonPersonality(species, MON_MALE, NATURE_RANDOM, RANDOM_UNOWN_LETTER); + CreateMonWithIVs(mon, species, level, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(mon); } void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) { - CreateMon(mon, species, level, 0, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMon(mon, species, level, personality, OTID_STRUCT_PLAYER_ID); SetMonData(mon, MON_DATA_IVS, &ivs); CalculateMonStats(mon); -} - -void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u32 otId) -{ - CreateMon(mon, species, level, 0, FALSE, 0, OT_ID_PRESET, otId); - SetMonData(mon, MON_DATA_HP_IV, &ivs[STAT_HP]); - SetMonData(mon, MON_DATA_ATK_IV, &ivs[STAT_ATK]); - SetMonData(mon, MON_DATA_DEF_IV, &ivs[STAT_DEF]); - SetMonData(mon, MON_DATA_SPEED_IV, &ivs[STAT_SPEED]); - SetMonData(mon, MON_DATA_SPATK_IV, &ivs[STAT_SPATK]); - SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[STAT_SPDEF]); - CalculateMonStats(mon); -} - -void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 evSpread) -{ - s32 i; - s32 statCount = 0; - u16 evAmount; - u8 evsBits; - - CreateMon(mon, species, level, fixedIV, FALSE, 0, OT_ID_PLAYER_ID, 0); - - evsBits = evSpread; - - for (i = 0; i < NUM_STATS; i++) - { - if (evsBits & 1) - statCount++; - evsBits >>= 1; - } - - evAmount = MAX_TOTAL_EVS / statCount; - - evsBits = 1; - - for (i = 0; i < NUM_STATS; i++) - { - if (evSpread & evsBits) - SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); - evsBits <<= 1; - } - - CalculateMonStats(mon); + GiveMonInitialMoveset(mon); } void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) @@ -1505,7 +1435,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) u8 language; u8 value; - CreateMon(mon, src->species, src->level, 0, TRUE, src->personality, OT_ID_PRESET, src->otId); + CreateMon(mon, src->species, src->level, src->personality, OTID_STRUCT_PRESET(src->otId)); for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); @@ -1552,67 +1482,67 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) CalculateMonStats(mon); } -// void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50) -// { -// s32 i; -// u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; -// u8 level; -// u8 language; -// u8 value; +void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50) +{ + s32 i; + u8 nickname[max(32, POKEMON_NAME_BUFFER_SIZE)]; + u8 level; + u8 language; + u8 value; -// if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) -// level = GetFrontierEnemyMonLevel(gSaveBlock2Ptr->frontier.lvlMode); -// else if (lvl50) -// level = FRONTIER_MAX_LEVEL_50; -// else -// level = src->level; + // if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_50) + // level = GetFrontierEnemyMonLevel(gSaveBlock2Ptr->frontier.lvlMode); + // else if (lvl50) + // level = FRONTIER_MAX_LEVEL_50; + // else + level = src->level; -// CreateMon(mon, src->species, level, 0, TRUE, src->personality, OT_ID_PRESET, src->otId); + CreateMon(mon, src->species, level, src->personality, OTID_STRUCT_PRESET(src->otId)); -// for (i = 0; i < MAX_MON_MOVES; i++) -// SetMonMoveSlot(mon, src->moves[i], i); + for (i = 0; i < MAX_MON_MOVES; i++) + SetMonMoveSlot(mon, src->moves[i], i); -// SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); -// SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); -// SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); + SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); + SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); + SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); -// StringCopy(nickname, src->nickname); + StringCopy(nickname, src->nickname); -// if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) -// { -// language = LANGUAGE_JAPANESE; -// StripExtCtrlCodes(nickname); -// } -// else -// { -// language = GAME_LANGUAGE; -// } + if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) + { + language = LANGUAGE_JAPANESE; + StripExtCtrlCodes(nickname); + } + else + { + language = GAME_LANGUAGE; + } -// SetMonData(mon, MON_DATA_LANGUAGE, &language); -// SetMonData(mon, MON_DATA_NICKNAME, nickname); -// SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); -// SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); -// SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); -// SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); -// SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); -// SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); -// value = src->abilityNum; -// SetMonData(mon, MON_DATA_ABILITY_NUM, &value); -// value = src->hpIV; -// SetMonData(mon, MON_DATA_HP_IV, &value); -// value = src->attackIV; -// SetMonData(mon, MON_DATA_ATK_IV, &value); -// value = src->defenseIV; -// SetMonData(mon, MON_DATA_DEF_IV, &value); -// value = src->speedIV; -// SetMonData(mon, MON_DATA_SPEED_IV, &value); -// value = src->spAttackIV; -// SetMonData(mon, MON_DATA_SPATK_IV, &value); -// value = src->spDefenseIV; -// SetMonData(mon, MON_DATA_SPDEF_IV, &value); -// MonRestorePP(mon); -// CalculateMonStats(mon); -// } + SetMonData(mon, MON_DATA_LANGUAGE, &language); + SetMonData(mon, MON_DATA_NICKNAME, nickname); + SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); + SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); + SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); + SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); + SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); + SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); + value = src->abilityNum; + SetMonData(mon, MON_DATA_ABILITY_NUM, &value); + value = src->hpIV; + SetMonData(mon, MON_DATA_HP_IV, &value); + value = src->attackIV; + SetMonData(mon, MON_DATA_ATK_IV, &value); + value = src->defenseIV; + SetMonData(mon, MON_DATA_DEF_IV, &value); + value = src->speedIV; + SetMonData(mon, MON_DATA_SPEED_IV, &value); + value = src->spAttackIV; + SetMonData(mon, MON_DATA_SPATK_IV, &value); + value = src->spDefenseIV; + SetMonData(mon, MON_DATA_SPDEF_IV, &value); + MonRestorePP(mon); + CalculateMonStats(mon); +} // void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId) // { @@ -1623,15 +1553,12 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) // u32 personality = ((gApprentices[src->id].otId >> 8) | ((gApprentices[src->id].otId & 0xFF) << 8)) // + src->party[monId].species + src->number; -// CreateMon(mon, +// CreateMonWithIVs(mon, // src->party[monId].species, // GetFrontierEnemyMonLevel(src->lvlMode - 1), -// MAX_PER_STAT_IVS, -// TRUE, // personality, -// OT_ID_PRESET, -// otId); - +// OTID_STRUCT_PRESET(otId), +// MAX_PER_STAT_IVS); // SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item); // for (i = 0; i < MAX_MON_MOVES; i++) // SetMonMoveSlot(mon, src->party[monId].moves[i], i); @@ -1646,47 +1573,13 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) // CalculateMonStats(mon); // } -void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId) -{ - s32 i; - s32 statCount = 0; - u8 evsBits; - u16 evAmount; - - // i is reused as personality value - do - { - i = Random32(); - } while (nature != GetNatureFromPersonality(i)); - - CreateMon(mon, species, level, fixedIV, TRUE, i, OT_ID_PRESET, otId); - evsBits = evSpread; - for (i = 0; i < NUM_STATS; i++) - { - if (evsBits & 1) - statCount++; - evsBits >>= 1; - } - - evAmount = MAX_TOTAL_EVS / statCount; - evsBits = 1; - for (i = 0; i < NUM_STATS; i++) - { - if (evSpread & evsBits) - SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); - evsBits <<= 1; - } - - CalculateMonStats(mon); -} - void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest) { s32 i; u16 heldItem; - dest->species = GetMonData(mon, MON_DATA_SPECIES, NULL); - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + dest->species = GetMonData(mon, MON_DATA_SPECIES); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); if (heldItem == ITEM_ENIGMA_BERRY_E_READER) heldItem = ITEM_NONE; @@ -1694,95 +1587,38 @@ void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerP dest->heldItem = heldItem; for (i = 0; i < MAX_MON_MOVES; i++) - dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, NULL); + dest->moves[i] = GetMonData(mon, MON_DATA_MOVE1 + i); - dest->level = GetMonData(mon, MON_DATA_LEVEL, NULL); - dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - dest->otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); - dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); - dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); - dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); - dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); - dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); - dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); - dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); - dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); - dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); - dest->abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); - dest->personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + dest->level = GetMonData(mon, MON_DATA_LEVEL); + dest->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + dest->otId = GetMonData(mon, MON_DATA_OT_ID); + dest->hpEV = GetMonData(mon, MON_DATA_HP_EV); + dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV); + dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV); + dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV); + dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV); + dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV); + dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + dest->hpIV = GetMonData(mon, MON_DATA_HP_IV); + dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV); + dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV); + dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV); + dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV); + dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV); + dest->abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM); + dest->personality = GetMonData(mon, MON_DATA_PERSONALITY); GetMonData(mon, MON_DATA_NICKNAME10, dest->nickname); } -static void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +static void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u32 personality, struct OriginalTrainerId otId) { bool32 isModernFatefulEncounter = TRUE; - CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); + CreateMon(mon, species, level, personality, otId); SetMonData(mon, MON_DATA_MODERN_FATEFUL_ENCOUNTER, &isModernFatefulEncounter); } -// If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler) -{ - switch (caseId) - { - case 0: - default: - return FALSE; - case 1: // Player's side in battle - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - return FALSE; - if (!gMain.inBattle) - return FALSE; - if (gLinkPlayers[GetMultiplayerId()].id == battler) - return FALSE; - break; - case 2: - break; - case 3: // Summary Screen - if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - return FALSE; - if (!gMain.inBattle) - return FALSE; - if (battler == 1 || battler == 4 || battler == 5) - return TRUE; - return FALSE; - case 4: - break; - case 5: // In move animation, e.g. in Role Play or Snatch - if (gBattleTypeFlags & BATTLE_TYPE_LINK) - { - if (!gMain.inBattle) - return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if (gLinkPlayers[GetMultiplayerId()].id == battler) - return FALSE; - } - else - { - if (IsOnPlayerSide(battler)) - return FALSE; - } - } - else - { - if (!gMain.inBattle) - return FALSE; - if (IsOnPlayerSide(battler)) - return FALSE; - } - break; - } - - return TRUE; -} - -u16 GetUnionRoomTrainerPic(void) +enum TrainerPicID GetUnionRoomTrainerPic(void) { u8 linkId; u32 arrId; @@ -1819,7 +1655,10 @@ void CreateEnemyEventMon(void) s32 itemId = gSpecialVar_0x8006; ZeroEnemyPartyMons(); - CreateEventMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + + CreateEventMon(&gEnemyParty[0], species, level, Random32(), OTID_STRUCT_PLAYER_ID); + SetBoxMonIVs(&gEnemyParty[0].box, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[0]); if (itemId) { u8 heldItem[2]; @@ -1867,14 +1706,14 @@ static u16 CalculateBoxMonChecksumReencrypt(struct BoxPokemon *boxMon) void CalculateMonStats(struct Pokemon *mon) { - s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); - s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); + s32 oldMaxHP = GetMonData(mon, MON_DATA_MAX_HP); + s32 currentHP = GetMonData(mon, MON_DATA_HP); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u8 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); s32 level = GetLevelFromMonExp(mon); s32 newMaxHP; - u8 nature = GetMonData(mon, MON_DATA_HIDDEN_NATURE, NULL); + u8 nature = GetMonData(mon, MON_DATA_HIDDEN_NATURE); SetMonData(mon, MON_DATA_LEVEL, &level); @@ -1948,7 +1787,7 @@ void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; dest->box = *src; - dest->status = GetBoxMonData(&dest->box, MON_DATA_STATUS, NULL); + dest->status = GetBoxMonData(&dest->box, MON_DATA_STATUS); dest->hp = 0; dest->maxHP = 0; value = MAIL_NONE; @@ -1961,8 +1800,8 @@ void BoxMonToMon(const struct BoxPokemon *src, struct Pokemon *dest) u8 GetLevelFromMonExp(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u32 exp = GetMonData(mon, MON_DATA_EXP, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u32 exp = GetMonData(mon, MON_DATA_EXP); s32 level = 1; while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp) @@ -1973,8 +1812,8 @@ u8 GetLevelFromMonExp(struct Pokemon *mon) u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) { - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP, NULL); + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); + u32 exp = GetBoxMonData(boxMon, MON_DATA_EXP); s32 level = 1; while (level <= MAX_LEVEL && gExperienceTables[gSpeciesInfo[species].growthRate][level] <= exp) @@ -1983,17 +1822,17 @@ u8 GetLevelFromBoxMonExp(struct BoxPokemon *boxMon) return level - 1; } -u16 GiveMoveToMon(struct Pokemon *mon, u16 move) +u16 GiveMoveToMon(struct Pokemon *mon, enum Move move) { return GiveMoveToBoxMon(&mon->box, move); } -u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, enum Move move) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { - u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); + enum Move existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i); if (existingMove == MOVE_NONE) { u32 pp = GetMovePP(move); @@ -2007,7 +1846,7 @@ u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) return MON_HAS_MAX_MOVES; } -u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) +u16 GiveMoveToBattleMon(struct BattlePokemon *mon, enum Move move) { s32 i; @@ -2024,17 +1863,17 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) return MON_HAS_MAX_MOVES; } -void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) +void SetMonMoveSlot(struct Pokemon *mon, enum Move move, u8 slot) { SetMonData(mon, MON_DATA_MOVE1 + slot, &move); u32 pp = GetMovePP(move); SetMonData(mon, MON_DATA_PP1 + slot, &pp); } -static void SetMonMoveSlot_KeepPP(struct Pokemon *mon, u16 move, u8 slot) +static void SetMonMoveSlot_KeepPP(struct Pokemon *mon, enum Move move, u8 slot) { - u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); - u8 currPP = GetMonData(mon, MON_DATA_PP1 + slot, NULL); + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + u8 currPP = GetMonData(mon, MON_DATA_PP1 + slot); u8 newPP = CalculatePPWithBonus(move, ppBonuses, slot); u16 finalPP = min(currPP, newPP); @@ -2042,7 +1881,7 @@ static void SetMonMoveSlot_KeepPP(struct Pokemon *mon, u16 move, u8 slot) SetMonData(mon, MON_DATA_PP1 + slot, &finalPP); } -void SetBattleMonMoveSlot(struct BattlePokemon *mon, u16 move, u8 slot) +void SetBattleMonMoveSlot(struct BattlePokemon *mon, enum Move move, u8 slot) { mon->moves[slot] = move; mon->pp[slot] = GetMovePP(move); @@ -2055,10 +1894,10 @@ void GiveMonInitialMoveset(struct Pokemon *mon) void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) //Credit: AsparagusEduardo { - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); s32 level = GetLevelFromBoxMonExp(boxMon); s32 i; - u16 moves[MAX_MON_MOVES] = {MOVE_NONE}; + enum Move moves[MAX_MON_MOVES] = {MOVE_NONE}; u8 addedMoves = 0; const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); @@ -2104,10 +1943,48 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) //Credit: AsparagusEdua } } -u16 MonTryLearningNewMoveAtLevel(struct Pokemon *mon, bool32 firstMove, u32 level) +void GiveMonDefaultMove(struct Pokemon *mon, u32 slot) { - u32 retVal = MOVE_NONE; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + GiveBoxMonDefaultMove(&mon->box, slot); +} + +void GiveBoxMonDefaultMove(struct BoxPokemon *boxMon, u32 slot) +{ + enum Move move = MOVE_NONE; + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + s32 level = GetLevelFromBoxMonExp(boxMon); + for (u32 i = 0; learnset[i].move != LEVEL_UP_MOVE_END; i++) + { + s32 j; + bool32 alreadyKnown = FALSE; + + if (learnset[i].level > level) + break; + if (learnset[i].level == 0) + continue; + + for (j = 0; j < slot; j++) + { + if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + j) == learnset[i].move) + { + alreadyKnown = TRUE; + break; + } + } + if (!alreadyKnown) + move = learnset[i].move; + } + + SetBoxMonData(boxMon, MON_DATA_MOVE1 + slot, &move); + u32 pp = GetMovePP(move); + SetBoxMonData(boxMon, MON_DATA_PP1 + slot, &pp); +} + +enum Move MonTryLearningNewMoveAtLevel(struct Pokemon *mon, bool32 firstMove, u32 level) +{ + enum Move retVal = MOVE_NONE; + u16 species = GetMonData(mon, MON_DATA_SPECIES); const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); // since you can learn more than one move per level @@ -2155,25 +2032,25 @@ u16 MonTryLearningNewMoveAtLevel(struct Pokemon *mon, bool32 firstMove, u32 leve return retVal; } -u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) +enum Move MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { - return MonTryLearningNewMoveAtLevel(mon, firstMove, GetMonData(mon, MON_DATA_LEVEL, NULL)); + return MonTryLearningNewMoveAtLevel(mon, firstMove, GetMonData(mon, MON_DATA_LEVEL)); } -void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) +void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, enum Move move) { s32 i; - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; for (i = 0; i < MAX_MON_MOVES - 1; i++) { - moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetMonData(mon, MON_DATA_PP2 + i, NULL); + moves[i] = GetMonData(mon, MON_DATA_MOVE2 + i); + pp[i] = GetMonData(mon, MON_DATA_PP2 + i); } - ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; pp[MAX_MON_MOVES - 1] = GetMovePP(move); @@ -2187,20 +2064,20 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } -void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) +void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, enum Move move) { s32 i; - u16 moves[MAX_MON_MOVES]; + enum Move moves[MAX_MON_MOVES]; u8 pp[MAX_MON_MOVES]; u8 ppBonuses; for (i = 0; i < MAX_MON_MOVES - 1; i++) { - moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i, NULL); - pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i, NULL); + moves[i] = GetBoxMonData(boxMon, MON_DATA_MOVE2 + i); + pp[i] = GetBoxMonData(boxMon, MON_DATA_PP2 + i); } - ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, NULL); + ppBonuses = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES); ppBonuses >>= 2; moves[MAX_MON_MOVES - 1] = move; pp[MAX_MON_MOVES - 1] = GetMovePP(move); @@ -2280,8 +2157,8 @@ u8 GetMonGender(struct Pokemon *mon) u8 GetBoxMonGender(struct BoxPokemon *boxMon) { - u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); - u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL); + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); + u32 personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); switch (gSpeciesInfo[species].genderRatio) { @@ -2327,7 +2204,7 @@ u32 GetUnownSpeciesId(u32 personality) return unownLetter + SPECIES_UNOWN_B - 1; } -void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) +void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, enum BattlerPosition battlerPosition) { if (gMonSpritesGfxPtr != NULL) gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; @@ -2354,7 +2231,7 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) } } -void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition) +void SetMultiuseSpriteTemplateToTrainerBack(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition) { gMultiuseSpriteTemplate.paletteTag = trainerPicId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) @@ -2373,7 +2250,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition } } -void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPosition) +void SetMultiuseSpriteTemplateToTrainerFront(enum TrainerPicID trainerPicId, enum BattlerPosition battlerPosition) { if (gMonSpritesGfxPtr != NULL) gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; @@ -2454,21 +2331,6 @@ u32 GetMonData3(struct Pokemon *mon, s32 field, u8 *data) case MON_DATA_SPDEF: ret = mon->spDefense; break; - case MON_DATA_ATK2: - ret = mon->attack; - break; - case MON_DATA_DEF2: - ret = mon->defense; - break; - case MON_DATA_SPEED2: - ret = mon->speed; - break; - case MON_DATA_SPATK2: - ret = mon->spAttack; - break; - case MON_DATA_SPDEF2: - ret = mon->spDefense; - break; case MON_DATA_MAIL: ret = mon->mail; break; @@ -2608,7 +2470,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) data[retVal++] = substruct0->nickname12; } } - else if (POKEMON_NAME_LENGTH >= 11) + else if (field != MON_DATA_NICKNAME10 && POKEMON_NAME_LENGTH >= 11) { if (substruct0->nickname11 == 0) { @@ -2702,6 +2564,12 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_POKERUS: retVal = GetSubstruct3(boxMon)->pokerus; break; + case MON_DATA_POKERUS_STRAIN: + retVal = ((GetSubstruct3(boxMon)->pokerus & 0xF0) >> 4); + break; + case MON_DATA_POKERUS_DAYS_LEFT: + retVal = (GetSubstruct3(boxMon)->pokerus & 0x0F); + break; case MON_DATA_MET_LOCATION: retVal = GetSubstruct3(boxMon)->metLocation; break; @@ -2820,7 +2688,7 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) while (moves[i] != MOVES_COUNT) { - u16 move = moves[i]; + enum Move move = moves[i]; if (substruct1->move1 == move || substruct1->move2 == move || substruct1->move3 == move @@ -3017,7 +2885,7 @@ u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field) #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) // -// Prefer SET_BY_WIDTH for fields whose types might be extended (e.g. +// Prefer SET_BY_WIDTH for fields whose types might be extended (e.g. // anything whose typedef is in gametypes.h). // #define SET_BY_WIDTH(lhs) \ @@ -3211,6 +3079,12 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_POKERUS: SET8(GetSubstruct3(boxMon)->pokerus); break; + case MON_DATA_POKERUS_STRAIN: + GetSubstruct3(boxMon)->pokerus = (*data << 4) | (GetSubstruct3(boxMon)->pokerus & 0x0F); + break; + case MON_DATA_POKERUS_DAYS_LEFT: + GetSubstruct3(boxMon)->pokerus = (GetSubstruct3(boxMon)->pokerus & 0xF0) | *data; + break; case MON_DATA_MET_LOCATION: SET8(GetSubstruct3(boxMon)->metLocation); break; @@ -3437,7 +3311,7 @@ void CopyMon(void *dest, void *src, size_t size) memcpy(dest, src, size); } -u8 GiveMonToPlayer(struct Pokemon *mon) +u8 GiveCapturedMonToPlayer(struct Pokemon *mon) { s32 i; @@ -3447,7 +3321,7 @@ u8 GiveMonToPlayer(struct Pokemon *mon) for (i = 0; i < PARTY_SIZE; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) break; } @@ -3472,7 +3346,7 @@ u8 CopyMonToPC(struct Pokemon *mon) for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++) { struct BoxPokemon *checkingMon = GetBoxedMonPtr(boxNo, boxPos); - if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE) + if (GetBoxMonData(checkingMon, MON_DATA_SPECIES) == SPECIES_NONE) { MonRestorePP(mon); CopyMon(checkingMon, &mon->box, sizeof(mon->box)); @@ -3498,7 +3372,7 @@ u8 CalculatePartyCount(struct Pokemon *party) u32 partyCount = 0; while (partyCount < PARTY_SIZE - && GetMonData(&party[partyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + && GetMonData(&party[partyCount], MON_DATA_SPECIES) != SPECIES_NONE) { partyCount++; } @@ -3512,7 +3386,7 @@ u8 CalculatePartyCountOfSide(u32 battler, struct Pokemon *party) GetAIPartyIndexes(battler, &partyCount, &partySize); while (partyCount < partySize - && GetMonData(&party[partyCount], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + && GetMonData(&party[partyCount], MON_DATA_SPECIES) != SPECIES_NONE) { partyCount++; } @@ -3551,9 +3425,9 @@ u8 GetMonsStateToDoubles(void) for (i = 0; i < gPlayerPartyCount; i++) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_EGG - && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0 - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL) != SPECIES_NONE) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG + && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE) aliveCount++; } @@ -3571,9 +3445,9 @@ u8 GetMonsStateToDoubles_2(void) for (i = 0; i < PARTY_SIZE; i++) { - u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG, NULL); + u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG); if (species != SPECIES_EGG && species != SPECIES_NONE - && GetMonData(&gPlayerParty[i], MON_DATA_HP, NULL) != 0) + && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) aliveCount++; } @@ -3610,8 +3484,8 @@ enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum) enum Ability GetMonAbility(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM); return GetAbilityBySpecies(species, abilityNum); } @@ -3626,15 +3500,12 @@ enum Ability GetMonAbility(struct Pokemon *mon) // { // if (gBattleResources->secretBase->party.species[i]) // { -// CreateMon(&gEnemyParty[i], +// CreateMonWithIVs(&gEnemyParty[i], // gBattleResources->secretBase->party.species[i], // gBattleResources->secretBase->party.levels[i], -// 15, -// TRUE, // gBattleResources->secretBase->party.personality[i], -// OT_ID_RANDOM_NO_SHINY, -// 0); - +// OTID_STRUCT_RANDOM_NO_SHINY, +// 15); // SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]); // for (j = 0; j < NUM_STATS; j++) @@ -3650,7 +3521,7 @@ enum Ability GetMonAbility(struct Pokemon *mon) // } // } -u8 GetSecretBaseTrainerPicIndex(void) +enum TrainerPicID GetSecretBaseTrainerPicIndex(void) { u8 facilityClass = sSecretBaseFacilityClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % NUM_SECRET_BASE_CLASSES]; return gFacilityClassToPicIndex[facilityClass]; @@ -3667,7 +3538,7 @@ bool8 IsPlayerPartyAndPokemonStorageFull(void) s32 i; for (i = 0; i < PARTY_SIZE; i++) - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) return FALSE; return IsPokemonStorageFull(); @@ -3827,7 +3698,7 @@ const struct FormChange *GetSpeciesFormChanges(u16 species) return formChanges; } -u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) +u8 CalculatePPWithBonus(enum Move move, u8 ppBonuses, u8 moveIndex) { u8 basePP = GetMovePP(move); return basePP + ((basePP * 20 * ((gPPUpGetMask[moveIndex] & ppBonuses) >> (2 * moveIndex))) / 100); @@ -3835,7 +3706,7 @@ u8 CalculatePPWithBonus(u16 move, u8 ppBonuses, u8 moveIndex) void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex) { - u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); ppBonuses &= gPPUpClearMask[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); } @@ -3852,33 +3723,33 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) for (i = 0; i < MAX_MON_MOVES; i++) { - dst->moves[i] = GetMonData(src, MON_DATA_MOVE1 + i, NULL); - dst->pp[i] = GetMonData(src, MON_DATA_PP1 + i, NULL); + dst->moves[i] = GetMonData(src, MON_DATA_MOVE1 + i); + dst->pp[i] = GetMonData(src, MON_DATA_PP1 + i); } - dst->species = GetMonData(src, MON_DATA_SPECIES, NULL); - dst->item = GetMonData(src, MON_DATA_HELD_ITEM, NULL); - dst->ppBonuses = GetMonData(src, MON_DATA_PP_BONUSES, NULL); - dst->friendship = GetMonData(src, MON_DATA_FRIENDSHIP, NULL); - dst->experience = GetMonData(src, MON_DATA_EXP, NULL); - dst->hpIV = GetMonData(src, MON_DATA_HP_IV, NULL); - dst->attackIV = GetMonData(src, MON_DATA_ATK_IV, NULL); - dst->defenseIV = GetMonData(src, MON_DATA_DEF_IV, NULL); - dst->speedIV = GetMonData(src, MON_DATA_SPEED_IV, NULL); - dst->spAttackIV = GetMonData(src, MON_DATA_SPATK_IV, NULL); - dst->spDefenseIV = GetMonData(src, MON_DATA_SPDEF_IV, NULL); - dst->personality = GetMonData(src, MON_DATA_PERSONALITY, NULL); - dst->status1 = GetMonData(src, MON_DATA_STATUS, NULL); - dst->level = GetMonData(src, MON_DATA_LEVEL, NULL); - dst->hp = GetMonData(src, MON_DATA_HP, NULL); - dst->maxHP = GetMonData(src, MON_DATA_MAX_HP, NULL); - dst->attack = GetMonData(src, MON_DATA_ATK, NULL); - dst->defense = GetMonData(src, MON_DATA_DEF, NULL); - dst->speed = GetMonData(src, MON_DATA_SPEED, NULL); - dst->spAttack = GetMonData(src, MON_DATA_SPATK, NULL); - dst->spDefense = GetMonData(src, MON_DATA_SPDEF, NULL); - dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM, NULL); - dst->otId = GetMonData(src, MON_DATA_OT_ID, NULL); + dst->species = GetMonData(src, MON_DATA_SPECIES); + dst->item = GetMonData(src, MON_DATA_HELD_ITEM); + dst->ppBonuses = GetMonData(src, MON_DATA_PP_BONUSES); + dst->friendship = GetMonData(src, MON_DATA_FRIENDSHIP); + dst->experience = GetMonData(src, MON_DATA_EXP); + dst->hpIV = GetMonData(src, MON_DATA_HP_IV); + dst->attackIV = GetMonData(src, MON_DATA_ATK_IV); + dst->defenseIV = GetMonData(src, MON_DATA_DEF_IV); + dst->speedIV = GetMonData(src, MON_DATA_SPEED_IV); + dst->spAttackIV = GetMonData(src, MON_DATA_SPATK_IV); + dst->spDefenseIV = GetMonData(src, MON_DATA_SPDEF_IV); + dst->personality = GetMonData(src, MON_DATA_PERSONALITY); + dst->status1 = GetMonData(src, MON_DATA_STATUS); + dst->level = GetMonData(src, MON_DATA_LEVEL); + dst->hp = GetMonData(src, MON_DATA_HP); + dst->maxHP = GetMonData(src, MON_DATA_MAX_HP); + dst->attack = GetMonData(src, MON_DATA_ATK); + dst->defense = GetMonData(src, MON_DATA_DEF); + dst->speed = GetMonData(src, MON_DATA_SPEED); + dst->spAttack = GetMonData(src, MON_DATA_SPATK); + dst->spDefense = GetMonData(src, MON_DATA_SPDEF); + dst->abilityNum = GetMonData(src, MON_DATA_ABILITY_NUM); + dst->otId = GetMonData(src, MON_DATA_OT_ID); dst->types[0] = GetSpeciesType(dst->species, 0); dst->types[1] = GetSpeciesType(dst->species, 1); dst->types[2] = TYPE_MYSTERY; @@ -3896,15 +3767,15 @@ void PokemonToBattleMon(struct Pokemon *src, struct BattlePokemon *dst) void CopyPartyMonToBattleData(u32 battler, u32 partyIndex) { - u32 side = GetBattlerSide(battler); + enum BattleSide side = GetBattlerSide(battler); struct Pokemon *party = GetSideParty(side); PokemonToBattleMon(&party[partyIndex], &gBattleMons[battler]); - gBattleStruct->hpOnSwitchout[side] = gBattleMons[battler].hp; + gBattleStruct->battlerState[battler].hpOnSwitchout = gBattleMons[battler].hp; UpdateSentPokesToOpponentValue(battler); ClearTemporarySpeciesSpriteData(battler, FALSE, FALSE); } -bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) +bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, enum Item item, u8 partyIndex, u8 moveIndex) { return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, FALSE); } @@ -3914,18 +3785,8 @@ bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, if ((retVal == 0 || friendshipOnly) && !ShouldSkipFriendshipChange() && friendshipChange == 0) \ { \ friendshipChange = itemEffect[itemEffectParam]; \ - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); \ - if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) \ - friendship += 150 * friendshipChange / 100; \ - else \ - friendship += friendshipChange; \ - if (friendshipChange > 0) \ - { \ - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) \ - friendship++; \ - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) \ - friendship++; \ - } \ + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); \ + friendship += CalculateFriendshipBonuses(mon,friendshipChange,holdEffect); \ if (friendship < 0) \ friendship = 0; \ if (friendship > MAX_FRIENDSHIP) \ @@ -3945,7 +3806,7 @@ const u32 sExpCandyExperienceTable[] = { }; // Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise -bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) +bool8 PokemonUseItemEffects(struct Pokemon *mon, enum Item item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) { u32 dataUnsigned; s32 dataSigned, evCap; @@ -3959,7 +3820,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov enum HoldEffect holdEffect; u8 battler = MAX_BATTLERS_COUNT; bool32 friendshipOnly = FALSE; - u16 heldItem; + enum Item heldItem; u8 effectFlags; s8 evChange; u16 evCount; @@ -3968,7 +3829,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u32 maxAllowedEVs = !B_EV_ITEMS_CAP ? MAX_TOTAL_EVS : GetCurrentEVCap(); // Get item hold effect - heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); if (heldItem == ITEM_ENIGMA_BERRY_E_READER) #if FREE_ENIGMA_BERRY == FALSE holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; @@ -4008,19 +3869,19 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 3: // Rare Candy / EXP Candy if ((itemEffect[i] & ITEM3_LEVEL_UP) - && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) + && GetMonData(mon, MON_DATA_LEVEL) != MAX_LEVEL) { u8 param = GetItemHoldEffectParam(item); dataUnsigned = 0; if (param == 0) // Rare Candy { - dataUnsigned = gExperienceTables[gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; + dataUnsigned = gExperienceTables[gSpeciesInfo[GetMonData(mon, MON_DATA_SPECIES)].growthRate][GetMonData(mon, MON_DATA_LEVEL) + 1]; } else if (param - 1 < ARRAY_COUNT(sExpCandyExperienceTable)) // EXP Candies { - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + dataUnsigned = sExpCandyExperienceTable[param - 1] + GetMonData(mon, MON_DATA_EXP); if (B_RARE_CANDY_CAP && B_EXP_CAP_TYPE == EXP_CAP_HARD) { @@ -4049,7 +3910,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; if ((itemEffect[i] & ITEM3_BURN) && HealStatusConditions(mon, STATUS1_BURN, battler) == 0) retVal = FALSE; - if ((itemEffect[i] & ITEM3_FREEZE) && HealStatusConditions(mon, STATUS1_FREEZE | STATUS1_FROSTBITE, battler) == 0) + if ((itemEffect[i] & ITEM3_FREEZE) && HealStatusConditions(mon, STATUS1_ICY_ANY, battler) == 0) retVal = FALSE; if ((itemEffect[i] & ITEM3_PARALYSIS) && HealStatusConditions(mon, STATUS1_PARALYSIS, battler) == 0) retVal = FALSE; @@ -4062,17 +3923,17 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // PP Up if (effectFlags & ITEM4_PP_UP) { - u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); effectFlags &= ~ITEM4_PP_UP; dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, moveIndex); + temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex), ppBonuses, moveIndex); if (dataUnsigned <= 2 && temp1 > 4) { dataUnsigned = ppBonuses + gPPUpAddValues[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned); - dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp1; - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned; + dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex), dataUnsigned, moveIndex) - temp1; + dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex) + dataUnsigned; SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } @@ -4090,7 +3951,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 1: // ITEM4_EV_ATK evCount = GetMonEVCount(mon); temp2 = itemEffect[itemEffectParam]; - dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1], NULL); + dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1]); evChange = temp2; if (evChange > 0) // Increasing EV (HP or Atk) @@ -4154,8 +4015,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 2: // ITEM4_HEAL_HP { - u32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); - u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); + u32 currentHP = GetMonData(mon, MON_DATA_HP); + u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP); // Check use validity. if ((effectFlags & (ITEM4_REVIVE >> 2) && currentHP != 0) || (!(effectFlags & (ITEM4_REVIVE >> 2)) && currentHP == 0)) @@ -4205,10 +4066,11 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Heal PP for all moves for (temp2 = 0; (signed)(temp2) < (signed)(MAX_MON_MOVES); temp2++) { - u32 move, ppBonus; - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2, NULL); - move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); - ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); + enum Move move; + u32 ppBonus; + dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2); + move = GetMonData(mon, MON_DATA_MOVE1 + temp2); + ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES), temp2); if (dataUnsigned != ppBonus) { dataUnsigned += itemEffect[itemEffectParam]; @@ -4223,10 +4085,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov else { // Heal PP for one move - u16 move; - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); - move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); - u32 ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + enum Move move; + dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex); + move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex); + u32 ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES), moveIndex); if (dataUnsigned != ppBonus) { dataUnsigned += itemEffect[itemEffectParam++]; @@ -4280,7 +4142,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 3: // ITEM5_EV_SPATK evCount = GetMonEVCount(mon); temp2 = itemEffect[itemEffectParam]; - dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1 + 2], NULL); + dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1 + 2]); evChange = temp2; if (evChange > 0) // Increasing EV { @@ -4343,9 +4205,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 4: // ITEM5_PP_MAX { - u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, moveIndex); + temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex), ppBonuses, moveIndex); // Check if 3 PP Ups have been applied already, and that the move has a total PP of at least 5 (excludes Sketch) if (dataUnsigned < 3 && temp2 >= 5) @@ -4355,8 +4217,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov dataUnsigned += gPPUpAddValues[moveIndex] * 3; // Apply 3 PP Ups (max) SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned); - dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp2; - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned; + dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex), dataUnsigned, moveIndex) - temp2; + dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex) + dataUnsigned; SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } @@ -4367,19 +4229,19 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // how much friendship the Pokémon already has. // In general, Pokémon with lower friendship receive more, // and Pokémon with higher friendship receive less. - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100) + if (GetMonData(mon, MON_DATA_FRIENDSHIP) < 100) UPDATE_FRIENDSHIP_FROM_ITEM(); itemEffectParam++; break; case 6: // ITEM5_FRIENDSHIP_MID - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200) + if (GetMonData(mon, MON_DATA_FRIENDSHIP) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP) < 200) UPDATE_FRIENDSHIP_FROM_ITEM(); itemEffectParam++; break; case 7: // ITEM5_FRIENDSHIP_HIGH - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200) + if (GetMonData(mon, MON_DATA_FRIENDSHIP) >= 200) UPDATE_FRIENDSHIP_FROM_ITEM(); itemEffectParam++; break; @@ -4429,7 +4291,7 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 healMask, u8 battler) } } -u8 GetItemEffectParamOffset(u32 battler, u16 itemId, u8 effectByte, u8 effectBit) +u8 GetItemEffectParamOffset(u32 battler, enum Item itemId, u8 effectByte, u8 effectBit) { const u8 *temp; const u8 *itemEffect; @@ -4559,7 +4421,7 @@ static void BufferStatRoseMessage(enum Stat statIdx) BattleStringExpandPlaceholdersToDisplayedString(gText_DefendersStatRose); } -u8 *UseStatIncreaseItem(u16 itemId) +u8 *UseStatIncreaseItem(enum Item itemId) { const u8 *itemEffect; @@ -4779,7 +4641,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti case IF_SPECIES_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { - if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == params[i].arg1) + if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) == params[i].arg1) { currentCondition = TRUE; break; @@ -4807,7 +4669,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti case IF_TYPE_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { - u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); + u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES); if (GetSpeciesType(currSpecies, 0) == params[i].arg1 || GetSpeciesType(currSpecies, 1) == params[i].arg1) { @@ -4835,7 +4697,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti case IF_KNOWS_MOVE_TYPE: for (j = 0; j < MAX_MON_MOVES; j++) { - if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j, NULL)) == params[i].arg1) + if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j)) == params[i].arg1) { currentCondition = TRUE; break; @@ -4892,8 +4754,8 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti break; case IF_CURRENT_DAMAGE_GE: { - u32 currentHp = GetMonData(mon, MON_DATA_HP, NULL); - if (currentHp != 0 && (GetMonData(mon, MON_DATA_MAX_HP, NULL) - currentHp >= params[i].arg1)) + u32 currentHp = GetMonData(mon, MON_DATA_HP); + if (currentHp != 0 && (GetMonData(mon, MON_DATA_MAX_HP) - currentHp >= params[i].arg1)) currentCondition = TRUE; break; } @@ -5154,7 +5016,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 // Pikachu, Meowth, Eevee and Duraludon cannot evolve if they have the // Gigantamax Factor. We assume that is because their evolutions // do not have a Gigantamax Form. - if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR, NULL) + if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR) && GetGMaxTargetSpecies(species) != species && GetGMaxTargetSpecies(targetSpecies) == targetSpecies) { @@ -5466,7 +5328,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) u32 sanitizedTrainerId = SanitizeTrainerId(trainerOpponentId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - return gTrainers[difficulty][sanitizedTrainerId].encounterMusic_gender & (F_TRAINER_FEMALE - 1); + return gTrainers[difficulty][sanitizedTrainerId].encounterMusic; } u16 ModifyStatByNature(u8 nature, u16 stat, enum Stat statIndex) @@ -5513,7 +5375,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) if (species && species != SPECIES_EGG) { u8 friendshipLevel = 0; - s16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + s32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); enum TrainerClassID opponentTrainerClass = GetTrainerClassFromId(TRAINER_BATTLE_PARAM.opponentA); if (friendship > 99) @@ -5539,18 +5401,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) } mod = sFriendshipEventModifiers[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) - // 50% increase, rounding down - mod = (150 * mod) / 100; - - friendship += mod; - if (mod > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } + friendship += CalculateFriendshipBonuses(mon,mod,holdEffect); if (friendship < 0) friendship = 0; @@ -5561,6 +5412,27 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) } } +u8 CalculateFriendshipBonuses(struct Pokemon *mon, u32 modifier, enum HoldEffect itemHoldEffect) +{ + u32 bonus = 0; + + if ((modifier > 0) && (itemHoldEffect == HOLD_EFFECT_FRIENDSHIP_UP)) + bonus += 150 * modifier / 100; + else + bonus += modifier; + + if (modifier == 0) + return bonus; + + if (GetMonData(mon, MON_DATA_POKEBALL) == ITEM_LUXURY_BALL) + bonus += ITEM_FRIENDSHIP_LUXURY_BONUS; + + if (GetMonData(mon, MON_DATA_MET_LOCATION) == GetCurrentRegionMapSectionId()) + bonus += ITEM_FRIENDSHIP_MAPSEC_BONUS; + + return bonus; +} + void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) { u8 evs[NUM_STATS]; @@ -5605,7 +5477,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) if (totalEVs >= currentEVCap) break; - if (CheckPartyHasHadPokerus(mon, 0)) + if (CheckMonHasHadPokerus(mon)) multiplier = 2; else multiplier = 1; @@ -5682,152 +5554,6 @@ u16 GetMonEVCount(struct Pokemon *mon) return count; } -void RandomlyGivePartyPokerus(struct Pokemon *party) -{ - u16 rnd = Random(); - if (rnd == 0x4000 || rnd == 0x8000 || rnd == 0xC000) - { - struct Pokemon *mon; - - do - { - rnd = Random() % PARTY_SIZE; - mon = &party[rnd]; - } - while (!GetMonData(mon, MON_DATA_SPECIES, 0) || GetMonData(mon, MON_DATA_IS_EGG, 0)); - - if (!(CheckPartyHasHadPokerus(party, 1u << rnd))) - { - u8 rnd2; - - do - { - rnd2 = Random(); - } - while ((rnd2 & 0x7) == 0); - - if (rnd2 & 0xF0) - rnd2 &= 0x7; - - rnd2 |= (rnd2 << 4); - rnd2 &= 0xF3; - rnd2++; - - SetMonData(&party[rnd], MON_DATA_POKERUS, &rnd2); - } - } -} - -u8 CheckPartyPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && (GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0) & 0xF)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0) & 0xF) - { - retVal = 1; - } - - return retVal; -} - -u8 CheckPartyHasHadPokerus(struct Pokemon *party, u8 selection) -{ - u8 retVal; - - int partyIndex = 0; - unsigned curBit = 1; - retVal = 0; - - if (selection) - { - do - { - if ((selection & 1) && GetMonData(&party[partyIndex], MON_DATA_POKERUS, 0)) - retVal |= curBit; - partyIndex++; - curBit <<= 1; - selection >>= 1; - } - while (selection); - } - else if (GetMonData(&party[0], MON_DATA_POKERUS, 0)) - { - retVal = 1; - } - - return retVal; -} - -void UpdatePartyPokerusTime(u16 days) -{ - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS, 0); - if (pokerus & 0xF) - { - if ((pokerus & 0xF) < days || days > 4) - pokerus &= 0xF0; - else - pokerus -= days; - - if (pokerus == 0) - pokerus = 0x10; - - SetMonData(&gPlayerParty[i], MON_DATA_POKERUS, &pokerus); - } - } - } -} - -void PartySpreadPokerus(struct Pokemon *party) -{ - if ((Random() % 3) == 0) - { - int i; - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&party[i], MON_DATA_SPECIES, 0)) - { - u8 pokerus = GetMonData(&party[i], MON_DATA_POKERUS, 0); - u8 curPokerus = pokerus; - if (pokerus) - { - if (pokerus & 0xF) - { - // Spread to adjacent party members. - if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) - SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); - if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) - { - SetMonData(&party[i + 1], MON_DATA_POKERUS, &curPokerus); - i++; - } - } - } - } - } - } -} - bool8 TryIncrementMonLevel(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); @@ -5849,90 +5575,19 @@ bool8 TryIncrementMonLevel(struct Pokemon *mon) } } -static const u16 sUniversalMoves[] = -{ - MOVE_BIDE, - MOVE_FRUSTRATION, - MOVE_HIDDEN_POWER, - MOVE_MIMIC, - MOVE_NATURAL_GIFT, - MOVE_RAGE, - MOVE_RETURN, - MOVE_SECRET_POWER, - MOVE_SUBSTITUTE, - MOVE_TERA_BLAST, -}; - -u8 CanLearnTeachableMove(u16 species, u16 move) +u8 CanLearnTeachableMove(u16 species, enum Move move) { + const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); if (species == SPECIES_EGG) - { return FALSE; - } - else if (species == SPECIES_MEW) + for (u32 i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) { - switch (move) - { - case MOVE_BADDY_BAD: - case MOVE_BOUNCY_BUBBLE: - case MOVE_BUZZY_BUZZ: - case MOVE_DRAGON_ASCENT: - case MOVE_FLOATY_FALL: - case MOVE_FREEZY_FROST: - case MOVE_GLITZY_GLOW: - case MOVE_RELIC_SONG: - case MOVE_SAPPY_SEED: - case MOVE_SECRET_SWORD: - case MOVE_SIZZLY_SLIDE: - case MOVE_SPARKLY_SWIRL: - case MOVE_SPLISHY_SPLASH: - case MOVE_VOLT_TACKLE: - case MOVE_ZIPPY_ZAP: - return FALSE; - default: + if (teachableLearnset[i] == move) return TRUE; - } - } - else - { - u32 i, j; - const u16 *teachableLearnset = GetSpeciesTeachableLearnset(species); - for (i = 0; i < ARRAY_COUNT(sUniversalMoves); i++) - { - if (sUniversalMoves[i] == move) - { - if (!gSpeciesInfo[species].tmIlliterate) - { - if (move == MOVE_TERA_BLAST && GET_BASE_SPECIES_ID(species) == SPECIES_TERAPAGOS) - return FALSE; - if (GET_BASE_SPECIES_ID(species) == SPECIES_PYUKUMUKU && (move == MOVE_HIDDEN_POWER || move == MOVE_RETURN || move == MOVE_FRUSTRATION)) - return FALSE; - return TRUE; - } - else - { - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - - if (P_TM_LITERACY < GEN_6) - return FALSE; - - for (j = 0; j < MAX_LEVEL_UP_MOVES && learnset[j].move != LEVEL_UP_MOVE_END; j++) - { - if (learnset[j].move == move) - return TRUE; - } - return FALSE; - } - } - } - for (i = 0; teachableLearnset[i] != MOVE_UNAVAILABLE; i++) - { - if (teachableLearnset[i] == move) - return TRUE; - } - return FALSE; } + return FALSE; } + u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) { u16 learnedMoves[4]; @@ -5973,62 +5628,6 @@ u8 GetMoveRelearnerMoves(struct Pokemon *mon, u16 *moves) return numMoves; } -u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) -{ - u8 numMoves = 0; - int i; - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - - for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) - moves[numMoves++] = learnset[i].move; - - return numMoves; -} - -u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) -{ - u16 learnedMoves[MAX_MON_MOVES]; - u16 moves[MAX_LEVEL_UP_MOVES]; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - int i, j, k; - - if (species == SPECIES_EGG) - return 0; - - for (i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) - { - u16 moveLevel; - - if (learnset[i].move == LEVEL_UP_MOVE_END) - break; - - moveLevel = learnset[i].level; - - if (moveLevel <= level) - { - for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != learnset[i].move; j++) - ; - - if (j == MAX_MON_MOVES) - { - for (k = 0; k < numMoves && moves[k] != learnset[i].move; k++) - ; - - if (k == numMoves) - moves[numMoves++] = learnset[i].move; - } - } - } - - return numMoves; -} - static void QuickSortMoves(u16 *moves, s32 left, s32 right) { if (left >= right) @@ -6058,49 +5657,33 @@ static void QuickSortMoves(u16 *moves, s32 left, s32 right) QuickSortMoves(moves, i, right); } -static void SortMovesAlphabetically(u16 *moves, u8 numMoves) +static void SortMovesAlphabetically(u16 *moves, u32 numMoves) { if (numMoves > 1) QuickSortMoves(moves, 0, numMoves - 1); } -u8 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves) +u32 GetRelearnerLevelUpMovesBox(struct BoxPokemon *boxMon, u16 *moves) { - u16 learnedMoves[MAX_MON_MOVES] = {0}; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u8 level = (P_ENABLE_ALL_LEVEL_UP_MOVES ? MAX_LEVEL : GetMonData(mon, MON_DATA_LEVEL, 0)); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); - for (u8 i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + if (species == SPECIES_EGG) + return 0; + + u32 numMoves = 0; + u32 level = (P_ENABLE_ALL_LEVEL_UP_MOVES == TRUE) ? MAX_LEVEL : GetLevelFromBoxMonExp(boxMon); do { const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); - for (u16 i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + for (u32 i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) { if (learnset[i].level > level) - continue; + break; - u16 j; - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (learnedMoves[j] == learnset[i].move) - break; - } - if (j < MAX_MON_MOVES) - continue; - - for (j = 0; j < numMoves; j++) - { - if (moves[j] == learnset[i].move) - break; - } - if (j < numMoves) - continue; - - moves[numMoves++] = learnset[i].move; + if (!BoxMonKnowsMove(boxMon, learnset[i].move)) + moves[numMoves++] = learnset[i].move; } species = (P_PRE_EVO_MOVES ? GetSpeciesPreEvolution(species) : SPECIES_NONE); @@ -6112,197 +5695,324 @@ u8 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves) return numMoves; } -u8 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves) +u32 GetRelearnerLevelUpMoves(struct Pokemon *mon, u16 *moves) { - u16 learnedMoves[MAX_MON_MOVES] = {0}; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES); - - while (GetSpeciesPreEvolution(species) != SPECIES_NONE) - species = GetSpeciesPreEvolution(species); - const u16 *eggMoves = GetSpeciesEggMoves(species); - - if (eggMoves == sNoneEggMoveLearnset) - return numMoves; - - for (u8 i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (u16 i = 0; eggMoves[i] != MOVE_UNAVAILABLE; i++) - { - u16 j; - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (learnedMoves[j] == eggMoves[i]) - break; - } - if (j < MAX_MON_MOVES) - continue; - - for (j = 0; j < numMoves; j++) - { - if (moves[j] == eggMoves[i]) - break; - } - if (j < numMoves) - continue; - - moves[numMoves++] = eggMoves[i]; - } - - if (P_SORT_MOVES) - SortMovesAlphabetically(moves, numMoves); - - return numMoves; + return GetRelearnerLevelUpMovesBox(&mon->box, moves); } -u8 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves) -{ - u16 learnedMoves[MAX_MON_MOVES] = {0}; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES); - u16 allMoves[NUM_ALL_MACHINES]; - u16 totalMoveCount = 0; - - for (u16 i = 0; i < NUM_ALL_MACHINES; i++) - { - enum TMHMItemId item = GetTMHMItemId(i + 1); - u16 move = GetTMHMMoveId(i + 1); - if ((P_ENABLE_ALL_TM_MOVES || CheckBagHasItem(item, 1)) && CanLearnTeachableMove(species, move) && move != MOVE_NONE) - allMoves[totalMoveCount++] = move; - } - - for (u8 i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (u16 i = 0; i < totalMoveCount; i++) - { - u16 j; - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (learnedMoves[j] == allMoves[i]) - break; - } - if (j < MAX_MON_MOVES) - continue; - - for (j = 0; j < numMoves; j++) - { - if (moves[j] == allMoves[i]) - break; - } - if (j < numMoves) - continue; - - moves[numMoves++] = allMoves[i]; - } - - if (P_SORT_MOVES) - SortMovesAlphabetically(moves, numMoves); - - return numMoves; -} - -u8 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves) -{ -#if P_TUTOR_MOVES_ARRAY - u16 learnedMoves[MAX_MON_MOVES] = {0}; - u8 numMoves = 0; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - - for (u8 i = 0; i < MAX_MON_MOVES; i++) - learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); - - for (u16 i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) - { - u16 move = gTutorMoves[i]; - - if (!CanLearnTeachableMove(species, move)) - continue; - - u16 j; - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (learnedMoves[j] == move) - break; - } - if (j < MAX_MON_MOVES) - continue; - - for (j = 0; j < numMoves; j++) - { - if (moves[j] == move) - break; - } - if (j < numMoves) - continue; - - moves[numMoves++] = move; - } - - if (P_SORT_MOVES) - SortMovesAlphabetically(moves, numMoves); - - return numMoves; -#else - return 0; -#endif // P_TUTOR_MOVES_ARRAY -} - -u8 GetNumberOfLevelUpMoves(struct Pokemon *mon) -{ - u16 moves[MAX_RELEARNER_MOVES] = {0}; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); - - if (species == SPECIES_EGG) - return 0; - - return GetRelearnerLevelUpMoves(mon, moves); -} - -u8 GetNumberOfEggMoves(struct Pokemon *mon) +u32 GetRelearnerEggMovesBox(struct BoxPokemon *boxMon, u16 *moves) { if (!FlagGet(P_FLAG_EGG_MOVES) && !P_ENABLE_MOVE_RELEARNERS) return 0; - u16 moves[EGG_MOVES_ARRAY_COUNT] = {0}; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_EGG) return 0; - return GetRelearnerEggMoves(mon, moves); + u32 numMoves = 0; + + while (GetSpeciesPreEvolution(species) != SPECIES_NONE) + species = GetSpeciesPreEvolution(species); + + const u16 *eggMoves = GetSpeciesEggMoves(species); + + if (eggMoves == sNoneEggMoveLearnset) + return 0; + + for (u32 i = 0; eggMoves[i] != MOVE_UNAVAILABLE; i++) + { + if (!BoxMonKnowsMove(boxMon, eggMoves[i])) + moves[numMoves++] = eggMoves[i]; + } + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; } -u8 GetNumberOfTMMoves(struct Pokemon *mon) +u32 GetRelearnerEggMoves(struct Pokemon *mon, u16 *moves) { - if (!P_TM_MOVES_RELEARNER) + return GetRelearnerEggMovesBox(&mon->box, moves); +} + +u32 GetRelearnerTMMovesBox(struct BoxPokemon *boxMon, u16 *moves) +{ + if (!P_TM_MOVES_RELEARNER && !P_ENABLE_MOVE_RELEARNERS) return 0; - if (!P_ENABLE_ALL_TM_MOVES && !IsBagPocketNonEmpty(POCKET_TM_HM)) - return 0; - - u16 moves[MAX_RELEARNER_MOVES] = {0}; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_EGG) return 0; - return GetRelearnerTMMoves(mon, moves); + u32 numMoves = 0; + + for (u32 i = 0; i < NUM_ALL_MACHINES; i++) + { + enum Item item = GetTMHMItemId(i + 1); + enum Move move = GetTMHMMoveId(i + 1); + + if (move == MOVE_NONE) + continue; + + if (!P_ENABLE_ALL_TM_MOVES && !CheckBagHasItem(item, 1)) + continue; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!BoxMonKnowsMove(boxMon, move)) + moves[numMoves++] = move; + } + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; } -u8 GetNumberOfTutorMoves(struct Pokemon *mon) +u32 GetRelearnerTMMoves(struct Pokemon *mon, u16 *moves) +{ + return GetRelearnerTMMovesBox(&mon->box, moves); +} + +u32 GetRelearnerTutorMovesBox(struct BoxPokemon *boxMon, u16 *moves) { if (!FlagGet(P_FLAG_TUTOR_MOVES) && !P_ENABLE_MOVE_RELEARNERS) return 0; - u16 moves[MAX_RELEARNER_MOVES] = {0}; - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); if (species == SPECIES_EGG) return 0; - return GetRelearnerTutorMoves(mon, moves); + u32 numMoves = 0; + + for (u32 i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) + { + enum Move move = gTutorMoves[i]; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!BoxMonKnowsMove(boxMon, move)) + moves[numMoves++] = move; + } + + if (P_SORT_MOVES) + SortMovesAlphabetically(moves, numMoves); + + return numMoves; +} + +u32 GetRelearnerTutorMoves(struct Pokemon *mon, u16 *moves) +{ + return GetRelearnerTutorMovesBox(&mon->box, moves); +} + +bool32 HasRelearnerLevelUpMovesBox(struct BoxPokemon *boxMon) +{ + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); + + if (species == SPECIES_EGG) + return FALSE; + + u32 level = (P_ENABLE_ALL_LEVEL_UP_MOVES == TRUE) ? MAX_LEVEL : GetLevelFromBoxMonExp(boxMon); + + do + { + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + for (u32 i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + { + if (learnset[i].level > level) + break; + + if (!BoxMonKnowsMove(boxMon, learnset[i].move)) + return TRUE; + } + + species = (P_PRE_EVO_MOVES ? GetSpeciesPreEvolution(species) : SPECIES_NONE); + + } while (species != SPECIES_NONE); + + return FALSE; +} + +bool32 HasRelearnerLevelUpMoves(struct Pokemon *mon) +{ + return HasRelearnerLevelUpMovesBox(&mon->box); +} + +bool32 HasRelearnerEggMovesBox(struct BoxPokemon *boxMon) +{ + if (!FlagGet(P_FLAG_EGG_MOVES) && !P_ENABLE_MOVE_RELEARNERS) + return FALSE; + + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); + + if (species == SPECIES_EGG) + return FALSE; + + while (GetSpeciesPreEvolution(species) != SPECIES_NONE) + species = GetSpeciesPreEvolution(species); + + const u16 *eggMoves = GetSpeciesEggMoves(species); + + if (eggMoves == sNoneEggMoveLearnset) + return FALSE; + + for (u32 i = 0; eggMoves[i] != MOVE_UNAVAILABLE; i++) + { + if (!BoxMonKnowsMove(boxMon, eggMoves[i])) + return TRUE; + } + + return FALSE; +} + +bool32 HasRelearnerEggMoves(struct Pokemon *mon) +{ + return HasRelearnerEggMovesBox(&mon->box); +} + +bool32 HasRelearnerTMMovesBox(struct BoxPokemon *boxMon) +{ + if (!P_TM_MOVES_RELEARNER && !P_ENABLE_MOVE_RELEARNERS) + return FALSE; + + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); + + if (species == SPECIES_EGG) + return FALSE; + + for (u32 i = 0; i < NUM_ALL_MACHINES; i++) + { + enum Item item = GetTMHMItemId(i + 1); + enum Move move = GetTMHMMoveId(i + 1); + + if (move == MOVE_NONE) + continue; + + if (!P_ENABLE_ALL_TM_MOVES && !CheckBagHasItem(item, 1)) + continue; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!BoxMonKnowsMove(boxMon, move)) + return TRUE; + } + + return FALSE; +} + +bool32 HasRelearnerTMMoves(struct Pokemon *mon) +{ + return HasRelearnerTMMovesBox(&mon->box); +} + +bool32 HasRelearnerTutorMovesBox(struct BoxPokemon *boxMon) +{ + if (!FlagGet(P_FLAG_TUTOR_MOVES) && !P_ENABLE_MOVE_RELEARNERS) + return FALSE; + + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES_OR_EGG); + + if (species == SPECIES_EGG) + return FALSE; + + for (u32 i = 0; gTutorMoves[i] != MOVE_UNAVAILABLE; i++) + { + enum Move move = gTutorMoves[i]; + + if (!CanLearnTeachableMove(species, move)) + continue; + + if (!BoxMonKnowsMove(boxMon, move)) + return TRUE; + } + + return FALSE; +} + +bool32 HasRelearnerTutorMoves(struct Pokemon *mon) +{ + return HasRelearnerTutorMovesBox(&mon->box); +} + +u8 GetLevelUpMovesBySpecies(u16 species, u16 *moves) +{ + u8 numMoves = 0; + int i; + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + + for (i = 0; i < MAX_LEVEL_UP_MOVES && learnset[i].move != LEVEL_UP_MOVE_END; i++) + moves[numMoves++] = learnset[i].move; + + return numMoves; +} + +u8 GetNumberOfRelearnableMoves(struct Pokemon *mon) +{ + enum Move learnedMoves[MAX_MON_MOVES]; + enum Move moves[MAX_LEVEL_UP_MOVES]; + u8 numMoves = 0; + u16 species; + u8 level; + if(gSpecialVar_MonBoxId == 0xFF) + { + species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, 0); + level = GetMonData(mon, MON_DATA_LEVEL, 0); + } + else + { + species = GetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_SPECIES_OR_EGG); + level = GetBoxMonLevelAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos); + } + + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); + int i, j, k; + + if (species == SPECIES_EGG) + return 0; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if(gSpecialVar_MonBoxId == 0xFF) + learnedMoves[i] = GetMonData(mon, MON_DATA_MOVE1 + i, 0); + else + learnedMoves[i] = GetBoxMonDataAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, MON_DATA_MOVE1 + i); + } + + for (i = 0; i < MAX_LEVEL_UP_MOVES; i++) + { + u16 moveLevel; + + if (learnset[i].move == LEVEL_UP_MOVE_END) + break; + + moveLevel = learnset[i].level; + + if (moveLevel <= level) + { + for (j = 0; j < MAX_MON_MOVES && learnedMoves[j] != learnset[i].move; j++) + ; + + if (j == MAX_MON_MOVES) + { + for (k = 0; k < numMoves && moves[k] != learnset[i].move; k++) + ; + + if (k == numMoves) + moves[numMoves++] = learnset[i].move; + } + } + } + + return numMoves; } u16 SpeciesToPokedexNum(u16 species) @@ -6327,7 +6037,7 @@ u16 GetBattleBGM(void) { if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY) { - switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL)) + switch (GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)) { case SPECIES_REGIROCK: case SPECIES_REGICE: @@ -6414,22 +6124,40 @@ static void Task_PlayMapChosenOrBattleBGM(u8 taskId) const u16 *GetMonFrontSpritePal(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES_OR_EGG, NULL); - bool32 isShiny = GetMonData(mon, MON_DATA_IS_SHINY, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - return GetMonSpritePalFromSpeciesAndPersonality(species, isShiny, personality); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + bool32 isShiny = GetMonData(mon, MON_DATA_IS_SHINY); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY); + bool32 isEgg = GetMonData(mon, MON_DATA_IS_EGG); + return GetMonSpritePalFromSpeciesAndPersonalityIsEgg(species, isShiny, personality, isEgg); } const u16 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, bool32 isShiny, u32 personality) { - return GetMonSpritePalFromSpecies(species, isShiny, IsPersonalityFemale(species, personality)); + return GetMonSpritePalFromSpeciesIsEgg(species, isShiny, IsPersonalityFemale(species, personality), FALSE); +} + +const u16 *GetMonSpritePalFromSpeciesAndPersonalityIsEgg(u16 species, bool32 isShiny, u32 personality, bool32 isEgg) +{ + return GetMonSpritePalFromSpeciesIsEgg(species, isShiny, IsPersonalityFemale(species, personality), isEgg); } const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFemale) +{ + return GetMonSpritePalFromSpeciesIsEgg(species, isShiny, isFemale, FALSE); +} + +const u16 *GetMonSpritePalFromSpeciesIsEgg(u16 species, bool32 isShiny, bool32 isFemale, bool32 isEgg) { species = SanitizeSpeciesId(species); - if (isShiny) + if (isEgg) + { + if (gSpeciesInfo[species].eggId != EGG_ID_NONE) + return gEggDatas[gSpeciesInfo[species].eggId].eggPalette; + else + return gSpeciesInfo[SPECIES_EGG].palette; + } + else if (isShiny) { #if P_GENDER_DIFFERENCES if (gSpeciesInfo[species].shinyPaletteFemale != NULL && isFemale) @@ -6457,14 +6185,14 @@ const u16 *GetMonSpritePalFromSpecies(u16 species, bool32 isShiny, bool32 isFema #define OR_MOVE_IS_HM(_hm) || (move == MOVE_##_hm) -bool32 IsMoveHM(u16 move) +bool32 IsMoveHM(enum Move move) { return FALSE FOREACH_HM(OR_MOVE_IS_HM); } #undef OR_MOVE_IS_HM -bool32 CannotForgetMove(u16 move) +bool32 CannotForgetMove(enum Move move) { if (P_CAN_FORGET_HIDDEN_MOVE) return FALSE; @@ -6500,11 +6228,7 @@ bool8 IsTradedMon(struct Pokemon *mon) bool8 IsOtherTrainer(u32 otId, u8 *otName) { - if (otId == - (gSaveBlock2Ptr->playerTrainerId[0] - | (gSaveBlock2Ptr->playerTrainerId[1] << 8) - | (gSaveBlock2Ptr->playerTrainerId[2] << 16) - | (gSaveBlock2Ptr->playerTrainerId[3] << 24))) + if (otId == READ_OTID_FROM_SAVE) { int i; for (i = 0; otName[i] != EOS; i++) @@ -6529,7 +6253,7 @@ void BoxMonRestorePP(struct BoxPokemon *boxMon) { if (GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0)) { - u16 move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); + enum Move move = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, 0); u16 bonus = GetBoxMonData(boxMon, MON_DATA_PP_BONUSES, 0); u8 pp = CalculatePPWithBonus(move, bonus, i); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp); @@ -6593,7 +6317,7 @@ void SetWildMonHeldItem(void) for (i = 0; i < count; i++) { - if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE) + if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM) != ITEM_NONE) continue; // prevent overwriting previously set item rnd = Random() % 100; @@ -6642,7 +6366,7 @@ void SetWildMonHeldItem(void) bool8 IsMonShiny(struct Pokemon *mon) { - return GetMonData(mon, MON_DATA_IS_SHINY, NULL); + return GetMonData(mon, MON_DATA_IS_SHINY); } const u8 *GetTrainerPartnerName(void) @@ -6836,12 +6560,12 @@ u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId) return i; } -u16 FacilityClassToPicIndex(u16 facilityClass) +enum TrainerPicID FacilityClassToPicIndex(u16 facilityClass) { return gFacilityClassToPicIndex[facilityClass]; } -u16 PlayerGenderToFrontTrainerPicId(u8 playerGender) +enum TrainerPicID PlayerGenderToFrontTrainerPicId(u8 playerGender) { if (playerGender != MALE) return FacilityClassToPicIndex(FACILITY_CLASS_LEAF); @@ -7102,7 +6826,7 @@ u32 GetFormChangeTargetSpecies(struct Pokemon *mon, enum FormChanges method, u32 u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges method, u32 arg) { u32 i; - u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); + u32 species = GetBoxMonData(boxMon, MON_DATA_SPECIES); u32 targetSpecies = species; const struct FormChange *formChanges = GetSpeciesFormChanges(species); u16 heldItem; @@ -7110,8 +6834,8 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges if (formChanges != NULL) { - heldItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM, NULL); - ability = GetAbilityBySpecies(species, GetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, NULL)); + heldItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); + ability = GetAbilityBySpecies(species, GetBoxMonData(boxMon, MON_DATA_ABILITY_NUM)); for (i = 0; formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) { @@ -7156,7 +6880,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges break; } - if (formChanges[i].param3 != STATUS1_NONE && GetBoxMonData(boxMon, MON_DATA_STATUS, NULL) & formChanges[i].param3) + if (formChanges[i].param3 != STATUS1_NONE && GetBoxMonData(boxMon, MON_DATA_STATUS) & formChanges[i].param3) pass = FALSE; if (pass) @@ -7190,7 +6914,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges targetSpecies = formChanges[i].targetSpecies; break; case FORM_CHANGE_STATUS: - if (GetBoxMonData(boxMon, MON_DATA_STATUS, NULL) & formChanges[i].param1) + if (GetBoxMonData(boxMon, MON_DATA_STATUS) & formChanges[i].param1) targetSpecies = formChanges[i].targetSpecies; break; case FORM_CHANGE_TIME_OF_DAY: @@ -7219,7 +6943,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges void TrySetDayLimitToFormChange(struct Pokemon *mon) { u32 i; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); const struct FormChange *formChanges = GetSpeciesFormChanges(species); for (i = 0; formChanges != NULL && formChanges[i].method != FORM_CHANGE_TERMINATOR; i++) @@ -7248,8 +6972,8 @@ bool32 DoesSpeciesHaveFormChangeMethod(u16 species, enum FormChanges method) u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove) { - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); - u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); + u8 level = GetMonData(mon, MON_DATA_LEVEL); const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(species); // Since you can learn more than one move per level, @@ -7383,10 +7107,19 @@ bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method) u32 currentSpecies = GetMonData(&party[monId], MON_DATA_SPECIES); u32 targetSpecies = GetFormChangeTargetSpecies(&party[monId], method, 0); - if (targetSpecies == currentSpecies && gBattleStruct != NULL && gBattleStruct->partyState[side][monId].changedSpecies != SPECIES_NONE) + // If the battle ends, and there's not a specified species to change back to,, + // use the species at the start of the battle. + if (targetSpecies == SPECIES_NONE + && gBattleStruct != NULL + && gBattleStruct->partyState[side][monId].changedSpecies != SPECIES_NONE + // This is added to prevent FORM_CHANGE_END_BATTLE_ENVIRONMENT from omitting move changes + // at the end of the battle, as it was being counting as a successful form change. + && method == FORM_CHANGE_END_BATTLE) + { targetSpecies = gBattleStruct->partyState[side][monId].changedSpecies; + } - if (targetSpecies != currentSpecies) + if (targetSpecies != currentSpecies && targetSpecies != SPECIES_NONE) { TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); @@ -7399,10 +7132,12 @@ bool32 TryFormChange(u32 monId, enum BattleSide side, enum FormChanges method) u16 SanitizeSpeciesId(u16 species) { - if (species > NUM_SPECIES || !IsSpeciesEnabled(species)) + assertf(species <= NUM_SPECIES && (species == SPECIES_NONE || IsSpeciesEnabled(species)), "invalid species: %d", species) + { return SPECIES_NONE; - else - return species; + } + + return species; } bool32 IsSpeciesEnabled(u16 species) @@ -7414,7 +7149,7 @@ bool32 IsSpeciesEnabled(u16 species) void TryToSetBattleFormChangeMoves(struct Pokemon *mon, enum FormChanges method) { int i, j; - u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u16 species = GetMonData(mon, MON_DATA_SPECIES); const struct FormChange *formChanges = GetSpeciesFormChanges(species); if (formChanges == NULL @@ -7433,7 +7168,7 @@ void TryToSetBattleFormChangeMoves(struct Pokemon *mon, enum FormChanges method) for (j = 0; j < MAX_MON_MOVES; j++) { - u16 currMove = GetMonData(mon, MON_DATA_MOVE1 + j, NULL); + u16 currMove = GetMonData(mon, MON_DATA_MOVE1 + j); if (currMove == originalMove) SetMonMoveSlot_KeepPP(mon, newMove, j); } @@ -7444,7 +7179,7 @@ void TryToSetBattleFormChangeMoves(struct Pokemon *mon, enum FormChanges method) u32 GetMonFriendshipScore(struct Pokemon *pokemon) { - u32 friendshipScore = GetMonData(pokemon, MON_DATA_FRIENDSHIP, NULL); + u32 friendshipScore = GetMonData(pokemon, MON_DATA_FRIENDSHIP); if (friendshipScore == MAX_FRIENDSHIP) return FRIENDSHIP_MAX; @@ -7464,7 +7199,7 @@ u32 GetMonFriendshipScore(struct Pokemon *pokemon) u32 GetMonAffectionHearts(struct Pokemon *pokemon) { - u32 friendship = GetMonData(pokemon, MON_DATA_FRIENDSHIP, NULL); + u32 friendship = GetMonData(pokemon, MON_DATA_FRIENDSHIP); if (friendship == MAX_FRIENDSHIP) return AFFECTION_FIVE_HEARTS; @@ -7488,9 +7223,9 @@ void UpdateMonPersonality(struct BoxPokemon *boxMon, u32 personality) struct PokemonSubstruct3 *old3, *new3; struct BoxPokemon old; - bool32 isShiny = GetBoxMonData(boxMon, MON_DATA_IS_SHINY, NULL); - u32 hiddenNature = GetBoxMonData(boxMon, MON_DATA_HIDDEN_NATURE, NULL); - enum Type teraType = GetBoxMonData(boxMon, MON_DATA_TERA_TYPE, NULL); + bool32 isShiny = GetBoxMonData(boxMon, MON_DATA_IS_SHINY); + u32 hiddenNature = GetBoxMonData(boxMon, MON_DATA_HIDDEN_NATURE); + enum Type teraType = GetBoxMonData(boxMon, MON_DATA_TERA_TYPE); old = *boxMon; old0 = &(GetSubstruct(&old, old.personality, SUBSTRUCT_TYPE_0)->type0); @@ -7556,9 +7291,13 @@ u16 GetSpeciesPreEvolution(u16 species) for (i = SPECIES_BULBASAUR; i < NUM_SPECIES; i++) { + if (!IsSpeciesEnabled(i)) + continue; + const struct Evolution *evolutions = GetSpeciesEvolutions(i); if (evolutions == NULL) continue; + for (j = 0; evolutions[j].method != EVOLUTIONS_END; j++) { if (SanitizeSpeciesId(evolutions[j].targetSpecies) == species) @@ -7596,7 +7335,7 @@ void UpdateDaysPassedSinceFormChange(u16 days) { u32 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_CHANGE_DAYS_PASSED, 0); - if (targetSpecies != currentSpecies) + if (targetSpecies != currentSpecies && targetSpecies != SPECIES_NONE) { SetMonData(mon, MON_DATA_SPECIES, &targetSpecies); CalculateMonStats(mon); @@ -7605,7 +7344,7 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } -enum Type CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) +enum Type CheckDynamicMoveType(struct Pokemon *mon, enum Move move, u32 battler, enum MonState state) { enum Type moveType = GetDynamicMoveType(mon, move, battler, state); if (moveType != TYPE_NONE) @@ -7716,6 +7455,41 @@ bool32 IsSpeciesOfType(u32 species, enum Type type) return FALSE; } +u32 GiveScriptedMonToPlayer(struct Pokemon *mon, u8 slot) +{ + u32 sentToPc; + u32 i = 0; + if (slot < PARTY_SIZE) + { + CopyMon(&gPlayerParty[slot], mon, sizeof(struct Pokemon)); + sentToPc = MON_GIVEN_TO_PARTY; + } + else + { + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE) + break; + } + if (i >= PARTY_SIZE) + { + sentToPc = CopyMonToPC(mon); + } + else + { + sentToPc = MON_GIVEN_TO_PARTY; + CopyMon(&gPlayerParty[i], mon, sizeof(struct Pokemon)); + gPlayerPartyCount = i + 1; + } + } + if (sentToPc != MON_CANT_GIVE) + { + HandleSetPokedexFlagFromMon(mon, FLAG_SET_SEEN); + HandleSetPokedexFlagFromMon(mon, FLAG_SET_CAUGHT); + } + return sentToPc; +} + //pokefirered specific u8 GetPlayerPartyHighestLevel(void) { diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 3f41be230..7a98c792c 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -8987,6 +8987,20 @@ void GetBoxMonNickAt(u8 boxId, u8 boxPosition, u8 *dst) *dst = EOS; } +u32 GetBoxMonLevelAt(u8 boxId, u8 boxPosition) +{ + u32 lvl; + + if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) + lvl = GetLevelFromBoxMonExp(&gPokemonStoragePtr->boxes[boxId][boxPosition]); +#ifdef BUGFIX + else +#endif + lvl = 0; + + return lvl; +} + void SetBoxMonNickAt(u8 boxId, u8 boxPosition, const u8 *nick) { if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 64d588d80..95dd5d5ab 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -35,6 +35,7 @@ #include "battle_interface.h" #include "mon_markings.h" #include "pokemon_storage_system.h" +#include "pokerus.h" #include "constants/battle_move_effects.h" #include "constants/sound.h" @@ -2399,7 +2400,6 @@ static const struct StatData sStatData[] = { [STAT_HP] = { .monDataStat = MON_DATA_HP, - .monDataStat2 = MON_DATA_HP, .monDataEv = MON_DATA_HP_EV, .monDataIv = MON_DATA_HP_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_HP, @@ -2408,7 +2408,6 @@ static const struct StatData sStatData[] = { [STAT_ATK] = { .monDataStat = MON_DATA_ATK, - .monDataStat2 = MON_DATA_ATK2, .monDataEv = MON_DATA_ATK_EV, .monDataIv = MON_DATA_ATK_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_ATK, @@ -2417,7 +2416,6 @@ static const struct StatData sStatData[] = { [STAT_DEF] = { .monDataStat = MON_DATA_DEF, - .monDataStat2 = MON_DATA_DEF2, .monDataEv = MON_DATA_DEF_EV, .monDataIv = MON_DATA_DEF_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_DEF, @@ -2426,7 +2424,6 @@ static const struct StatData sStatData[] = { [STAT_SPATK] = { .monDataStat = MON_DATA_SPATK, - .monDataStat2 = MON_DATA_SPATK2, .monDataEv = MON_DATA_SPATK_EV, .monDataIv = MON_DATA_SPATK_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPATK, @@ -2435,7 +2432,6 @@ static const struct StatData sStatData[] = { [STAT_SPDEF] = { .monDataStat = MON_DATA_SPDEF, - .monDataStat2 = MON_DATA_SPDEF2, .monDataEv = MON_DATA_SPDEF_EV, .monDataIv = MON_DATA_SPDEF_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPDEF, @@ -2444,7 +2440,6 @@ static const struct StatData sStatData[] = { [STAT_SPEED] = { .monDataStat = MON_DATA_SPEED, - .monDataStat2 = MON_DATA_SPEED2, .monDataEv = MON_DATA_SPEED_EV, .monDataIv = MON_DATA_SPEED_IV, .monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPEED, @@ -2501,12 +2496,7 @@ static void ApplyNatureColor(u8 *str, u8 stat) static void BufferStatString(u8 stat) { u8 *dst = sMonSummaryScreen->summary.statValueStrBufs[sStatData[stat].pssStat]; - u16 statValue; - - if (sMonSummaryScreen->savedCallback == CB2_ReturnToTradeMenuFromSummary && sMonSummaryScreen->isEnemyParty == TRUE) - statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataStat2); - else - statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataStat); + u16 statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataStat); ConvertIntToDecimalStringN(dst, statValue, STR_CONV_MODE_LEFT_ALIGN, 3); if (stat == STAT_HP) @@ -2625,7 +2615,7 @@ static void BufferMonSkills(void) sMonSummaryScreen->curMonStatusAilment = StatusToAilment(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_STATUS)); if (sMonSummaryScreen->curMonStatusAilment == AILMENT_NONE) - if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)) + if (ShouldPokemonShowActivePokerus(&sMonSummaryScreen->currentMon)) sMonSummaryScreen->curMonStatusAilment = AILMENT_PKRS; } @@ -3955,7 +3945,7 @@ static u8 StatusToAilment(u32 status) if ((status & STATUS1_FROSTBITE) != 0) return AILMENT_FRB; - if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)) + if (ShouldPokemonShowActivePokerus(&sMonSummaryScreen->currentMon)) return AILMENT_PKRS; return AILMENT_NONE; @@ -4580,8 +4570,7 @@ static void ShowOrHideBallIconObj(u8 invisible) static void DestroyBallIconObj(void) { - // Redundant, as DestroySpriteAndFreeResources could've been used. - DestroySpriteAndFreeResources_Ball(&gSprites[sMonSummaryScreen->ballIconSpriteId]); + DestroySpriteAndFreeResources(&gSprites[sMonSummaryScreen->ballIconSpriteId]); } static void PokeSum_CreateMonIconSprite(void) @@ -5171,8 +5160,8 @@ static void DestroyPokerusIconObj(void) static void ShowPokerusIconObjIfHasOrHadPokerus(void) { - if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0) - && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0)) + if (!ShouldPokemonShowActivePokerus(&sMonSummaryScreen->currentMon) + && CheckMonHasHadPokerus(&sMonSummaryScreen->currentMon)) HideShowPokerusIcon(FALSE); else HideShowPokerusIcon(TRUE); @@ -5180,8 +5169,8 @@ static void ShowPokerusIconObjIfHasOrHadPokerus(void) static void HideShowPokerusIcon(bool8 invisible) { - if (!CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0) - && CheckPartyHasHadPokerus(&sMonSummaryScreen->currentMon, 0)) + if (!ShouldPokemonShowActivePokerus(&sMonSummaryScreen->currentMon) + && CheckMonHasHadPokerus(&sMonSummaryScreen->currentMon)) { sPokerusIconObj->sprite->invisible = invisible; return; diff --git a/src/pokerus.c b/src/pokerus.c new file mode 100644 index 000000000..9e769d9b8 --- /dev/null +++ b/src/pokerus.c @@ -0,0 +1,218 @@ +#include "global.h" +#include "event_data.h" +#include "generational_changes.h" +#include "pokemon.h" +#include "pokerus.h" +#include "random.h" +#include "config/pokerus.h" + +u32 GetDaysLeftBasedOnStrain(u32 strain) +{ + u32 daysLeft = (strain % 4) + 1; + return daysLeft; +} + +static u32 GetRandomPokerusStrain(void) +{ + if (P_POKERUS_STRAIN_DISTRIBUTION < GEN_3) // Gen 1 - 2 (Gen 1 had no Pokérus but we default it with gen 2) + return RandomWeighted(RNG_POKERUS_STRAIN_DISTRIBUTION, 15, 30, 30, 30, 30, 30, 30, 30, 30, 1, 1, 1, 1, 1, 1, 1); + else if (P_POKERUS_STRAIN_DISTRIBUTION < GEN_4) //Gen 3 (Ruby/Sapphire only) + return RandomWeighted(RNG_POKERUS_STRAIN_DISTRIBUTION, 30, 31, 31, 31, 31, 31, 31, 31, 1, 1, 1, 1, 1, 1, 1, 1); + else // Gen 4+ (Pokérus was disabled in gen 9 but we default it here) + return RandomWeighted(RNG_POKERUS_STRAIN_DISTRIBUTION, 0, 31, 31, 31, 31, 31, 31, 31, 0, 1, 1, 1, 1, 1, 1, 1); +} + +void RandomlyGivePartyPokerus(void) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return; + + if ((GetConfig(CONFIG_POKERUS_INFECT_AGAIN) > GEN_2) && IsPokerusInParty()) + return; + + if (P_POKERUS_FLAG_INFECTION && !FlagGet(P_POKERUS_FLAG_INFECTION)) + return; + + if (RandomUniform(RNG_POKERUS_INFECTION, 0, MAX_u16) < P_POKERUS_INFECTION_ODDS) + { + struct Pokemon *mon; + u32 randomIndex; + u32 validTargetsCount = 0; + s32 validTargets[PARTY_SIZE]; + + for (u32 i = 0; i < PARTY_SIZE; i++) + { + mon = &gPlayerParty[i]; + if (!GetMonData(mon, MON_DATA_SPECIES)) + continue; + else if (!GetConfig(CONFIG_POKERUS_INFECT_EGG) && GetMonData(mon, MON_DATA_IS_EGG)) + continue; + else if (!GetConfig(CONFIG_POKERUS_HERD_IMMUNITY) && CheckMonHasHadPokerus(mon)) + continue; + validTargets[validTargetsCount] = i; + validTargetsCount++; + } + + if (validTargetsCount == 0) + return; + + randomIndex = RandomUniform(RNG_POKERUS_PARTY_MEMBER, 0, validTargetsCount - 1); + mon = &gPlayerParty[validTargets[randomIndex]]; + + if (!CheckMonHasHadPokerus(mon)) + { + u32 strain = GetRandomPokerusStrain(); + u32 daysLeft = GetDaysLeftBasedOnStrain(strain); + + SetMonData(mon, MON_DATA_POKERUS_STRAIN, &strain); + SetMonData(mon, MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); + } + } +} + +bool32 IsPokerusInParty(void) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return FALSE; + + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + continue; + + if (GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_DAYS_LEFT)) + return TRUE; + } + + return FALSE; +} + +bool32 CheckMonPokerus(struct Pokemon *mon) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return FALSE; + + if (GetMonData(mon, MON_DATA_POKERUS_DAYS_LEFT)) + return TRUE; + + return FALSE; +} + +bool32 CheckMonHasHadPokerus(struct Pokemon *mon) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return FALSE; + + if (GetMonData(mon, MON_DATA_POKERUS)) + return TRUE; + + return FALSE; +} + +bool32 IsPokerusVisible(struct Pokemon *mon) +{ + if ((P_POKERUS_VISIBLE_ON_EGG >= GEN_3 && P_POKERUS_VISIBLE_ON_EGG <= GEN_6) || !GetMonData(mon, MON_DATA_IS_EGG)) + return TRUE; + return FALSE; +} + +bool32 ShouldPokemonShowActivePokerus(struct Pokemon *mon) +{ + if (!IsPokerusVisible(mon)) + return FALSE; + return CheckMonPokerus(mon); +} + +bool32 ShouldPokemonShowCuredPokerus(struct Pokemon *mon) +{ + if (!IsPokerusVisible(mon)) + return FALSE; + if (CheckMonPokerus(mon)) + return FALSE; + return CheckMonHasHadPokerus(mon); +} + +void UpdatePartyPokerusTime(u32 days) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return; + + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + continue; + + u32 strain = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_STRAIN); + u32 daysLeft = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_DAYS_LEFT); + if (daysLeft) + { + if (daysLeft < days) + daysLeft = 0; + else + daysLeft -= days; + + //If the strain was 0, we changed it to 1 when the Pokérus disappear to remember the Pokémon was infected by Pokérus + // (otherwise its data would look the same as unaffected Pokémon) + if (daysLeft == 0 && strain == 0) + { + strain = 1; + SetMonData(&gPlayerParty[i], MON_DATA_POKERUS_STRAIN, &strain); + } + + SetMonData(&gPlayerParty[i], MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); + } + } +} + +static void SpreadPokerusToSpecificMon(struct Pokemon *mon, u32 strain, u32 daysLeft) +{ + SetMonData(mon, MON_DATA_POKERUS_STRAIN, &strain); + if (GetConfig(CONFIG_POKERUS_SPREAD_DAYS_LEFT) < GEN_3) + daysLeft = GetDaysLeftBasedOnStrain(strain); + SetMonData(mon, MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); +} + +static bool32 CanReceivePokerusFromSpread(struct Pokemon *mon) +{ + if (GetConfig(CONFIG_POKERUS_WEAK_VARIANT)) + return !GetMonData(mon, MON_DATA_POKERUS_STRAIN); + return !GetMonData(mon, MON_DATA_POKERUS); +} + +void PartySpreadPokerus(void) +{ + if (!GetConfig(CONFIG_POKERUS_ENABLED)) + return; + + if (RandomUniform(RNG_POKERUS_SPREAD, 0, MAX_u16) >= P_POKERUS_SPREAD_ODDS) + return; + + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + continue; + + u32 strain = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_STRAIN); + u32 daysLeft = GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_DAYS_LEFT); + if (daysLeft) + { + bool32 spreadUp = TRUE, spreadDown = TRUE; + if (GetConfig(CONFIG_POKERUS_SPREAD_ADJACENCY) < GEN_3) + { + if (i == (gPlayerPartyCount - 1)) + spreadUp = FALSE; + else if (RandomUniform(RNG_POKERUS_SPREAD_SIDE, 0, 1)) + spreadDown = FALSE; + else + spreadUp = FALSE; + } + if (spreadDown && i != 0 && CanReceivePokerusFromSpread(&gPlayerParty[i - 1])) + SpreadPokerusToSpecificMon(&gPlayerParty[i - 1], strain, daysLeft); + if (spreadUp && i != (PARTY_SIZE - 1) && CanReceivePokerusFromSpread(&gPlayerParty[i + 1])) + { + SpreadPokerusToSpecificMon(&gPlayerParty[i + 1], strain, daysLeft); + i++; + } + } + } +} diff --git a/src/quest_log.c b/src/quest_log.c index b2a6c99ab..712f7f6dc 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -137,7 +137,7 @@ static bool8 RecordHeadAtEndOfEntry(void); static const struct WindowTemplate sWindowTemplates[WIN_COUNT] = { [WIN_TOP_BAR] = { .bg = 0, - .tilemapLeft = 0, + .tilemapLeft = 0, .tilemapTop = 0, .width = 30, .height = 2, @@ -271,9 +271,9 @@ static void QLogCB_Playback(void) if (sPlaybackControl.endMode == END_MODE_NONE) { - if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED - || sPlaybackControl.state == 1 - || (sPlaybackControl.cursor < ARRAY_COUNT(sEventData) + if (gQuestLogPlaybackState != QL_PLAYBACK_STATE_STOPPED + || sPlaybackControl.state == 1 + || (sPlaybackControl.cursor < ARRAY_COUNT(sEventData) && sEventData[sPlaybackControl.cursor] != NULL)) QuestLog_PlayCurrentEvent(); else @@ -546,7 +546,7 @@ static void QL_LoadObjectsAndTemplates(u8 sceneNum) { struct QuestLogScene *questLog = &gSaveBlock1Ptr->questLog[sceneNum]; u16 i; - + for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { if (questLog->objectEventTemplates[i].negx) @@ -628,7 +628,7 @@ void QL_ResetPartyAndPC(void) } *prev = AllocZeroed(sizeof(*prev)); u16 packedCounts, i, count, j; - CreateMon(&prev->mon, SPECIES_RATTATA, 1, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateMon(&prev->mon, SPECIES_RATTATA, 1, 0, OTID_STRUCT_PLAYER_ID); packedCounts = VarGet(VAR_QUEST_LOG_MON_COUNTS); prev->partyCount = packedCounts >> NUM_PC_COUNT_BITS; prev->boxMonCount = packedCounts % (1 << NUM_PC_COUNT_BITS); @@ -899,7 +899,7 @@ static void Task_AvoidDisplay(u8 taskId) if (!gPaletteFade.active) { gQuestLogPlaybackState = QL_PLAYBACK_STATE_STOPPED; - + // Call the provided function (if any). In practice this is always QL_DestroyAbortedDisplay routine = (void (*)(void)) GetWordTaskArg(taskId, DATA_IDX_CALLBACK); if (routine != NULL) @@ -1252,10 +1252,10 @@ static bool8 RestoreScreenAfterPlayback(u8 taskId) CopyPaletteInvertedTint(&gPlttBufferUnfaded[BG_PLTT_ID(0) + 1], &gPlttBufferFaded[BG_PLTT_ID(0) + 1], 0xDF, 15 - tTimer); CopyPaletteInvertedTint(&gPlttBufferUnfaded[OBJ_PLTT_ID(0)], &gPlttBufferFaded[OBJ_PLTT_ID(0)], 0x100, 15 - tTimer); - + gTimeUpdateCounter = 0; UpdateTimeOfDay(); - + if (MapHasNaturalLight(gMapHeader.mapType)) { UpdateAltBgPalettes(PALETTES_BG); diff --git a/src/quest_log_battle.c b/src/quest_log_battle.c index a00fe23c5..d56f80195 100644 --- a/src/quest_log_battle.c +++ b/src/quest_log_battle.c @@ -12,7 +12,7 @@ static void GetLinkMultiBattlePlayerIndexes(s32 *, s32 *); void TrySetQuestLogBattleEvent(void) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_OLD_MAN_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_CATCH_TUTORIAL | BATTLE_TYPE_POKEDUDE)) && (gBattleOutcome == B_OUTCOME_WON || gBattleOutcome == B_OUTCOME_CAUGHT)) { // Why allocate both of these? Only one will ever be used at a time struct QuestLogEvent_TrainerBattle * trainerData = Alloc(sizeof(*trainerData)); @@ -43,7 +43,7 @@ void TrySetQuestLogBattleEvent(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { trainerData->speciesOpponent = gBattleResults.lastOpponentSpecies; - + // Decide which of the pokemon on the player's side to mention as the victor if (GetBattlerSide(gBattleStruct->lastAttackerToFaintOpponent) == B_SIDE_PLAYER) trainerData->speciesPlayer = gBattleMons[gBattleStruct->lastAttackerToFaintOpponent].species; @@ -124,7 +124,7 @@ void TrySetQuestLogLinkBattleEvent(void) { inUnionRoom = InUnionRoom(); eventId = QL_EVENT_LINK_BATTLED_SINGLE; - + if (inUnionRoom == TRUE) eventId = QL_EVENT_LINK_BATTLED_UNION; } diff --git a/src/random.c b/src/random.c index e19f6f6fb..b02d6a2a3 100644 --- a/src/random.c +++ b/src/random.c @@ -166,7 +166,7 @@ __attribute__((weak, alias("RandomUniformExceptDefault"))) u32 RandomUniformExcept(enum RandomTag, u32 lo, u32 hi, bool32 (*reject)(u32)); __attribute__((weak, alias("RandomWeightedArrayDefault"))) -u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights); +u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u16 *weights); __attribute__((weak, alias("RandomElementArrayDefault"))) const void *RandomElementArray(enum RandomTag tag, const void *array, size_t size, size_t count); @@ -191,16 +191,17 @@ u32 RandomUniformExceptDefault(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reje LOOP_RANDOM_END; } -u32 RandomWeightedArrayDefault(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) +u32 RandomWeightedArrayDefault(enum RandomTag tag, u32 sum, u32 n, const u16 *weights) { assertf(n > 0); - s32 i, targetSum; + assertf(sum <= MAX_u16); + u32 i, targetSum; targetSum = (sum * Random()) >> 16; for (i = 0; i < n - 1; i++) { - targetSum -= weights[i]; - if (targetSum < 0) + if (targetSum < weights[i]) return i; + targetSum -= weights[i]; } return n - 1; } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 3d133a8d0..9d8f1fbf8 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -404,7 +404,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) movePp.moves[j] = gBattleMons[battler].moves[moveSlots[j]]; movePp.currentPp[j] = gBattleMons[battler].pp[moveSlots[j]]; movePp.maxPp[j] = ppBonuses[moveSlots[j]]; - mimickedMoveSlots[j] = (gDisableStructs[battler].mimickedMoves & (1u << j)) >> j; + mimickedMoveSlots[j] = (gBattleMons[battler].volatiles.mimickedMoves & (1u << j)) >> j; } for (j = 0; j < MAX_MON_MOVES; j++) { @@ -412,11 +412,11 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) gBattleMons[battler].pp[j] = movePp.currentPp[j]; } gBattleMons[battler].ppBonuses = 0; - gDisableStructs[battler].mimickedMoves = 0; + gBattleMons[battler].volatiles.mimickedMoves = 0; for (j = 0; j < MAX_MON_MOVES; j++) { gBattleMons[battler].ppBonuses |= movePp.maxPp[j] << (j << 1); - gDisableStructs[battler].mimickedMoves |= mimickedMoveSlots[j] << j; + gBattleMons[battler].volatiles.mimickedMoves |= mimickedMoveSlots[j] << j; } if (!(gBattleMons[battler].volatiles.transformed)) diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 3869d5902..e9c07291b 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -269,7 +269,7 @@ static void CB2_ReshowBlankBattleScreenAfterMenu(void) gBattleScripting.reshowMainState--; break; case 10: - if (gBattleScripting.monCaught) + if (gBattleScripting.monCaught) CreateCaughtMonSprite(); // displays the caught mon for the switch into party feature break; default: @@ -300,7 +300,7 @@ static bool8 LoadBattlerSpriteGfx(u8 battler) } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, battler); - else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPic(TRAINER_BACK_PIC_OLD_MAN, battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); @@ -345,7 +345,7 @@ void CreateBattlerSprite(u32 battler) gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } - else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) { SetMultiuseSpriteTemplateToTrainerBack(5, GetBattlerPosition(0)); gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 80, @@ -381,7 +381,7 @@ static void CreateHealthboxSprite(u8 battler) if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) healthboxSpriteId = CreateSafariPlayerHealthboxSprites(); - else if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) + else if (gBattleTypeFlags & BATTLE_TYPE_CATCH_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) return; else healthboxSpriteId = CreateBattlerHealthboxSprites(battler); diff --git a/src/roamer.c b/src/roamer.c index fd4050b7e..25a18eebf 100644 --- a/src/roamer.c +++ b/src/roamer.c @@ -3,6 +3,7 @@ #include "overworld.h" #include "random.h" #include "roamer.h" +#include "ow_synchronize.h" #include "constants/maps.h" #include "constants/region_map_sections.h" @@ -108,9 +109,13 @@ void MoveAllRoamers(void) void CreateInitialRoamerMon(u32 index, u32 species, u32 level) { - struct Pokemon * mon = &gEnemyParty[0]; + struct Pokemon *mon = &gEnemyParty[0]; ClearRoamerLocationHistory(index); - CreateMon(mon, species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + u32 personality = GetMonPersonality(species, + GetSynchronizedGender(ROAMER_ORIGIN, species), + GetSynchronizedNature(ROAMER_ORIGIN, species), + RANDOM_UNOWN_LETTER); + CreateMonWithIVs(mon, species, level, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); ROAMER(index)->species = species; ROAMER(index)->level = level; ROAMER(index)->statusA = 0; diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index 1a8dfa637..f8c2c892d 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -73,7 +73,7 @@ struct GFRomHeader const struct SpeciesInfo * speciesInfo; const u8 (* abilityNames)[]; const u8 *const * abilityDescriptions; - const struct Item * items; + const struct ItemInfo * items; const struct MoveInfo * moves; const struct CompressedSpriteSheet * ballGfx; const struct SpritePalette * ballPalettes; diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 7a7ba0e02..08a4d5b54 100644 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -8,6 +8,7 @@ #include "load_save.h" #include "item.h" #include "overworld.h" +#include "ow_synchronize.h" #include "party_menu.h" #include "pokedex.h" #include "pokemon.h" @@ -149,33 +150,15 @@ void SetTeraType(struct ScriptContext *ctx) * if side/slot are assigned, it will create the mon at the assigned party location * if slot == PARTY_SIZE, it will give the mon to first available party or storage slot */ -static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u16 item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u8 *evs, u8 *ivs, u16 *moves, enum ShinyMode shinyMode, bool8 gmaxFactor, enum Type teraType, u8 dmaxLevel) +static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, enum Item item, enum PokeBall ball, u8 nature, u8 abilityNum, u8 gender, u16 *evs, u16 *ivs, enum Move *moves, enum ShinyMode shinyMode, bool8 gmaxFactor, enum Type teraType, u8 dmaxLevel) { - enum NationalDexOrder nationalDexNum; - int sentToPc; struct Pokemon mon; u32 i; - u8 genderRatio = gSpeciesInfo[species].genderRatio; u16 targetSpecies; bool32 isShiny; - // check whether to use a specific nature or a random one - if (nature >= NUM_NATURES) - { - if (OW_SYNCHRONIZE_NATURE >= GEN_6 - && (gSpeciesInfo[species].eggGroups[0] == EGG_GROUP_NO_EGGS_DISCOVERED || OW_SYNCHRONIZE_NATURE == GEN_7)) - nature = PickWildMonNature(); - else - nature = Random() % NUM_NATURES; - } - - // create a Pokémon with basic data - if ((gender == MON_MALE && genderRatio != MON_FEMALE && genderRatio != MON_GENDERLESS) - || (gender == MON_FEMALE && genderRatio != MON_MALE && genderRatio != MON_GENDERLESS) - || (gender == MON_GENDERLESS && genderRatio == MON_GENDERLESS)) - CreateMonWithGenderNatureLetter(&mon, species, level, 32, gender, nature, 0); - else - CreateMonWithNature(&mon, species, level, 32, nature); + u32 personality = GetMonPersonality(species, gender, nature, RANDOM_UNOWN_LETTER); + CreateMon(&mon, species, level, personality, OTID_STRUCT_PLAYER_ID); // shininess if (shinyMode == SHINY_MODE_ALWAYS || (P_FLAG_FORCE_SHINY != 0 && FlagGet(P_FLAG_FORCE_SHINY))) @@ -214,25 +197,36 @@ static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u // moves for (i = 0; i < MAX_MON_MOVES; i++) { - if (moves[0] == MOVE_NONE) + if (moves[i] == MOVE_NONE) break; - if (moves[i] >= MOVES_COUNT) + if (moves[i] < MOVES_COUNT) + { + SetMonMoveSlot(&mon, moves[i], i); + } + else if (moves[i] == MOVE_DEFAULT) + { + GiveMonDefaultMove(&mon, i); continue; - SetMonMoveSlot(&mon, moves[i], i); + } + else + { + assertf(FALSE, "invalid move: %d", moves[i]) {} + } } // ability - if (abilityNum == NUM_ABILITY_PERSONALITY) + if (abilityNum != NUM_ABILITY_PERSONALITY) { - abilityNum = GetMonData(&mon, MON_DATA_PERSONALITY) & 1; + assertf(abilityNum < NUM_ABILITY_SLOTS && GetAbilityBySpecies(species, abilityNum) != ABILITY_NONE, + "invalid ability num %d for species %d", abilityNum, species) + { + // If the ability num is invalid, we loop to find a valid one + do { + abilityNum = Random() % NUM_ABILITY_SLOTS; // includes hidden abilities + } while (GetAbilityBySpecies(species, abilityNum) == ABILITY_NONE); + } + SetMonData(&mon, MON_DATA_ABILITY_NUM, &abilityNum); } - else if (abilityNum > NUM_NORMAL_ABILITY_SLOTS || GetAbilityBySpecies(species, abilityNum) == ABILITY_NONE) - { - do { - abilityNum = Random() % NUM_ABILITY_SLOTS; // includes hidden abilities - } while (GetAbilityBySpecies(species, abilityNum) == ABILITY_NONE); - } - SetMonData(&mon, MON_DATA_ABILITY_NUM, &abilityNum); // ball if (ball > POKEBALL_COUNT) @@ -247,66 +241,53 @@ static u32 ScriptGiveMonParameterized(u8 side, u8 slot, u16 species, u8 level, u if (targetSpecies != SPECIES_NONE) SetMonData(&mon, MON_DATA_SPECIES, &targetSpecies); - // assign OT name and gender - SetMonData(&mon, MON_DATA_OT_NAME, gSaveBlock2Ptr->playerName); - SetMonData(&mon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); + if (side == B_SIDE_PLAYER) + return GiveScriptedMonToPlayer(&mon, slot); - if (slot < PARTY_SIZE) + assertf(slot < PARTY_SIZE, "invalid slot: %d", slot) { - if (side == 0) - CopyMon(&gPlayerParty[slot], &mon, sizeof(struct Pokemon)); - else - CopyMon(&gEnemyParty[slot], &mon, sizeof(struct Pokemon)); - sentToPc = MON_GIVEN_TO_PARTY; + return MON_CANT_GIVE; } - else - { - // find empty party slot to decide whether the Pokémon goes to the Player's party or the storage system. - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL) == SPECIES_NONE) - break; - } - if (i >= PARTY_SIZE) - { - sentToPc = CopyMonToPC(&mon); - } - else - { - sentToPc = MON_GIVEN_TO_PARTY; - CopyMon(&gPlayerParty[i], &mon, sizeof(mon)); - gPlayerPartyCount = i + 1; - } - } - - if (side == 0) - { - // set pokédex flags - nationalDexNum = SpeciesToNationalPokedexNum(species); - if (sentToPc != MON_CANT_GIVE) - { - GetSetPokedexFlag(nationalDexNum, FLAG_SET_SEEN); - GetSetPokedexFlag(nationalDexNum, FLAG_SET_CAUGHT); - } - } - - return sentToPc; + CopyMon(&gEnemyParty[slot], &mon, sizeof(struct Pokemon)); + return MON_GIVEN_TO_PARTY; } -u32 ScriptGiveMon(u16 species, u8 level, u16 item) +u32 ScriptGiveMon(u16 species, u8 level, enum Item item) { - u8 evs[NUM_STATS] = {0, 0, 0, 0, 0, 0}; - u8 ivs[NUM_STATS] = {MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1, // We pass "MAX_PER_STAT_IVS + 1" here to ensure that - MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1, MAX_PER_STAT_IVS + 1}; // ScriptGiveMonParameterized won't touch the stats' IV. - u16 moves[MAX_MON_MOVES] = {MOVE_NONE, MOVE_NONE, MOVE_NONE, MOVE_NONE}; + struct Pokemon mon; + u8 heldItem[2]; - return ScriptGiveMonParameterized(0, PARTY_SIZE, species, level, item, ITEM_POKE_BALL, NUM_NATURES, NUM_ABILITY_PERSONALITY, MON_GENDERLESS, evs, ivs, moves, SHINY_MODE_RANDOM, FALSE, NUMBER_OF_MON_TYPES, 0); + CreateRandomMon(&mon, species, level); + if (item) + { + heldItem[0] = item; + heldItem[1] = item >> 8; + SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); + } + + return GiveScriptedMonToPlayer(&mon, PARTY_SIZE); } #define PARSE_FLAG(n, default_) (flags & (1 << (n))) ? VarGet(ScriptReadHalfword(ctx)) : (default_) +#define ADD_MOVE_IF_NOT_DEFAULT(i, move) \ + if (move && move != MOVE_DEFAULT) \ + { \ + moves[i] = move; \ + i++; \ + } + +#define ADD_MOVE_IF_DEFAULT(i, move) \ + if (moves[i] == MOVE_NONE && move == MOVE_DEFAULT) \ + { \ + moves[i] = MOVE_DEFAULT; \ + i++; \ + } + + /* Give or create a mon to either player or opponent */ + void ScrCmd_createmon(struct ScriptContext *ctx) { u8 side = ScriptReadByte(ctx); @@ -315,78 +296,98 @@ void ScrCmd_createmon(struct ScriptContext *ctx) u8 level = VarGet(ScriptReadHalfword(ctx)); u32 flags = ScriptReadWord(ctx); - u16 item = PARSE_FLAG(0, ITEM_NONE); + enum Item item = PARSE_FLAG(0, ITEM_NONE); u8 ball = PARSE_FLAG(1, ITEM_POKE_BALL); - u8 nature = PARSE_FLAG(2, NUM_NATURES); + u8 nature = PARSE_FLAG(2, NATURE_RANDOM); u8 abilityNum = PARSE_FLAG(3, NUM_ABILITY_PERSONALITY); - u8 gender = PARSE_FLAG(4, MON_GENDERLESS); // TODO: Find a better way to assign a random gender. - u8 hpEv = PARSE_FLAG(5, 0); - u8 atkEv = PARSE_FLAG(6, 0); - u8 defEv = PARSE_FLAG(7, 0); - u8 speedEv = PARSE_FLAG(8, 0); - u8 spAtkEv = PARSE_FLAG(9, 0); - u8 spDefEv = PARSE_FLAG(10, 0); - u8 hpIv = Random() % (MAX_PER_STAT_IVS + 1); - u8 atkIv = Random() % (MAX_PER_STAT_IVS + 1); - u8 defIv = Random() % (MAX_PER_STAT_IVS + 1); - u8 speedIv = Random() % (MAX_PER_STAT_IVS + 1); - u8 spAtkIv = Random() % (MAX_PER_STAT_IVS + 1); - u8 spDefIv = Random() % (MAX_PER_STAT_IVS + 1); + u8 gender = PARSE_FLAG(4, MON_GENDER_RANDOM); - // Perfect IV calculation u32 i; + u16 evs[NUM_STATS]; + for (i = 0; i < NUM_STATS; i++) + { + evs[i] = PARSE_FLAG(5 + i, 0); + assertf(evs[i] <= MAX_PER_STAT_EVS, "invalid ev value of %d above maximum of %d", evs[i], MAX_PER_STAT_EVS) + { + evs[i] = MAX_PER_STAT_EVS; + } + } + + u16 ivs[NUM_STATS]; + u32 nonFixedIvCount = 0; enum Stat availableIVs[NUM_STATS]; enum Stat selectedIvs[NUM_STATS]; + for (i = 0; i < NUM_STATS; i++) + { + ivs[i] = PARSE_FLAG(11 + i, USE_RANDOM_IVS); + assertf(ivs[i] <= USE_RANDOM_IVS, "invalid iv value of %d above maximum of %d", ivs[i], MAX_PER_STAT_IVS) + { + ivs[i] = MAX_PER_STAT_IVS; + } + if (ivs[i] == USE_RANDOM_IVS) + { + availableIVs[nonFixedIvCount] = i; + ivs[i] = Random() % (MAX_PER_STAT_IVS + 1); + nonFixedIvCount++; + } + } + + // Perfect IV calculation if (gSpeciesInfo[species].perfectIVCount != 0) { - // Initialize a list of IV indices. - for (i = 0; i < NUM_STATS; i++) - availableIVs[i] = i; - // Select the IVs that will be perfected. - for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) + for (i = 0; i < nonFixedIvCount && i < gSpeciesInfo[species].perfectIVCount; i++) { - u8 index = Random() % (NUM_STATS - i); + u8 index = Random() % (nonFixedIvCount - i); selectedIvs[i] = availableIVs[index]; RemoveIVIndexFromList(availableIVs, index); } - for (i = 0; i < NUM_STATS && i < gSpeciesInfo[species].perfectIVCount; i++) + for (i = 0; i < nonFixedIvCount && i < gSpeciesInfo[species].perfectIVCount; i++) { - switch (selectedIvs[i]) - { - case STAT_HP: hpIv = MAX_PER_STAT_IVS; break; - case STAT_ATK: atkIv = MAX_PER_STAT_IVS; break; - case STAT_DEF: defIv = MAX_PER_STAT_IVS; break; - case STAT_SPEED: speedIv = MAX_PER_STAT_IVS; break; - case STAT_SPATK: spAtkIv = MAX_PER_STAT_IVS; break; - case STAT_SPDEF: spDefIv = MAX_PER_STAT_IVS; break; - default: break; - } + ivs[selectedIvs[i]] = MAX_PER_STAT_IVS; } } - hpIv = PARSE_FLAG(11, hpIv); - atkIv = PARSE_FLAG(12, atkIv); - defIv = PARSE_FLAG(13, defIv); - speedIv = PARSE_FLAG(14, speedIv); - spAtkIv = PARSE_FLAG(15, spAtkIv); - spDefIv = PARSE_FLAG(16, spDefIv); - u16 move1 = PARSE_FLAG(17, MOVE_NONE); - u16 move2 = PARSE_FLAG(18, MOVE_NONE); - u16 move3 = PARSE_FLAG(19, MOVE_NONE); - u16 move4 = PARSE_FLAG(20, MOVE_NONE); + + enum Move move1 = PARSE_FLAG(17, MOVE_DEFAULT); + enum Move move2 = PARSE_FLAG(18, MOVE_DEFAULT); + enum Move move3 = PARSE_FLAG(19, MOVE_DEFAULT); + enum Move move4 = PARSE_FLAG(20, MOVE_DEFAULT); enum ShinyMode shinyMode = PARSE_FLAG(21, SHINY_MODE_RANDOM); bool8 gmaxFactor = PARSE_FLAG(22, FALSE); enum Type teraType = PARSE_FLAG(23, NUMBER_OF_MON_TYPES); u8 dmaxLevel = PARSE_FLAG(24, 0); - u8 evs[NUM_STATS] = {hpEv, atkEv, defEv, speedEv, spAtkEv, spDefEv}; - u8 ivs[NUM_STATS] = {hpIv, atkIv, defIv, speedIv, spAtkIv, spDefIv}; - u16 moves[MAX_MON_MOVES] = {move1, move2, move3, move4}; + enum Move moves[MAX_MON_MOVES]; + for (i = 0; i < MAX_MON_MOVES; i++) + moves[i] = MOVE_NONE; + i = 0; + //Reorder moves to put non-default moves first, default moves second and empty moves last + ADD_MOVE_IF_NOT_DEFAULT(i, move1) + ADD_MOVE_IF_NOT_DEFAULT(i, move2) + ADD_MOVE_IF_NOT_DEFAULT(i, move3) + ADD_MOVE_IF_NOT_DEFAULT(i, move4) + ADD_MOVE_IF_DEFAULT(i, move1) + ADD_MOVE_IF_DEFAULT(i, move2) + ADD_MOVE_IF_DEFAULT(i, move3) + ADD_MOVE_IF_DEFAULT(i, move4) + + enum GeneratedMonOrigin origin; if (side == 0) + { Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); + origin = GIFTMON_ORIGIN; + } else + { Script_RequestEffects(SCREFF_V1); + origin = STATIC_WILDMON_ORIGIN; + } + + if (gender == MON_GENDER_MAY_CUTE_CHARM) + gender = GetSynchronizedGender(origin, species); + if (nature == NATURE_MAY_SYNCHRONIZE) + nature = GetSynchronizedNature(origin, species); gSpecialVar_Result = ScriptGiveMonParameterized(side, slot, species, level, item, ball, nature, abilityNum, gender, evs, ivs, moves, shinyMode, gmaxFactor, teraType, dmaxLevel); } @@ -395,17 +396,14 @@ void ScrCmd_createmon(struct ScriptContext *ctx) u8 ScriptGiveEgg(u16 species) { - struct Pokemon *mon = AllocZeroed(sizeof(struct Pokemon)); - bool8 isEgg; - bool8 sentToPc; + struct Pokemon mon; + u8 isEgg; - CreateEgg(mon, species, TRUE); + CreateEgg(&mon, species, TRUE); isEgg = TRUE; - SetMonData(mon, MON_DATA_IS_EGG, &isEgg); + SetMonData(&mon, MON_DATA_IS_EGG, &isEgg); - sentToPc = GiveMonToPlayer(mon); - Free(mon); - return sentToPc; + return GiveCapturedMonToPlayer(&mon); } void HasEnoughMonsForDoubleBattle(void) @@ -451,10 +449,12 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) u8 heldItem[2]; ZeroEnemyPartyMons(); - if (OW_SYNCHRONIZE_NATURE > GEN_3) - CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature()); - else - CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); + u32 personality = GetMonPersonality(species, + GetSynchronizedGender(STATIC_WILDMON_ORIGIN, species), + GetSynchronizedNature(STATIC_WILDMON_ORIGIN, species), + RANDOM_UNOWN_LETTER); + CreateMonWithIVs(&gEnemyParty[0], species, level, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[0]); if (item) { heldItem[0] = item; @@ -463,17 +463,18 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) } } -void CreateScriptedDoubleWildMon(u16 species1, u8 level1, u16 item1, u16 species2, u8 level2, u16 item2) +void CreateScriptedDoubleWildMon(u16 species1, u8 level1, enum Item item1, u16 species2, u8 level2, enum Item item2) { u8 heldItem1[2]; u8 heldItem2[2]; ZeroEnemyPartyMons(); - - if (OW_SYNCHRONIZE_NATURE > GEN_3) - CreateMonWithNature(&gEnemyParty[0], species1, level1, 32, PickWildMonNature()); - else - CreateMon(&gEnemyParty[0], species1, level1, 32, 0, 0, OT_ID_PLAYER_ID, 0); + u32 personality = GetMonPersonality(species1, + GetSynchronizedGender(STATIC_WILDMON_ORIGIN, species1), + GetSynchronizedNature(STATIC_WILDMON_ORIGIN, species1), + RANDOM_UNOWN_LETTER); + CreateMonWithIVs(&gEnemyParty[0], species1, level1, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[0]); if (item1) { heldItem1[0] = item1; @@ -481,10 +482,12 @@ void CreateScriptedDoubleWildMon(u16 species1, u8 level1, u16 item1, u16 species SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem1); } - if (OW_SYNCHRONIZE_NATURE > GEN_3) - CreateMonWithNature(&gEnemyParty[1], species2, level2, 32, PickWildMonNature()); - else - CreateMon(&gEnemyParty[1], species2, level2, 32, 0, 0, OT_ID_PLAYER_ID, 0); + personality = GetMonPersonality(species2, + GetSynchronizedGender(STATIC_WILDMON_ORIGIN, species2), + GetSynchronizedNature(STATIC_WILDMON_ORIGIN, species2), + RANDOM_UNOWN_LETTER); + CreateMonWithIVs(&gEnemyParty[1], species2, level2, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[1]); if (item2) { heldItem2[0] = item2; diff --git a/src/sprite.c b/src/sprite.c index b74357d9c..568e9e9e2 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -481,10 +481,10 @@ u32 CreateSpriteAt(u32 index, const struct SpriteTemplate *template, s16 x, s16 sprite->subpriority = subpriority; sprite->oam = *template->oam; - sprite->anims = template->anims; - sprite->affineAnims = template->affineAnims; + sprite->anims = template->anims ? template->anims : gDummySpriteAnimTable; + sprite->affineAnims = template->affineAnims ? template->affineAnims : gDummySpriteAffineAnimTable; sprite->template = template; - sprite->callback = template->callback; + sprite->callback = template->callback ? template->callback : SpriteCallbackDummy; sprite->x = x; sprite->y = y; diff --git a/src/test_runner_stub.c b/src/test_runner_stub.c index 9a9452ed2..20aabe3d9 100644 --- a/src/test_runner_stub.c +++ b/src/test_runner_stub.c @@ -7,5 +7,7 @@ const bool8 gTestRunnerEnabled = FALSE; // The Makefile patches gTestRunnerHeadless as part of make test. // This allows us to open the ROM in an mgba with a UI and see the // animations and messages play, which helps when debugging a test. +#if TESTING const bool8 gTestRunnerHeadless = FALSE; +#endif const bool8 gTestRunnerSkipIsFail = FALSE; diff --git a/src/trade.c b/src/trade.c index 22b3739c8..7709f49ab 100644 --- a/src/trade.c +++ b/src/trade.c @@ -834,7 +834,7 @@ static void CB2_CreateTradeMenu(void) gPaletteFade.bufferTransferDisabled = FALSE; for (i = 0; i < PARTY_SIZE; i++) - CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateRandomMon(&gEnemyParty[i], SPECIES_NONE, 0); PrintTradeMessage(MSG_STANDBY); ShowBg(0); diff --git a/src/trade_scene.c b/src/trade_scene.c index 4dfe22b3e..b79fb4262 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -2454,9 +2454,12 @@ static void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx) u8 level = GetMonData(&gPlayerParty[playerSlot], MON_DATA_LEVEL); struct Mail mail; u8 metLocation = METLOC_IN_GAME_TRADE; - struct Pokemon * tradeMon = &gEnemyParty[0]; + struct Pokemon *tradeMon = &gEnemyParty[0]; u8 mailNum; - CreateMon(tradeMon, inGameTrade->species, level, USE_RANDOM_IVS, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + + CreateMon(tradeMon, inGameTrade->species, level, inGameTrade->personality, OTID_STRUCT_PRESET(inGameTrade->otId)); + GiveMonInitialMoveset(tradeMon); + SetMonData(tradeMon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); SetMonData(tradeMon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); SetMonData(tradeMon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); diff --git a/src/trainer_slide.c b/src/trainer_slide.c index d8045d8ec..e784c3c84 100644 --- a/src/trainer_slide.c +++ b/src/trainer_slide.c @@ -15,6 +15,7 @@ #include "link.h" #include "menu.h" #include "palette.h" +#include "party_menu.h" #include "recorded_battle.h" #include "string_util.h" #include "strings.h" @@ -26,6 +27,7 @@ #include "constants/abilities.h" // #include "constants/battle_dome.h" #include "constants/battle_string_ids.h" +#include "constants/flags.h" // #include "constants/frontier_util.h" #include "constants/items.h" #include "constants/moves.h" @@ -33,26 +35,28 @@ #include "constants/species.h" #include "constants/trainers.h" // #include "constants/trainer_hill.h" +#include "constants/vars.h" #include "constants/weather.h" #include "trainer_slide.h" #include "battle_message.h" static u32 BattlerHPPercentage(u32 battler, u32 operation, u32 threshold); -static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive); +static u32 GetPartyMonCount(u32 firstId, u32 lastId, enum BattleSide side, bool32 onlyAlive); static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId); -static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(enum TrainerSlideType slideId); -static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(u32 battler, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(u32 battler, enum TrainerSlideType slideId); static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler, enum TrainerSlideType slideId); -static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum TrainerSlideType slideId); -static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId); -static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum BattleSide side, u32 battler, enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId, enum BattleSide side); +static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum BattleSide side, u32 battler, enum TrainerSlideType slideId); static bool32 ShouldRunTrainerSlideLastSwitchIn(u32 battler); -static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, u32 battler); -static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, u32 battler); -static void SetTrainerSlideParamters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue); -static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId); +static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, enum BattleSide side, u32 battler); +static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, enum BattleSide side, u32 battler); +static void SetTrainerSlideParameters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue); +static bool32 IsSlideInitalizedOrPlayed(u32 battler, enum TrainerSlideType slideId); -static const u8* const sTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +// Partner trainers must be added as TRAINER_PARTNER(PARTNER_XXXX) +static const u8* const sTrainerSlides[DIFFICULTY_COUNT][TRAINER_PARTNER(PARTNER_COUNT)][TRAINER_SLIDE_COUNT] = { [DIFFICULTY_NORMAL] = { @@ -67,7 +71,7 @@ static const u8* const sFrontierTrainerSlides[DIFFICULTY_COUNT][FRONTIER_TRAINER }, }; -static const u8* const sTestTrainerSlides[DIFFICULTY_COUNT][TRAINERS_COUNT][TRAINER_SLIDE_COUNT] = +static const u8* const sTestTrainerSlides[DIFFICULTY_COUNT][MAX_TRAINERS_COUNT + PARTNER_COUNT][TRAINER_SLIDE_COUNT] = { #include "../test/battle/trainer_slides.h" }; @@ -92,17 +96,38 @@ static u32 BattlerHPPercentage(u32 battler, u32 operation, u32 threshold) } } -static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive) -{ - u32 i, count = 0; +static const s8 sMultiBattleOrder[] = {0, 2, 3, 1, 4, 5}; - for (i = firstId; i < lastId; i++) +static u32 GetPartyMonCount(u32 firstId, u32 lastId, enum BattleSide side, bool32 onlyAlive) +{ + u32 count = 0; + struct Pokemon* party = (side == B_SIDE_OPPONENT ? gEnemyParty : gPlayerParty); + + if (IsMultiBattle() && side == B_SIDE_PLAYER) { - u32 species = GetMonData(&gEnemyParty[i], MON_DATA_SPECIES_OR_EGG, NULL); - if (species != SPECIES_NONE - && species != SPECIES_EGG - && (!onlyAlive || GetMonData(&gEnemyParty[i], MON_DATA_HP, NULL))) - count++; + for (u32 i = firstId; i < lastId; i++) + { + u32 species = GetMonData(&party[sMultiBattleOrder[i]], MON_DATA_SPECIES_OR_EGG); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && (!onlyAlive || GetMonData(&party[sMultiBattleOrder[i]], MON_DATA_HP))) + { + count++; + } + } + } + else + { + for (u32 i = firstId; i < lastId; i++) + { + u32 species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG); + if (species != SPECIES_NONE + && species != SPECIES_EGG + && (!onlyAlive || GetMonData(&party[i], MON_DATA_HP))) + { + count++; + } + } } return count; @@ -110,12 +135,14 @@ static u32 GetEnemyMonCount(u32 firstId, u32 lastId, bool32 onlyAlive) static const u8* const *GetTrainerSlideArray(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) { +#if TESTING + return (FlagGet(TESTING_FLAG_TRAINER_SLIDES) ? sTestTrainerSlides[difficulty][trainerId] : NULL); +#else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) return sFrontierTrainerSlides[difficulty][trainerId]; - else if (TESTING) - return sTestTrainerSlides[difficulty][trainerId]; else return sTrainerSlides[difficulty][trainerId]; +#endif // TESTING } static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) @@ -123,10 +150,24 @@ static bool32 DoesTrainerHaveSlideMessage(enum DifficultyLevel difficulty, u32 t const u8* const *trainerSlides = GetTrainerSlideArray(difficulty, trainerId, slideId); const u8* const *trainerSlidesNormal = GetTrainerSlideArray(DIFFICULTY_NORMAL, trainerId, slideId); +#if TESTING + if (VarGet(TESTING_VAR_TRAINER_SLIDES) == slideId) + { + if (trainerSlides[slideId] == NULL) + return (trainerSlidesNormal[slideId] != NULL); + else + return TRUE; + } + else + { + return FALSE; + } +#else if (trainerSlides[slideId] == NULL) return (trainerSlidesNormal[slideId] != NULL); else return TRUE; +#endif // TESTING } void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 slideId) @@ -140,19 +181,19 @@ void SetTrainerSlideMessage(enum DifficultyLevel difficulty, u32 trainerId, u32 gBattleStruct->trainerSlideMsg = trainerSlidesNormal[slideId]; } -static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(enum TrainerSlideType slideId) +static bool32 ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(u32 battler, enum TrainerSlideType slideId) { - return IsTrainerSlideInitialized(slideId); + return IsTrainerSlideInitialized(battler, slideId); } -static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(enum TrainerSlideType slideId) +static bool32 ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(u32 battler, enum TrainerSlideType slideId) { - return IsTrainerSlideInitialized(slideId); + return IsTrainerSlideInitialized(battler, slideId); } static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler, enum TrainerSlideType slideId) { - if (!IsTrainerSlideInitialized(slideId)) + if (!IsTrainerSlideInitialized(battler, slideId)) return FALSE; if (!IsBattlerAlive(battler)) @@ -161,28 +202,28 @@ static bool32 ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 battler return TRUE; } -static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum TrainerSlideType slideId) +static bool32 ShouldRunTrainerSlidePlayerLandsFirstSTABMove(u32 firstId, u32 lastId, enum BattleSide side, u32 battler, enum TrainerSlideType slideId) { - if (!IsTrainerSlideInitialized(slideId)) + if (!IsTrainerSlideInitialized(battler, slideId)) return FALSE; - if (GetEnemyMonCount(firstId, lastId, TRUE) != GetEnemyMonCount(firstId, lastId, FALSE)) + if (GetPartyMonCount(firstId, lastId, side, TRUE) != GetPartyMonCount(firstId, lastId, side, FALSE)) return FALSE; return TRUE; } -static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId) +static bool32 ShouldRunTrainerSlidePlayerLandsFirstDown(u32 firstId, u32 lastId, enum BattleSide side) { - return ((GetEnemyMonCount(firstId, lastId, TRUE) == (GetEnemyMonCount(firstId, lastId, FALSE) - 1))); + return ((GetPartyMonCount(firstId, lastId, side, TRUE) == (GetPartyMonCount(firstId, lastId, side, FALSE) - 1))); } -static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum TrainerSlideType slideId) +static bool32 ShouldRunTrainerSlideEnemyMonUnaffected(u32 firstId, u32 lastId, enum BattleSide side, u32 battler, enum TrainerSlideType slideId) { - if (!IsTrainerSlideInitialized(slideId)) + if (!IsTrainerSlideInitialized(battler, slideId)) return FALSE; - return (GetEnemyMonCount(firstId, lastId, TRUE) == GetEnemyMonCount(firstId, lastId, FALSE)); + return (GetPartyMonCount(firstId, lastId, side, TRUE) == GetPartyMonCount(firstId, lastId, side, FALSE)); } static bool32 ShouldRunTrainerSlideLastSwitchIn(u32 battler) @@ -190,9 +231,9 @@ static bool32 ShouldRunTrainerSlideLastSwitchIn(u32 battler) return !CanBattlerSwitch(battler); } -static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, u32 battler) +static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, enum BattleSide side, u32 battler) { - if (GetEnemyMonCount(firstId, lastId, TRUE) != 1) + if (GetPartyMonCount(firstId, lastId, side, TRUE) != 1) return FALSE; if (BattlerHPPercentage(battler, GREATER_THAN, 2)) @@ -201,55 +242,72 @@ static bool32 ShouldRunTrainerSlideLastHalfHP(u32 firstId, u32 lastId, u32 battl return (BattlerHPPercentage(battler, GREATER_THAN, 4)); } -static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, u32 battler) +static bool32 ShouldRunTrainerSlideLastLowHp(u32 firstId, u32 lastId, enum BattleSide side, u32 battler) { - if (GetEnemyMonCount(firstId, lastId, TRUE) != 1) + if (GetPartyMonCount(firstId, lastId, side, TRUE) != 1) + return FALSE; + + if (!IsBattlerAlive(battler)) return FALSE; return (BattlerHPPercentage(battler, LESS_THAN_OR_EQUAL, 4)); } -static void SetTrainerSlideParamters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue) +static void SetTrainerSlideParameters(u32 battler, u32* firstId, u32* lastId, u32* trainerId, u32* retValue) { - if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if ((battler & BIT_SIDE) == B_SIDE_OPPONENT) { - if (gBattlerPartyIndexes[battler] >= MULTI_PARTY_SIZE) + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { - *firstId = MULTI_PARTY_SIZE; - *lastId = PARTY_SIZE; - *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentB); - *retValue = TRAINER_SLIDE_TARGET_TRAINER_B; + if (gBattlerPartyIndexes[battler] >= MULTI_PARTY_SIZE) + { + *firstId = MULTI_PARTY_SIZE; + *lastId = PARTY_SIZE; + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentB); + *retValue = TRAINER_SLIDE_TARGET_TRAINER_B; + } + else + { + *firstId = 0; + *lastId = MULTI_PARTY_SIZE; + *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + } } else { *firstId = 0; - *lastId = MULTI_PARTY_SIZE; + *lastId = PARTY_SIZE; *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); } } - else + else if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - *firstId = 0; + *firstId = MULTI_PARTY_SIZE; *lastId = PARTY_SIZE; - *trainerId = SanitizeTrainerId(TRAINER_BATTLE_PARAM.opponentA); + *trainerId = SanitizeTrainerId(gPartnerTrainerId); + *retValue = TRAINER_SLIDE_TARGET_TRAINER_PARTNER; } } enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType slideId) { - u32 firstId, lastId, trainerId; + u32 firstId = 0, lastId = PARTY_SIZE, trainerId = 0; + enum BattleSide side = GetBattlerSide(battler); u32 retValue = TRAINER_SLIDE_TARGET_TRAINER_A; bool32 shouldRun = FALSE; - if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) || GetBattlerSide(battler) != B_SIDE_OPPONENT) + if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) return TRAINER_SLIDE_TARGET_NONE; - SetTrainerSlideParamters(battler, &firstId, &lastId, &trainerId, &retValue); + if (!IsDoubleBattle() && (battler > B_BATTLER_1)) + return TRAINER_SLIDE_TARGET_NONE; + + SetTrainerSlideParameters(battler, &firstId, &lastId, &trainerId, &retValue); enum DifficultyLevel difficulty = GetCurrentDifficultyLevel(); gBattleScripting.battler = battler; - if (IsTrainerSlidePlayed(slideId)) + if (IsTrainerSlidePlayed(battler, slideId)) return TRAINER_SLIDE_TARGET_NONE; if (!DoesTrainerHaveSlideMessage(difficulty,trainerId,slideId)) @@ -258,31 +316,31 @@ enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType switch (slideId) { case TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT: - shouldRun = ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(slideId); + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstCriticalHit(battler, slideId); break; case TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT: - shouldRun = ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(slideId); + shouldRun = ShouldRunTrainerSlideEnemyLandsFirstCriticalHit(battler, slideId); break; case TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT: shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSuperEffectiveHit(battler, slideId); break; case TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE: - shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSTABMove(firstId, lastId, slideId); + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstSTABMove(firstId, lastId, side, battler, slideId); break; case TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN: - shouldRun = ShouldRunTrainerSlidePlayerLandsFirstDown(firstId, lastId); + shouldRun = ShouldRunTrainerSlidePlayerLandsFirstDown(firstId, lastId, side); break; case TRAINER_SLIDE_ENEMY_MON_UNAFFECTED: - shouldRun = ShouldRunTrainerSlideEnemyMonUnaffected(firstId, lastId, slideId); + shouldRun = ShouldRunTrainerSlideEnemyMonUnaffected(firstId, lastId, side, battler, slideId); break; case TRAINER_SLIDE_LAST_SWITCHIN: shouldRun = ShouldRunTrainerSlideLastSwitchIn(battler); break; case TRAINER_SLIDE_LAST_HALF_HP: - shouldRun = ShouldRunTrainerSlideLastHalfHP(firstId, lastId, battler); + shouldRun = ShouldRunTrainerSlideLastHalfHP(firstId, lastId, side, battler); break; case TRAINER_SLIDE_LAST_LOW_HP: - shouldRun = ShouldRunTrainerSlideLastLowHp(firstId, lastId, battler); + shouldRun = ShouldRunTrainerSlideLastLowHp(firstId, lastId, side, battler); break; case TRAINER_SLIDE_BEFORE_FIRST_TURN: case TRAINER_SLIDE_MEGA_EVOLUTION: @@ -297,118 +355,135 @@ enum TrainerSlideTargets ShouldDoTrainerSlide(u32 battler, enum TrainerSlideType if (shouldRun == FALSE) return TRAINER_SLIDE_TARGET_NONE; - MarkTrainerSlideAsPlayed(slideId); + // Prevents slides triggering twice in single-trainer doubles (B == A / B == TRAINER_NONE) and 2v1 multibattles (B == 0xFFFF) + if (((TRAINER_BATTLE_PARAM.opponentB == TRAINER_BATTLE_PARAM.opponentA) + || (TRAINER_BATTLE_PARAM.opponentB == TRAINER_NONE) + || (TRAINER_BATTLE_PARAM.opponentB == 0xFFFF))) + { + MarkTrainerSlideAsPlayed(BATTLE_PARTNER(battler), slideId); + } + + MarkTrainerSlideAsPlayed(battler, slideId); SetTrainerSlideMessage(difficulty,trainerId,slideId); return retValue; } -static bool32 IsSlideInitalizedOrPlayed(enum TrainerSlideType slideId) +static bool32 IsSlideInitalizedOrPlayed(u32 battler, enum TrainerSlideType slideId) { - if (IsTrainerSlideInitialized(slideId)) + if (IsTrainerSlideInitialized(battler, slideId)) return TRUE; - if (IsTrainerSlidePlayed(slideId)) + if (IsTrainerSlidePlayed(battler, slideId)) return TRUE; return FALSE; } -void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, u32 moveType) +void TryInitializeFirstSTABMoveTrainerSlide(u32 battlerDef, u32 battlerAtk, enum Type moveType) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; - if (IsSlideInitalizedOrPlayed(slideId)) + if (IsSlideInitalizedOrPlayed(battlerDef, slideId)) return; - if ((GetBattlerSide(battlerDef) == B_SIDE_PLAYER)) + if ((IsOnPlayerSide(battlerDef))) return; if (IS_BATTLER_OF_TYPE(battlerAtk, moveType) == FALSE) return; - InitalizeTrainerSlide(slideId); + InitalizeTrainerSlide(battlerDef, slideId); } void TryInitializeTrainerSlidePlayerLandsFirstCriticalHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; - if (IsSlideInitalizedOrPlayed(slideId)) + if (IsSlideInitalizedOrPlayed(target, slideId)) return; - if (GetBattlerSide(target) == B_SIDE_PLAYER) + if (IsOnPlayerSide(target)) return; - InitalizeTrainerSlide(slideId); + InitalizeTrainerSlide(target, slideId); } void TryInitializeTrainerSlideEnemyLandsFirstCriticalHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; - if (IsSlideInitalizedOrPlayed(slideId)) + if (IsSlideInitalizedOrPlayed(gBattlerAttacker, slideId)) return; - if (GetBattlerSide(target) == B_SIDE_OPPONENT) + if (!IsOnPlayerSide(target)) return; - InitalizeTrainerSlide(slideId); + InitalizeTrainerSlide(gBattlerAttacker, slideId); } void TryInitializeTrainerSlidePlayerLandsFirstSuperEffectiveHit(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; - if (IsSlideInitalizedOrPlayed(slideId)) + if (IsSlideInitalizedOrPlayed(target, slideId)) return; - if (GetBattlerSide(target) == B_SIDE_PLAYER) + if (IsOnPlayerSide(target)) return; - InitalizeTrainerSlide(slideId); + InitalizeTrainerSlide(target, slideId); } void TryInitializeTrainerSlideEnemyMonUnaffected(u32 target) { enum TrainerSlideType slideId = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; - if (IsSlideInitalizedOrPlayed(slideId)) + if (IsSlideInitalizedOrPlayed(target, slideId)) return; - if (GetBattlerSide(target) != B_SIDE_OPPONENT) + if (IsOnPlayerSide(target)) return; - InitalizeTrainerSlide(slideId); + InitalizeTrainerSlide(target, slideId); } -bool32 IsTrainerSlideInitialized(enum TrainerSlideType slideId) +bool32 IsTrainerSlideInitialized(u32 battler, enum TrainerSlideType slideId) { u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; - return (gBattleStruct->slideMessageStatus.messageInitalized[arrayIndex] & (1 << bitPosition)) != 0; + return (gBattleStruct->slideMessageStatus.messageInitalized[battler][arrayIndex] & (1 << bitPosition)) != 0; } -bool32 IsTrainerSlidePlayed(enum TrainerSlideType slideId) +bool32 IsTrainerSlidePlayed(u32 battler, enum TrainerSlideType slideId) { u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; - return (gBattleStruct->slideMessageStatus.messagePlayed[arrayIndex] & (1 << bitPosition)) != 0; + return (gBattleStruct->slideMessageStatus.messagePlayed[battler][arrayIndex] & (1 << bitPosition)) != 0; } -void InitalizeTrainerSlide(enum TrainerSlideType slideId) +void InitalizeTrainerSlide(u32 battler, enum TrainerSlideType slideId) { u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; - gBattleStruct->slideMessageStatus.messageInitalized[arrayIndex] |= (1 << bitPosition); + gBattleStruct->slideMessageStatus.messageInitalized[battler][arrayIndex] |= (1 << bitPosition); } -void MarkTrainerSlideAsPlayed(enum TrainerSlideType slideId) +void MarkInitializedTrainerSlidesAsPlayed(u32 battler, enum TrainerSlideType slideId) { u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; - gBattleStruct->slideMessageStatus.messagePlayed[arrayIndex] |= (1 << bitPosition); + if (IsTrainerSlideInitialized(battler, slideId) && !IsTrainerSlidePlayed(battler, slideId)) + gBattleStruct->slideMessageStatus.messagePlayed[battler][arrayIndex] |= (1 << bitPosition); +} + +void MarkTrainerSlideAsPlayed(u32 battler, enum TrainerSlideType slideId) +{ + u32 arrayIndex = slideId / TRAINER_SLIDES_PER_ARRAY; + u32 bitPosition = slideId % TRAINER_SLIDES_PER_ARRAY; + + gBattleStruct->slideMessageStatus.messagePlayed[battler][arrayIndex] |= (1 << bitPosition); } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b1d40097b..bd441397f 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -16,6 +16,7 @@ #include "quest_log.h" #include "safari_zone.h" #include "rtc.h" +#include "ow_synchronize.h" #include "constants/maps.h" #include "constants/abilities.h" #include "constants/item.h" @@ -46,7 +47,6 @@ EWRAM_DATA bool8 gIsSurfingEncounter = 0; EWRAM_DATA u16 gChainFishingDexNavStreak = 0; static bool8 UnlockedTanobyOrAreNotInTanoby(void); -static u32 GenerateUnownPersonalityByLetter(u8 letter); static void UpdateChainFishingStreak(); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *rate); @@ -300,7 +300,7 @@ void GetSeasonAndTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area, *timeOfDay = GetTimeOfDay(); if (*season == OW_SEASON_FALLBACK && *timeOfDay == OW_TIME_OF_DAY_FALLBACK) return; - + for (enum EncounterFallbacks fallback = ENCOUNTER_FALLBACK_TIME_OF_DAY; fallback <= ENCOUNTER_FALLBACK_COUNT; fallback++) { switch (area) @@ -327,9 +327,9 @@ void GetSeasonAndTimeOfDayForEncounters(u32 headerId, enum WildPokemonArea area, return; if (OW_TIME_OF_DAY_DISABLE_FALLBACK && OW_SEASON_DISABLE_FALLBACK) return; - + if (!OW_TIME_OF_DAY_DISABLE_FALLBACK && fallback == ENCOUNTER_FALLBACK_TIME_OF_DAY) - *timeOfDay = OW_TIME_OF_DAY_FALLBACK; + *timeOfDay = OW_TIME_OF_DAY_FALLBACK; if (!OW_SEASON_DISABLE_FALLBACK && fallback == ENCOUNTER_FALLBACK_SEASON) *season = OW_SEASON_FALLBACK; } @@ -353,87 +353,24 @@ static bool8 UnlockedTanobyOrAreNotInTanoby(void) return FALSE; } -u8 PickWildMonNature(void) +static u8 PickWildMonNature(u32 species) { - // check synchronize for a Pokémon with the same ability - if (OW_SYNCHRONIZE_NATURE < GEN_9 - && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) - && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE - && (OW_SYNCHRONIZE_NATURE == GEN_8 || Random() % 2 == 0)) - { - return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % NUM_NATURES; - } - - // random nature - return Random() % NUM_NATURES; + return GetSynchronizedNature(WILDMON_ORIGIN, species); } void CreateWildMon(u16 species, u8 level, u8 unownSlot) { - u32 personality; - s8 chamber; - bool32 checkCuteCharm; - u8 unownLetter = NUM_UNOWN_FORMS; - - ZeroEnemyPartyMons(); - - switch (gSpeciesInfo[species].genderRatio) - { - case MON_MALE: - case MON_FEMALE: - case MON_GENDERLESS: - checkCuteCharm = FALSE; - break; - } + u8 unownLetter = RANDOM_UNOWN_LETTER; if (species == SPECIES_UNOWN) { - chamber = gSaveBlock1Ptr->location.mapNum - MAP_NUM(MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER); + s8 chamber = gSaveBlock1Ptr->location.mapNum - MAP_NUM(MAP_SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER); unownLetter = sUnownLetterSlots[chamber][unownSlot]; } - if (checkCuteCharm - && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG) - && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM - && Random() % 3 != 0) - { - u16 leadingMonSpecies = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES); - u32 leadingMonPersonality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY); - u8 gender = GetGenderFromSpeciesAndPersonality(leadingMonSpecies, leadingMonPersonality); - - // misses mon is genderless check, although no genderless mon can have cute charm as ability - if (gender == MON_FEMALE) - gender = MON_MALE; - else - gender = MON_FEMALE; - - CreateMonWithGenderNatureLetter(&gEnemyParty[0], species, level, USE_RANDOM_IVS, gender, PickWildMonNature(), unownLetter); - return; - } - - if (species != SPECIES_UNOWN) - { - CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature()); - } - else - { - personality = GenerateUnownPersonalityByLetter(unownLetter); - CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, TRUE, personality, FALSE, 0); - } -} - -static u32 GenerateUnownPersonalityByLetter(u8 letter) -{ - u32 personality; - do - { - personality = (Random() << 16) | Random(); - } while (GetUnownLetterByPersonalityLoByte(personality) != letter); - return personality; -} - -u8 GetUnownLetterByPersonalityLoByte(u32 personality) -{ - return GET_UNOWN_LETTER(personality); + ZeroEnemyPartyMons(); + u32 personality = GetMonPersonality(species, GetSynchronizedGender(WILDMON_ORIGIN, species), PickWildMonNature(species), unownLetter); + CreateMonWithIVs(&gEnemyParty[0], species, level, personality, OTID_STRUCT_PLAYER_ID, USE_RANDOM_IVS); + GiveMonInitialMoveset(&gEnemyParty[0]); } #define TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildPokemon, type, ability, ptr, count) TryGetAbilityInfluencedWildMonIndex(wildPokemon, type, ability, ptr, count) @@ -658,7 +595,7 @@ bool8 TryStandardWildSurfEncounter(u16 headerId, u32 currMetatileAttrs, u16 prev } // try a regular surfing encounter if (TryGenerateWildMon(gWildMonHeaders[headerId].encounterTypes[season][timeOfDay].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_REPEL) == TRUE) - { + { gIsSurfingEncounter = TRUE; if (TryDoDoubleWildBattle()) { diff --git a/test/battle/ability/aerilate.c b/test/battle/ability/aerilate.c index c122496d5..d9eede03c 100644 --- a/test/battle/ability/aerilate.c +++ b/test/battle/ability/aerilate.c @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Aerilate turns a Normal-type move into Flying-type move") SINGLE_BATTLE_TEST("Aerilate can not turn certain moves into Flying type moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_WEATHER_BALL; } // PARAMETRIZE { move = MOVE_NATURAL_GIFT; } TODO: handle this case via Skill Swap PARAMETRIZE { move = MOVE_JUDGMENT; } @@ -47,14 +47,15 @@ SINGLE_BATTLE_TEST("Aerilate can not turn certain moves into Flying type moves") SINGLE_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage) { - u32 move, genConfig; + enum Move move; + u32 genConfig; PARAMETRIZE { move = MOVE_CELEBRATE; genConfig = GEN_7; } PARAMETRIZE { move = MOVE_CELEBRATE; genConfig = GEN_6; } PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_7; } PARAMETRIZE { move = MOVE_SKILL_SWAP; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_WOBBUFFET); @@ -73,7 +74,7 @@ SINGLE_BATTLE_TEST("Aerilate boosts power of affected moves by 20% (Gen7+) or 30 SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage) { - u32 move1, move2; + enum Move move1, move2; PARAMETRIZE { move1 = MOVE_CELEBRATE; move2 = MOVE_CELEBRATE; } PARAMETRIZE { move1 = MOVE_SUNNY_DAY; move2 = MOVE_CELEBRATE; } PARAMETRIZE { move1 = MOVE_CELEBRATE; move2 = MOVE_SKILL_SWAP; } @@ -104,7 +105,7 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Weather Ball's type", s16 damage) SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SKILL_SWAP; } GIVEN { @@ -125,7 +126,8 @@ SINGLE_BATTLE_TEST("Aerilate doesn't affect Natural Gift's type") SINGLE_BATTLE_TEST("Aerilate doesn't affect Judgment / Techno Blast / Multi-Attack's type") { - u16 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; } PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; } diff --git a/test/battle/ability/aftermath.c b/test/battle/ability/aftermath.c index 16ffad7ad..297997076 100644 --- a/test/battle/ability/aftermath.c +++ b/test/battle/ability/aftermath.c @@ -6,16 +6,16 @@ SINGLE_BATTLE_TEST("Aftermath damages the attacker by 1/4th of its max HP if fai s16 aftermathDamage; GIVEN { - PLAYER(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); }; + PLAYER(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {MOVE(opponent, MOVE_SCRATCH);} + TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { MESSAGE("The opposing Wobbuffet used Scratch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - MESSAGE("Voltorb fainted!"); ABILITY_POPUP(player, ABILITY_AFTERMATH); HP_BAR(opponent, captureDamage: &aftermathDamage); + MESSAGE("Voltorb fainted!"); } THEN { EXPECT_EQ(aftermathDamage, opponent->maxHP / 4); } @@ -24,27 +24,27 @@ SINGLE_BATTLE_TEST("Aftermath damages the attacker by 1/4th of its max HP if fai SINGLE_BATTLE_TEST("Aftermath ability pop-up will be displayed correctly: player point of view") { GIVEN { - PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); }; - OPPONENT(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); }; + PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); } + OPPONENT(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); } } WHEN { - TURN {MOVE(player, MOVE_HEADBUTT);} + TURN { MOVE(player, MOVE_HEADBUTT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); - MESSAGE("The opposing Voltorb fainted!"); ABILITY_POPUP(opponent, ABILITY_AFTERMATH); + MESSAGE("The opposing Voltorb fainted!"); } } SINGLE_BATTLE_TEST("Aftermath ability pop-up will be displayed correctly: opponent point of view") { GIVEN { - PLAYER(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); }; - OPPONENT(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); }; + PLAYER(SPECIES_VOLTORB) { HP(1); Ability(ABILITY_AFTERMATH); } + OPPONENT(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); } } WHEN { - TURN {MOVE(opponent, MOVE_HEADBUTT);} + TURN { MOVE(opponent, MOVE_HEADBUTT); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, opponent); - MESSAGE("Voltorb fainted!"); ABILITY_POPUP(player, ABILITY_AFTERMATH); + MESSAGE("Voltorb fainted!"); } } diff --git a/test/battle/ability/analytic.c b/test/battle/ability/analytic.c index 5e50c24d5..da2b8e28a 100644 --- a/test/battle/ability/analytic.c +++ b/test/battle/ability/analytic.c @@ -20,9 +20,59 @@ SINGLE_BATTLE_TEST("Analytic increases the power of moves by 30% if it's the las } } +DOUBLE_BATTLE_TEST("Analytic activates correctly with empty slot after fainting", s16 damage) +{ + u32 speed; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 5; } + + GIVEN { + PLAYER(SPECIES_MAGNEMITE) { Ability(ABILITY_ANALYTIC); Speed(speed); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + } + } SCENE { + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.3), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Analytic does not activate when not moving last with empty slot", s16 damage) +{ + u32 speed; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 15; } + + GIVEN { + PLAYER(SPECIES_MAGNEMITE) { Ability(ABILITY_ANALYTIC); Speed(speed); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); + } + } SCENE { + HP_BAR(opponentLeft, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + TO_DO_BATTLE_TEST("Analytic takes into account modifications to speeed an priority (Gen 5-8)"); //Eg. Paralysis, Power Weight, Stall TO_DO_BATTLE_TEST("Analytic does not take into account modifications to speeed an priority (Gen 8)"); //Eg. Paralysis, Power Weight, Stall -TO_DO_BATTLE_TEST("Analytic takes into account the turn order of what fainted Pokémon would've moved"); // Triple Battles needed to test //TO_DO_BATTLE_TEST("If the Pokémon with Analytic is targeting a Pokémon in a flank position that chooses to switch with its ally in the middle, its move's power will always be normal when it attacks the Pokémon that is shifted into the flank position"); diff --git a/test/battle/ability/anger_shell.c b/test/battle/ability/anger_shell.c index 6c9064ee0..d55d003f0 100644 --- a/test/battle/ability/anger_shell.c +++ b/test/battle/ability/anger_shell.c @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Anger Shell activates after all hits from a multi-hit move") u32 j; u16 maxHp = 500; GIVEN { - ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_DOUBLE_SLAP)); PLAYER(SPECIES_KLAWF) { Ability(ABILITY_ANGER_SHELL); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. } WHEN { diff --git a/test/battle/ability/anticipation.c b/test/battle/ability/anticipation.c index ee5b602a1..1e195981e 100644 --- a/test/battle/ability/anticipation.c +++ b/test/battle/ability/anticipation.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a super-effe PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Anticipation does not trigger even when a move is super effe PLAYER(SPECIES_WHISCASH) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_PIKACHU) { Moves(MOVE_CELEBRATE, MOVE_THUNDERBOLT); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a One-hit KO PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_FISSURE, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -44,11 +44,11 @@ SINGLE_BATTLE_TEST("Anticipation causes notifies if an opponent has a One-hit KO SINGLE_BATTLE_TEST("Anticipation treats Self-Destruct and Explosion like all other Normal types (Gen5+)") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EXPLOSION, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -63,7 +63,7 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Normalize into their effective PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Moves(MOVE_CLOSE_COMBAT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -75,12 +75,16 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Scrappy into their effectivene ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); ASSUME(GetSpeciesType(SPECIES_DOUBLADE, 0) == TYPE_STEEL); ASSUME(GetSpeciesType(SPECIES_DOUBLADE, 1) == TYPE_GHOST); - PLAYER(SPECIES_DOUBLADE) { Ability(ABILITY_ANTICIPATION); } - OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_CELEBRATE); } + PLAYER(SPECIES_WORMADAM_TRASH) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_SKILL_SWAP, MOVE_CELEBRATE); } + PLAYER(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); Moves(MOVE_CLOSE_COMBAT, MOVE_CELEBRATE); } + OPPONENT(SPECIES_DOUBLADE) { Ability(ABILITY_NO_GUARD); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN { MOVE(player, MOVE_SKILL_SWAP, target: opponent); MOVE(opponent, MOVE_CELEBRATE); } + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { SWITCH(opponent, 0); } } SCENE { - NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); + NOT ABILITY_POPUP(opponent, ABILITY_ANTICIPATION); } } @@ -100,7 +104,8 @@ SINGLE_BATTLE_TEST("Anticipation doesn't consider Gravity into their effectivene SINGLE_BATTLE_TEST("Anticipation counts Counter, Metal Burst or Mirror Coat as attacking moves of their types (Gen5+)") { - u32 move, species; + enum Move move; + u32 species; enum Type typeAtk, typeDef; PARAMETRIZE { move = MOVE_COUNTER; species = SPECIES_RATICATE; typeAtk = TYPE_FIGHTING; typeDef = TYPE_NORMAL; } PARAMETRIZE { move = MOVE_METAL_BURST; species = SPECIES_ROGGENROLA; typeAtk = TYPE_STEEL; typeDef = TYPE_ROCK; } @@ -197,7 +202,7 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ARCEUS) { Item(ITEM_FIST_PLATE); Moves(MOVE_JUDGMENT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -230,7 +235,7 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_NATURAL_GIFT, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -245,7 +250,7 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_GENESECT) { Item(ITEM_BURN_DRIVE); Moves(MOVE_TECHNO_BLAST, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -261,7 +266,7 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_ORICORIO_BAILE) { Moves(MOVE_REVELATION_DANCE, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -276,7 +281,7 @@ SINGLE_BATTLE_TEST("Anticipation treats dynamic move types as their base type (N PLAYER(SPECIES_EEVEE) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_SILVALLY) { Item(ITEM_FIGHTING_MEMORY); Moves(MOVE_MULTI_ATTACK, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -308,7 +313,7 @@ SINGLE_BATTLE_TEST("Anticipation does not consider ate-abilities") PLAYER(SPECIES_WORMADAM_PLANT) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_AURORUS) { Ability(ABILITY_REFRIGERATE); Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(player, ABILITY_ANTICIPATION); } @@ -343,7 +348,7 @@ SINGLE_BATTLE_TEST("Anticipation considers Inverse Battle types") PLAYER(SPECIES_FERROTHORN) { Ability(ABILITY_ANTICIPATION); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GROWL, MOVE_SCRATCH, MOVE_POUND, MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_ANTICIPATION); } diff --git a/test/battle/ability/arena_trap.c b/test/battle/ability/arena_trap.c index ef0d5b7d8..67384fa68 100644 --- a/test/battle/ability/arena_trap.c +++ b/test/battle/ability/arena_trap.c @@ -1,11 +1,141 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Arena Trap prevents grounded adjacent opponents from switching out"); -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs if the Pokémon is switched in the same turn the opponent decided to switch out"); -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via moves that switch out"); // Baton Pass, U-Turn, Volt Switch, Flip Turn, Parting Shot -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Shed Shell, but not via Teleport"); -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Run Away"); -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Smoke Ball"); -TO_DO_BATTLE_TEST("Arena Trap prevents switch outs from Ghost-type Pokémon (Gen3-5)"); -TO_DO_BATTLE_TEST("Arena Trap doesn't prevent switch outs from Ghost-type Pokémon (Gen6+)"); +SINGLE_BATTLE_TEST("Arena Trap prevents grounded adjacent opponents from switching out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u32 trapper = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + EXPECT_EQ(IsAbilityPreventingEscape(battler), trapper + 1); + } +} + +SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs if the Pokémon is switched in the same turn the opponent decided to switch out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); Speed(5); } + } WHEN { + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } THEN { + EXPECT_EQ(player->species, SPECIES_WYNAUT); + EXPECT_EQ(opponent->species, SPECIES_DIGLETT); + } +} + +SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs via moves that switch out") +{ + u16 move, effect; + PARAMETRIZE { move = MOVE_BATON_PASS; effect = EFFECT_BATON_PASS; } + PARAMETRIZE { move = MOVE_U_TURN; effect = EFFECT_HIT_ESCAPE; } + PARAMETRIZE { move = MOVE_VOLT_SWITCH; effect = EFFECT_HIT_ESCAPE; } + PARAMETRIZE { move = MOVE_FLIP_TURN; effect = EFFECT_HIT_ESCAPE; } + PARAMETRIZE { move = MOVE_PARTING_SHOT; effect = EFFECT_PARTING_SHOT; } + PARAMETRIZE { move = MOVE_TELEPORT; effect = EFFECT_TELEPORT; } + PARAMETRIZE { move = MOVE_SHED_TAIL; effect = EFFECT_SHED_TAIL; } + PARAMETRIZE { move = MOVE_CHILLY_RECEPTION; effect = EFFECT_WEATHER_AND_SWITCH; } + GIVEN { + ASSUME(GetMoveEffect(move) == effect); + ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + if (move == MOVE_VOLT_SWITCH) + TURN { MOVE(player, MOVE_SOAK); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, move); SEND_OUT(player, 1); } + } SCENE { + if (move == MOVE_VOLT_SWITCH) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SOAK, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs via Shed Shell") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_SHED_SHELL].holdEffect == HOLD_EFFECT_SHED_SHELL); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); } // Grounded + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +WILD_BATTLE_TEST("Arena Trap prevents switching but Run Away allows fleeing") +{ + GIVEN { + PLAYER(SPECIES_RATTATA) { Ability(ABILITY_RUN_AWAY); } + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u32 trapper = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + EXPECT_EQ(IsAbilityPreventingEscape(battler), trapper + 1); + EXPECT_EQ(IsRunningFromBattleImpossible(battler), BATTLE_RUN_SUCCESS); + } +} + +WILD_BATTLE_TEST("Arena Trap prevents switching but Smoke Ball allows fleeing") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_SMOKE_BALL].holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SMOKE_BALL); } + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u32 trapper = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + EXPECT_EQ(IsAbilityPreventingEscape(battler), trapper + 1); + EXPECT_EQ(IsRunningFromBattleImpossible(battler), BATTLE_RUN_SUCCESS); + } +} + +SINGLE_BATTLE_TEST("Arena Trap prevents switch outs from Ghost-type Pokémon (Gen3-5)") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_SHUPPET, 0) == TYPE_GHOST); + WITH_CONFIG(CONFIG_GHOSTS_ESCAPE, GEN_5); + PLAYER(SPECIES_SHUPPET); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u32 trapper = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + EXPECT_EQ(IsAbilityPreventingEscape(battler), trapper + 1); + } +} + +SINGLE_BATTLE_TEST("Arena Trap doesn't prevent switch outs from Ghost-type Pokémon (Gen6+)") +{ + GIVEN { + ASSUME(GetSpeciesType(SPECIES_SHUPPET, 0) == TYPE_GHOST); + WITH_CONFIG(CONFIG_GHOSTS_ESCAPE, GEN_6); + PLAYER(SPECIES_SHUPPET); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + u32 battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + EXPECT_EQ(IsAbilityPreventingEscape(battler), 0); + } +} diff --git a/test/battle/ability/aroma_veil.c b/test/battle/ability/aroma_veil.c index 08dedfae6..9a911f5d2 100644 --- a/test/battle/ability/aroma_veil.c +++ b/test/battle/ability/aroma_veil.c @@ -159,7 +159,7 @@ DOUBLE_BATTLE_TEST("Aroma Veil does not protect the Pokémon's side from Impriso ASSUME(GetMoveEffect(MOVE_IMPRISON) == EFFECT_IMPRISON); PLAYER(SPECIES_AROMATISSE) { Ability(ABILITY_AROMA_VEIL); } PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) {Moves(MOVE_IMPRISON, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_IMPRISON, MOVE_CELEBRATE); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(opponentLeft, MOVE_IMPRISON); MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); MOVE(opponentRight, MOVE_SPLASH); } diff --git a/test/battle/ability/aura_break.c b/test/battle/ability/aura_break.c index 389ab327b..c023869c7 100644 --- a/test/battle/ability/aura_break.c +++ b/test/battle/ability/aura_break.c @@ -5,111 +5,60 @@ DOUBLE_BATTLE_TEST("Aura Break inverts Fairy Aura's effect") { s16 damage[3]; - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); } - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(playerRight, 2); } - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(opponentRight, 2); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[0]); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(playerRight, 2); } + TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft); SWITCH(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); - } THEN { - EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); - EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); - } + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); + } } DOUBLE_BATTLE_TEST("Aura Break inverts Dark Aura's effect") { s16 damage[3]; - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); } - TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(playerRight, 2); } - TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(opponentRight, 2); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[0]); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); } + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(playerRight, 2); } + TURN { MOVE(playerLeft, MOVE_BITE, target:opponentLeft); SWITCH(opponentRight, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[1]); - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[2]); - } THEN { - EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); - EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); - } -} - -DOUBLE_BATTLE_TEST("Aura Break ignores Mold Breaker abilities") -{ - s16 damage[6]; - u32 species = SPECIES_WOBBUFFET, ability = ABILITY_NONE; - - PARAMETRIZE { species = SPECIES_WOBBUFFET, ability = ABILITY_SHADOW_TAG; } - PARAMETRIZE { species = SPECIES_CRANIDOS, ability = ABILITY_MOLD_BREAKER; } - PARAMETRIZE { species = SPECIES_ZEKROM, ability = ABILITY_TERAVOLT; } - PARAMETRIZE { species = SPECIES_RESHIRAM, ability = ABILITY_TURBOBLAZE; } - - GIVEN { - PLAYER(species) { Ability(ability); Level(50); } - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } - PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ZYGARDE_50) { Ability(ABILITY_AURA_BREAK); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_BITE, target: opponentLeft); } - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target: opponentLeft); } - TURN { MOVE(playerLeft, MOVE_BITE, target: opponentLeft); SWITCH(playerRight, 2); } - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target: opponentLeft); SWITCH(playerRight, 3); } - TURN { MOVE(playerLeft, MOVE_BITE, target: opponentLeft); SWITCH(playerRight, 2); SWITCH(opponentRight, 2); } - TURN { MOVE(playerLeft, MOVE_PLAY_ROUGH, target: opponentLeft); SWITCH(playerRight, 3); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[0]); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[1]); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[2]); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[3]); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[4]); - - ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); - HP_BAR(opponentLeft, captureDamage: &damage[5]); } THEN { - EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[2]); - EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[4]); - EXPECT_MUL_EQ(damage[1], UQ_4_12(1.33), damage[3]); - EXPECT_MUL_EQ(damage[1], UQ_4_12(0.75), damage[5]); - } + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[0], UQ_4_12(0.75), damage[2]); + } } diff --git a/test/battle/ability/bad_dreams.c b/test/battle/ability/bad_dreams.c index 491d5a91a..0fa9f6ef6 100644 --- a/test/battle/ability/bad_dreams.c +++ b/test/battle/ability/bad_dreams.c @@ -9,9 +9,9 @@ SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of PARAMETRIZE { status = STATUS1_SLEEP; } GIVEN { PLAYER(SPECIES_DARKRAI); - OPPONENT(SPECIES_WOBBUFFET) {Status1(status);} + OPPONENT(SPECIES_WOBBUFFET) { Status1(status); } } WHEN { - TURN {;} + TURN {} } SCENE { if (status == STATUS1_SLEEP) { ABILITY_POPUP(player, ABILITY_BAD_DREAMS); @@ -35,17 +35,31 @@ SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of } } -TO_DO_BATTLE_TEST("Bad Dreams affects Pokémon with Comatose") +SINGLE_BATTLE_TEST("Bad Dreams causes Pokémon with Comatose to lose 1/8 of HP") +{ + GIVEN { + PLAYER(SPECIES_DARKRAI); + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_BAD_DREAMS); + MESSAGE("The opposing Komala is tormented!"); + HP_BAR(opponent); + } THEN { + EXPECT_EQ(opponent->hp, opponent->maxHP - opponent->maxHP / 8); + } +} DOUBLE_BATTLE_TEST("Bad Dreams does not activate if only the partner Pokemon is sleeping") { GIVEN { PLAYER(SPECIES_DARKRAI); - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {;} + TURN {} } SCENE { NONE_OF { ABILITY_POPUP(playerLeft, ABILITY_BAD_DREAMS); @@ -62,12 +76,12 @@ DOUBLE_BATTLE_TEST("Bad Dreams does not activate if only the partner Pokemon is DOUBLE_BATTLE_TEST("Bad Dreams activates for both sleeping Pokémon on the player side") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } OPPONENT(SPECIES_DARKRAI); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {;} + TURN {} } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_BAD_DREAMS); MESSAGE("Wobbuffet is tormented!"); @@ -85,14 +99,14 @@ DOUBLE_BATTLE_TEST("Bad Dreams activates for both sleeping Pokémon on the playe DOUBLE_BATTLE_TEST("Bad Dreams faints both sleeping Pokemon on player side") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} - PLAYER(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } OPPONENT(SPECIES_DARKRAI); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3);} + TURN { SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3); } } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_BAD_DREAMS); MESSAGE("Wobbuffet is tormented!"); @@ -109,12 +123,12 @@ DOUBLE_BATTLE_TEST("Bad Dreams faints both sleeping Pokemon on opponent side") GIVEN { PLAYER(SPECIES_DARKRAI); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP); HP(1);} - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } } WHEN { - TURN {SEND_OUT(opponentLeft, 2); SEND_OUT(opponentRight, 3);} + TURN { SEND_OUT(opponentLeft, 2); SEND_OUT(opponentRight, 3); } } SCENE { ABILITY_POPUP(playerLeft, ABILITY_BAD_DREAMS); MESSAGE("The opposing Wobbuffet is tormented!"); diff --git a/test/battle/ability/ball_fetch.c b/test/battle/ability/ball_fetch.c index 762225c0f..185f7349d 100644 --- a/test/battle/ability/ball_fetch.c +++ b/test/battle/ability/ball_fetch.c @@ -3,7 +3,7 @@ WILD_BATTLE_TEST("Ball Fetch causes the Pokémon to pick up the last failed Ball at the end of the turn") { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_POKE_BALL; } PARAMETRIZE { item = ITEM_GREAT_BALL; } @@ -15,7 +15,7 @@ WILD_BATTLE_TEST("Ball Fetch causes the Pokémon to pick up the last failed Ball PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); } OPPONENT(SPECIES_METAGROSS); } WHEN { - TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16) );} + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, MAX_u16)); } TURN {} } SCENE { if (item != ITEM_X_ACCURACY) @@ -32,7 +32,7 @@ WILD_BATTLE_TEST("Ball Fetch causes the Pokémon to pick up the last failed Ball WILD_BATTLE_TEST("Ball Fetch doesn't trigger if the Pokémon is already holding an item") { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_NUGGET; } @@ -51,8 +51,7 @@ WILD_BATTLE_TEST("Ball Fetch doesn't trigger if the Pokémon is already holding } else { - NONE_OF - { + NONE_OF { ABILITY_POPUP(player, ABILITY_BALL_FETCH); MESSAGE("Yamper found a Great Ball!"); } @@ -67,14 +66,14 @@ WILD_BATTLE_TEST("Ball Fetch doesn't trigger if the Pokémon is already holding WILD_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battle") { - u32 item = 0; - u32 item2 = 0; + enum Item item = ITEM_NONE; + enum Item item2 = ITEM_NONE; PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_X_ACCURACY; } PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_ULTRA_BALL; } PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_FAST_BALL; } PARAMETRIZE { item = ITEM_GREAT_BALL; item2 = ITEM_STRANGE_BALL; } - + GIVEN { PLAYER(SPECIES_YAMPER) { Ability(ABILITY_BALL_FETCH); } @@ -98,7 +97,7 @@ WILD_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battl SINGLE_BATTLE_TEST("Ball Fetch doesn't trigger in Trainer Battles") { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_POKE_BALL; } PARAMETRIZE { item = ITEM_GREAT_BALL; } diff --git a/test/battle/ability/battle_bond.c b/test/battle/ability/battle_bond.c index d26853696..9d8bb1b3c 100644 --- a/test/battle/ability/battle_bond.c +++ b/test/battle/ability/battle_bond.c @@ -11,13 +11,13 @@ SINGLE_BATTLE_TEST("Battle Bond transforms player's Greninja - Singles") { u32 monsCountPlayer, monsCountOpponent; - PARAMETRIZE {monsCountPlayer = 1; monsCountOpponent = 1; } - PARAMETRIZE {monsCountPlayer = 1; monsCountOpponent = 2; } - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 1; } - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 1; monsCountOpponent = 1; } + PARAMETRIZE { monsCountPlayer = 1; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 1; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountPlayer == 2) { PLAYER(SPECIES_WOBBUFFET); @@ -59,18 +59,18 @@ SINGLE_BATTLE_TEST("Battle Bond transforms opponent's Greninja - Singles") { u32 monsCountPlayer, monsCountOpponent; - PARAMETRIZE {monsCountPlayer = 1; monsCountOpponent = 1; } - PARAMETRIZE {monsCountPlayer = 1; monsCountOpponent = 2; } - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 1; } - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 1; monsCountOpponent = 1; } + PARAMETRIZE { monsCountPlayer = 1; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 1; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 2; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); OPPONENT(SPECIES_GRENINJA_BATTLE_BOND); if (monsCountOpponent == 2) { OPPONENT(SPECIES_WOBBUFFET); } - PLAYER(SPECIES_WOBBUFFET) {HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } if (monsCountPlayer == 2) { PLAYER(SPECIES_WOBBUFFET); } @@ -107,13 +107,13 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A { u32 monsCountPlayer, monsCountOpponent; - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 2; } - PARAMETRIZE {monsCountPlayer = 2; monsCountOpponent = 3; } - PARAMETRIZE {monsCountPlayer = 3; monsCountOpponent = 2; } - PARAMETRIZE {monsCountPlayer = 3; monsCountOpponent = 3; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 2; monsCountOpponent = 3; } + PARAMETRIZE { monsCountPlayer = 3; monsCountOpponent = 2; } + PARAMETRIZE { monsCountPlayer = 3; monsCountOpponent = 3; } GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND); PLAYER(SPECIES_WOBBUFFET) { HP(1); } if (monsCountPlayer == 3) { @@ -145,7 +145,7 @@ DOUBLE_BATTLE_TEST("Battle Bond transforms player's Greninja when fainting its A SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -166,7 +166,7 @@ SINGLE_BATTLE_TEST("Battle Bond increases Atk, SpAtk and Speed by 1 stage (Gen9+ SINGLE_BATTLE_TEST("Battle Bond increases a Stat even if only one can be increased (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_9); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_9); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index 86172459a..f6a0378e4 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -34,8 +34,8 @@ SINGLE_BATTLE_TEST("Beads of Ruin reduces Sp. Def if opposing mon's ability does SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_CHI_YU); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -56,10 +56,10 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_CHI_YU); } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler DOUBLE_BATTLE_TEST("Beads of Ruin increases damage taken by physical moves in Wonder Room", s16 damage) { bool32 useWonderRoom; - u32 move; + enum Move move; PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } @@ -166,7 +166,7 @@ DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is not ignored by Mold Bre DOUBLE_BATTLE_TEST("Beads of Ruin's Sp. Def reduction is ignored by Gastro Acid", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GASTRO_ACID; } PARAMETRIZE { move = MOVE_CELEBRATE; } diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index d6691c2f8..ce7df9135 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -17,23 +17,26 @@ SINGLE_BATTLE_TEST("Beast Boost boosts the most proficient stat when knocking ou TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_BEAST_BOOST); - switch(i) { - case 0: - MESSAGE("Nihilego's Attack rose!"); - break; - case 1: - MESSAGE("Nihilego's Defense rose!"); - break; - case 2: - MESSAGE("Nihilego's Sp. Atk rose!"); - break; - case 3: - MESSAGE("Nihilego's Sp. Def rose!"); - break; - case 4: - MESSAGE("Nihilego's Speed rose!"); - break; + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + u32 expectedStat = STAT_ATK; + + switch (i) { + case 1: + expectedStat = STAT_DEF; + break; + case 2: + expectedStat = STAT_SPATK; + break; + case 3: + expectedStat = STAT_SPDEF; + break; + case 4: + expectedStat = STAT_SPEED; + break; } + + EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1); } } @@ -73,28 +76,180 @@ SINGLE_BATTLE_TEST("Beast Boost prioritizes stats in the case of a tie in the fo TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_BEAST_BOOST); - switch(i) { - case 0: - MESSAGE("Nihilego's Attack rose!"); - break; - case 1: - MESSAGE("Nihilego's Defense rose!"); - break; - case 2: - MESSAGE("Nihilego's Sp. Atk rose!"); - break; - case 3: - MESSAGE("Nihilego's Sp. Def rose!"); - break; + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + u32 expectedStat = STAT_ATK; + + switch (i) { + case 1: + expectedStat = STAT_DEF; + break; + case 2: + expectedStat = STAT_SPATK; + break; + case 3: + expectedStat = STAT_SPDEF; + break; } + + EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1); } } -TO_DO_BATTLE_TEST("Beast Boost considers Power Split"); -TO_DO_BATTLE_TEST("Beast Boost considers Guard Split"); -TO_DO_BATTLE_TEST("Beast Boost considers Power Trick"); -TO_DO_BATTLE_TEST("Beast Boost considers Wonder Room"); -TO_DO_BATTLE_TEST("Beast Boost considers Speed Swap"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider stat stages"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider held items"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider status condition reductions"); +SINGLE_BATTLE_TEST("Beast Boost considers Power Split") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(200); Defense(30); SpAttack(50); SpDefense(30); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Attack(10); SpAttack(250); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POWER_SPLIT); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_SPLIT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Guard Split") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(80); Defense(20); SpAttack(70); SpDefense(10); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Defense(200); SpDefense(30); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_GUARD_SPLIT); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUARD_SPLIT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Power Trick") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_TRICK) == EFFECT_POWER_TRICK); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(40); Defense(200); SpAttack(60); SpDefense(50); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POWER_TRICK); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_TRICK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Wonder Room") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMovePower(MOVE_SCRATCH) > 0); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(50); SpAttack(70); SpDefense(200); Speed(120); Moves(MOVE_SPLASH, MOVE_EXTREME_SPEED); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); Moves(MOVE_WONDER_ROOM, MOVE_SPLASH); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + } WHEN { + TURN { MOVE(opponent, MOVE_WONDER_ROOM); MOVE(player, MOVE_SPLASH); } + TURN { MOVE(player, MOVE_EXTREME_SPEED); MOVE(opponent, MOVE_SPLASH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WONDER_ROOM, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXTREME_SPEED, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Speed Swap") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SPEED_SWAP) == EFFECT_SPEED_SWAP); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(60); Defense(60); SpAttack(70); SpDefense(60); Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SPEED_SWAP); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPEED_SWAP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider stat stages") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(60); SpAttack(150); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider held items") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Item(ITEM_CHOICE_BAND); Attack(120); Defense(60); SpAttack(150); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider status condition reductions") +{ + GIVEN { + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Status1(STATUS1_BURN); Attack(150); Defense(60); SpAttack(100); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index fe356bc67..8b9b452a9 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Berserk activates after all hits from a multi-hit move") u32 j; u16 maxHp = 500; GIVEN { - ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_DOUBLE_SLAP)); PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); MaxHP(maxHp); HP(maxHp / 2 + 1); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. } WHEN { @@ -98,7 +98,7 @@ SINGLE_BATTLE_TEST("Berserk will not activate if the last multi hit move activat { u32 j; GIVEN { - ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_DOUBLE_SLAP)); PLAYER(SPECIES_DRAMPA) { Ability(ABILITY_BERSERK); Item(ITEM_SITRUS_BERRY); MaxHP(100); HP(90); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } // Always hits 5 times. } WHEN { diff --git a/test/battle/ability/big_pecks.c b/test/battle/ability/big_pecks.c index 44bb008a1..984ba7a88 100644 --- a/test/battle/ability/big_pecks.c +++ b/test/battle/ability/big_pecks.c @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Big Pecks doesn't prevent Spectral Thief from resetting posi { GIVEN { ASSUME(GetMoveEffect(MOVE_HARDEN) == EFFECT_DEFENSE_UP); - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_STEAL_STATS)); ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_BIG_PECKS); } diff --git a/test/battle/ability/cheek_pouch.c b/test/battle/ability/cheek_pouch.c index ffd1c8416..0e52ca3fe 100644 --- a/test/battle/ability/cheek_pouch.c +++ b/test/battle/ability/cheek_pouch.c @@ -1,19 +1,178 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Cheek Pouch restores 33% max HP") -TO_DO_BATTLE_TEST("Cheek Pouch restores HP after the berry's effect") -TO_DO_BATTLE_TEST("Cheek Pouch activates via Bug Bite/Pluck if it would trigger an effect") -TO_DO_BATTLE_TEST("Cheek Pouch activates when receiving from Fling if it would trigger an effect") -TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using Natural Gift") -TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using Fling") -TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate when using a berry from the bag") -TO_DO_BATTLE_TEST("Cheek Pouch doesn't activate under Heal Block's effect") +SINGLE_BATTLE_TEST("Cheek Pouch restores 33% max HP") +{ + s16 berryHeal, cheekPouchHeal; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(31); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUPER_FANG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player, captureDamage: &berryHeal); + ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + HP_BAR(player, captureDamage: &cheekPouchHeal); + } THEN { + EXPECT_LT(berryHeal, 0); + EXPECT_EQ(cheekPouchHeal, -(player->maxHP / 3)); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch restores HP after the berry's effect") +{ + u16 hpAfterBerry, hpAfterCheekPouch; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(31); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUPER_FANG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player, captureHP: &hpAfterBerry); + ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + HP_BAR(player, captureHP: &hpAfterCheekPouch); + } THEN { + EXPECT_GT(hpAfterCheekPouch, hpAfterBerry); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch activates via Bug Bite/Pluck if it would trigger an effect") +{ + u16 move; + s16 berryHeal, cheekPouchHeal; + + PARAMETRIZE { move = MOVE_BUG_BITE; } + PARAMETRIZE { move = MOVE_PLUCK; } + + GIVEN { + ASSUME(MoveHasAdditionalEffect(move, MOVE_EFFECT_BUG_BITE)); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(30); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + HP_BAR(player, captureDamage: &berryHeal); + ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + HP_BAR(player, captureDamage: &cheekPouchHeal); + } THEN { + EXPECT_LT(berryHeal, 0); + EXPECT_EQ(cheekPouchHeal, -(player->maxHP / 3)); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch activates when receiving from Fling if it would trigger an effect") +{ + s16 berryHeal, cheekPouchHeal; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_WOBBUFFET) { Attack(1); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(30); } + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + HP_BAR(opponent, captureDamage: &berryHeal); + ABILITY_POPUP(opponent, ABILITY_CHEEK_POUCH); + HP_BAR(opponent, captureDamage: &cheekPouchHeal); + } THEN { + EXPECT_LT(berryHeal, 0); + EXPECT_EQ(cheekPouchHeal, -(opponent->maxHP / 3)); + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Natural Gift") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_NATURAL_GIFT) == EFFECT_NATURAL_GIFT); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(40); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NATURAL_GIFT); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using Fling") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(40); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate when using a berry from the bag") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(20); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_ORAN_BERRY, partyIndex: 0); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + } +} + +SINGLE_BATTLE_TEST("Cheek Pouch doesn't activate under Heal Block's effect") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_HEAL_BLOCK) == EFFECT_HEAL_BLOCK); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffect == HOLD_EFFECT_RESTORE_HP); + ASSUME(gItemsInfo[ITEM_ORAN_BERRY].holdEffectParam == 10); + PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); MaxHP(60); HP(31); Item(ITEM_ORAN_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEAL_BLOCK); } + TURN { MOVE(opponent, MOVE_SUPER_FANG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, opponent); + HP_BAR(player); + NOT ABILITY_POPUP(player, ABILITY_CHEEK_POUCH); + } THEN { + EXPECT_EQ(player->item, ITEM_ORAN_BERRY); + } +} SINGLE_BATTLE_TEST("Cheek Pouch activation doesn't mutate damage when restoring HP mid battle") { - s16 damage; - s16 healing; + s16 damage, healing; GIVEN { PLAYER(SPECIES_GREEDENT) { Ability(ABILITY_CHEEK_POUCH); Item(ITEM_CHOPLE_BERRY); HP(100); } diff --git a/test/battle/ability/chlorophyll.c b/test/battle/ability/chlorophyll.c index 84546dbe4..66f7b9ccc 100644 --- a/test/battle/ability/chlorophyll.c +++ b/test/battle/ability/chlorophyll.c @@ -36,6 +36,7 @@ SINGLE_BATTLE_TEST("Chlorophyll doesn't double speed if Cloud Nine/Air Lock is o SINGLE_BATTLE_TEST("Chlorophyll doesn't double speed if they have an Utility Umbrella") { GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); PLAYER(SPECIES_VENUSAUR) { Ability(ABILITY_CHLOROPHYLL); Speed(100); Item(ITEM_UTILITY_UMBRELLA); } OPPONENT(SPECIES_WOBBUFFET) { Speed(199); } } WHEN { diff --git a/test/battle/ability/clear_body.c b/test/battle/ability/clear_body.c index f5b9573fe..8cc32e1b7 100644 --- a/test/battle/ability/clear_body.c +++ b/test/battle/ability/clear_body.c @@ -12,9 +12,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; } PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(species) { Ability(ability); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(species) { Ability(ability); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat stage reduction from moves") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; u32 j, species = SPECIES_NONE; enum Ability ability = ABILITY_NONE; static const u16 statReductionMoves[] = { @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and u32 j, k, species = SPECIES_NONE; enum Ability ability = ABILITY_NONE; enum Ability breakerAbility = ABILITY_NONE; - u16 move = ABILITY_NONE; + enum Move move = MOVE_NONE; static const u16 breakerAbilities[] = { ABILITY_MOLD_BREAKER, ABILITY_TERAVOLT, @@ -220,7 +220,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(species) { Speed(6); Ability(ability); Item(heldItem); } } WHEN { - TURN { } + TURN {} } SCENE { NOT ABILITY_POPUP(opponent, ability); if (heldItem == ITEM_IRON_BALL) { @@ -388,14 +388,14 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_STEAL_STATS)); ASSUME(GetMoveEffect(MOVE_AGILITY) == EFFECT_SPEED_UP_2); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(species) { Speed(5); Ability(ability); } } WHEN { - TURN{ MOVE(opponent, MOVE_AGILITY); } - TURN{ MOVE(player, MOVE_SPECTRAL_THIEF); } - TURN{ } + TURN { MOVE(opponent, MOVE_AGILITY); } + TURN { MOVE(player, MOVE_SPECTRAL_THIEF); } + TURN {} } SCENE { if (ability == ABILITY_FULL_METAL_BODY) MESSAGE("The opposing Solgaleo used Agility!"); @@ -426,11 +426,11 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke protect from Protect's secondary effects") { - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; u32 species = SPECIES_NONE; enum Ability ability = ABILITY_NONE; - static const u32 moves[] = { + static const enum Move moves[] = { MOVE_SPIKY_SHIELD, MOVE_KINGS_SHIELD, MOVE_SILK_TRAP, diff --git a/test/battle/ability/cloud_nine.c b/test/battle/ability/cloud_nine.c index a4eddd1e1..4f6f2ab94 100644 --- a/test/battle/ability/cloud_nine.c +++ b/test/battle/ability/cloud_nine.c @@ -8,7 +8,8 @@ SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but witho PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; } PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { - ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM); + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/color_change.c b/test/battle/ability/color_change.c index 49eaa3e91..9c5176e3a 100644 --- a/test/battle/ability/color_change.c +++ b/test/battle/ability/color_change.c @@ -90,8 +90,8 @@ SINGLE_BATTLE_TEST("Color Change changes the type when a Pokemon is hit by Futur OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(player, MOVE_FUTURE_SIGHT); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Kecleon took the Future Sight attack!"); @@ -107,8 +107,8 @@ SINGLE_BATTLE_TEST("Color Change changes the type when a Pokemon is hit by Doom OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(player, MOVE_DOOM_DESIRE); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOOM_DESIRE, player); MESSAGE("The opposing Kecleon took the Doom Desire attack!"); @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type to Electric when a Pokemon is OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_COLOR_CHANGE); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FUTURE_SIGHT); } - TURN { } + TURN {} TURN { MOVE(opponent, MOVE_ELECTRIFY); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Color Change changes the type to Normal when a Pokemon is hi } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FUTURE_SIGHT); } TURN { MOVE(player, MOVE_SOAK); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("Wobbuffet used Soak!"); @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Color Change does not change the type to Normal when a Pokem } WHEN { TURN { MOVE(player, MOVE_SOAK); } TURN { MOVE(player, MOVE_STRUGGLE); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SOAK, player); MESSAGE("The opposing Kecleon transformed into the Water type!"); diff --git a/test/battle/ability/comatose.c b/test/battle/ability/comatose.c index c049d5624..e65e43c51 100644 --- a/test/battle/ability/comatose.c +++ b/test/battle/ability/comatose.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Comatose prevents status-inducing moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISONPOWDER; } @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Comatose prevents status-inducing moves") SINGLE_BATTLE_TEST("Comatose may be suppressed if Pokémon transformed into a Pokémon with Comatose ability and was under the effects of Gastro Acid") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISONPOWDER; } @@ -88,7 +88,92 @@ SINGLE_BATTLE_TEST("Comatose Pokémon don't get poisoned by Toxic Spikes on swit } } -TO_DO_BATTLE_TEST("Comatose makes Rest fail") -TO_DO_BATTLE_TEST("Comatose isn't affected by Mold Breaker, Turboblaze or Teravolt") -TO_DO_BATTLE_TEST("Comatose isn't affected by Poison Touch + Sunsteel Strike") -TO_DO_BATTLE_TEST("Comatose boosts Dream Ball's multiplier") +SINGLE_BATTLE_TEST("Comatose makes Rest fail") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); HP(1); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_REST); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + HP_BAR(player); + } + } THEN { + EXPECT_EQ(player->hp, 1); + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + +SINGLE_BATTLE_TEST("Comatose isn't affected by Mold Breaker, Turboblaze or Teravolt") +{ + enum Ability ability; + u16 species; + + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; species = SPECIES_PINSIR; } + PARAMETRIZE { ability = ABILITY_TURBOBLAZE; species = SPECIES_RESHIRAM; } + PARAMETRIZE { ability = ABILITY_TERAVOLT; species = SPECIES_ZEKROM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + PLAYER(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_TOXIC); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, opponent); + ABILITY_POPUP(player, ABILITY_COMATOSE); + MESSAGE("It doesn't affect Komala…"); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + +SINGLE_BATTLE_TEST("Comatose isn't affected by Poison Touch + Sunsteel Strike") +{ + GIVEN { + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); + ASSUME(MoveMakesContact(MOVE_SUNSTEEL_STRIKE)); + PLAYER(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + OPPONENT(SPECIES_CROAGUNK) { Ability(ABILITY_POISON_TOUCH); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNSTEEL_STRIKE, WITH_RNG(RNG_POISON_TOUCH, 1)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNSTEEL_STRIKE, opponent); + HP_BAR(player); + NOT STATUS_ICON(player, poison: TRUE); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + } +} + +WILD_BATTLE_TEST("Comatose boosts Dream Ball's multiplier") +{ + enum Ability ability; + u16 species; + bool32 shouldCatch; + const u16 rng = 50000; + + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; shouldCatch = TRUE; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; shouldCatch = FALSE; } + + GIVEN { + ASSUME(B_DREAM_BALL_MODIFIER >= GEN_8); + ASSUME(gSpeciesInfo[species].catchRate == 45); + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); MaxHP(100); HP(1); } + } WHEN { + TURN { USE_ITEM(player, ITEM_DREAM_BALL, WITH_RNG(RNG_BALLTHROW_SHAKE, rng)); } + } SCENE { + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW, player); + } THEN { + if (shouldCatch) + EXPECT_EQ(gBattleResults.caughtMonSpecies, species); + else + EXPECT_EQ(gBattleResults.caughtMonSpecies, SPECIES_NONE); + } +} diff --git a/test/battle/ability/commander.c b/test/battle/ability/commander.c index c64590a3a..96e4facce 100644 --- a/test/battle/ability/commander.c +++ b/test/battle/ability/commander.c @@ -51,7 +51,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri avoids moves targetted towards it") ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); - MESSAGE("The opposing Wobbuffet's attack missed!"); + MESSAGE("Tatsugiri avoided the attack!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentRight); } } @@ -64,11 +64,11 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri will still take residual damage from a f OPPONENT(SPECIES_TYRANITAR) { Ability(ABILITY_SAND_STREAM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_SAND_STREAM); ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); - ABILITY_POPUP(opponentLeft, ABILITY_SAND_STREAM); MESSAGE("Dondozo is buffeted by the sandstorm!"); MESSAGE("Tatsugiri is buffeted by the sandstorm!"); MESSAGE("The opposing Wobbuffet is buffeted by the sandstorm!"); @@ -83,7 +83,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri will still take poison damage if while i OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); @@ -104,7 +104,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri still avoids moves even when the attacke ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); - MESSAGE("The opposing Machamp's attack missed!"); + MESSAGE("Tatsugiri avoided the attack!"); } } @@ -145,9 +145,9 @@ DOUBLE_BATTLE_TEST("Commander prevents Whirlwind from working against Dondozo or ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); MESSAGE("The opposing Wobbuffet used Whirlwind!"); - MESSAGE("But it failed!"); + MESSAGE("Tatsugiri avoided the attack!"); MESSAGE("The opposing Wobbuffet used Whirlwind!"); - MESSAGE("But it failed!"); + MESSAGE("But it failed!"); // Avoided on tatsu, but it failed on dozo } } @@ -175,8 +175,8 @@ DOUBLE_BATTLE_TEST("Commander prevents Red Card from working while Commander is DOUBLE_BATTLE_TEST("Commander Tatsugiri is not damaged by a double target move if Dondozo faints") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); - PLAYER(SPECIES_DONDOZO) { HP(1); }; + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_DONDOZO) { HP(1); } PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -244,7 +244,7 @@ DOUBLE_BATTLE_TEST("Commander doesn't prevent Imposter from working on a Command OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_DITTO) { Ability(ABILITY_IMPOSTER); } } WHEN { - TURN { } + TURN {} TURN { SWITCH(opponentLeft, 2); } } SCENE { ABILITY_POPUP(playerRight, ABILITY_COMMANDER); @@ -308,7 +308,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri is still affected by Haze while controll DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); @@ -321,17 +321,17 @@ DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Left Slot)") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); ABILITY_POPUP(playerRight, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); + MESSAGE("Tatsugiri avoided the attack!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); HP_BAR(playerLeft); HP_BAR(opponentRight); - MESSAGE("The opposing Wobbuffet's attack missed!"); } } DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Right Slot)") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DONDOZO); @@ -344,7 +344,7 @@ DOUBLE_BATTLE_TEST("Commander Attacker is kept (Dondozo Right Slot)") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); MESSAGE("Tatsugiri was swallowed by Dondozo and became Dondozo's commander!"); - MESSAGE("The opposing Wobbuffet's attack missed!"); + MESSAGE("Tatsugiri avoided the attack!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, opponentLeft); HP_BAR(playerRight); HP_BAR(opponentRight); @@ -380,7 +380,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not attack if Dondozo faints the sa DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when a commanded Dondozo faints") { GIVEN { - ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveTarget(MOVE_DRAGON_DARTS) == TARGET_SMART); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_DONDOZO) { HP(1); } PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } @@ -402,7 +402,7 @@ DOUBLE_BATTLE_TEST("Commander Tatsugiri does not get hit by Dragon Darts when co PARAMETRIZE { targetPlayerRight = TRUE; } PARAMETRIZE { targetPlayerRight = FALSE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveTarget(MOVE_DRAGON_DARTS) == TARGET_SMART); PLAYER(SPECIES_TATSUGIRI) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/competitive.c b/test/battle/ability/competitive.c index 96472fa2c..df2541d5d 100644 --- a/test/battle/ability/competitive.c +++ b/test/battle/ability/competitive.c @@ -140,7 +140,7 @@ SINGLE_BATTLE_TEST("Competitive activates after Sticky Web lowers Speed") SINGLE_BATTLE_TEST("Competitive doesn't activate after Sticky Web lowers Speed if Court Changed (gen8)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } OPPONENT(SPECIES_WOBBUFFET); @@ -167,14 +167,14 @@ SINGLE_BATTLE_TEST("Competitive doesn't activate after Sticky Web lowers Speed i SINGLE_BATTLE_TEST("Competitive correctly activates after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_IGGLYBUFF) { Ability(ABILITY_COMPETITIVE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } TURN { SWITCH(player, 1); } - TURN { MOVE(opponent, MOVE_GROWL);} + TURN { MOVE(opponent, MOVE_GROWL); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -237,7 +237,7 @@ DOUBLE_BATTLE_TEST("Competitive is activated by Cotton Down for non-ally pokemon SINGLE_BATTLE_TEST("Competitive activates before White Herb") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_LEER; } PARAMETRIZE { move = MOVE_CONFIDE; } @@ -303,7 +303,7 @@ SINGLE_BATTLE_TEST("Competitive activates for each stat that is lowered") SINGLE_BATTLE_TEST("Competitive doesn't activate if the pokemon lowers it's own stats") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUPERPOWER; } PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } diff --git a/test/battle/ability/contrary.c b/test/battle/ability/contrary.c index ef5b4c6c7..863e37bc3 100644 --- a/test/battle/ability/contrary.c +++ b/test/battle/ability/contrary.c @@ -246,7 +246,7 @@ AI_SINGLE_BATTLE_TEST("AI sees Contrary-effected moves correctly in MoveEffectIn { GIVEN{ AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); - PLAYER(SPECIES_HERACROSS){ + PLAYER(SPECIES_HERACROSS) { Level(44); HP(1); Speed(5); @@ -254,7 +254,7 @@ AI_SINGLE_BATTLE_TEST("AI sees Contrary-effected moves correctly in MoveEffectIn Item(ITEM_LOADED_DICE); Moves(MOVE_PIN_MISSILE); } - OPPONENT(SPECIES_SERPERIOR){ + OPPONENT(SPECIES_SERPERIOR) { Level(44); Speed(10); Nature(NATURE_TIMID); @@ -262,11 +262,31 @@ AI_SINGLE_BATTLE_TEST("AI sees Contrary-effected moves correctly in MoveEffectIn Moves(MOVE_DRAGON_PULSE, MOVE_SPIN_OUT, MOVE_HIDDEN_POWER, MOVE_GLARE); } } WHEN { - TURN{ + TURN { MOVE(player, MOVE_PIN_MISSILE); EXPECT_MOVE(opponent, MOVE_SPIN_OUT); // previously all 107, now sees speed can rise w/ Contrary } } } -TO_DO_BATTLE_TEST("Contrary does not invert stat changes that have been Baton-passed") +SINGLE_BATTLE_TEST("Contrary does not invert stat changes that have been Baton-passed") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNIVY) { Ability(ABILITY_CONTRARY); } + } WHEN { + TURN { MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BATON_PASS, opponent); + MESSAGE("2 sent out Snivy!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +TO_DO_BATTLE_TEST("Contrary inverts stat changes from X Attack and other stat-boosting items.") diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index ca6b60200..47c2dec80 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Pokemon regardless of SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Steel type with a status poison effect") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_POISON_POWDER; } PARAMETRIZE { move = MOVE_TOXIC; } @@ -100,7 +100,7 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a T PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_TOXIC_ORB); } OPPONENT(SPECIES_ODDISH); } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); STATUS_ICON(player, badPoison: TRUE); @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion holds a T SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a target with Synchronize, Synchronize will not poison Poison- or Steel-type Pokémon") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { @@ -138,7 +138,7 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type Pokémon with Corrosion poisons a SINGLE_BATTLE_TEST("Corrosion cannot bypass moves that prevent poisoning such as Safeguard") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass moves that prevent poisoning such as SINGLE_BATTLE_TEST("Corrosion cannot bypass abilities that prevent poisoning such as Immunity") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { @@ -186,7 +186,7 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass abilities that prevent poisoning suc SINGLE_BATTLE_TEST("Corrosion allows the Pokémon with the ability to poison a Steel or Poison-type opponent by using Magic Coat") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { @@ -212,7 +212,7 @@ SINGLE_BATTLE_TEST("Corrosion allows the Pokémon with the ability to poison a S SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon with the ability is reflected by Magic Coat") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { @@ -239,9 +239,115 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon } } -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb") +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_BANEFUL_BUNKER); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BANEFUL_BUNKER, player); + MESSAGE("Salandit protected itself!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Salandit protected itself!"); + STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Status1(STATUS1_POISON); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_PSYCHO_SHIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + STATUS_ICON(player, none: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_TOXIC_ORB); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, badPoison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER); + ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_POISON_BARB); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion does not affect Poison Spikes") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); + } THEN { + EXPECT_EQ(opponent->status1, STATUS1_NONE); + } +} + TO_DO_BATTLE_TEST("Dynamax: Corrosion can poison Poison/Steel types if the Pokémon uses G-Max Malodor") -TO_DO_BATTLE_TEST("Corrosion does not affect Poison Spikes") diff --git a/test/battle/ability/costar.c b/test/battle/ability/costar.c index 3d041a8d5..0859f5b3b 100644 --- a/test/battle/ability/costar.c +++ b/test/battle/ability/costar.c @@ -25,8 +25,183 @@ DOUBLE_BATTLE_TEST("Costar copies an ally's stat stages upon entering battle") } } -// Copy from Ruin ability tests -TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player"); -TO_DO_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Opponent"); +DOUBLE_BATTLE_TEST("Costar copies an ally's Dragon Cheer critical hit boost") +{ + PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_CHEER, target: playerLeft); MOVE(playerLeft, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerRight); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} -TO_DO_BATTLE_TEST("Costar can copy an ally's critical hit ratio"); +DOUBLE_BATTLE_TEST("Costar copies an ally's lowered stat stages") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_GROWL].effect == EFFECT_ATTACK_DOWN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_GROWL); MOVE(opponentRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's Focus Energy critical hit boost") +{ + PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_FOCUS_ENERGY].effect == EFFECT_FOCUS_ENERGY); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SWORDS_DANCE); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { MOVE(playerLeft, MOVE_FOCUS_ENERGY); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerRight, 2); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_ENERGY, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's Dragon Cheer critical hit boost") +{ + PASSES_RANDOMLY(1, 8, RNG_CRITICAL_HIT); + GIVEN { + ASSUME(gMovesInfo[MOVE_DRAGON_CHEER].effect == EFFECT_DRAGON_CHEER); + ASSUME(gMovesInfo[MOVE_TACKLE].criticalHitStage == 0); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_CHEER, target: playerLeft); MOVE(playerLeft, MOVE_SWORDS_DANCE); } + TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE); } + TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_CHEER, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight); + MESSAGE("A critical hit!"); + } +} + +DOUBLE_BATTLE_TEST("Costar copies an ally's stat stages after their ability activates upon entering battle") +{ + u32 speedLeft, speedRight = 0; + + PARAMETRIZE { speedLeft = 200; speedRight = 150; } + PARAMETRIZE { speedLeft = 150; speedRight = 200; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + PLAYER(SPECIES_WOBBUFFET) { Speed(110); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); HP(1); }; + OPPONENT(SPECIES_WYNAUT) { Speed(10); HP(1); }; + OPPONENT(SPECIES_FLAMIGO) { Speed(speedLeft); Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_ZACIAN) { Speed(speedRight); Ability(ABILITY_INTREPID_SWORD); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_HYPER_VOICE); + SEND_OUT(opponentLeft, 2); + SEND_OUT(opponentRight, 3); + } + } SCENE { + ABILITY_POPUP(opponentRight, ABILITY_INTREPID_SWORD); + ABILITY_POPUP(opponentLeft, ABILITY_COSTAR); + } THEN { + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +// Copy from Ruin ability tests +DOUBLE_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Player") +{ + GIVEN { + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + PLAYER(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_EXPLOSION); + SEND_OUT(playerLeft, 2); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(opponentRight, 3); + } + } SCENE { + MESSAGE("The opposing Wobbuffet used Explosion!"); + ABILITY_POPUP(playerLeft, ABILITY_INTREPID_SWORD); + MESSAGE("Zacian's Intrepid Sword raised its Attack!"); + ABILITY_POPUP(playerRight, ABILITY_COSTAR); + MESSAGE("Flamigo copied Zacian's stat changes!"); + } +} + +DOUBLE_BATTLE_TEST("Costar's message displays correctly after all battlers fainted - Opponent") +{ + GIVEN { + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + OPPONENT(SPECIES_FLAMIGO) { Ability(ABILITY_COSTAR); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_EXPLOSION); + SEND_OUT(playerLeft, 2); + SEND_OUT(opponentLeft, 2); + SEND_OUT(playerRight, 3); + SEND_OUT(opponentRight, 3); + } + } SCENE { + MESSAGE("Wobbuffet used Explosion!"); + ABILITY_POPUP(opponentLeft, ABILITY_INTREPID_SWORD); + MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!"); + ABILITY_POPUP(opponentRight, ABILITY_COSTAR); + MESSAGE("The opposing Flamigo copied the opposing Zacian's stat changes!"); + } +} diff --git a/test/battle/ability/cud_chew.c b/test/battle/ability/cud_chew.c index aca9e7944..9f7c3902a 100644 --- a/test/battle/ability/cud_chew.c +++ b/test/battle/ability/cud_chew.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Kee Berry effect again on the next tu OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { Ability(ABILITY_CUD_CHEW); Item(ITEM_KEE_BERRY); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } - TURN { MOVE(player, MOVE_CELEBRATE);} + TURN { MOVE(player, MOVE_CELEBRATE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); HP_BAR(opponent); @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { MaxHP(60); HP(60); Ability(ABILITY_CUD_CHEW); Item(ITEM_ORAN_BERRY); } } WHEN { TURN { MOVE(player, MOVE_DRAGON_RAGE); } - TURN { MOVE(player, MOVE_CELEBRATE);} + TURN { MOVE(player, MOVE_CELEBRATE); } TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_RAGE, player); @@ -48,4 +48,28 @@ SINGLE_BATTLE_TEST("Cud Chew will activate Oran Berry effect again on the next t } } -TO_DO_BATTLE_TEST("Cud Chew will activate Lum Berry effect again on the next turn") +SINGLE_BATTLE_TEST("Cud Chew will activate Lum Berry effect again on the next turn") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TAUROS_PALDEA_COMBAT) { Ability(ABILITY_CUD_CHEW); Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_WAVE); } + TURN { MOVE(player, MOVE_THUNDER_WAVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + STATUS_ICON(opponent, paralysis: FALSE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_WAVE, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PRZ, opponent); + STATUS_ICON(opponent, paralysis: TRUE); + ABILITY_POPUP(opponent, ABILITY_CUD_CHEW); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + STATUS_ICON(opponent, paralysis: FALSE); + } +} diff --git a/test/battle/ability/cursed_body.c b/test/battle/ability/cursed_body.c index b3bc886a3..7600da8c1 100644 --- a/test/battle/ability/cursed_body.c +++ b/test/battle/ability/cursed_body.c @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Cursed Body cannot trigger if the target is behind a Substit SINGLE_BATTLE_TEST("Cursed Body does not stop a multistrike move mid-execution") { GIVEN { - ASSUME(GetMoveEffect(MOVE_ROCK_BLAST) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_ROCK_BLAST)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } } WHEN { @@ -87,6 +87,48 @@ SINGLE_BATTLE_TEST("Cursed Body does not stop a multistrike move mid-execution") } } -TO_DO_BATTLE_TEST("Cursed Body disables the move that called another move instead of the called move") -TO_DO_BATTLE_TEST("Cursed Body disables damaging Z-Moves, but not the base move") // Rotom Powers can restore Z-Moves -TO_DO_BATTLE_TEST("Cursed Body disables the base move of a status Z-Move") +SINGLE_BATTLE_TEST("Cursed Body disables the move that called another move instead of the called move") +{ + PASSES_RANDOMLY(3, 10, RNG_CURSED_BODY); + GIVEN { + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); + ASSUME(IsMoveSleepTalkBanned(MOVE_FLY)); + ASSUME(IsMoveSleepTalkBanned(MOVE_DIG)); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SHADOW_BALL, MOVE_FLY, MOVE_DIG); } + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Sleep Talk was disabled by the opposing Frillish's Cursed Body!"); + } THEN { + u32 disabledMove = player->volatiles.disabledMove; + EXPECT_EQ(disabledMove, MOVE_SLEEP_TALK); + } +} + +SINGLE_BATTLE_TEST("Cursed Body disables the base move of a status Z-Move") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_NATURE_POWER) == EFFECT_NATURE_POWER); + ASSUME(GetMoveEffect(MOVE_ELECTRIC_TERRAIN) == EFFECT_ELECTRIC_TERRAIN); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_FRILLISH) { Ability(ABILITY_CURSED_BODY); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_NATURE_POWER, gimmick: GIMMICK_Z_MOVE, WITH_RNG(RNG_CURSED_BODY, 1)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_CURSED_BODY); + MESSAGE("Wobbuffet's Nature Power was disabled by the opposing Frillish's Cursed Body!"); + } THEN { + u32 disabledMove = player->volatiles.disabledMove; + EXPECT_EQ(disabledMove, MOVE_NATURE_POWER); + } +} + +TO_DO_BATTLE_TEST("Cursed Body disables damaging Z-Moves, but not the base move") diff --git a/test/battle/ability/cute_charm.c b/test/battle/ability/cute_charm.c index 0813296a2..bc61e3b2c 100644 --- a/test/battle/ability/cute_charm.c +++ b/test/battle/ability/cute_charm.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Cute Charm inflicts infatuation on contact") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { @@ -48,13 +48,14 @@ SINGLE_BATTLE_TEST("Cute Charm cannot infatuate same gender") TO_DO_BATTLE_TEST("Cute Charm cannot infatuate if either Pokémon are Gender-unknown") -TO_DO_BATTLE_TEST("Cute Charm triggers 1/3 of the time (Gen 3)") - -SINGLE_BATTLE_TEST("Cute Charm triggers 30% of the time (Gen 4+)") +SINGLE_BATTLE_TEST("Cute Charm triggers 1/3 times (Gen3) or 30% (Gen 4+) of the time") { - PASSES_RANDOMLY(3, 10, RNG_CUTE_CHARM); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 3; } // 33.3% + PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% + PASSES_RANDOMLY(passes, trials, RNG_CUTE_CHARM); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } diff --git a/test/battle/ability/damp.c b/test/battle/ability/damp.c index 030e698d8..6707e2a55 100644 --- a/test/battle/ability/damp.c +++ b/test/battle/ability/damp.c @@ -1,9 +1,9 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_EXPLOSION; } PARAMETRIZE { move = MOVE_SELF_DESTRUCT; } PARAMETRIZE { move = MOVE_MIND_BLOWN; } @@ -19,9 +19,9 @@ SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies") } } -DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double battle") +DOUBLE_BATTLE_TEST("Damp prevents Explosion-like moves from enemies in a double battle") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_EXPLOSION; } PARAMETRIZE { move = MOVE_SELF_DESTRUCT; } PARAMETRIZE { move = MOVE_MIND_BLOWN; } @@ -39,9 +39,9 @@ DOUBLE_BATTLE_TEST("Damp prevents explosion-like moves from enemies in a double } } -SINGLE_BATTLE_TEST("Damp prevents explosion-like moves from self") +SINGLE_BATTLE_TEST("Damp prevents Explosion-like moves from self") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_EXPLOSION; } PARAMETRIZE { move = MOVE_SELF_DESTRUCT; } PARAMETRIZE { move = MOVE_MIND_BLOWN; } @@ -72,3 +72,5 @@ SINGLE_BATTLE_TEST("Damp prevents damage from Aftermath") NONE_OF { HP_BAR(player); } } } + +//TO_DO_BATTLE_TEST("Damp affects non-adjacent Pokémon (triples)") diff --git a/test/battle/ability/dancer.c b/test/battle/ability/dancer.c index b456d9d79..075a3e46a 100644 --- a/test/battle/ability/dancer.c +++ b/test/battle/ability/dancer.c @@ -1,5 +1,6 @@ #include "global.h" #include "test/battle.h" +#include "constants/battle_z_move_effects.h" SINGLE_BATTLE_TEST("Dancer can copy a dance move immediately after it was used and allow the user of Dancer to still use its move") { @@ -79,6 +80,60 @@ DOUBLE_BATTLE_TEST("Dancer triggers from slowest to fastest") } } +DOUBLE_BATTLE_TEST("Dancer triggers from slowest to fastest during Trick Room") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(5); } + } WHEN { + TURN { MOVE(playerRight, MOVE_TRICK_ROOM); } + TURN { MOVE(playerRight, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK_ROOM, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } +} + +DOUBLE_BATTLE_TEST("Dancer triggering ignores Lagging Tail") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); + PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); Item(ITEM_LAGGING_TAIL); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(5); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } + } WHEN { + TURN { MOVE(playerRight, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ABILITY_POPUP(playerLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ABILITY_POPUP(opponentRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } +} + SINGLE_BATTLE_TEST("Dancer doesn't trigger if the original user flinches") { GIVEN { @@ -146,6 +201,27 @@ SINGLE_BATTLE_TEST("Dancer-called attacks have their type updated") } } +SINGLE_BATTLE_TEST("Dancer-called attacks do not trigger Life Orb if target is immune") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_REVELATION_DANCE)); + ASSUME(GetMoveEffect(MOVE_REVELATION_DANCE) == EFFECT_REVELATION_DANCE); + ASSUME(GetMoveEffect(MOVE_ROOST) == EFFECT_ROOST); + ASSUME(GetItemHoldEffect(ITEM_LIFE_ORB) == HOLD_EFFECT_LIFE_ORB); + ASSUME(GetSpeciesType(SPECIES_ORICORIO_POM_POM, 0) == TYPE_ELECTRIC || GetSpeciesType(SPECIES_ORICORIO_POM_POM, 1) == TYPE_ELECTRIC); + PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } + OPPONENT(SPECIES_ORICORIO_POM_POM) { Ability(ABILITY_DANCER); Item(ITEM_LIFE_ORB); } + } WHEN { + TURN { MOVE(opponent, MOVE_ROOST); MOVE(player, MOVE_REVELATION_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_REVELATION_DANCE, opponent); + ABILITY_POPUP(player, ABILITY_LIGHTNING_ROD); + NOT HP_BAR(opponent); + } +} + DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") { GIVEN { @@ -170,6 +246,55 @@ DOUBLE_BATTLE_TEST("Dancer doesn't trigger on a snatched move") } } +DOUBLE_BATTLE_TEST("Dancer doesn't trigger when an ally snatches the move") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_SNATCH) == EFFECT_SNATCH); + ASSUME(MoveCanBeSnatched(MOVE_DRAGON_DANCE)); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SNATCH); MOVE(playerRight, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + NONE_OF { + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + } + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Dancer-called moves can be reflected by Magic Bounce") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_FEATHER_DANCE)); + PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); } + } WHEN { + TURN { MOVE(player, MOVE_FEATHER_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FEATHER_DANCE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ABILITY_POPUP(player, ABILITY_MAGIC_BOUNCE); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FEATHER_DANCE, opponent); + MESSAGE("The opposing Oricorio's Feather Dance was bounced back by Espeon's Magic Bounce!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FEATHER_DANCE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 4); + } +} + DOUBLE_BATTLE_TEST("Dancer triggers on Instructed dance moves") { GIVEN { @@ -225,6 +350,62 @@ DOUBLE_BATTLE_TEST("Dancer-called move doesn't update move to be Instructed") } } +DOUBLE_BATTLE_TEST("Dancer-called moves do not update move to be called by Mimic") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_MIMIC) == EFFECT_MIMIC); + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); + MOVE(playerRight, MOVE_DRAGON_DANCE); + MOVE(playerLeft, MOVE_MIMIC, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIMIC, playerLeft); + MESSAGE("Wobbuffet learned Scratch!"); + NOT MESSAGE("Wobbuffet learned Dragon Dance!"); + } +} + +DOUBLE_BATTLE_TEST("Dancer-called moves doesn't update move to be called by Mirror Move") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_MIRROR_MOVE) == EFFECT_MIRROR_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(playerRight, MOVE_DRAGON_DANCE); } + TURN { MOVE(playerLeft, MOVE_MIRROR_MOVE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, playerRight); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("Wobbuffet used Mirror Move!"); + MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + NOT MESSAGE("Wobbuffet used Dragon Dance!"); + } +} + DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder") { GIVEN { @@ -247,7 +428,6 @@ DOUBLE_BATTLE_TEST("Dancer doesn't call a move that didn't execute due to Powder } } - DOUBLE_BATTLE_TEST("Dancer still activates after Red Card") { GIVEN { @@ -277,7 +457,7 @@ DOUBLE_BATTLE_TEST("Dancer still activates after Red Card") DOUBLE_BATTLE_TEST("Dancer still activate after Red Card even if blocked by Suction Cups") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SUCTION_CUPS); } + PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_SUCTION_CUPS); } PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); } PLAYER(SPECIES_CHANSEY); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } @@ -286,13 +466,13 @@ DOUBLE_BATTLE_TEST("Dancer still activate after Red Card even if blocked by Suct } WHEN { TURN { MOVE(playerLeft, MOVE_FIERY_DANCE, target: opponentLeft); } } SCENE { - MESSAGE("Wobbuffet used Fiery Dance!"); + MESSAGE("Octillery used Fiery Dance!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerLeft); HP_BAR(opponentLeft); // red card trigger ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); - MESSAGE("The opposing Wobbuffet held up its Red Card against Wobbuffet!"); - MESSAGE("Wobbuffet anchors itself with Suction Cups!"); + MESSAGE("The opposing Wobbuffet held up its Red Card against Octillery!"); + MESSAGE("Octillery anchors itself with Suction Cups!"); NOT MESSAGE("Chansey was dragged out!"); // Dancer ABILITY_POPUP(playerRight, ABILITY_DANCER); @@ -334,3 +514,293 @@ DOUBLE_BATTLE_TEST("Dancer correctly restores move targets") HP_BAR(playerRight); } } + +DOUBLE_BATTLE_TEST("Dancer-called damaging moves are considered for Counter/Mirror Coat/Metal Burst") +{ + u32 danceMove, retaliateMove; + + PARAMETRIZE { danceMove = MOVE_AQUA_STEP; retaliateMove = MOVE_COUNTER; } + PARAMETRIZE { danceMove = MOVE_FIERY_DANCE; retaliateMove = MOVE_MIRROR_COAT; } + PARAMETRIZE { danceMove = MOVE_FIERY_DANCE; retaliateMove = MOVE_METAL_BURST; } + + GIVEN { + ASSUME(IsDanceMove(danceMove)); + if (retaliateMove == MOVE_COUNTER) + ASSUME(GetMoveCategory(danceMove) == DAMAGE_CATEGORY_PHYSICAL); + else if (retaliateMove == MOVE_MIRROR_COAT) + ASSUME(GetMoveCategory(danceMove) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(playerLeft, danceMove, target: opponentLeft); MOVE(opponentLeft, retaliateMove); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, danceMove, playerLeft); + HP_BAR(opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, danceMove, playerRight); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, retaliateMove, opponentLeft); + HP_BAR(playerRight); + NOT HP_BAR(playerLeft); + } +} + +SINGLE_BATTLE_TEST("Dancer copies a status Z-Move's base move without gaining an additional Z-Power effect") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); + ASSUME(GetMoveZEffect(MOVE_SWORDS_DANCE) == Z_EFFECT_RESET_STATS); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); } + } WHEN { + TURN { MOVE(player, MOVE_SCREECH); } + TURN { MOVE(player, MOVE_SWORDS_DANCE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Dancer user may hit itself in confusion instead of copying a move if it's confused") +{ + u32 genConfig, pctChance; + + PARAMETRIZE { genConfig = GEN_6; pctChance = 50; } + PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } + PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); + GIVEN { + WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + ASSUME(IsDanceMove(MOVE_DRAGON_DANCE)); + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + } WHEN { + TURN { MOVE(player, MOVE_CONFUSE_RAY); } + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, player); + MESSAGE("The opposing Oricorio became confused!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + MESSAGE("The opposing Oricorio is confused!"); + MESSAGE("It hurt itself in its confusion!"); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } + } +} + +SINGLE_BATTLE_TEST("Dancer can still copy a move even if it's being forced into a different move - Rampage move") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(IsDanceMove(MOVE_PETAL_DANCE)); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_PETAL_DANCE, MOVE_EFFECT_THRASH)); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_PETAL_DANCE); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); FORCED_MOVE(opponent); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_DANCE, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Dancer can still copy a move even if it's being forced into a different move - Rollout") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetMoveEffect(MOVE_ROLLOUT) == EFFECT_ROLLOUT); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_ROLLOUT); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); FORCED_MOVE(opponent); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Dancer can still copy a move even if it's being forced into a different move - Choice items") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetItemHoldEffect(ITEM_CHOICE_BAND) == HOLD_EFFECT_CHOICE_BAND); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); Item(ITEM_CHOICE_BAND); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Dancer can still copy a move even if it's being forced into a different move - Encore") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_ENCORE, target: opponent); MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, player); + MESSAGE("The opposing Oricorio must do an encore!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Dancer tries to copy a status move but fails if it's under Taunt's effect") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); } + } WHEN { + TURN { MOVE(player, MOVE_TAUNT); } + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TAUNT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Dancer can still copy status moves if the user is holding an Assault Vest") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_SWORDS_DANCE)); + ASSUME(GetItemHoldEffect(ITEM_ASSAULT_VEST) == HOLD_EFFECT_ASSAULT_VEST); + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(10); Item(ITEM_ASSAULT_VEST); } + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ABILITY_POPUP(opponent, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + } +} + +DOUBLE_BATTLE_TEST("Dancer copies Lunar Dance after the original user faints, but before the replacement is sent out") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_LUNAR_DANCE); + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(20); } + PLAYER(SPECIES_WYNAUT) { Speed(5); } + PLAYER(SPECIES_CHANSEY) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LUNAR_DANCE); SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerLeft); + HP_BAR(playerLeft, hp: 0); + MESSAGE("Wobbuffet fainted!"); + ABILITY_POPUP(playerRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerRight); + HP_BAR(playerRight, hp: 0); + MESSAGE("Oricorio fainted!"); + SEND_IN_MESSAGE("Wynaut"); + SEND_IN_MESSAGE("Chansey"); + } +} + +DOUBLE_BATTLE_TEST("Dancer doesn't activate Feather Dance if it was reflected by Magic Bounce/Coat") +{ + bool32 useMagicCoat; + + PARAMETRIZE { useMagicCoat = FALSE; } + PARAMETRIZE { useMagicCoat = TRUE; } + GIVEN { + ASSUME(IsDanceMove(MOVE_FEATHER_DANCE)); + ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + if (useMagicCoat) + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + else + OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); Speed(30); } + OPPONENT(SPECIES_ORICORIO) { Ability(ABILITY_DANCER); Speed(5); } + } WHEN { + if (useMagicCoat) + TURN { MOVE(opponentLeft, MOVE_MAGIC_COAT); MOVE(playerLeft, MOVE_FEATHER_DANCE, target: opponentLeft); } + else + TURN { MOVE(playerLeft, MOVE_FEATHER_DANCE, target: opponentLeft); } + } SCENE { + if (useMagicCoat) + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, opponentLeft); + else + ABILITY_POPUP(opponentLeft, ABILITY_MAGIC_BOUNCE); + NONE_OF { + ABILITY_POPUP(opponentRight, ABILITY_DANCER); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FEATHER_DANCE, opponentRight); + } + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/ability/dark_aura.c b/test/battle/ability/dark_aura.c index eb1bf0524..1371975a2 100644 --- a/test/battle/ability/dark_aura.c +++ b/test/battle/ability/dark_aura.c @@ -1,4 +1,108 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Dark Aura (Ability) test titles") +DOUBLE_BATTLE_TEST("Dark Aura increases the power of all Dark-type attacks by 33%") +{ + s16 damage[8]; + + GIVEN { + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + PLAYER(SPECIES_LINOONE); + PLAYER(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_BITE, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerRight, secondaryEffect:FALSE); + } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target:playerRight); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_BITE, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerRight, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[3]); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[5]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[6]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[7]); + } THEN { + EXPECT_MUL_EQ(damage[4], UQ_4_12(1.33), damage[0]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[6], UQ_4_12(1.33), damage[2]); + EXPECT_MUL_EQ(damage[7], UQ_4_12(1.33), damage[3]); + } +} + +DOUBLE_BATTLE_TEST("Dark Aura's effect doesn't stack multiple times") +{ + s16 damage[6]; + + GIVEN { + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + PLAYER(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + PLAYER(SPECIES_YVELTAL) { Ability(ABILITY_DARK_AURA); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + } + TURN { SWITCH(playerRight, 2); } + TURN { + MOVE(playerLeft, MOVE_BITE, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_BITE, target:playerLeft, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[2]); + + // Turn 2 + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Yveltal"); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[3]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BITE, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[3], damage[0]); + EXPECT_EQ(damage[4], damage[1]); + EXPECT_EQ(damage[5], damage[2]); + } +} diff --git a/test/battle/ability/dauntless_shield.c b/test/battle/ability/dauntless_shield.c index 6fed2f0b5..9a8871d5d 100644 --- a/test/battle/ability/dauntless_shield.c +++ b/test/battle/ability/dauntless_shield.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage") SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it switches in (Gen8)") { GIVEN { - WITH_CONFIG(GEN_DAUNTLESS_SHIELD, GEN_8); + WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } OPPONENT(SPECIES_WYNAUT); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it s SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle (Gen 9+)") { GIVEN { - WITH_CONFIG(GEN_DAUNTLESS_SHIELD, GEN_9); + WITH_CONFIG(CONFIG_DAUNTLESS_SHIELD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index ea7b2ba1b..2199f4928 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -1,6 +1,6 @@ #include "global.h" #include "test/battle.h" - +#include "constants/battle_z_move_effects.h" ASSUMPTIONS { @@ -122,3 +122,183 @@ SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail prevent Protean act ABILITY_POPUP(opponent, ability); } } + +// Listed on Bulbapedia as "Moves that target all Pokémon (except Perish Song, Flower Shield, and Rototiller)," +// Despite the fact that there's only 2 remaining moves from that list, being Haze and Teatime +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block Haze") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAZE) == EFFECT_HAZE); + PLAYER(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_HAZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAZE, player); + NOT ABILITY_POPUP(opponent, ability); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block Teatime") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TEATIME) == EFFECT_TEATIME); + ASSUME(GetItemHoldEffect(ITEM_ORAN_BERRY) == HOLD_EFFECT_RESTORE_HP); + PLAYER(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); Item(ITEM_ORAN_BERRY); HP(75); MaxHP(100); } + OPPONENT(species) { Ability(ability); Item(ITEM_ORAN_BERRY); HP(75); MaxHP(100); } + } WHEN { + TURN { MOVE(player, MOVE_TEATIME); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, player); + NOT ABILITY_POPUP(opponent, ability); + } THEN { + EXPECT_EQ(player->item, ITEM_NONE); + EXPECT_EQ(opponent->item, ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block a move's Z-Status effect") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveZEffect(MOVE_BABY_DOLL_EYES) == Z_EFFECT_DEF_UP_1); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FAIRIUM_Z); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_BABY_DOLL_EYES, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ABILITY_POPUP(opponent, ability); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BABY_DOLL_EYES, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Mold Breaker ignores Dazzling, Queenly Majesty and Armor Tail") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_QUICK_ATTACK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, player); + HP_BAR(opponent); + NOT ABILITY_POPUP(opponent, ability); + } +} + +DOUBLE_BATTLE_TEST("Instruct-called moves keep their priority, which is considered for Dazzling, Queenly Majesty and Armor Tail") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + ASSUME(GetItemHoldEffect(ITEM_EJECT_BUTTON) == HOLD_EFFECT_EJECT_BUTTON); + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(species) { Ability(ability); Speed(15); } + } WHEN { + TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentLeft); MOVE(playerLeft, MOVE_INSTRUCT, target: playerRight); SEND_OUT(opponentLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, playerRight); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + MESSAGE("The opposing Wobbuffet is switched out with the Eject Button!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, playerLeft); + ABILITY_POPUP(opponentLeft, ability); + MESSAGE("Wobbuffet cannot use Quick Attack!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, playerRight); + } +} + +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail do not block high-priority moves called by other moves") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_METRONOME) == EFFECT_METRONOME); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_METRONOME, WITH_RNG(RNG_METRONOME, MOVE_QUICK_ATTACK)); } + } SCENE { + MESSAGE("Wobbuffet used Metronome!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METRONOME, player); + MESSAGE("Waggling a finger let it use Quick Attack!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, player); + HP_BAR(opponent); + NOT ABILITY_POPUP(opponent, ability); + } +} + +DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail from partner don't block priority moves that target it") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_COACHING) == TARGET_ALLY); + PLAYER(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } + PLAYER(species) { Ability(ability); } + OPPONENT(species) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_COACHING, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COACHING, playerLeft); + NONE_OF { + ABILITY_POPUP(opponentLeft, ability); + ABILITY_POPUP(playerRight, ability); + } + } +} diff --git a/test/battle/ability/defeatist.c b/test/battle/ability/defeatist.c index 16f7c406e..93d84e8a9 100644 --- a/test/battle/ability/defeatist.c +++ b/test/battle/ability/defeatist.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Defeatist halves Attack when HP <= 50%", s16 damage) PARAMETRIZE { hp = 400; } PARAMETRIZE { hp = 200; } GIVEN { - PLAYER(SPECIES_ARCHEN) { Ability(ABILITY_DEFEATIST); HP(hp), MaxHP(400);} + PLAYER(SPECIES_ARCHEN) { Ability(ABILITY_DEFEATIST); HP(hp), MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_CELEBRATE); } @@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Defeatist halves Special Attack when HP <= 50%", s16 damage) PARAMETRIZE { hp = 400; } PARAMETRIZE { hp = 200; } GIVEN { - PLAYER(SPECIES_ARCHEN) { Ability(ABILITY_DEFEATIST); HP(hp), MaxHP(400);} + PLAYER(SPECIES_ARCHEN) { Ability(ABILITY_DEFEATIST); HP(hp), MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_ECHOED_VOICE); MOVE(opponent, MOVE_CELEBRATE); } diff --git a/test/battle/ability/defiant.c b/test/battle/ability/defiant.c index 517077dc6..9f5038f33 100644 --- a/test/battle/ability/defiant.c +++ b/test/battle/ability/defiant.c @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed") SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Court Changed (Gen8)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_8); + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_8); ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); @@ -151,7 +151,7 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Co OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -179,7 +179,7 @@ SINGLE_BATTLE_TEST("Defiant doesn't activate after Sticky Web lowers Speed if Co SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed if Court Changed (Gen9)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DEFIANT_STICKY_WEB, GEN_9); + WITH_CONFIG(CONFIG_DEFIANT_STICKY_WEB, GEN_9); ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); @@ -188,7 +188,7 @@ SINGLE_BATTLE_TEST("Defiant activates after Sticky Web lowers Speed if Court Cha OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_STICKY_WEB); MOVE(opponent, MOVE_COURT_CHANGE); } - TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL);} + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_GROWL); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_COURT_CHANGE, opponent); @@ -248,7 +248,7 @@ DOUBLE_BATTLE_TEST("Defiant is activated by Cotton Down for non-ally Pokémon") SINGLE_BATTLE_TEST("Defiant activates before White Herb") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_LEER; } PARAMETRIZE { move = MOVE_GROWL; } @@ -313,7 +313,7 @@ SINGLE_BATTLE_TEST("Defiant activates for each stat that is lowered") SINGLE_BATTLE_TEST("Defiant doesn't activate if the Pokémon lowers it's own stats") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUPERPOWER; } PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } diff --git a/test/battle/ability/delta_stream.c b/test/battle/ability/delta_stream.c index 5b4081cb1..0ea7429ff 100644 --- a/test/battle/ability/delta_stream.c +++ b/test/battle/ability/delta_stream.c @@ -1,4 +1,49 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Delta Stream (Ability) test titles") +// Effects of strong winds are handled in test/battle/weather/strong_winds.c + +//TO_DO_BATTLE_TEST("Delta Stream doesn't activate if is sent-out in a rotated-out position (Rotation)") +//TO_DO_BATTLE_TEST("Delta Stream doesn't activate if is rotated-in (Rotation)") +DOUBLE_BATTLE_TEST("Delta Stream doesn't activate if there's already strong winds") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_DELTA_STREAM); + MESSAGE("Mysterious strong winds are protecting Flying-type Pokémon!"); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Rayquaza"); + NONE_OF { + ABILITY_POPUP(playerLeft, ABILITY_DELTA_STREAM); + MESSAGE("Mysterious strong winds are protecting Flying-type Pokémon!"); + } + } +} + +DOUBLE_BATTLE_TEST("Strong winds continue as long as there's a Pokémon with Delta Stream on the field") +{ + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, hp: 0); + MESSAGE("Rayquaza fainted!"); + SEND_IN_MESSAGE("Wobbuffet"); + NOT MESSAGE("The mysterious strong winds have dissipated!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_STRONG_WINDS); + } +} diff --git a/test/battle/ability/desolate_land.c b/test/battle/ability/desolate_land.c index b7cc02d47..8a081a621 100644 --- a/test/battle/ability/desolate_land.c +++ b/test/battle/ability/desolate_land.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves") { GIVEN { - PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB);} + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } @@ -34,11 +34,11 @@ DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints th GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SURF)); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); - PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB); {Speed(5);}} - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(8);} + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(5); } + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } } WHEN { TURN { MOVE(opponentLeft, MOVE_SURF); } } SCENE { @@ -56,8 +56,8 @@ DOUBLE_BATTLE_TEST("Desolate Land blocks damaging Water-type moves and prints th SINGLE_BATTLE_TEST("Desolate Land does not block a move if Pokémon is asleep and uses a Water-type move") // Sleep/confusion/paralysis all happen before the check for primal weather { GIVEN { - PLAYER(SPECIES_GROUDON) {Item(ITEM_RED_ORB);} - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } } SCENE { @@ -98,3 +98,83 @@ SINGLE_BATTLE_TEST("Desolate Land is removed immediately if user faints") MESSAGE("The extremely harsh sunlight faded!"); } } + +SINGLE_BATTLE_TEST("Desolate Land blocks weather-setting moves") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SUNNY_DAY; } + PARAMETRIZE { move = MOVE_RAIN_DANCE; } + PARAMETRIZE { move = MOVE_SANDSTORM; } + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + + GIVEN { + ASSUME(GetMoveEffect(move) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SUNNY_DAY) == BATTLE_WEATHER_SUN); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, move, opponent); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_SUN_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Desolate Land prevents other weather abilities") +{ + u16 ability, species; + PARAMETRIZE { ability = ABILITY_DROUGHT; species = SPECIES_NINETALES; } + PARAMETRIZE { ability = ABILITY_DRIZZLE; species = SPECIES_POLITOED; } + PARAMETRIZE { ability = ABILITY_SAND_STREAM; species = SPECIES_HIPPOWDON; } + PARAMETRIZE { ability = ABILITY_SNOW_WARNING; species = SPECIES_ABOMASNOW; } + + GIVEN { + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ability); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_SUN_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Desolate Land can be replaced by Delta Stream") +{ + GIVEN { + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DELTA_STREAM); + MESSAGE("Mysterious strong winds are protecting Flying-type Pokémon!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_STRONG_WINDS); + } +} + +SINGLE_BATTLE_TEST("Desolate Land can be replaced by Primordial Sea") +{ + GIVEN { + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_PRIMORDIAL_SEA); + MESSAGE("A heavy rain began to fall!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_RAIN_PRIMAL); + } +} diff --git a/test/battle/ability/disguise.c b/test/battle/ability/disguise.c index 0d73fdf9a..c0ef6fbc9 100644 --- a/test/battle/ability/disguise.c +++ b/test/battle/ability/disguise.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Disguised Mimikyu doesn't lose 1/8 of its max HP upon changing to its busted form (Gen7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_7); + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu will lose 1/8 of its max HP upon changing s16 disguiseDamage; GIVEN { - WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8); + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu takes no damage from a confusion hit and c OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_CONFUSE_RAY); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu's Air Balloon will pop upon changing to it } } -SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise") +SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise - Stealth Rock") { GIVEN { ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); @@ -104,6 +104,26 @@ SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without } } +SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from secondary damage without breaking the disguise - Weather") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + ASSUME(GetSpeciesType(SPECIES_GEODUDE, 0) == TYPE_ROCK || GetSpeciesType(SPECIES_GEODUDE, 1) == TYPE_ROCK); + PLAYER(SPECIES_GEODUDE); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_GEODUDE); + } WHEN { + TURN { MOVE(opponent, MOVE_SANDSTORM); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SANDSTORM, opponent); + HP_BAR(player); + } THEN { + EXPECT_EQ(player->species, SPECIES_MIMIKYU_DISGUISED); + } +} + SINGLE_BATTLE_TEST("Disguised Mimikyu takes damage from Rocky Helmet without breaking the disguise") { GIVEN { diff --git a/test/battle/ability/download.c b/test/battle/ability/download.c index f275b7c26..4b1fe89c9 100644 --- a/test/battle/ability/download.c +++ b/test/battle/ability/download.c @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet PARAMETRIZE { ability = ABILITY_TRACE; } PARAMETRIZE { ability = ABILITY_DOWNLOAD; } GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET) { Speed(100); } PLAYER(SPECIES_PORYGON) { Ability(ability); Defense(400); SpDefense(300); Speed(300); Attack(100); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } diff --git a/test/battle/ability/dragons_maw.c b/test/battle/ability/dragons_maw.c index 950cb1db0..37a8bab16 100644 --- a/test/battle/ability/dragons_maw.c +++ b/test/battle/ability/dragons_maw.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } diff --git a/test/battle/ability/drizzle.c b/test/battle/ability/drizzle.c index fd5670483..8e6f7876c 100644 --- a/test/battle/ability/drizzle.c +++ b/test/battle/ability/drizzle.c @@ -22,3 +22,84 @@ SINGLE_BATTLE_TEST("Drizzle summons rain", s16 damage) EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.5), results[0].damage); } } + +SINGLE_BATTLE_TEST("Drizzle sets up rain for 5 turns (Gen6+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_DRIZZLE); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("The rain stopped."); + } +} + +SINGLE_BATTLE_TEST("Drizzle sets up rain for 8 turns with Damp Rock (Gen6+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); Item(ITEM_DAMP_ROCK); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_DRIZZLE); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("The rain stopped."); + } +} + +SINGLE_BATTLE_TEST("Drizzle sets up permanent rain (Gen3-5)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); + PLAYER(SPECIES_POLITOED) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_DRIZZLE); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + MESSAGE("Rain continues to fall."); + NOT MESSAGE("The rain stopped."); + } +} diff --git a/test/battle/ability/drought.c b/test/battle/ability/drought.c index c28b0895b..ba78643b5 100644 --- a/test/battle/ability/drought.c +++ b/test/battle/ability/drought.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 5 turns (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); Item(ITEM_HEAT_ROCK); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Drought sets up sun for 8 turns with Heat Rock (Gen6+)") SINGLE_BATTLE_TEST("Drought sets up permanent sun (Gen3-5)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_3); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); PLAYER(SPECIES_NINETALES) { Moves(MOVE_CELEBRATE); Ability(ABILITY_DROUGHT); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { diff --git a/test/battle/ability/dry_skin.c b/test/battle/ability/dry_skin.c index aab565861..6bca34e26 100644 --- a/test/battle/ability/dry_skin.c +++ b/test/battle/ability/dry_skin.c @@ -15,7 +15,28 @@ SINGLE_BATTLE_TEST("Dry Skin causes 1/8th Max HP damage in Sun") } } -TO_DO_BATTLE_TEST("Dry Skin doesn't get damaged in Sun if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Dry Skin doesn't get damaged in Sun if Cloud Nine/Air Lock is on the field") +{ + u16 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_DRY_SKIN); + HP_BAR(player); + MESSAGE("Parasect's Dry Skin takes its toll!"); + } + } +} SINGLE_BATTLE_TEST("Dry Skin heals 1/8th Max HP in Rain") { @@ -31,7 +52,28 @@ SINGLE_BATTLE_TEST("Dry Skin heals 1/8th Max HP in Rain") } } -TO_DO_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on the field") +{ + u16 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_RAIN_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + NONE_OF { + ABILITY_POPUP(player, ABILITY_DRY_SKIN); + HP_BAR(player); + MESSAGE("Parasect's Dry Skin restored its HP a little!"); + } + } +} SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%", s16 damage) { @@ -93,7 +135,7 @@ SINGLE_BATTLE_TEST("Dry Skin is only triggered once on multi strike moves") { GIVEN { ASSUME(GetMoveType(MOVE_WATER_SHURIKEN) == TYPE_WATER); - ASSUME(GetMoveEffect(MOVE_WATER_SHURIKEN) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_WATER_SHURIKEN)); PLAYER(SPECIES_PARASECT) { Ability(ABILITY_DRY_SKIN); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -107,7 +149,7 @@ SINGLE_BATTLE_TEST("Dry Skin is only triggered once on multi strike moves") SINGLE_BATTLE_TEST("Dry Skin prevents Absorb Bulb and Luminous Moss from activating") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABSORB_BULB; } PARAMETRIZE { item = ITEM_LUMINOUS_MOSS; } GIVEN { diff --git a/test/battle/ability/effect_spore.c b/test/battle/ability/effect_spore.c index ff61683b5..670797395 100644 --- a/test/battle/ability/effect_spore.c +++ b/test/battle/ability/effect_spore.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Effect Spore only inflicts status on contact") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } @@ -32,11 +32,15 @@ SINGLE_BATTLE_TEST("Effect Spore only inflicts status on contact") } } -SINGLE_BATTLE_TEST("Effect Spore causes poison 9% of the time") +SINGLE_BATTLE_TEST("Effect Spore causes poison 3.3% (Gen3), 10% (Gen4) and 9% (Gen5+) of the time") { - PASSES_RANDOMLY(9, 100, RNG_EFFECT_SPORE); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 30; } // 3.3% + PARAMETRIZE { config = GEN_4; passes = 1; trials = 10; } // 10% + PARAMETRIZE { config = GEN_5; passes = 9; trials = 100; } // 9% + PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -51,11 +55,15 @@ SINGLE_BATTLE_TEST("Effect Spore causes poison 9% of the time") } } -SINGLE_BATTLE_TEST("Effect Spore causes paralysis 10% of the time") +SINGLE_BATTLE_TEST("Effect Spore causes paralysis 3.3% (Gen3) and 10% (Gen4+) of the time") { - PASSES_RANDOMLY(10, 100, RNG_EFFECT_SPORE); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 30; } // 3.3% + PARAMETRIZE { config = GEN_4; passes = 1; trials = 10; } // 10% + PARAMETRIZE { config = GEN_5; passes = 1; trials = 10; } // 10% + PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -70,11 +78,15 @@ SINGLE_BATTLE_TEST("Effect Spore causes paralysis 10% of the time") } } -SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time") +SINGLE_BATTLE_TEST("Effect Spore causes sleep 3.3% (Gen3), 10% (Gen4) and 11% (Gen5+) of the time") { - PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 30; } // 3.3% + PARAMETRIZE { config = GEN_4; passes = 1; trials = 10; } // 10% + PARAMETRIZE { config = GEN_5; passes = 11; trials = 100; } // 11% + PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -91,9 +103,13 @@ SINGLE_BATTLE_TEST("Effect Spore causes sleep 11% of the time") SINGLE_BATTLE_TEST("Effect Spore will check if it can inflict status onto attacker, not itself") { - PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 30; } // 3.3% + PARAMETRIZE { config = GEN_4; passes = 1; trials = 10; } // 10% + PARAMETRIZE { config = GEN_5; passes = 11; trials = 100; } // 11% + PASSES_RANDOMLY(passes, trials, RNG_EFFECT_SPORE); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Status1(STATUS1_BURN); Ability(ABILITY_EFFECT_SPORE); } diff --git a/test/battle/ability/electromorphosis.c b/test/battle/ability/electromorphosis.c index 92fe09358..cc457db77 100644 --- a/test/battle/ability/electromorphosis.c +++ b/test/battle/ability/electromorphosis.c @@ -4,10 +4,10 @@ SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move") { s16 dmgBefore, dmgAfter; - u16 move; + enum Move move; - PARAMETRIZE {move = MOVE_SCRATCH; } - PARAMETRIZE {move = MOVE_GUST; } + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_GUST; } GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Electromorphosis sets up Charge when hit by any move") ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); PLAYER(SPECIES_BELLIBOLT) { Ability(ABILITY_ELECTROMORPHOSIS); Speed(10); } - OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(5); } // Limber, so it doesn't get paralyzed. } WHEN { TURN { MOVE(player, MOVE_THUNDER_SHOCK), MOVE(opponent, move); } diff --git a/test/battle/ability/embody_aspect.c b/test/battle/ability/embody_aspect.c index e7ac53a9e..326981125 100644 --- a/test/battle/ability/embody_aspect.c +++ b/test/battle/ability/embody_aspect.c @@ -16,7 +16,7 @@ SINGLE_BATTLE_TEST("Embody Aspect raises a stat depending on the users form by o PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ability); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); diff --git a/test/battle/ability/emergency_exit.c b/test/battle/ability/emergency_exit.c index 3592b91b0..a03a4853c 100644 --- a/test/battle/ability/emergency_exit.c +++ b/test/battle/ability/emergency_exit.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Emergency Exit switches out when taking 50% max-hp damage") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SUPER_FANG); SEND_OUT(opponent, 1); } @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Emergency Exit does not switch out when going below 50% max- { GIVEN { PLAYER(SPECIES_WOBBUFFET) - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); Item(ITEM_SITRUS_BERRY); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SUPER_FANG); } @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Emergency Exit switches out when going below 50% max-HP but { GIVEN { PLAYER(SPECIES_WOBBUFFET) - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); Item(ITEM_ORAN_BERRY); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SUPER_FANG); SEND_OUT(opponent, 1); } @@ -53,8 +53,8 @@ DOUBLE_BATTLE_TEST("Only the fastest Wimp Out (Emergency Exit) user switches out GIVEN { PLAYER(SPECIES_ZAPDOS) { Speed(10); } PLAYER(SPECIES_WOBBUFFET) { Speed(10); } - OPPONENT(SPECIES_WIMPOD) { Speed(1); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); }; - OPPONENT(SPECIES_WIMPOD) { Speed(2); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); }; + OPPONENT(SPECIES_WIMPOD) { Speed(1); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); } + OPPONENT(SPECIES_WIMPOD) { Speed(2); Ability(ABILITY_WIMP_OUT); Item(ITEM_FOCUS_SASH); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } } WHEN { @@ -71,7 +71,7 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { SEND_OUT(opponent, 1); } @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when healing from under 50% max-hp GIVEN { ASSUME(GetMoveEffect(MOVE_AQUA_RING) == EFFECT_AQUA_RING); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Status1(STATUS1_BURN); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_AQUA_RING); SEND_OUT(opponent, 1); } @@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SANDSTORM); SEND_OUT(opponent, 1); } @@ -119,7 +119,7 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when healing from under 50% max-hp ASSUME(GetMoveEffect(MOVE_AQUA_RING) == EFFECT_AQUA_RING); ASSUME(GetItemHoldEffect(ITEM_STICKY_BARB) == HOLD_EFFECT_STICKY_BARB); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Item(ITEM_STICKY_BARB); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(130); Item(ITEM_STICKY_BARB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_AQUA_RING); SEND_OUT(opponent, 1); } @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Emergency Exit activates when taking residual damage and fal { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(160); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(160); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SALT_CURE); SEND_OUT(opponent, 1); } @@ -149,9 +149,9 @@ WILD_BATTLE_TEST("Emergency Exit makes the pokemon flee during wild battle") GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } } WHEN { - TURN { MOVE(player, MOVE_SUPER_FANG);} + TURN { MOVE(player, MOVE_SUPER_FANG); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, player); HP_BAR(opponent); @@ -166,9 +166,9 @@ WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falli GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); Status1(STATUS1_BURN); } } WHEN { - TURN { } + TURN {} } SCENE { HP_BAR(opponent); ABILITY_POPUP(opponent, ABILITY_EMERGENCY_EXIT); @@ -180,11 +180,11 @@ WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falli WILD_BATTLE_TEST("Emergency Exit makes the player ran during wild battle") { GIVEN { - PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_SUPER_FANG);} + TURN { MOVE(opponent, MOVE_SUPER_FANG); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SUPER_FANG, opponent); HP_BAR(player); @@ -197,11 +197,11 @@ WILD_BATTLE_TEST("Emergency Exit makes the player ran during wild battle") WILD_BATTLE_TEST("Emergency Exit activates when taking residual damage and falling under 50% max-hp (wild battle player side)") { GIVEN { - PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); }; + PLAYER(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(134); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_SANDSTORM);} + TURN { MOVE(opponent, MOVE_SANDSTORM); } } SCENE { HP_BAR(player); ABILITY_POPUP(player, ABILITY_EMERGENCY_EXIT); diff --git a/test/battle/ability/fairy_aura.c b/test/battle/ability/fairy_aura.c index 3b8d400b0..a51abf1be 100644 --- a/test/battle/ability/fairy_aura.c +++ b/test/battle/ability/fairy_aura.c @@ -1,4 +1,108 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fairy Aura (Ability) test titles") +DOUBLE_BATTLE_TEST("Fairy Aura increases the power of all Fairy-type attacks by 33%") +{ + s16 damage[8]; + + GIVEN { + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + PLAYER(SPECIES_LINOONE); + PLAYER(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + OPPONENT(SPECIES_LINOONE); + } WHEN { + TURN { MOVE(playerRight, MOVE_SKILL_SWAP, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_PLAY_ROUGH, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerRight, secondaryEffect:FALSE); + } + TURN { MOVE(opponentLeft, MOVE_GASTRO_ACID, target:playerRight); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(playerRight, MOVE_PLAY_ROUGH, target:opponentRight, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerRight, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[2]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[3]); + + // Turn 2 + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponentLeft); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerRight); + HP_BAR(opponentRight, captureDamage: &damage[5]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[6]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerRight, captureDamage: &damage[7]); + } THEN { + EXPECT_MUL_EQ(damage[4], UQ_4_12(1.33), damage[0]); + EXPECT_MUL_EQ(damage[5], UQ_4_12(1.33), damage[1]); + EXPECT_MUL_EQ(damage[6], UQ_4_12(1.33), damage[2]); + EXPECT_MUL_EQ(damage[7], UQ_4_12(1.33), damage[3]); + } +} + +DOUBLE_BATTLE_TEST("Fairy Aura's effect doesn't stack multiple times") +{ + s16 damage[6]; + + GIVEN { + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + PLAYER(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + PLAYER(SPECIES_XERNEAS) { Ability(ABILITY_FAIRY_AURA); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9999); MaxHP(9999); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + } + TURN { SWITCH(playerRight, 2); } + TURN { + MOVE(playerLeft, MOVE_PLAY_ROUGH, target:opponentLeft, secondaryEffect:FALSE); + MOVE(opponentLeft, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + MOVE(opponentRight, MOVE_PLAY_ROUGH, target:playerLeft, secondaryEffect:FALSE); + } + } SCENE { + // Turn 1 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[2]); + + // Turn 2 + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Xerneas"); + + // Turn 3 + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, playerLeft); + HP_BAR(opponentLeft, captureDamage: &damage[3]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &damage[4]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PLAY_ROUGH, opponentRight); + HP_BAR(playerLeft, captureDamage: &damage[5]); + } THEN { + EXPECT_EQ(damage[3], damage[0]); + EXPECT_EQ(damage[4], damage[1]); + EXPECT_EQ(damage[5], damage[2]); + } +} diff --git a/test/battle/ability/filter.c b/test/battle/ability/filter.c index 30662fe03..db3d353b7 100644 --- a/test/battle/ability/filter.c +++ b/test/battle/ability/filter.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Filter reduces damage to Super Effective moves by 0.75", s16 GIVEN { ASSUME(gSpeciesInfo[SPECIES_MR_MIME].types[0] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_MR_MIME].types[1] == TYPE_FAIRY); - ASSUME(gMovesInfo[MOVE_POISON_JAB].type == TYPE_POISON); + ASSUME(GetMoveType(MOVE_POISON_JAB) == TYPE_POISON); ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_FAIRY] > UQ_4_12(1.0)); ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_PSYCHIC] == UQ_4_12(1.0)); PLAYER(SPECIES_MR_MIME) { Ability(ability); } diff --git a/test/battle/ability/flame_body.c b/test/battle/ability/flame_body.c index 6120af0c2..a1aac23f3 100644 --- a/test/battle/ability/flame_body.c +++ b/test/battle/ability/flame_body.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Flame Body inflicts burn on contact") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { @@ -30,11 +30,14 @@ SINGLE_BATTLE_TEST("Flame Body inflicts burn on contact") } } -SINGLE_BATTLE_TEST("Flame Body triggers 30% of the time") +SINGLE_BATTLE_TEST("Flame Body triggers 1/3 times (Gen3) or 30% (Gen 4+) of the time") { - PASSES_RANDOMLY(3, 10, RNG_FLAME_BODY); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 3; } // 33.3% + PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% + PASSES_RANDOMLY(passes, trials, RNG_FLAME_BODY); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_MAGMAR) { Ability(ABILITY_FLAME_BODY); } diff --git a/test/battle/ability/flare_boost.c b/test/battle/ability/flare_boost.c index a4ff14382..54bd3b9d3 100644 --- a/test/battle/ability/flare_boost.c +++ b/test/battle/ability/flare_boost.c @@ -1,4 +1,21 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flare Boost (Ability) test titles") +SINGLE_BATTLE_TEST("Flare Boost increases Sp. Attack by 50% when the Pokémon is burned", s16 damage) +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_BURN; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_FLARE_BOOST); Status1(status1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWIFT, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} diff --git a/test/battle/ability/flower_gift.c b/test/battle/ability/flower_gift.c index 30cc7926e..8e5f9faca 100644 --- a/test/battle/ability/flower_gift.c +++ b/test/battle/ability/flower_gift.c @@ -17,7 +17,28 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim in harsh sunlight") } } -TO_DO_BATTLE_TEST("Flower Gift doesn't transform Cherrim if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Flower Gift doesn't transform Cherrim if Cloud Nine/Air Lock is on the field") +{ + u32 species = 0; + enum Ability ability = 0; + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + GIVEN { + PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_FLOWER_GIFT); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + MESSAGE("Cherrim transformed!"); + } + } THEN { + EXPECT_EQ(player->species, SPECIES_CHERRIM_OVERCAST); + } +} SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when weather changes") { @@ -219,4 +240,19 @@ DOUBLE_BATTLE_TEST("Flower Gift reverts Cherrim back after Teraform Zero clears } } -TO_DO_BATTLE_TEST("Flower Gift does not transform Cherrim back to normal when suppressed if Cherrim is Dynamaxed"); +SINGLE_BATTLE_TEST("Flower Gift does not transform Cherrim back to normal when suppressed if Cherrim is Dynamaxed") +{ + GIVEN { + ASSUME(B_WEATHER_FORMS >= GEN_5); + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + PLAYER(SPECIES_CHERRIM_OVERCAST) { Ability(ABILITY_FLOWER_GIFT); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + TURN { MOVE(opponent, MOVE_GASTRO_ACID); } + } SCENE { + } THEN { + EXPECT_EQ(player->species, SPECIES_CHERRIM_SUNSHINE); + } +} diff --git a/test/battle/ability/flower_veil.c b/test/battle/ability/flower_veil.c index 78d15df1b..c1e300e76 100644 --- a/test/battle/ability/flower_veil.c +++ b/test/battle/ability/flower_veil.c @@ -17,7 +17,7 @@ ASSUMPTIONS DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - right target") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_GAS; } @@ -41,7 +41,7 @@ DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - right ta DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - left target") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_GAS; } @@ -63,4 +63,22 @@ DOUBLE_BATTLE_TEST("Flower Veil prevents status on allied Grass-types - left tar } } -TO_DO_BATTLE_TEST("Flower Veil's stat reduction protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. +DOUBLE_BATTLE_TEST("Flower Veil's stat reduction protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWAGGER) == EFFECT_SWAGGER); + ASSUME(GetSpeciesType(SPECIES_SNIVY, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_SNIVY, 1) == TYPE_GRASS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_COMFEY) { Ability(ABILITY_FLOWER_VEIL); } + OPPONENT(SPECIES_SNIVY) { Ability(ABILITY_CONTRARY); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SWAGGER, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWAGGER, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_FLOWER_VEIL); + MESSAGE("The opposing Snivy surrounded itself with a veil of petals!"); + } THEN { + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/ability/forecast.c b/test/battle/ability/forecast.c index b6889620a..bdff1a739 100644 --- a/test/battle/ability/forecast.c +++ b/test/battle/ability/forecast.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an opponent's move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNNY_DAY; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_HAIL; } @@ -30,13 +30,15 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an opponent's m case MOVE_SNOWSCAPE: EXPECT_EQ(player->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from its own move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNNY_DAY; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_HAIL; } @@ -63,13 +65,15 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from its own move") case MOVE_SNOWSCAPE: EXPECT_EQ(player->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } DOUBLE_BATTLE_TEST("Forecast transforms Castform in weather from a partner's move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNNY_DAY; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_HAIL; } @@ -98,13 +102,15 @@ DOUBLE_BATTLE_TEST("Forecast transforms Castform in weather from a partner's mov case MOVE_SNOWSCAPE: EXPECT_EQ(playerLeft->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNNY_DAY; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_HAIL; } @@ -151,6 +157,8 @@ DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather") EXPECT_EQ(opponentLeft->species, SPECIES_CASTFORM_SNOWY); EXPECT_EQ(opponentRight->species, SPECIES_CASTFORM_SNOWY); break; + default: + break; } } } diff --git a/test/battle/ability/frisk.c b/test/battle/ability/frisk.c index e20d2f520..b39f53c48 100644 --- a/test/battle/ability/frisk.c +++ b/test/battle/ability/frisk.c @@ -4,12 +4,12 @@ DOUBLE_BATTLE_TEST("Frisk does not trigger when Pokémon hold no items") { GIVEN { - PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; - PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; - OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); }; - OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); }; + PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); } + PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); } + OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); } + OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); } } WHEN { - TURN { ; } + TURN {} } SCENE { NONE_OF { ABILITY_POPUP(playerLeft, ABILITY_FRISK); @@ -23,10 +23,10 @@ DOUBLE_BATTLE_TEST("Frisk does not trigger when Pokémon hold no items") SINGLE_BATTLE_TEST("Frisk triggers in a Single Battle") { GIVEN { - PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); Item(ITEM_POTION); }; - OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); Item(ITEM_POTION); }; + PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); Item(ITEM_POTION); } + OPPONENT(SPECIES_SENTRET) { Ability(ABILITY_FRISK); Item(ITEM_POTION); } } WHEN { - TURN { ; } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_FRISK); MESSAGE("Furret frisked the opposing Sentret and found its Potion!"); @@ -45,7 +45,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for player in a Double Battle after switching ASSUME(!IsBattleMoveStatus(MOVE_POUND)); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; + PLAYER(SPECIES_FURRET) { Ability(ABILITY_FRISK); } OPPONENT(SPECIES_WYNAUT) { Item(ITEM_POTION); } OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -70,7 +70,7 @@ DOUBLE_BATTLE_TEST("Frisk triggers for opponent in a Double Battle after switchi PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } - OPPONENT(SPECIES_FURRET) { Ability(ABILITY_FRISK); }; + OPPONENT(SPECIES_FURRET) { Ability(ABILITY_FRISK); } } WHEN { TURN { MOVE(playerLeft, MOVE_POUND, target: target); SEND_OUT(target, 2); } } SCENE { diff --git a/test/battle/ability/fur_coat.c b/test/battle/ability/fur_coat.c index 56fb19711..2ad6a3d5a 100644 --- a/test/battle/ability/fur_coat.c +++ b/test/battle/ability/fur_coat.c @@ -1,4 +1,44 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fur Coat (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); +} + +SINGLE_BATTLE_TEST("Fur Coat doubles Defense", s16 damage) +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_FUR_COAT; } + PARAMETRIZE { ability = ABILITY_RATTLED; } + + GIVEN { + PLAYER(SPECIES_PERSIAN_ALOLA) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Fur Coat has no effect on self-inflicted confusion damage", s16 damage) +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_FUR_COAT; } + PARAMETRIZE { ability = ABILITY_RATTLED; } + + GIVEN { + PLAYER(SPECIES_PERSIAN_ALOLA) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_POUND, WITH_RNG(RNG_CONFUSION, TRUE)); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + HP_BAR(player, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} diff --git a/test/battle/ability/gale_wings.c b/test/battle/ability/gale_wings.c index df8f02532..711d9ae0f 100644 --- a/test/battle/ability/gale_wings.c +++ b/test/battle/ability/gale_wings.c @@ -9,10 +9,10 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)") PARAMETRIZE { hp = 100; config = GEN_6; } PARAMETRIZE { hp = 99; config = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_GALE_WINGS, config); + WITH_CONFIG(CONFIG_GALE_WINGS, config); ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); - PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1);} - OPPONENT(SPECIES_WOBBUFFET) { Speed(100);}; + PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(hp); MaxHP(100); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(player, MOVE_AERIAL_ACE); } } SCENE { @@ -29,14 +29,14 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority at full HP (Gen 7+)") SINGLE_BATTLE_TEST("Gale Wings only grants priority to Flying-type moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_AERIAL_ACE; } PARAMETRIZE { move = MOVE_FLARE_BLITZ; } GIVEN { ASSUME(GetMoveType(MOVE_AERIAL_ACE) == TYPE_FLYING); ASSUME(GetMoveType(MOVE_FLARE_BLITZ) == TYPE_FIRE); - PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(100); MaxHP(100); Speed(1);} - OPPONENT(SPECIES_WOBBUFFET) { Speed(100);}; + PLAYER(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); HP(100); MaxHP(100); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(player, move); } } SCENE { @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Gale Wings only grants priority to Flying-type moves") SINGLE_BATTLE_TEST("Gale Wings doesn't increase priority of Flying-type Natural Gift, Judgment, Hidden Power, or Tera Blast") { - u32 move; + enum Move move; u16 heldItem; PARAMETRIZE { move = MOVE_NATURAL_GIFT; heldItem = ITEM_LUM_BERRY; } PARAMETRIZE { move = MOVE_JUDGMENT; heldItem = ITEM_SKY_PLATE; } @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Gale Wings doesn't increase priority of Flying-type Natural ASSUME(gItemsInfo[ITEM_SKY_PLATE].secondaryId == TYPE_FLYING); ASSUME(gNaturalGiftTable[ITEM_TO_BERRY(ITEM_LUM_BERRY)].type == TYPE_FLYING); OPPONENT(SPECIES_TALONFLAME) { Ability(ABILITY_GALE_WINGS); Speed(1); Item(heldItem); HPIV(31); AttackIV(3); DefenseIV(31); SpAttackIV(30); SpDefenseIV(30); SpeedIV(30); TeraType(TYPE_FLYING); } - PLAYER(SPECIES_WOBBUFFET) { Speed(100); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(opponent, move); } } SCENE { diff --git a/test/battle/ability/galvanize.c b/test/battle/ability/galvanize.c index 01add35fd..e672457a3 100644 --- a/test/battle/ability/galvanize.c +++ b/test/battle/ability/galvanize.c @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Galvanize turns a normal type move into Electric") SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HIDDEN_POWER; } PARAMETRIZE { move = MOVE_WEATHER_BALL; } @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3 PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_GEODUDE_ALOLA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3 SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage) { - u16 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } @@ -117,7 +117,8 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type") SINGLE_BATTLE_TEST("Galvanize doesn't affect Judgment / Techno Blast / Multi-Attack's type") { - u16 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_SPLASH_PLATE; } PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_DOUSE_DRIVE; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_WATER_MEMORY; } diff --git a/test/battle/ability/good_as_gold.c b/test/battle/ability/good_as_gold.c index fc6c6bc8c..a1c2960da 100644 --- a/test/battle/ability/good_as_gold.c +++ b/test/battle/ability/good_as_gold.c @@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Good as Gold doesn't protect from moves that target the fiel { GIVEN { ASSUME(GetMoveCategory(MOVE_STEALTH_ROCK) == DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD); + ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == TARGET_OPPONENTS_FIELD); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); } } WHEN { diff --git a/test/battle/ability/grim_neigh.c b/test/battle/ability/grim_neigh.c index bb212e589..c5a6f3d49 100644 --- a/test/battle/ability/grim_neigh.c +++ b/test/battle/ability/grim_neigh.c @@ -8,14 +8,14 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_GLALIE) { HP(1); } OPPONENT(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_ABRA); } WHEN { - TURN { MOVE(playerLeft, MOVE_DISCHARGE); SEND_OUT(opponentLeft, 2); } + TURN { MOVE(playerLeft, MOVE_DISCHARGE); SEND_OUT(opponentLeft, 2); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); MESSAGE("The opposing Glalie fainted!"); @@ -45,7 +45,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect dam OPPONENT(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_ABRA); } WHEN { - TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentRight); SEND_OUT(opponentLeft, 2); } + TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentRight); SEND_OUT(opponentLeft, 2); } } SCENE { int i; @@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move th PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; } GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/ability/gulp_missile.c b/test/battle/ability/gulp_missile.c index f6c102a48..5a3266ff1 100644 --- a/test/battle/ability/gulp_missile.c +++ b/test/battle/ability/gulp_missile.c @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; } GIVEN { PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); } - OPPONENT(species) { Ability(ability); } + OPPONENT(species) { Ability(ability); HP(9999); MaxHP(9999); } // In Gen 5 data, Surf would be enough to knock out Chatot } WHEN { TURN { MOVE(player, MOVE_SURF); MOVE(opponent, MOVE_SCRATCH); } } SCENE { diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index 403d044f8..d2e050c32 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -5,7 +5,8 @@ ASSUMPTIONS { ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); ASSUME(I_SITRUS_BERRY_HEAL >= GEN_4); - ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_SUNNY_DAY); + ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SUNNY_DAY) == BATTLE_WEATHER_SUN); } SINGLE_BATTLE_TEST("Harvest has a 50% chance to restore a Berry at the end of the turn") @@ -230,10 +231,9 @@ SINGLE_BATTLE_TEST("Harvest can restore a Berry that was transferred from anothe PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); } } WHEN { - TURN { MOVE(opponent, MOVE_TRICK); MOVE(player, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_TRICK); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); ABILITY_POPUP(opponent, ABILITY_HARVEST); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); @@ -250,11 +250,10 @@ SINGLE_BATTLE_TEST("Harvest can only restore the newest berry consumed that was PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); HP(100); MaxHP(500); Item(ITEM_APICOT_BERRY); } } WHEN { - TURN { MOVE(opponent, MOVE_TRICK); MOVE(player, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_TRICK); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); ABILITY_POPUP(opponent, ABILITY_HARVEST); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); diff --git a/test/battle/ability/healer.c b/test/battle/ability/healer.c index 6a113f407..93422ed8a 100644 --- a/test/battle/ability/healer.c +++ b/test/battle/ability/healer.c @@ -18,7 +18,7 @@ DOUBLE_BATTLE_TEST("Healer cures adjacent ally's status condition 30% of the tim OPPONENT(SPECIES_WOBBUFFET) { Status1(status); } OPPONENT(SPECIES_CHANSEY) { Ability(ABILITY_HEALER); } } WHEN { - TURN { } + TURN {} } SCENE { MESSAGE("The opposing Chansey's Healer cured the opposing Wobbuffet's problem!"); } diff --git a/test/battle/ability/heatproof.c b/test/battle/ability/heatproof.c index 7f1d772bb..154569fd2 100644 --- a/test/battle/ability/heatproof.c +++ b/test/battle/ability/heatproof.c @@ -1,4 +1,52 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Heatproof (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); +} + +SINGLE_BATTLE_TEST("Heatproof halves damage from fire type moves") +{ + s16 damage[2]; + GIVEN { + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_BRONZONG) { Ability(ABILITY_HEATPROOF); } + } + WHEN { + TURN { MOVE(player, MOVE_EMBER); } + TURN { MOVE(player, MOVE_WORRY_SEED); } + TURN { MOVE(player, MOVE_EMBER); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + EXPECT_MUL_EQ(damage[0], Q_4_12(2), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Heatproof halves the damage done by burn from 1/8th to 1/16th (Gen1-6) or 1/16th to 1/32nd (Gen 7+)") +{ + u32 config, burnRate; + + PARAMETRIZE { config = GEN_7; burnRate = 32; } + PARAMETRIZE { config = GEN_6; burnRate = 16; } + + GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); + PLAYER (SPECIES_BRONZONG) { Ability(ABILITY_HEATPROOF); Status1(STATUS1_BURN); } + OPPONENT (SPECIES_WOBBUFFET); + } + WHEN { + TURN {} + } + SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / burnRate); + } +} + diff --git a/test/battle/ability/hospitality.c b/test/battle/ability/hospitality.c index 2c89c3eb9..3f5fad586 100644 --- a/test/battle/ability/hospitality.c +++ b/test/battle/ability/hospitality.c @@ -14,7 +14,7 @@ DOUBLE_BATTLE_TEST("Hospitality user restores 25% of ally's health") OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { if (health == 75) { ABILITY_POPUP(playerLeft, ABILITY_HOSPITALITY); @@ -72,8 +72,8 @@ DOUBLE_BATTLE_TEST("Hospitality ignores Substitute") DOUBLE_BATTLE_TEST("Hospitality does not trigger if there is no ally on the field") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_POLTCHAGEIST) { Ability(ABILITY_HOSPITALITY); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -111,3 +111,39 @@ DOUBLE_BATTLE_TEST("Hospitality is blocked by Heal Block") } } } + +DOUBLE_BATTLE_TEST("Hospitality user restores 25% of ally's max HP after taking hazard damage") +{ + u32 speedLeft, speedRight = 0; + + PARAMETRIZE { speedLeft = 200; speedRight = 150; } + PARAMETRIZE { speedLeft = 150; speedRight = 200; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(speedLeft); }; + PLAYER(SPECIES_POLTCHAGEIST) { Speed(speedRight); Ability(ABILITY_HOSPITALITY); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(110); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_SPIKES); + MOVE(opponentRight, MOVE_HYPER_VOICE); + SEND_OUT(playerLeft, 2); + SEND_OUT(playerRight, 3); + } + } SCENE { + HP_BAR(playerLeft); + HP_BAR(playerRight); + if (speedLeft == 200) { + HP_BAR(playerLeft); // Spikes dmg + HP_BAR(playerRight); // Spikes dmg + } else { + HP_BAR(playerRight); // Spikes dmg + HP_BAR(playerLeft); // Spikes dmg + } + ABILITY_POPUP(playerRight, ABILITY_HOSPITALITY); + HP_BAR(playerLeft); // Hospitality Heal + } +} diff --git a/test/battle/ability/hunger_switch.c b/test/battle/ability/hunger_switch.c index 469cf02d3..0c2dc8a53 100644 --- a/test/battle/ability/hunger_switch.c +++ b/test/battle/ability/hunger_switch.c @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Hunger Switch does not switch Morpeko's form when Terastalli PLAYER(SPECIES_MORPEKO) { Ability(ABILITY_HUNGER_SWITCH); TeraType(TYPE_NORMAL); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_TERA); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Hunger Switch does not switch Morpeko's form after switching PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_ROAR); } TURN { SWITCH(player, 0); } } SCENE { diff --git a/test/battle/ability/hyper_cutter.c b/test/battle/ability/hyper_cutter.c index 7b1070e61..15ecd888a 100644 --- a/test/battle/ability/hyper_cutter.c +++ b/test/battle/ability/hyper_cutter.c @@ -118,7 +118,7 @@ SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Spectral Thief from resetting p { GIVEN { ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_STEAL_STATS)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { diff --git a/test/battle/ability/ice_body.c b/test/battle/ability/ice_body.c index 07890d52f..feba28fd4 100644 --- a/test/battle/ability/ice_body.c +++ b/test/battle/ability/ice_body.c @@ -2,13 +2,15 @@ #include "test/battle.h" ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); } SINGLE_BATTLE_TEST("Ice Body prevents damage from hail") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { @@ -23,7 +25,7 @@ SINGLE_BATTLE_TEST("Ice Body prevents damage from hail") SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { @@ -40,7 +42,7 @@ SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.") SINGLE_BATTLE_TEST("Ice Body doesn't recover HP if Cloud Nine/Air Lock is on the field") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { diff --git a/test/battle/ability/ice_face.c b/test/battle/ability/ice_face.c index c3df84bae..d7583e188 100644 --- a/test/battle/ability/ice_face.c +++ b/test/battle/ability/ice_face.c @@ -11,7 +11,10 @@ SINGLE_BATTLE_TEST("Ice Face blocks physical moves, changing Eiscue into its Noi TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { ABILITY_POPUP(player, ABILITY_ICE_FACE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Eiscue transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_EISCUE_NOICE); } } @@ -26,18 +29,22 @@ SINGLE_BATTLE_TEST("Ice Face does not block special moves, Eiscue stays in Ice F TURN { MOVE(opponent, MOVE_EMBER); } } SCENE { NOT ABILITY_POPUP(player, ABILITY_ICE_FACE); + } THEN { + EXPECT_EQ(player->species, SPECIES_EISCUE_ICE); } } SINGLE_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face Eiscue is out") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -46,23 +53,30 @@ SINGLE_BATTLE_TEST("Ice Face is restored if hail or snow begins while Noice Face TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { ABILITY_POPUP(player, ABILITY_ICE_FACE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Eiscue transformed!"); ABILITY_POPUP(player, ABILITY_ICE_FACE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Eiscue transformed!"); ABILITY_POPUP(player, ABILITY_ICE_FACE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Eiscue transformed!"); + } THEN { + EXPECT_EQ(player->species, SPECIES_EISCUE_NOICE); } } SINGLE_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while hail or snow is active") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_EISCUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -82,13 +96,15 @@ SINGLE_BATTLE_TEST("Ice Face is restored if Noice Face Eiscue is sent in while h SINGLE_BATTLE_TEST("Ice Face is not restored if Eiscue changes into Noice Face form while there's already hail or snow") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_EISCUE) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -138,13 +154,15 @@ SINGLE_BATTLE_TEST("Ice Face doesn't transform Eiscue if Cloud Nine/Air Lock is SINGLE_BATTLE_TEST("Ice Face is not restored if hail or snow and Eiscue are already out") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_EISCUE); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/ability/ice_scales.c b/test/battle/ability/ice_scales.c index ea96f6496..98bed83d1 100644 --- a/test/battle/ability/ice_scales.c +++ b/test/battle/ability/ice_scales.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYCHIC; } PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_PSYCHIC; } diff --git a/test/battle/ability/illusion.c b/test/battle/ability/illusion.c index 26c8daabc..46d99c774 100644 --- a/test/battle/ability/illusion.c +++ b/test/battle/ability/illusion.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Illusion can only imitate Normal Form terapagos") // Switch to Terapagos which enters Terastal Form TURN { SWITCH(player, 1); } // Switch back to Zoroark, should not be Terastal Terapagos - TURN { SWITCH(player, 0); MOVE(opponent, MOVE_SCRATCH);} + TURN { SWITCH(player, 0); MOVE(opponent, MOVE_SCRATCH); } // Switch back to Terapagos TURN { SWITCH(player, 1); } // Terapagos Stellar, Zoroark gets Roared in, should not be Stellar Terapagos @@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("Illusion breaks in Neutralizing Gas") PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ILLUSION_OFF, player); @@ -113,3 +113,20 @@ SINGLE_BATTLE_TEST("Illusion breaks if user loses Illusion due to Worry Seed") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ILLUSION_OFF, player); } } + +SINGLE_BATTLE_TEST("Illusion breaks when attacked behind a substitute") +{ + GIVEN { + PLAYER(SPECIES_DRAGAPULT) { Ability(ABILITY_INFILTRATOR); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_ZOROARK) { Speed(2); } + OPPONENT(SPECIES_WYNAUT) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_SHED_TAIL); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SWAP_FROM_SUBSTITUTE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ILLUSION_OFF, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SWAP_TO_SUBSTITUTE, opponent); + MESSAGE("The opposing Zoroark's illusion wore off!"); + } +} diff --git a/test/battle/ability/innards_out.c b/test/battle/ability/innards_out.c index 516bde342..87f730c1b 100644 --- a/test/battle/ability/innards_out.c +++ b/test/battle/ability/innards_out.c @@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Innards Out uses correct damage amount for Future Sight") OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(opponent, MOVE_FUTURE_SIGHT); } - TURN { } + TURN {} TURN { SEND_OUT(player, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, opponent); diff --git a/test/battle/ability/inner_focus.c b/test/battle/ability/inner_focus.c index 75c7c113d..ef0d8ea8a 100644 --- a/test/battle/ability/inner_focus.c +++ b/test/battle/ability/inner_focus.c @@ -7,10 +7,10 @@ SINGLE_BATTLE_TEST("Inner Focus doesn't prevent intimidate (Gen3-7)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -34,10 +34,10 @@ SINGLE_BATTLE_TEST("Inner Focus prevents intimidate (Gen8+)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -58,7 +58,7 @@ SINGLE_BATTLE_TEST("Inner Focus prevents flinching") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; + OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } } WHEN { TURN { MOVE(player, MOVE_FAKE_OUT); MOVE(opponent, MOVE_SCRATCH); @@ -73,8 +73,8 @@ SINGLE_BATTLE_TEST("Inner Focus prevents flinching") SINGLE_BATTLE_TEST("Mold Breaker ignores Inner Focus") { GIVEN { - PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }; - OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); }; + PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_ZUBAT) { Ability(ABILITY_INNER_FOCUS); } } WHEN { TURN { MOVE(player, MOVE_FAKE_OUT); } } SCENE { diff --git a/test/battle/ability/intimidate.c b/test/battle/ability/intimidate.c index 0606938d4..001fb8d85 100644 --- a/test/battle/ability/intimidate.c +++ b/test/battle/ability/intimidate.c @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16 DOUBLE_BATTLE_TEST("Intimidate doesn't activate on an empty field in a double battle") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } @@ -171,7 +171,7 @@ DOUBLE_BATTLE_TEST("Intimidate activates on an empty slot") DOUBLE_BATTLE_TEST("Intimidate activates immediately after the mon was switched in as long as one opposing mon is alive") { GIVEN { - PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ELECTRIC_SEED); } OPPONENT(SPECIES_WYNAUT) { HP(1); } @@ -267,7 +267,7 @@ SINGLE_BATTLE_TEST("Intimidate activates when it's no longer effected by Neutral DOUBLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - switching moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_U_TURN; } PARAMETRIZE { move = MOVE_HEALING_WISH; } PARAMETRIZE { move = MOVE_BATON_PASS; } @@ -300,7 +300,8 @@ DOUBLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutral SINGLE_BATTLE_TEST("Intimidate activates when it's no longer affected by Neutralizing Gas - opponent caused switches") { - u32 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_SCRATCH; item = ITEM_EJECT_BUTTON; } PARAMETRIZE { move = MOVE_GROWL; item = ITEM_EJECT_PACK; } PARAMETRIZE { move = MOVE_ROAR; item = ITEM_NONE; } diff --git a/test/battle/ability/intrepid_sword.c b/test/battle/ability/intrepid_sword.c index a260e78d0..2ea924fc2 100644 --- a/test/battle/ability/intrepid_sword.c +++ b/test/battle/ability/intrepid_sword.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage") SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it switches in (Gen8)") { GIVEN { - WITH_CONFIG(GEN_INTREPID_SWORD, GEN_8); + WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WYNAUT); @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it swit SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_INTREPID_SWORD, GEN_9); + WITH_CONFIG(CONFIG_INTREPID_SWORD, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WYNAUT); @@ -112,3 +112,47 @@ SINGLE_BATTLE_TEST("Intrepid Sword and Dauntless Shield both can be Skill Swappe MESSAGE("Wobbuffet's Dauntless Shield raised its Defense!"); } } + +SINGLE_BATTLE_TEST("Intrepid Sword and Dauntless Shield do not proc at max stage (Skill Swap)") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } + } WHEN { + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SKILL_SWAP); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_DAUNTLESS_SHIELD); + ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); + } + } +} + +SINGLE_BATTLE_TEST("Intrepid Sword and Dauntless Shield do not proc at max stage (Baton Pass)") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); + ASSUME(GetMoveEffect(MOVE_IRON_DEFENSE) == EFFECT_DEFENSE_UP_2); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } + } WHEN { + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_IRON_DEFENSE); MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_BATON_PASS); MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } + } SCENE { + NONE_OF { + ABILITY_POPUP(player, ABILITY_DAUNTLESS_SHIELD); + ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD); + } + } +} diff --git a/test/battle/ability/iron_fist.c b/test/battle/ability/iron_fist.c index ae26f9cdd..859c32a3f 100644 --- a/test/battle/ability/iron_fist.c +++ b/test/battle/ability/iron_fist.c @@ -1,4 +1,27 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Iron Fist (Ability) test titles") +SINGLE_BATTLE_TEST("Iron Fist increases the power of punching moves by 20%", s16 damage) +{ + enum Move move; + enum Ability ability; + PARAMETRIZE { move = MOVE_BULLET_PUNCH; ability = ABILITY_IRON_FIST; } + PARAMETRIZE { move = MOVE_BULLET_PUNCH; ability = ABILITY_BLAZE; } + PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_IRON_FIST; } + PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BLAZE; } + + GIVEN { + ASSUME(IsPunchingMove(MOVE_BULLET_PUNCH)); + ASSUME(!IsPunchingMove(MOVE_SCRATCH)); + ASSUME(GetMovePower(MOVE_BULLET_PUNCH) == GetMovePower(MOVE_SCRATCH)); + PLAYER(SPECIES_CHIMCHAR) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.2), results[0].damage); // Iron Fist affects punching moves + EXPECT_EQ(results[2].damage, results[3].damage); // Iron Fist does not affect non-punching moves + } +} diff --git a/test/battle/ability/keen_eye.c b/test/battle/ability/keen_eye.c index 4e645a218..8b8784c1a 100644 --- a/test/battle/ability/keen_eye.c +++ b/test/battle/ability/keen_eye.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY); GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); PLAYER(speciesPlayer) { Ability(abilityPlayer); } OPPONENT(speciesOpponent) { Ability(abilityOpponent); } } WHEN { @@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY); PLAYER(SPECIES_WOBBUFFET); @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; } GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -177,9 +177,9 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; } GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP); - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_STEAL_STATS)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index 94785bd29..b3ccfa3db 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") { - u32 move; + enum Move move; u16 status; PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; } PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; } @@ -31,11 +31,47 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent non-volatile status conditions if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent non-volatile status conditions if Cloud Nine/Air Lock is on the field") +{ + enum Move move; + u32 species; + enum Ability ability; + u16 status; + PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_THUNDER_WAVE; status = STATUS1_PARALYSIS; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_THUNDER_WAVE; status = STATUS1_PARALYSIS; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + // PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway + GIVEN { + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + NONE_OF { + ABILITY_POPUP(player, ABILITY_LEAF_GUARD); + MESSAGE("It doesn't affect Leafeon…"); + } + STATUS_ICON(player, status); + } +} SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Toxic Orb") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_FLAME_ORB; } PARAMETRIZE { item = ITEM_TOXIC_ORB; } GIVEN { @@ -50,29 +86,84 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents status conditions from Flame Orb and Tox NONE_OF { MESSAGE("Leafeon was burned!"); STATUS_ICON(player, burn: TRUE); } } else { - NONE_OF { MESSAGE("Leafeon was badly poisoned!"); STATUS_ICON(player, poison: TRUE); } + NONE_OF { MESSAGE("Leafeon was badly poisoned!"); STATUS_ICON(player, badPoison: TRUE); } } } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent status conditions from Flame Orb and Toxic Orb if Cloud Nine/Air Lock is on the field"); - -SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun") +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent status conditions from Flame Orb and Toxic Orb if Cloud Nine/Air Lock is on the field") { + enum Item item; + u32 species; + enum Ability ability; + PARAMETRIZE { item = ITEM_FLAME_ORB; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { item = ITEM_FLAME_ORB; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } GIVEN { - ASSUME(B_LEAF_GUARD_PREVENTS_REST >= GEN_5); + ASSUME(gItemsInfo[ITEM_FLAME_ORB].holdEffect == HOLD_EFFECT_FLAME_ORB); + ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); Item(item); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); } + } SCENE { + if (item == ITEM_FLAME_ORB) { + MESSAGE("Leafeon was burned!"); + STATUS_ICON(player, burn: TRUE); + } + else { + MESSAGE("Leafeon was badly poisoned!"); + STATUS_ICON(player, badPoison: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Leaf Guard prevents Rest during sun (Gen 5+)") +{ + u32 gen; + PARAMETRIZE { gen = GEN_4; } + PARAMETRIZE { gen = GEN_5; } + GIVEN { + WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, gen); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SUNNY_DAY); MOVE(player, MOVE_REST); } } SCENE { - MESSAGE("But it failed!"); - NONE_OF { + if (gen >= GEN_5) { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + STATUS_ICON(player, sleep: TRUE); + HP_BAR(player); + } + } + else { STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); HP_BAR(player); } } } -TO_DO_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on the field"); +SINGLE_BATTLE_TEST("Leaf Guard doesn't prevent Rest if Cloud Nine/Air Lock is on the field") +{ + u32 species, ability; + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + GIVEN { + WITH_CONFIG(CONFIG_LEAF_GUARD_PREVENTS_REST, GEN_5); + ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); + PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); HP(100); MaxHP(200); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); MOVE(player, MOVE_REST); } + } SCENE { + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REST, player); + HP_BAR(player); + } +} diff --git a/test/battle/ability/levitate.c b/test/battle/ability/levitate.c index 51ac0dca2..0a58cbbd0 100644 --- a/test/battle/ability/levitate.c +++ b/test/battle/ability/levitate.c @@ -11,7 +11,6 @@ SINGLE_BATTLE_TEST("Levitate activates when targeted by ground type moves") TURN { MOVE(opponent, MOVE_MUD_SLAP); } } SCENE { ABILITY_POPUP(player, ABILITY_LEVITATE); - MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); } } @@ -26,7 +25,6 @@ SINGLE_BATTLE_TEST("Levitate does not activate if protected") } SCENE { NONE_OF { ABILITY_POPUP(player, ABILITY_LEVITATE); - MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); } } } @@ -43,7 +41,6 @@ SINGLE_BATTLE_TEST("Levitate does not activate on status moves") } SCENE { NONE_OF { ABILITY_POPUP(player, ABILITY_LEVITATE); - MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); } } } @@ -59,7 +56,6 @@ SINGLE_BATTLE_TEST("Levitate does not activate if attacked by an opponent with M } SCENE { NONE_OF { ABILITY_POPUP(player, ABILITY_LEVITATE); - MESSAGE("Lunatone makes Ground-type moves miss with Levitate!"); } } } @@ -92,7 +88,8 @@ DOUBLE_BATTLE_TEST("Levitate does not cause single remaining target to take high AI_SINGLE_BATTLE_TEST("Levitate is seen correctly by switch AI") { - enum Ability ability = ABILITY_NONE, item = ITEM_NONE; + enum Ability ability = ABILITY_NONE; + enum Item item = ITEM_NONE; PARAMETRIZE { ability = ABILITY_OWN_TEMPO, item = ITEM_NONE ; } PARAMETRIZE { ability = ABILITY_MOLD_BREAKER, item = ITEM_NONE ; } diff --git a/test/battle/ability/libero.c b/test/battle/ability/libero.c index 8ea93df3c..b2ebf5cd5 100644 --- a/test/battle/ability/libero.c +++ b/test/battle/ability/libero.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Libero (Ability) test titles") +// Tests for Libero are handled in test/battle/ability/protean.c diff --git a/test/battle/ability/lightning_rod.c b/test/battle/ability/lightning_rod.c index aec2e7fea..aa14774cf 100644 --- a/test/battle/ability/lightning_rod.c +++ b/test/battle/ability/lightning_rod.c @@ -1,16 +1,20 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack [Gen5+]") +SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the Sp. Attack") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } } WHEN { TURN { MOVE(player, MOVE_THUNDERBOLT); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); HP_BAR(opponent); @@ -29,13 +33,21 @@ SINGLE_BATTLE_TEST("Lightning Rod absorbs Electric-type moves and increases the } ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); } THEN { - EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_LIGHTNING_ROD); // Check if the correct ability has been recorded + if (config >= GEN_5) { + EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_LIGHTNING_ROD); // Check if the correct ability has been recorded + } else { + EXPECT_EQ(gBattleHistory->abilities[1], ABILITY_NONE); + } } } DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to target the Pokémon with this Ability.") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -49,7 +61,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod forces single-target Electric-type moves to ta MOVE(opponentRight, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { HP_BAR(opponentLeft); HP_BAR(opponentRight); @@ -86,7 +98,7 @@ DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") TURN { MOVE(opponentRight, MOVE_THUNDERBOLT, target: playerLeft); } } SCENE { MESSAGE("The opposing Wobbuffet used Thunderbolt!"); - if (B_REDIRECT_ABILITY_ALLIES >= GEN_5) + if (B_REDIRECT_ABILITY_ALLIES >= GEN_4) { NOT HP_BAR(playerLeft); ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD); @@ -100,9 +112,10 @@ DOUBLE_BATTLE_TEST("Lightning Rod redirects an ally's attack") } } -DOUBLE_BATTLE_TEST("Lightning Rod absorbs moves that targets all battlers but does not redirect") +DOUBLE_BATTLE_TEST("Lightning Rod absorbs moves that targets all battlers but does not redirect (Gen6+)") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index a9e5fb4b9..437f8e4c7 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -142,7 +142,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of h { s16 damage; GIVEN { - WITH_CONFIG(GEN_DREAM_EATER_LIQUID_OOZE, GEN_5); + WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); @@ -163,11 +163,11 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of h } } -SINGLE_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP instead of heal (Gen 3-4") +SINGLE_BATTLE_TEST("Liquid Ooze does not cause Dream Eater users to lose HP instead of heal (Gen 3-4)") { s16 damage; GIVEN { - WITH_CONFIG(GEN_DREAM_EATER_LIQUID_OOZE, GEN_3); + WITH_CONFIG(CONFIG_DREAM_EATER_LIQUID_OOZE, GEN_3); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index 56c9a3233..77ca7d4b8 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -1,7 +1,6 @@ #include "global.h" #include "test/battle.h" - SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves") { GIVEN { @@ -20,6 +19,46 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves") } } +SINGLE_BATTLE_TEST("Magic Bounce wont activate if ability user protects") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_TOXIC); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_MAGIC_BOUNCE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, opponent); + STATUS_ICON(player, badPoison: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Magic Bounce wont activate if ability user is in a semi-invulnerable position") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_DIG) == EFFECT_SEMI_INVULNERABLE); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } + } WHEN { + TURN { MOVE(opponent, MOVE_DIG); MOVE(player, MOVE_TOXIC); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DIG, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_MAGIC_BOUNCE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, opponent); + STATUS_ICON(player, badPoison: TRUE); + } + } +} + SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") { GIVEN { @@ -42,6 +81,7 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") SINGLE_BATTLE_TEST("Magic Bounce cannot bounce back powder moves against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_ODDISH); @@ -62,7 +102,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting both foes at two foe { GIVEN { ASSUME(GetMoveEffect(MOVE_LEER) == EFFECT_DEFENSE_DOWN); - ASSUME(GetMoveTarget(MOVE_LEER) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_LEER) == TARGET_BOTH); PLAYER(SPECIES_ABRA); PLAYER(SPECIES_KADABRA); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } @@ -94,7 +134,7 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field") battlerTwo = SPECIES_ESPEON; abilityBattlerTwo = ABILITY_MAGIC_BOUNCE; } GIVEN { - ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == MOVE_TARGET_OPPONENTS_FIELD); + ASSUME(GetMoveTarget(MOVE_STEALTH_ROCK) == TARGET_OPPONENTS_FIELD); PLAYER(SPECIES_ABRA); PLAYER(SPECIES_KADABRA); OPPONENT(battlerOne) { Ability(abilityBattlerOne); } diff --git a/test/battle/ability/magic_guard.c b/test/battle/ability/magic_guard.c index adcfdfc5a..7c080c1fa 100644 --- a/test/battle/ability/magic_guard.c +++ b/test/battle/ability/magic_guard.c @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Magic Guard ignores immobilization that can be caused by par else PASSES_RANDOMLY(75, 100, RNG_PARALYSIS); GIVEN { - PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS);} + PLAYER(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } @@ -35,10 +35,10 @@ SINGLE_BATTLE_TEST("Magic Guard ignores immobilization that can be caused by par SINGLE_BATTLE_TEST("Magic Guard does not ignore speed stat changes caused by paralysis") { GIVEN { - PLAYER(SPECIES_CLEFABLE) { Speed(100); Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS);} + PLAYER(SPECIES_CLEFABLE) { Speed(100); Ability(ABILITY_MAGIC_GUARD); Status1(STATUS1_PARALYSIS); } OPPONENT(SPECIES_WOBBUFFET) { Speed(99); } } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); diff --git a/test/battle/ability/mimicry.c b/test/battle/ability/mimicry.c index 5cdea7276..d4d2c5395 100644 --- a/test/battle/ability/mimicry.c +++ b/test/battle/ability/mimicry.c @@ -12,7 +12,7 @@ static const u16 terrainData[][2] = SINGLE_BATTLE_TEST("Mimicry changes the battler's type based on Terrain") { u32 j; - u32 terrainMove = MOVE_NONE; + enum Move terrainMove = MOVE_NONE; enum Type terrainType = TYPE_NONE; for (j = 0; j < ARRAY_COUNT(terrainData); j++) @@ -31,6 +31,7 @@ SINGLE_BATTLE_TEST("Mimicry changes the battler's type based on Terrain") case MOVE_PSYCHIC_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Psychic!"); break; case MOVE_GRASSY_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Grass!"); break; case MOVE_MISTY_TERRAIN: MESSAGE("The opposing Stunfisk's type changed to Fairy!"); break; + default: break; } } THEN { EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], terrainType); @@ -41,8 +42,8 @@ SINGLE_BATTLE_TEST("Mimicry changes the battler's type based on Terrain") SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed by Steel Roller and Ice Spinner") { u32 j; - u32 terrainMove = MOVE_NONE; - u32 removeTerrainMove = MOVE_NONE; + enum Move terrainMove = MOVE_NONE; + enum Move removeTerrainMove = MOVE_NONE; for (j = 0; j < ARRAY_COUNT(terrainData); j++) { @@ -53,7 +54,7 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed GIVEN { ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 0) == TYPE_GROUND); ASSUME(GetSpeciesType(SPECIES_STUNFISK_GALAR, 1) == TYPE_STEEL); - PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_STUNFISK_GALAR) { Ability(ABILITY_MIMICRY); } } WHEN { TURN { MOVE(opponent, terrainMove); MOVE(player, removeTerrainMove); } @@ -64,6 +65,7 @@ SINGLE_BATTLE_TEST("Mimicry restores the battler's types when terrain is removed case MOVE_PSYCHIC_TERRAIN: MESSAGE("The weirdness disappeared from the battlefield!"); break; case MOVE_GRASSY_TERRAIN: MESSAGE("The grass disappeared from the battlefield."); break; case MOVE_MISTY_TERRAIN: MESSAGE("The mist disappeared from the battlefield."); break; + default: break; } } THEN { EXPECT_EQ(gBattleMons[B_POSITION_OPPONENT_LEFT].types[0], TYPE_GROUND); diff --git a/test/battle/ability/minds_eye.c b/test/battle/ability/minds_eye.c index 4ac339d89..cd19eda4a 100644 --- a/test/battle/ability/minds_eye.c +++ b/test/battle/ability/minds_eye.c @@ -3,12 +3,12 @@ SINGLE_BATTLE_TEST("Mind's Eye allows to hit Ghost-type Pokémon with Normal- and Fighting-type moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_KARATE_CHOP; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_MINDS_EYE); }; + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_MINDS_EYE); } OPPONENT(SPECIES_GASTLY); } WHEN { TURN { MOVE(player, move); } @@ -21,13 +21,13 @@ SINGLE_BATTLE_TEST("Mind's Eye allows to hit Ghost-type Pokémon with Normal- an // No current official way to test this, effect based on Smogon's NatDex format. SINGLE_BATTLE_TEST("Mind's Eye doesn't bypass a Ghost-type's Wonder Guard") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_KARATE_CHOP; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SCRAPPY); }; - OPPONENT(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); }; + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SCRAPPY); } + OPPONENT(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); } } WHEN { TURN { MOVE(player, move); } } SCENE { @@ -36,7 +36,6 @@ SINGLE_BATTLE_TEST("Mind's Eye doesn't bypass a Ghost-type's Wonder Guard") HP_BAR(opponent); } ABILITY_POPUP(opponent, ABILITY_WONDER_GUARD); - MESSAGE("The opposing Shedinja avoided damage with Wonder Guard!"); } } diff --git a/test/battle/ability/mirror_armor.c b/test/battle/ability/mirror_armor.c index 7d027398f..cdb9b2d8b 100644 --- a/test/battle/ability/mirror_armor.c +++ b/test/battle/ability/mirror_armor.c @@ -3,17 +3,18 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon") { - u16 move, statId; + enum Move move; + u32 statId; - PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; } - PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; } + PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; } + PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; } PARAMETRIZE { move = MOVE_SWEET_SCENT; statId = STAT_EVASION; } PARAMETRIZE { move = MOVE_SAND_ATTACK; statId = STAT_ACC; } - PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; } - PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; } + PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; } + PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; } GIVEN { - PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR);} + PLAYER(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(opponent, move); } @@ -29,7 +30,11 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon") MESSAGE("The opposing Wynaut's Attack fell!"); break; case STAT_EVASION: - MESSAGE("The opposing Wynaut's evasiveness harshly fell!"); + if (GetMoveEffect(move) == EFFECT_EVASION_DOWN_2) { + MESSAGE("The opposing Wynaut's evasiveness harshly fell!"); + } else { + MESSAGE("The opposing Wynaut's evasiveness fell!"); + } break; case STAT_ACC: MESSAGE("The opposing Wynaut's accuracy fell!"); @@ -43,7 +48,7 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon") } } THEN { EXPECT_EQ(player->statStages[statId], DEFAULT_STAT_STAGE); - EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || statId == STAT_EVASION) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || (statId == STAT_EVASION && GetMoveEffect(move) == EFFECT_EVASION_DOWN_2)) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1); } } @@ -125,8 +130,8 @@ SINGLE_BATTLE_TEST("Mirror Armor doesn't lower the stats of an attacking Pokemon SINGLE_BATTLE_TEST("Mirror Armor raises the stat of an attacking Pokemon with Contrary") { GIVEN { - PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR);} - OPPONENT(SPECIES_SHUCKLE) {Ability(ABILITY_CONTRARY);} + PLAYER(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); } + OPPONENT(SPECIES_SHUCKLE) { Ability(ABILITY_CONTRARY); } } WHEN { TURN { MOVE(opponent, MOVE_LEER); } } SCENE { @@ -143,7 +148,7 @@ SINGLE_BATTLE_TEST("Mirror Armor raises the stat of an attacking Pokemon with Co SINGLE_BATTLE_TEST("Mirror Armor doesn't lower the stat of the attacking Pokemon if it is already at -6") { GIVEN { - PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR);} + PLAYER(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(player, MOVE_SCREECH); } @@ -173,15 +178,15 @@ DOUBLE_BATTLE_TEST("Mirror Armor lowers Speed of the partner Pokemon after Court ASSUME(GetMoveEffect(MOVE_COURT_CHANGE) == EFFECT_COURT_CHANGE); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); } + PLAYER(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); } OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_STICKY_WEB); } TURN { MOVE(opponentLeft, MOVE_COURT_CHANGE); } - TURN { SWITCH(playerRight, 2);} - TURN { } + TURN { SWITCH(playerRight, 2); } + TURN {} } SCENE { MESSAGE("Wobbuffet used Sticky Web!"); MESSAGE("The opposing Wynaut used Court Change!"); @@ -224,3 +229,24 @@ SINGLE_BATTLE_TEST("Mirror Armor reflects Obstruct defense drop") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); } } + +SINGLE_BATTLE_TEST("Mirror Armor does not trigger if the user is behind a Substitute") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } + OPPONENT(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); } + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ABILITY_POPUP(player, ABILITY_TANGLING_HAIR); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + ABILITY_POPUP(opponent, ABILITY_MIRROR_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } + } +} diff --git a/test/battle/ability/mold_breaker.c b/test/battle/ability/mold_breaker.c index 2c04deeee..fb6f9d11a 100644 --- a/test/battle/ability/mold_breaker.c +++ b/test/battle/ability/mold_breaker.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Mold Breaker (Ability) test titles") +SINGLE_BATTLE_TEST("Mold Breaker cancels damage reduction from Ice Scales", s16 damage) +{ + u16 ability; + PARAMETRIZE { ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { ability = ABILITY_MOLD_BREAKER; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_PSYCHIC) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_FROSMOTH) { Ability(ABILITY_ICE_SCALES); } + } WHEN { + TURN { MOVE(player, MOVE_PSYCHIC); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, UQ_4_12(0.5), results[0].damage); + } +} + +TO_DO_BATTLE_TEST("TODO: Write more Mold Breaker (Ability) test titles") diff --git a/test/battle/ability/moody.c b/test/battle/ability/moody.c index d52f6e9ce..ca04ec1f7 100644 --- a/test/battle/ability/moody.c +++ b/test/battle/ability/moody.c @@ -11,11 +11,11 @@ SINGLE_BATTLE_TEST("Moody randomly raises the user's Attack, Defense, Sp. Atk, S // HP is not included PASSES_RANDOMLY(1, statsNum - 1, RNG_MOODY_INCREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_MOODY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -36,11 +36,11 @@ SINGLE_BATTLE_TEST("Moody randomly lowers the user's Attack, Defense, Sp. Atk, S // One stat becomes unavailable due to it already increasing PASSES_RANDOMLY(1, statsNum - 2, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_MOODY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -60,11 +60,11 @@ SINGLE_BATTLE_TEST("Moody randomly raises the holder's Attack, Defense, Sp. Atk, PASSES_RANDOMLY(statsNum - 1, statsNum - 1, RNG_MOODY_DECREASE); GIVEN { - WITH_CONFIG(GEN_CONFIG_MOODY_STATS, config); + WITH_CONFIG(CONFIG_MOODY_ACC_EVASION, config); PLAYER(SPECIES_OCTILLERY) { Ability(ABILITY_MOODY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_MOODY); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); diff --git a/test/battle/ability/motor_drive.c b/test/battle/ability/motor_drive.c index 7ee02328e..8fcf28eee 100644 --- a/test/battle/ability/motor_drive.c +++ b/test/battle/ability/motor_drive.c @@ -24,9 +24,9 @@ DOUBLE_BATTLE_TEST("Motor Drive absorbs moves that target all battlers but does } WHEN { TURN { MOVE(playerLeft, MOVE_DISCHARGE); } } SCENE { + ABILITY_POPUP(opponentRight, ABILITY_MOTOR_DRIVE); HP_BAR(opponentLeft); HP_BAR(playerRight); NOT HP_BAR(opponentRight); - ABILITY_POPUP(opponentRight, ABILITY_MOTOR_DRIVE); } } diff --git a/test/battle/ability/moxie.c b/test/battle/ability/moxie.c index 01eb51b9e..70a6a707f 100644 --- a/test/battle/ability/moxie.c +++ b/test/battle/ability/moxie.c @@ -9,14 +9,14 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; } PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_SNORUNT) { HP(1); } OPPONENT(SPECIES_GLALIE) { HP(1); } OPPONENT(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_ABRA); } WHEN { - TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); SEND_OUT(opponentLeft, 2); } + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); SEND_OUT(opponentLeft, 2); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); MESSAGE("The opposing Glalie fainted!"); @@ -49,7 +49,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to in OPPONENT(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_ABRA); } WHEN { - TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentRight); SEND_OUT(opponentLeft, 2); } + TURN { MOVE(playerRight, MOVE_QUICK_ATTACK, target: opponentRight); SEND_OUT(opponentLeft, 2); } } SCENE { int i; @@ -121,7 +121,7 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the sa PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); PLAYER(species) { Ability(ability); } PLAYER(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c index 990fba7a0..fa89bf0a8 100644 --- a/test/battle/ability/mummy.c +++ b/test/battle/ability/mummy.c @@ -3,11 +3,12 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on contact") { - u32 move, species; + enum Move move; + u32 species; enum Ability ability; PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK;} + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; } PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } GIVEN { diff --git a/test/battle/ability/mycelium_might.c b/test/battle/ability/mycelium_might.c index 7ffac1c64..e5a8b569e 100644 --- a/test/battle/ability/mycelium_might.c +++ b/test/battle/ability/mycelium_might.c @@ -34,7 +34,7 @@ SINGLE_BATTLE_TEST("Mycelium Might ignores opposing abilities") { GIVEN { PLAYER(SPECIES_TOEDSCOOL) { Speed(100); Ability(ABILITY_MYCELIUM_MIGHT); } - OPPONENT(SPECIES_BELDUM) { Speed(1); Ability(ABILITY_CLEAR_BODY);} + OPPONENT(SPECIES_BELDUM) { Speed(1); Ability(ABILITY_CLEAR_BODY); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SCREECH); } } SCENE { @@ -51,7 +51,7 @@ SINGLE_BATTLE_TEST("Mycelium Might vs Stall action order depends on speed") PARAMETRIZE { speed = 101; } GIVEN { PLAYER(SPECIES_TOEDSCOOL) { Speed(100); Ability(ABILITY_MYCELIUM_MIGHT); } - OPPONENT(SPECIES_SABLEYE) { Speed(speed); Ability(ABILITY_STALL);} + OPPONENT(SPECIES_SABLEYE) { Speed(speed); Ability(ABILITY_STALL); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } } SCENE { diff --git a/test/battle/ability/neuroforce.c b/test/battle/ability/neuroforce.c index 32f3e91e5..e469032ac 100644 --- a/test/battle/ability/neuroforce.c +++ b/test/battle/ability/neuroforce.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves by 25%", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SHADOW_BALL; } PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_SHADOW_BALL; } diff --git a/test/battle/ability/neutralizing_gas.c b/test/battle/ability/neutralizing_gas.c index 2bf9cd184..d1e67dc79 100644 --- a/test/battle/ability/neutralizing_gas.c +++ b/test/battle/ability/neutralizing_gas.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas activates on switch-in") PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas prevents opponent's switch-in ability from PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } OPPONENT(SPECIES_ZEKROM) { Ability(ABILITY_TERAVOLT); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); NONE_OF { @@ -38,7 +38,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas prevents ally's switch-in ability from acti OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); NONE_OF { @@ -51,7 +51,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas prevents ally's switch-in ability from acti DOUBLE_BATTLE_TEST("Neutralizing Gas ignores all battlers' ability effects") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } OPPONENT(SPECIES_LANTURN) { Ability(ABILITY_WATER_ABSORB); } @@ -243,7 +243,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas prevents Trace from copying it") PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); NONE_OF { @@ -310,3 +310,89 @@ SINGLE_BATTLE_TEST("Neutralizing Gas exiting the field does not activate Imposte NOT ABILITY_POPUP(player, ABILITY_IMPOSTER); } } + +SINGLE_BATTLE_TEST("Neutralizing Gas exiting the field does not activate Air Lock/Cloud Nine but their effects are kept") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(species) { Ability(ability); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_LUDICOLO) { Ability(ABILITY_RAIN_DISH); } + } WHEN { + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_RAIN_DANCE); } + } SCENE { + NOT ABILITY_POPUP(player, ABILITY_AIR_LOCK); + MESSAGE("The effects of the neutralizing gas wore off!"); + NOT ABILITY_POPUP(player, ABILITY_AIR_LOCK); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + NOT ABILITY_POPUP(opponent, ABILITY_RAIN_DISH); + } +} + +SINGLE_BATTLE_TEST("Neutralizing Gas only displays exiting message for the last user leaving the field") +{ + GIVEN { + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("The effects of the neutralizing gas wore off!"); + NOT MESSAGE("The effects of the neutralizing gas wore off!"); + } +} + +DOUBLE_BATTLE_TEST("Neutralizing Gas is active for the duration of a Spread Move even if Neutralizing Gas is no longer on the field") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_ORIGIN_PULSE) == TARGET_BOTH); + PLAYER(SPECIES_WEEZING) { HP(1); Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_GOLEM) { Ability(ABILITY_STURDY); } + OPPONENT(SPECIES_BASCULEGION) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_ORIGIN_PULSE); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ORIGIN_PULSE, opponentLeft); + HP_BAR(playerLeft); + HP_BAR(playerRight); + MESSAGE("Weezing fainted!"); + MESSAGE("Golem fainted!"); + NOT ABILITY_POPUP(playerRight, ABILITY_STURDY); + } +} + +DOUBLE_BATTLE_TEST("Neutralizing Gas is active until the last Dragon Darts hit even if Neutralizing Gas is no longer on the field") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_DRAGON_DARTS) == TARGET_SMART); + PLAYER(SPECIES_WEEZING) { HP(1); Ability(ABILITY_NEUTRALIZING_GAS); } + PLAYER(SPECIES_GOLEM) { HP(2); MaxHP(2); Ability(ABILITY_STURDY); } + OPPONENT(SPECIES_BASCULEGION) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_DRAGON_DARTS, target: playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, opponentLeft); + HP_BAR(playerLeft); + MESSAGE("Weezing fainted!"); + HP_BAR(playerRight); + NOT MESSAGE("Golem fainted!"); + ABILITY_POPUP(playerRight, ABILITY_STURDY); + } +} diff --git a/test/battle/ability/normalize.c b/test/battle/ability/normalize.c index 79f41d204..b85db768d 100644 --- a/test/battle/ability/normalize.c +++ b/test/battle/ability/normalize.c @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move") GIVEN { ASSUME(GetSpeciesType(SPECIES_GASTLY, 0) == TYPE_GHOST); PLAYER(SPECIES_GASTLY); - OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN);} + OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } } SCENE { @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Normalize affects status moves") ASSUME(GetMoveType(MOVE_THUNDER_WAVE) == TYPE_ELECTRIC); ASSUME(GetSpeciesType(SPECIES_DRILBUR, 0) == TYPE_GROUND); PLAYER(SPECIES_DRILBUR); - OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE);} + OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_THUNDER_WAVE); } } WHEN { TURN { MOVE(opponent, MOVE_THUNDER_WAVE); } } SCENE { @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t ASSUME(GetMoveEffect(MOVE_FREEZE_DRY) == EFFECT_SUPER_EFFECTIVE_ON_ARG); ASSUME(GetSpeciesType(SPECIES_MUDKIP, 0) == TYPE_WATER); PLAYER(SPECIES_MUDKIP); - OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY);} + OPPONENT(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_FREEZE_DRY); } } WHEN { TURN { MOVE(opponent, MOVE_FREEZE_DRY); } } SCENE { @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_DELCATTY) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -125,7 +125,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Ge PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_6); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_6); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s1 PARAMETRIZE { ability = ABILITY_NORMALIZE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, GEN_7); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, GEN_7); PLAYER(SPECIES_SKITTY) { Ability(ability); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -184,7 +184,7 @@ SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Delu SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage) { - u16 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_CUTE_CHARM; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_CUTE_CHARM; } @@ -232,7 +232,8 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type") SINGLE_BATTLE_TEST("Normalize doesn't affect Judgment / Techno Blast / Multi-Attack's type") { - u16 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; } PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; } diff --git a/test/battle/ability/oblivious.c b/test/battle/ability/oblivious.c index c160ab423..03f71d7f5 100644 --- a/test/battle/ability/oblivious.c +++ b/test/battle/ability/oblivious.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_OBLIVIOUS_TAUNT, gen); + WITH_CONFIG(CONFIG_OBLIVIOUS_TAUNT, gen); ASSUME(GetMoveEffect(MOVE_TAUNT) == EFFECT_TAUNT); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Oblivious prevents Taunt (Gen6+)") SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Oblivious doesn't prevent Intimidate (Gen3-7)") SINGLE_BATTLE_TEST("Oblivious prevents Intimidate (Gen8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OBLIVIOUS); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } diff --git a/test/battle/ability/opportunist.c b/test/battle/ability/opportunist.c index 6e5b13dd3..261aa9a15 100644 --- a/test/battle/ability/opportunist.c +++ b/test/battle/ability/opportunist.c @@ -218,7 +218,7 @@ DOUBLE_BATTLE_TEST("Opportunist copies the stat of each Pokémon that were raise OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_INTREPID_SWORD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); @@ -281,7 +281,7 @@ SINGLE_BATTLE_TEST("Opportunist and Mirror Herb stack stat increases") PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); Item(ITEM_MIRROR_HERB); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_INTREPID_SWORD); ABILITY_POPUP(opponent, ABILITY_OPPORTUNIST); @@ -303,7 +303,7 @@ DOUBLE_BATTLE_TEST("Opportunist and Mirror Herb resolve correctly") OPPONENT(SPECIES_MEOWSCARADA) { Item(ITEM_MIRROR_HERB); } OPPONENT(SPECIES_ESPATHRA) { Ability(ABILITY_OPPORTUNIST); Item(ITEM_MIRROR_HERB); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTREPID_SWORD); ABILITY_POPUP(opponentRight, ABILITY_OPPORTUNIST); @@ -315,3 +315,5 @@ DOUBLE_BATTLE_TEST("Opportunist and Mirror Herb resolve correctly") EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); } } + +TO_DO_BATTLE_TEST("Opportunist copies stat changes from the opponent's X Attack and other stat-boosting items.") diff --git a/test/battle/ability/orichalcum_pulse.c b/test/battle/ability/orichalcum_pulse.c index 295e0db23..62509ce0c 100644 --- a/test/battle/ability/orichalcum_pulse.c +++ b/test/battle/ability/orichalcum_pulse.c @@ -1,5 +1,112 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Orichalcum Pulse sets up sun for 5 turns"); -TO_DO_BATTLE_TEST("Orichalcum Pulse boosts the Pokémon's Attack by 33% in sun, even if it's holding an Utility Umbrella"); +SINGLE_BATTLE_TEST("Orichalcum Pulse sets up sun for 5 turns") +{ + GIVEN { + PLAYER(SPECIES_KORAIDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_ORICHALCUM_PULSE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ORICHALCUM_PULSE); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight faded."); + } +} + +SINGLE_BATTLE_TEST("Orichalcum Pulse sets up sun for 8 turns with Heat Rock") +{ + GIVEN { + PLAYER(SPECIES_KORAIDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_ORICHALCUM_PULSE); Item(ITEM_HEAT_ROCK); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ORICHALCUM_PULSE); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight is strong."); + MESSAGE("The sunlight faded."); + } +} + +SINGLE_BATTLE_TEST("Orichalcum Pulse boosts physical moves by 33% in sun", s16 damage) +{ + u16 setupMove; + PARAMETRIZE { setupMove = MOVE_CELEBRATE; } + PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_KORAIDON) { Ability(ABILITY_ORICHALCUM_PULSE); Moves(MOVE_SCRATCH); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_RAIN_DANCE, MOVE_CELEBRATE); Speed(10); } + } WHEN { + TURN { MOVE(opponent, setupMove); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ORICHALCUM_PULSE); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.3333), results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Orichalcum Pulse boost applies even if the target holds Utility Umbrella", s16 damage) +{ + u16 targetItem; + PARAMETRIZE { targetItem = ITEM_NONE; } + PARAMETRIZE { targetItem = ITEM_UTILITY_UMBRELLA; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_KORAIDON) { Ability(ABILITY_ORICHALCUM_PULSE); Moves(MOVE_SCRATCH); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(10); Item(targetItem); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ORICHALCUM_PULSE); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_EQ(results[0].damage, results[1].damage); + } +} + +SINGLE_BATTLE_TEST("Orichalcum Pulse does not boost physical moves if holder has Utility Umbrella", s16 damage) +{ + u16 holdItem; + PARAMETRIZE { holdItem = ITEM_NONE; } + PARAMETRIZE { holdItem = ITEM_UTILITY_UMBRELLA; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_KORAIDON) { Ability(ABILITY_ORICHALCUM_PULSE); Moves(MOVE_SCRATCH); Speed(5); Item(holdItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ORICHALCUM_PULSE); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[1].damage, Q_4_12(1.3333), results[0].damage); + } +} diff --git a/test/battle/ability/overcoat.c b/test/battle/ability/overcoat.c index cfdbad7de..461c08ee7 100644 --- a/test/battle/ability/overcoat.c +++ b/test/battle/ability/overcoat.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Overcoat blocks powder and spore moves (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_OVERCOAT, gen); + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } @@ -52,7 +52,8 @@ DOUBLE_BATTLE_TEST("Overcoat blocks damage from sandstorm") DOUBLE_BATTLE_TEST("Overcoat blocks damage from hail") { GIVEN { - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_WYNAUT) { Speed(50); Ability(ABILITY_SNOW_CLOAK); } PLAYER(SPECIES_SOLOSIS) { Speed(40); Ability(ABILITY_RUN_AWAY); } OPPONENT(SPECIES_PINECO) { Speed(30); Ability(ABILITY_OVERCOAT); } @@ -71,17 +72,29 @@ DOUBLE_BATTLE_TEST("Overcoat blocks damage from hail") } } -SINGLE_BATTLE_TEST("Overcoat blocks Effect Spore's effect") +SINGLE_BATTLE_TEST("Overcoat blocks Effect Spore's effect (Gen6+)") { + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } GIVEN { - PLAYER(SPECIES_PINECO) {Ability(ABILITY_OVERCOAT);} - OPPONENT(SPECIES_SHROOMISH) {Ability(ABILITY_EFFECT_SPORE);} + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, config); + PLAYER(SPECIES_PINECO) { Ability(ABILITY_OVERCOAT); } + OPPONENT(SPECIES_SHROOMISH) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { TURN { MOVE(player, MOVE_TACKLE, WITH_RNG(RNG_EFFECT_SPORE, 1)); } } SCENE { MESSAGE("Pineco used Tackle!"); - NOT ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + if (config == GEN_6) { + NOT ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + } + else { + ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); + } } THEN { - EXPECT_EQ(player->status1, 0); + if (config == GEN_6) + EXPECT_EQ(player->status1, 0); + else + EXPECT_NE(player->status1, 0); } } diff --git a/test/battle/ability/own_tempo.c b/test/battle/ability/own_tempo.c index bbd709c57..06b6f366f 100644 --- a/test/battle/ability/own_tempo.c +++ b/test/battle/ability/own_tempo.c @@ -4,12 +4,12 @@ SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_INTIMIDATE); NONE_OF { @@ -22,10 +22,10 @@ SINGLE_BATTLE_TEST("Own Tempo doesn't prevent Intimidate (Gen3-7)") SINGLE_BATTLE_TEST("Own Tempo prevents Intimidate but no other stat down changes (Gen8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8); + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { TURN { MOVE(player, MOVE_SCARY_FACE); } } SCENE { @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the opponent") GIVEN { ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { TURN { MOVE(player, MOVE_CONFUSE_RAY); } } SCENE { @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from moves by the user") GIVEN { ASSUME(MoveHasAdditionalEffectSelf(MOVE_PETAL_DANCE, MOVE_EFFECT_THRASH)); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { TURN { MOVE(opponent, MOVE_PETAL_DANCE); } TURN { MOVE(opponent, MOVE_PETAL_DANCE); } @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Mold Breaker ignores Own Tempo") GIVEN { ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { TURN { MOVE(player, MOVE_CONFUSE_RAY); } } SCENE { @@ -92,8 +92,8 @@ SINGLE_BATTLE_TEST("Mold Breaker does not prevent Own Tempo from curing confusio { GIVEN { ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); - PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); }; - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + PLAYER(SPECIES_PINSIR) { Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } } WHEN { TURN { MOVE(player, MOVE_CONFUSE_RAY); } } SCENE { @@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Own Tempo cures confusion if it's obtained via Skill Swap") GIVEN { ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); - PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); }; + PLAYER(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CONFUSE_RAY); } @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Own Tempo prevents confusion from items") GIVEN { ASSUME(gItemsInfo[ITEM_BERSERK_GENE].holdEffect == HOLD_EFFECT_BERSERK_GENE); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); Item(ITEM_BERSERK_GENE); }; + OPPONENT(SPECIES_SLOWPOKE) { Ability(ABILITY_OWN_TEMPO); Item(ITEM_BERSERK_GENE); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index 1909efe28..d65bdd91b 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -49,15 +49,15 @@ SINGLE_BATTLE_TEST("Parental Bond does not convert a move with three or more str SINGLE_BATTLE_TEST("Parental Bond converts multi-target moves into a two-strike move in Single Battles") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_EARTHQUAKE; } PARAMETRIZE { move = MOVE_ICY_WIND; } GIVEN { ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveStrikeCount(MOVE_ICY_WIND) < 2); - ASSUME(GetMoveTarget(MOVE_ICY_WIND) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_ICY_WIND) == TARGET_BOTH); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -79,7 +79,7 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two { GIVEN { ASSUME(GetMoveStrikeCount(MOVE_EARTHQUAKE) < 2); - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } PLAYER(SPECIES_PIDGEY); @@ -105,12 +105,14 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod/Storm Drain mons") { - u16 move, species; + enum Move move; + u32 species; enum Type type; enum Ability ability; PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; } - PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } + PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveStrikeCount(move) < 2); ASSUME(GetMoveType(move) == type); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } @@ -141,9 +143,9 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_COMET_PUNCH)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -170,9 +172,9 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_COMET_PUNCH)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -200,9 +202,9 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_COMET_PUNCH)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -231,9 +233,9 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); ASSUME(GetMoveCategory(MOVE_COMET_PUNCH) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveEffect(MOVE_COMET_PUNCH) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_COMET_PUNCH)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -354,6 +356,22 @@ SINGLE_BATTLE_TEST("Parental Bond does not trigger on two turn attacks") } } +SINGLE_BATTLE_TEST("Parental Bond does not trigger Scale Shot effect on Drain Punch") +{ + GIVEN { + PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAIN_PUNCH, gimmick: GIMMICK_MEGA); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAIN_PUNCH, player); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } +} + TO_DO_BATTLE_TEST("Parental Bond tests"); // Temporary TODO: Convert Bulbapedia description into tests. diff --git a/test/battle/ability/perish_body.c b/test/battle/ability/perish_body.c index 92562ef88..500fe8017 100644 --- a/test/battle/ability/perish_body.c +++ b/test/battle/ability/perish_body.c @@ -2,3 +2,4 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Perish Body (Ability) test titles") + diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index cc9ae37e9..bf7482336 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Pickup grants an item used by another Pokémon") WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_PICKUP_WILD, GEN_9); + WITH_CONFIG(CONFIG_PICKUP_WILD, GEN_9); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/pixilate.c b/test/battle/ability/pixilate.c index faa9b3573..ed9fa6591 100644 --- a/test/battle/ability/pixilate.c +++ b/test/battle/ability/pixilate.c @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30 PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_SYLVEON) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30 SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage) { - u16 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; } @@ -96,7 +96,8 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type") SINGLE_BATTLE_TEST("Pixilate doesn't affect Judgment / Techno Blast / Multi-Attack's type") { - u16 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; } PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; } diff --git a/test/battle/ability/poison_heal.c b/test/battle/ability/poison_heal.c index 2ee7620c6..9d7acc38a 100644 --- a/test/battle/ability/poison_heal.c +++ b/test/battle/ability/poison_heal.c @@ -28,8 +28,8 @@ SINGLE_BATTLE_TEST("Poison Heal heals from Toxic Poison damage are constant") PLAYER(SPECIES_SHROOMISH) { Ability(ABILITY_POISON_HEAL); Status1(STATUS1_TOXIC_POISON); HP(1), MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_POISON_HEAL); MESSAGE("The poisoning healed Shroomish a little bit!"); diff --git a/test/battle/ability/poison_point.c b/test/battle/ability/poison_point.c index 243ed51bb..f2258dbb3 100644 --- a/test/battle/ability/poison_point.c +++ b/test/battle/ability/poison_point.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Poison Point inflicts poison on contact") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { @@ -31,11 +31,14 @@ SINGLE_BATTLE_TEST("Poison Point inflicts poison on contact") } } -SINGLE_BATTLE_TEST("Poison Point triggers 30% of the time") +SINGLE_BATTLE_TEST("Poison Point triggers 1/3 times (Gen3) or 30% (Gen 4+) of the time") { - PASSES_RANDOMLY(3, 10, RNG_POISON_POINT); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 3; } // 33.3% + PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% + PASSES_RANDOMLY(passes, trials, RNG_POISON_POINT); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_NIDORAN_M) { Ability(ABILITY_POISON_POINT); } diff --git a/test/battle/ability/poison_puppeteer.c b/test/battle/ability/poison_puppeteer.c index db2769141..4c830a792 100644 --- a/test/battle/ability/poison_puppeteer.c +++ b/test/battle/ability/poison_puppeteer.c @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Poison Puppeteer confuses target if it was poisoned by a dam SINGLE_BATTLE_TEST("Poison Puppeteer confuses target if it was (badly) poisoned by a status move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_POISON_POWDER; } PARAMETRIZE { move = MOVE_TOXIC; } @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Poison Puppeteer does not trigger if poison is Toxic Spikes OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_TOXIC_SPIKES);} + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } TURN { SWITCH(opponent, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); diff --git a/test/battle/ability/poison_touch.c b/test/battle/ability/poison_touch.c index 6678394e6..7f5764684 100644 --- a/test/battle/ability/poison_touch.c +++ b/test/battle/ability/poison_touch.c @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Poison Touch has a 30% chance to poison when attacking with SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } @@ -54,11 +54,11 @@ SINGLE_BATTLE_TEST("Poison Touch only applies when using contact moves") SINGLE_BATTLE_TEST("Poison Touch applies between multi-hit move hits") { GIVEN { - ASSUME(GetMoveEffect(MOVE_ARM_THRUST) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_ARM_THRUST)); ASSUME(MoveMakesContact(MOVE_ARM_THRUST)); ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); PLAYER(SPECIES_GRIMER) { Ability(ABILITY_POISON_TOUCH); } - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_PECHA_BERRY); } } WHEN { TURN { MOVE(player, MOVE_ARM_THRUST); } } SCENE { diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index 32627c59f..70d35f9e4 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon (Ge PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon (Ge SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon after they switch-in") { GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } @@ -64,10 +64,10 @@ SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CONFUSE_RAY); }; + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CONFUSE_RAY); } } WHEN { TURN { MOVE(opponent, MOVE_ASSIST); } } SCENE { @@ -87,9 +87,9 @@ DOUBLE_BATTLE_TEST("Prankster-affected moves called via Instruct do not affect D PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } - PLAYER(SPECIES_WOBBUFFET) { Speed(10);} + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_UMBREON) { Speed(15); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_UMBREON) { Speed(1); } @@ -134,7 +134,7 @@ DOUBLE_BATTLE_TEST("Moves called via Prankster-affected After you affect Dark-ty { GIVEN { PLAYER(SPECIES_VOLBEAT) { Speed(1); Ability(ABILITY_PRANKSTER); } - PLAYER(SPECIES_WOBBUFFET) { Speed(1);} + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_UMBREON) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } } WHEN { @@ -167,7 +167,7 @@ SINGLE_BATTLE_TEST("Prankster is blocked by Quick Guard in Gen5+") DOUBLE_BATTLE_TEST("Prankster-affected moves that target all Pokémon are successful regardless of the presence of Dark-type Pokémon") { GIVEN { - ASSUME(GetMoveTarget(MOVE_CAPTIVATE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_CAPTIVATE) == TARGET_BOTH); PLAYER(SPECIES_ILLUMISE) { Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_UMBREON); @@ -203,7 +203,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat c PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_SABLEYE) { Ability(sableyeAbility); } OPPONENT(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } } WHEN { diff --git a/test/battle/ability/primordial_sea.c b/test/battle/ability/primordial_sea.c index 39d350d3a..480838886 100644 --- a/test/battle/ability/primordial_sea.c +++ b/test/battle/ability/primordial_sea.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves") { GIVEN { - PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB);} + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_EMBER); } @@ -34,11 +34,11 @@ DOUBLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves and prints th GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_ERUPTION)); ASSUME(GetMoveType(MOVE_ERUPTION) == TYPE_FIRE); - ASSUME(GetMoveTarget(MOVE_ERUPTION) == MOVE_TARGET_BOTH); - PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB); {Speed(5);}} - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(10);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(8);} + ASSUME(GetMoveTarget(MOVE_ERUPTION) == TARGET_BOTH); + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(5); } + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(8); } } WHEN { TURN { MOVE(opponentLeft, MOVE_ERUPTION); } } SCENE { @@ -55,8 +55,8 @@ DOUBLE_BATTLE_TEST("Primordial Sea blocks damaging Fire-type moves and prints th SINGLE_BATTLE_TEST("Primordial Sea does not block a move if Pokémon is asleep and uses a Fire-type move") // Sleep/confusion/paralysis all happen before the check for primal weather { GIVEN { - PLAYER(SPECIES_KYOGRE) {Item(ITEM_BLUE_ORB);} - OPPONENT(SPECIES_WOBBUFFET) {Status1(STATUS1_SLEEP);} + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } } WHEN { TURN { MOVE(opponent, MOVE_EMBER); } } SCENE { @@ -64,3 +64,83 @@ SINGLE_BATTLE_TEST("Primordial Sea does not block a move if Pokémon is asleep a MESSAGE("The opposing Wobbuffet is fast asleep."); } } + +SINGLE_BATTLE_TEST("Primordial Sea blocks weather-setting moves") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SUNNY_DAY; } + PARAMETRIZE { move = MOVE_RAIN_DANCE; } + PARAMETRIZE { move = MOVE_SANDSTORM; } + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + + GIVEN { + ASSUME(GetMoveEffect(move) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SUNNY_DAY) == BATTLE_WEATHER_SUN); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, move, opponent); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_RAIN_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primordial Sea prevents other weather abilities") +{ + u16 ability, species; + PARAMETRIZE { ability = ABILITY_DROUGHT; species = SPECIES_NINETALES; } + PARAMETRIZE { ability = ABILITY_DRIZZLE; species = SPECIES_POLITOED; } + PARAMETRIZE { ability = ABILITY_SAND_STREAM; species = SPECIES_HIPPOWDON; } + PARAMETRIZE { ability = ABILITY_SNOW_WARNING; species = SPECIES_ABOMASNOW; } + + GIVEN { + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ability); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_RAIN_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Primordial Sea can be replaced by Delta Stream") +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DELTA_STREAM); + MESSAGE("Mysterious strong winds are protecting Flying-type Pokémon!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_STRONG_WINDS); + } +} + +SINGLE_BATTLE_TEST("Primordial Sea can be replaced by Desolate Land") +{ + GIVEN { + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DESOLATE_LAND); + MESSAGE("The sunlight turned extremely harsh!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_SUN_PRIMAL); + } +} diff --git a/test/battle/ability/prism_armor.c b/test/battle/ability/prism_armor.c index bdd93d127..36fbc27f9 100644 --- a/test/battle/ability/prism_armor.c +++ b/test/battle/ability/prism_armor.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Prism Armor reduces damage to Super Effective moves by 0.75" GIVEN { ASSUME(gSpeciesInfo[SPECIES_NECROZMA].types[0] == TYPE_PSYCHIC); ASSUME(gSpeciesInfo[SPECIES_NECROZMA].types[1] == TYPE_PSYCHIC); - ASSUME(gMovesInfo[MOVE_DARK_PULSE].type == TYPE_DARK); + ASSUME(GetMoveType(MOVE_DARK_PULSE) == TYPE_DARK); ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_FAIRY] > UQ_4_12(1.0)); ASSUME(gTypeEffectivenessTable[TYPE_POISON][TYPE_PSYCHIC] == UQ_4_12(1.0)); PLAYER(SPECIES_NECROZMA); diff --git a/test/battle/ability/protean.c b/test/battle/ability/protean.c index fe4ae25e6..7ebec1ff6 100644 --- a/test/battle/ability/protean.c +++ b/test/battle/ability/protean.c @@ -1,12 +1,15 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Protean changes the type of the user to the move used every time (Gen6-8)") +SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user to the move used every time (Gen6-8)") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_6); + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); - OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } @@ -15,24 +18,36 @@ SINGLE_BATTLE_TEST("Protean changes the type of the user to the move used every TURN { SWITCH(opponent, 0); } TURN { MOVE(opponent, MOVE_WATER_GUN); } } SCENE { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Normal type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Normal type!"); + else + MESSAGE("The opposing Raboot transformed into the Normal type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); } } -SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in (Gen9+)") +SINGLE_BATTLE_TEST("Protean/Libero changes the type of the user only once per switch in (Gen9+)") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_9); + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_9); PLAYER(SPECIES_REGIROCK); - OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_WATER_GUN); } @@ -41,31 +56,42 @@ SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in TURN { SWITCH(opponent, 0); } TURN { MOVE(opponent, MOVE_WATER_GUN); } } SCENE { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); NONE_OF { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ABILITY_POPUP(opponent, ability); MESSAGE("The opposing Kecleon transformed into the Normal type!"); + MESSAGE("The opposing Raboot transformed into the Normal type!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - ABILITY_POPUP(opponent, ABILITY_PROTEAN); - MESSAGE("The opposing Kecleon transformed into the Water type!"); + ABILITY_POPUP(opponent, ability); + if (species == SPECIES_KECLEON) + MESSAGE("The opposing Kecleon transformed into the Water type!"); + else + MESSAGE("The opposing Raboot transformed into the Water type!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent); } } -SINGLE_BATTLE_TEST("Protean does not change the user's type when using Struggle") +SINGLE_BATTLE_TEST("Protean/Libero does not change the user's type when using Struggle") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { PLAYER(SPECIES_REGIROCK); - OPPONENT(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); } + OPPONENT(species) { Ability(ability); } } WHEN { TURN { MOVE(opponent, MOVE_STRUGGLE); } } SCENE { NONE_OF { - ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ABILITY_POPUP(opponent, ability); MESSAGE("The opposing Greninja transformed into the Normal type!"); + MESSAGE("The opposing Raboot transformed into the Normal type!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); } diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index 9bffb125e..5173a18bd 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Protosynthesis boosts the highest stat") SINGLE_BATTLE_TEST("Protosynthesis boosts either Attack or Special Attack, not both") { u16 species; - u32 move; + enum Move move; s16 damage[2]; PARAMETRIZE { species = SPECIES_ROARING_MOON; move = MOVE_SCRATCH; } @@ -59,9 +59,9 @@ SINGLE_BATTLE_TEST("Protosynthesis ability pop up activates only once during the u16 turns; GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_WALKING_WAKE) { Ability(ABILITY_PROTOSYNTHESIS); } - OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); }; + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } } WHEN { for (turns = 0; turns < 5; turns++) TURN {} @@ -90,7 +90,7 @@ SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in") GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_ROARING_MOON) { Ability(ABILITY_PROTOSYNTHESIS); } - OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); }; + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } } WHEN { TURN { SWITCH(player, 1); } } SCENE { @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Protosynthesis prioritizes stats in the case of a tie in the PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(stats[0]); Defense(stats[1]); SpAttack(stats[2]); SpDefense(stats[3]); Speed(stats[4]); } OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_DROUGHT); ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); @@ -173,10 +173,11 @@ SINGLE_BATTLE_TEST("Protosynthesis doesn't activate for a transformed battler") SINGLE_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an Utility Umbrella") { GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_UTILITY_UMBRELLA); } OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_DROUGHT); ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); @@ -219,3 +220,130 @@ SINGLE_BATTLE_TEST("Protosynthesis activates after weather was reset") ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); } } + +SINGLE_BATTLE_TEST("Protosynthesis accounts for Sticky Web when determining the boosted stat") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(50); Defense(50); SpAttack(150); SpDefense(140); Speed(180); } + OPPONENT(SPECIES_GALVANTULA) { Speed(60); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_STICKY_WEB); MOVE(player, MOVE_SUNNY_DAY); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPLASH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("The harsh sunlight activated Flutter Mane's Protosynthesis!"); + MESSAGE("Flutter Mane's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis keeps its initial boosted stat after Speed is lowered") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ROUND); } + OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); Moves(MOVE_ICY_WIND, MOVE_CELEBRATE); Speed(100); } + } WHEN { + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_ICY_WIND); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DROUGHT); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis recalculates the boosted stat after Neutralizing Gas leaves the field") +{ + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_ICY_WIND); Speed(70); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_ICY_WIND); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + NOT ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + MESSAGE("The effects of the neutralizing gas wore off!"); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + MESSAGE("The harsh sunlight activated Flutter Mane's Protosynthesis!"); + MESSAGE("Flutter Mane's Sp. Atk was heightened!"); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis retains its boosted stat after Neutralizing Gas briefly suppresses it") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_FLUTTER_MANE) { Ability(ABILITY_PROTOSYNTHESIS); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_SUNNY_DAY, MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_CELEBRATE); Speed(70); } + } WHEN { + TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player); + ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Protosynthesis damage calculation is correct") +{ + s16 dmg; + s16 expectedDamage; + + PARAMETRIZE { expectedDamage = 127; } + PARAMETRIZE { expectedDamage = 126; } + PARAMETRIZE { expectedDamage = 124; } + PARAMETRIZE { expectedDamage = 123; } + PARAMETRIZE { expectedDamage = 121; } + PARAMETRIZE { expectedDamage = 120; } + PARAMETRIZE { expectedDamage = 118; } + PARAMETRIZE { expectedDamage = 118; } + PARAMETRIZE { expectedDamage = 117; } + PARAMETRIZE { expectedDamage = 115; } + PARAMETRIZE { expectedDamage = 114; } + PARAMETRIZE { expectedDamage = 112; } + PARAMETRIZE { expectedDamage = 111; } + PARAMETRIZE { expectedDamage = 109; } + PARAMETRIZE { expectedDamage = 109; } + PARAMETRIZE { expectedDamage = 108; } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_CLOSE_COMBAT) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_GOUGING_FIRE) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_URSHIFU_RAPID_STRIKE); + } WHEN { + TURN { MOVE(opponent, MOVE_CLOSE_COMBAT, WITH_RNG(RNG_DAMAGE_MODIFIER, i)); } + } SCENE { + HP_BAR(player, captureDamage: &dmg); + } THEN { + EXPECT_EQ(expectedDamage, dmg); + } +} diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 80dc78611..23f919b02 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", SINGLE_BATTLE_TEST("Purifying Salt makes Rest fail") { GIVEN { - PLAYER(SPECIES_GARGANACL) { Ability(ABILITY_PURIFYING_SALT); HP(1); MaxHP(100);} + PLAYER(SPECIES_GARGANACL) { Ability(ABILITY_PURIFYING_SALT); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_REST); } @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Purifying Salt makes Rest fail") SINGLE_BATTLE_TEST("Purifying Salt grants immunity to status effects") { - u32 move; + enum Move move; u16 status; PARAMETRIZE { move = MOVE_WILL_O_WISP; status = STATUS1_BURN; } PARAMETRIZE { move = MOVE_HYPNOSIS; status = STATUS1_SLEEP; } diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index a9f6e65a4..b79362d63 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Quark Drive boosts the highest stat") SINGLE_BATTLE_TEST("Quark Drive boosts either Attack or Special Attack, not both") { u16 species; - u32 move; + enum Move move; s16 damage[2]; PARAMETRIZE { species = SPECIES_IRON_VALIANT; move = MOVE_SCRATCH; } @@ -54,6 +54,59 @@ SINGLE_BATTLE_TEST("Quark Drive boosts either Attack or Special Attack, not both } } +SINGLE_BATTLE_TEST("Quark Drive keeps its initial boosted stat after Speed is lowered") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Ability(ABILITY_QUARK_DRIVE); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Moves(MOVE_CELEBRATE, MOVE_ICY_WIND); Speed(100); } + } WHEN { + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_ICY_WIND); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ICY_WIND, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Quark Drive retains its boosted stat after Neutralizing Gas briefly suppresses it") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Ability(ABILITY_QUARK_DRIVE); Attack(10); Defense(10); SpAttack(150); SpDefense(120); Speed(180); Moves(MOVE_ELECTRIC_TERRAIN, MOVE_ROUND, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + OPPONENT(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); Moves(MOVE_CELEBRATE); Speed(70); } + } WHEN { + TURN { MOVE(player, MOVE_ELECTRIC_TERRAIN); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 1); } + TURN { MOVE(player, MOVE_CELEBRATE); SWITCH(opponent, 0); } + TURN { MOVE(player, MOVE_ROUND); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, player); + ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + SINGLE_BATTLE_TEST("Quark Drive ability pop up activates only once during the duration of electric terrain") { u16 turns; @@ -90,7 +143,7 @@ SINGLE_BATTLE_TEST("Quark Drive activates on switch-in") GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_IRON_MOTH) { Ability(ABILITY_QUARK_DRIVE); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { TURN { SWITCH(player, 1); } } SCENE { @@ -106,9 +159,9 @@ SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not ground GIVEN { ASSUME(GetSpeciesType(SPECIES_IRON_JUGULIS, 0) == TYPE_FLYING || GetSpeciesType(SPECIES_IRON_JUGULIS, 1) == TYPE_FLYING); PLAYER(SPECIES_IRON_JUGULIS) { Ability(ABILITY_QUARK_DRIVE); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); @@ -127,7 +180,7 @@ SINGLE_BATTLE_TEST("Quark Drive prioritizes stats in the case of a tie in the fo PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(stats[0]); Defense(stats[1]); SpAttack(stats[2]); SpDefense(stats[3]); Speed(stats[4]); } OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); diff --git a/test/battle/ability/rain_dish.c b/test/battle/ability/rain_dish.c index dc7de954c..eaead8d48 100644 --- a/test/battle/ability/rain_dish.c +++ b/test/battle/ability/rain_dish.c @@ -2,7 +2,8 @@ #include "test/battle.h" ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); } SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain") diff --git a/test/battle/ability/rattled.c b/test/battle/ability/rattled.c index a2cc61536..7e892bcda 100644 --- a/test/battle/ability/rattled.c +++ b/test/battle/ability/rattled.c @@ -15,14 +15,14 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost type move") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_FURY_CUTTER; } PARAMETRIZE { move = MOVE_FEINT_ATTACK; } PARAMETRIZE { move = MOVE_SHADOW_PUNCH; } PARAMETRIZE { move = MOVE_SCRATCH; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Speed(42) ;} - OPPONENT(SPECIES_SUDOWOODO) {Speed(40); Ability(ABILITY_RATTLED);} + PLAYER(SPECIES_WOBBUFFET) { Speed(42) ; } + OPPONENT(SPECIES_SUDOWOODO) { Speed(40); Ability(ABILITY_RATTLED); } } WHEN { TURN { MOVE(player, move); } TURN { MOVE(player, move); } @@ -55,9 +55,9 @@ SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when hit by Bug, Dark or Ghost typ SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidate (Gen5-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7); - PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); } - OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SUDOWOODO) { Ability(ABILITY_RATTLED); } } WHEN { TURN {} } SCENE { @@ -75,9 +75,9 @@ SINGLE_BATTLE_TEST("Rattled does not boost speed by 1 when affected by Intimidat SINGLE_BATTLE_TEST("Rattled boosts speed by 1 when affected by Intimidate (Gen8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8); - PLAYER(SPECIES_GYARADOS) {Ability(ABILITY_INTIMIDATE); } - OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_SUDOWOODO) { Ability(ABILITY_RATTLED); } } WHEN { TURN {} } SCENE { @@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Rattled triggers correctly when hit by U-Turn") // Specific ASSUME(GetMoveType(MOVE_U_TURN) == TYPE_BUG); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_SUDOWOODO) {Ability(ABILITY_RATTLED); } + OPPONENT(SPECIES_SUDOWOODO) { Ability(ABILITY_RATTLED); } OPPONENT(SPECIES_SUDOWOODO); } WHEN { TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } diff --git a/test/battle/ability/refrigerate.c b/test/battle/ability/refrigerate.c index 718326780..834254f26 100644 --- a/test/battle/ability/refrigerate.c +++ b/test/battle/ability/refrigerate.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ATE_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_ATE_MULTIPLIER, genConfig); PLAYER(SPECIES_AMAURA) { Ability(ability); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -47,14 +47,14 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage) { - u16 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_SNOW_WARNING; } PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; } GIVEN { - WITH_CONFIG(GEN_SNOW_WARNING, GEN_9); //To prevent capturing hail damage + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); //To prevent capturing hail damage ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL); ASSUME(GetSpeciesType(SPECIES_PINSIR, 0) == TYPE_BUG); PLAYER(SPECIES_AMAURA) { Ability(ability); } @@ -95,7 +95,8 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type") SINGLE_BATTLE_TEST("Refrigerate doesn't affect Judgment / Techno Blast / Multi-Attack's type") { - u16 move, item; + enum Move move; + enum Item item; PARAMETRIZE { move = MOVE_JUDGMENT; item = ITEM_ZAP_PLATE; } PARAMETRIZE { move = MOVE_TECHNO_BLAST; item = ITEM_SHOCK_DRIVE; } PARAMETRIZE { move = MOVE_MULTI_ATTACK; item = ITEM_ELECTRIC_MEMORY; } diff --git a/test/battle/ability/rivalry.c b/test/battle/ability/rivalry.c index fbb4ba453..7db0fc1c9 100644 --- a/test/battle/ability/rivalry.c +++ b/test/battle/ability/rivalry.c @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", GIVEN { ASSUME(GetSpeciesAbility(SPECIES_PORYGON, 0) == ABILITY_TRACE); PLAYER(SPECIES_PORYGON) { Ability(ABILITY_TRACE); } // No genderless mon naturally gets Rivalry - OPPONENT(species) { Ability(ability); }; + OPPONENT(species) { Ability(ability); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the target is genderless", s PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; } GIVEN { - PLAYER(species) { Ability(ability); }; + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_PORYGON); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } diff --git a/test/battle/ability/rocky_payload.c b/test/battle/ability/rocky_payload.c index d688e5c87..9d1aefb3d 100644 --- a/test/battle/ability/rocky_payload.c +++ b/test/battle/ability/rocky_payload.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BIG_PECKS; } diff --git a/test/battle/ability/sand_force.c b/test/battle/ability/sand_force.c index ba062f3fa..749806a64 100644 --- a/test/battle/ability/sand_force.c +++ b/test/battle/ability/sand_force.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Sand Force prevents damage from sandstorm") SINGLE_BATTLE_TEST("Sand Force increases the power of Rock-, Ground- and Steel-type moves by 30% in sandstorm", s16 damage) { - u32 moveOpponent, movePlayer; + enum Move moveOpponent, movePlayer; PARAMETRIZE { moveOpponent = MOVE_CELEBRATE; movePlayer = MOVE_ROCK_THROW; } PARAMETRIZE { moveOpponent = MOVE_SANDSTORM; movePlayer = MOVE_ROCK_THROW; } PARAMETRIZE { moveOpponent = MOVE_CELEBRATE; movePlayer = MOVE_EARTHQUAKE; } @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Sand Force increases the power of Rock-, Ground- and Steel-t SINGLE_BATTLE_TEST("Sand Force don't increase move power if Cloud Nine/Air Lock is on the field", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SANDSTORM; } GIVEN { diff --git a/test/battle/ability/sand_spit.c b/test/battle/ability/sand_spit.c index c2128f65d..cb9717944 100644 --- a/test/battle/ability/sand_spit.c +++ b/test/battle/ability/sand_spit.c @@ -1,4 +1,77 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Sand Spit (Ability) test titles") +SINGLE_BATTLE_TEST("Sand Spit sets up sandstorm for 5 turns when hit") +{ + GIVEN { + PLAYER(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_SPIT); } + OPPONENT(SPECIES_LANDORUS) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("The opposing Landorus used Tackle!"); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_SAND_SPIT); + MESSAGE("A sandstorm kicked up!"); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm subsided."); + } +} + +SINGLE_BATTLE_TEST("Sand Spit sets up sandstorm for 8 turns when hit with Smooth Rock") +{ + GIVEN { + PLAYER(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_SPIT); Item(ITEM_SMOOTH_ROCK); } + OPPONENT(SPECIES_LANDORUS) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("The opposing Landorus used Tackle!"); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_SAND_SPIT); + MESSAGE("A sandstorm kicked up!"); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm subsided."); + } +} + +SINGLE_BATTLE_TEST("Sand Spit triggers even if the user is knocked out by the hit") +{ + GIVEN { + PLAYER(SPECIES_SANDSLASH) { Ability(ABILITY_SAND_SPIT); HP(1); Speed(1); } + PLAYER(SPECIES_LANDORUS) { Moves(MOVE_CELEBRATE); Speed(5); } + OPPONENT(SPECIES_LANDORUS) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("The opposing Landorus used Tackle!"); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_SAND_SPIT); + MESSAGE("A sandstorm kicked up!"); + MESSAGE("The sandstorm is raging."); + MESSAGE("The opposing Landorus used Celebrate!"); + MESSAGE("Landorus used Celebrate!"); + MESSAGE("The sandstorm is raging."); + } +} diff --git a/test/battle/ability/sand_stream.c b/test/battle/ability/sand_stream.c index 6cd1b06eb..a1b9464c2 100644 --- a/test/battle/ability/sand_stream.c +++ b/test/battle/ability/sand_stream.c @@ -1,4 +1,83 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Sand Stream (Ability) test titles") +SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 5 turns (Gen6+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); } + OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SAND_STREAM); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm subsided."); + } +} + +SINGLE_BATTLE_TEST("Sand Stream sets up sandstorm for 8 turns with Smooth Rock (Gen6+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); Item(ITEM_SMOOTH_ROCK); } + OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SAND_STREAM); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm subsided."); + } +} + +SINGLE_BATTLE_TEST("Sand Stream sets up permanent sandstorm (Gen3-5)") +{ + GIVEN { + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_3); + PLAYER(SPECIES_HIPPOWDON) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SAND_STREAM); } + OPPONENT(SPECIES_SANDSLASH) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SAND_STREAM); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + MESSAGE("The sandstorm is raging."); + NOT MESSAGE("The sandstorm subsided."); + } +} diff --git a/test/battle/ability/sap_sipper.c b/test/battle/ability/sap_sipper.c index aeb746d2c..28c6ea55b 100644 --- a/test/battle/ability/sap_sipper.c +++ b/test/battle/ability/sap_sipper.c @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Sap Sipper does not increase Attack if already maxed") SINGLE_BATTLE_TEST("Sap Sipper blocks multi-hit grass type moves") { GIVEN { - ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_BULLET_SEED)); PLAYER(SPECIES_MARILL) { Ability(ABILITY_SAP_SIPPER); } OPPONENT(SPECIES_SHELLDER) { Ability(ABILITY_SKILL_LINK); } } WHEN { diff --git a/test/battle/ability/scrappy.c b/test/battle/ability/scrappy.c index 9476f9392..431e3c280 100644 --- a/test/battle/ability/scrappy.c +++ b/test/battle/ability/scrappy.c @@ -7,10 +7,10 @@ SINGLE_BATTLE_TEST("Scrappy doesn't prevent Intimidate (Gen4-7)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_7); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_7); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -35,10 +35,10 @@ SINGLE_BATTLE_TEST("Scrappy prevents Intimidate (Gen8+)") s16 turnTwoHit; GIVEN { - WITH_CONFIG(GEN_CONFIG_UPDATED_INTIMIDATE, GEN_8); - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; + WITH_CONFIG(CONFIG_UPDATED_INTIMIDATE, GEN_8); + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -57,12 +57,12 @@ SINGLE_BATTLE_TEST("Scrappy prevents Intimidate (Gen8+)") SINGLE_BATTLE_TEST("Scrappy allows to hit Ghost-type Pokémon with Normal- and Fighting-type moves") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_KARATE_CHOP; } GIVEN { - PLAYER(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; + PLAYER(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } OPPONENT(SPECIES_GASTLY); } WHEN { TURN { MOVE(player, move); } @@ -74,13 +74,13 @@ SINGLE_BATTLE_TEST("Scrappy allows to hit Ghost-type Pokémon with Normal- and F SINGLE_BATTLE_TEST("Scrappy doesn't bypass a Ghost-type's Wonder Guard") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_KARATE_CHOP; } GIVEN { - PLAYER(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); }; - OPPONENT(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); }; + PLAYER(SPECIES_KANGASKHAN) { Ability(ABILITY_SCRAPPY); } + OPPONENT(SPECIES_SHEDINJA) { Ability(ABILITY_WONDER_GUARD); } } WHEN { TURN { MOVE(player, move); } } SCENE { @@ -89,6 +89,5 @@ SINGLE_BATTLE_TEST("Scrappy doesn't bypass a Ghost-type's Wonder Guard") HP_BAR(opponent); } ABILITY_POPUP(opponent, ABILITY_WONDER_GUARD); - MESSAGE("The opposing Shedinja avoided damage with Wonder Guard!"); } } diff --git a/test/battle/ability/seed_sower.c b/test/battle/ability/seed_sower.c index 5785d4684..4522351ec 100644 --- a/test/battle/ability/seed_sower.c +++ b/test/battle/ability/seed_sower.c @@ -28,9 +28,9 @@ SINGLE_BATTLE_TEST("Seed Sower sets up Grassy Terrain when hit by an attack") DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is triggered") // #2796 { u32 j, k, l; - u16 usedMove = MOVE_NONE; - static const u16 moves[] = {MOVE_HYPER_VOICE, MOVE_SURF}; - u16 abilities[MAX_BATTLERS_COUNT] = {0}; + enum Move usedMove = MOVE_NONE; + static const enum Move moves[] = {MOVE_HYPER_VOICE, MOVE_SURF}; + enum Ability abilities[MAX_BATTLERS_COUNT] = {0}; u8 attacker = 0; for (j = 0; j < ARRAY_COUNT(moves); j++) @@ -49,8 +49,8 @@ DOUBLE_BATTLE_TEST("Multi-target moves hit correct battlers after Seed Sower is } GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_PLAYER_LEFT]); } PLAYER(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_PLAYER_RIGHT]); } OPPONENT(SPECIES_ARBOLIVA) { Ability(abilities[B_POSITION_OPPONENT_LEFT]); } diff --git a/test/battle/ability/sharpness.c b/test/battle/ability/sharpness.c index 10374faf5..0293161ae 100644 --- a/test/battle/ability/sharpness.c +++ b/test/battle/ability/sharpness.c @@ -1,9 +1,9 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves", s16 damage) +SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves by 50%", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_SHARPNESS; } PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_STEADFAST; } diff --git a/test/battle/ability/shed_skin.c b/test/battle/ability/shed_skin.c index 60554f921..73f09bc9e 100644 --- a/test/battle/ability/shed_skin.c +++ b/test/battle/ability/shed_skin.c @@ -1,13 +1,16 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Shed Skin triggers 33% of the time") +SINGLE_BATTLE_TEST("Shed Skin triggers 33% (Gen3, Gen5+) or 30% (Gen 4) of the time") { - if (B_ABILITY_TRIGGER_CHANCE == GEN_4) - PASSES_RANDOMLY(30, 100, RNG_SHED_SKIN); - else - PASSES_RANDOMLY(33, 100, RNG_SHED_SKIN); + u32 config, passes; + PARAMETRIZE { config = GEN_3; passes = 33; } + PARAMETRIZE { config = GEN_4; passes = 30; } + PARAMETRIZE { config = GEN_5; passes = 33; } + + PASSES_RANDOMLY(passes, 100, RNG_SHED_SKIN); GIVEN { + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ARBOK) { Status1(STATUS1_POISON); Ability(ABILITY_SHED_SKIN); } diff --git a/test/battle/ability/sheer_force.c b/test/battle/ability/sheer_force.c index abeee88ce..8cc6e7062 100644 --- a/test/battle/ability/sheer_force.c +++ b/test/battle/ability/sheer_force.c @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage) } WHEN { //Test will fail if present heals because the hp change would be 0 //so we want a damaging version of present - TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 1)); } + TURN { MOVE(player, MOVE_PRESENT, WITH_RNG(RNG_PRESENT, 1)); } } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { @@ -214,12 +214,12 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Burn Up", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Double Shock", s16 damage) { - u16 move = 0; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_SKILL_SWAP; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { PLAYER(SPECIES_PIKACHU); - OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); }; + OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_DOUBLE_SHOCK); } } SCENE { @@ -265,12 +265,12 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Synchronoise", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Aura Wheel", s16 damage) { - u16 move = 0; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_SKILL_SWAP; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { PLAYER(SPECIES_MORPEKO); - OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); }; + OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_AURA_WHEEL); } } SCENE { @@ -282,12 +282,12 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Aura Wheel", s16 damage) } SINGLE_BATTLE_TEST("Sheer Force doesn't boost Hyperspace Fury", s16 damage) { - u16 move = 0; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_SKILL_SWAP; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { PLAYER(SPECIES_HOOPA_UNBOUND); - OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); }; + OPPONENT(SPECIES_TAUROS) { Ability(ABILITY_SHEER_FORCE); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_HYPERSPACE_FURY); } } SCENE { @@ -366,10 +366,10 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Payback", s16 damage) } } -static inline bool32 IgnoreMoveForSheerForceBoost(u32 move) +static inline bool32 IgnoreMoveForSheerForceBoost(enum Move move) { switch (move) { - case MOVE_PSYWAVE: // Just skip Psywve + case MOVE_PSYWAVE: // Just skip Psywave case MOVE_PRESENT: // And Present... case MOVE_MAGNITUDE: // And Magnitude... case MOVE_ERUPTION: // And Eruption... @@ -393,11 +393,12 @@ static inline bool32 IgnoreMoveForSheerForceBoost(u32 move) case MOVE_GLITZY_GLOW: // Light Screen Move Effect seems to be bugged case MOVE_PAYBACK: return TRUE; + default: + return FALSE; } - return FALSE; } -static inline bool32 IsMoveSheerForceBoosted(u32 move) +static inline bool32 IsMoveSheerForceBoosted(enum Move move) { switch (move) { case MOVE_AIR_SLASH: @@ -608,15 +609,16 @@ static inline bool32 IsMoveSheerForceBoosted(u32 move) return TRUE; case MOVE_RAPID_SPIN: return B_SPEED_BUFFING_RAPID_SPIN >= GEN_8; + default: + return FALSE; } - return FALSE; } // Tests split by generation DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen1)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_POUND; j < MOVES_COUNT_GEN1; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -664,11 +666,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -689,17 +691,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen2)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_SKETCH; j < MOVES_COUNT_GEN2; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -747,11 +754,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -772,17 +779,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen3)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_FAKE_OUT; j < MOVES_COUNT_GEN3; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -830,11 +842,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -855,17 +867,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen4)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_ROOST; j < MOVES_COUNT_GEN4; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -913,11 +930,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -938,18 +955,23 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen5)") { s16 damage1, damage2; - u32 move = 0; - for (u32 j = MOVE_HONE_CLAWS; j < MOVES_COUNT_GEN5; j++) + enum Move move = 0; + for (u32 j = MOVE_HONE_CLAWS + 12; j < MOVES_COUNT_GEN5; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) PARAMETRIZE { move = j; } @@ -996,11 +1018,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -1021,17 +1043,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen6)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_FLYING_PRESS; j < MOVES_COUNT_GEN6; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -1079,11 +1106,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -1104,17 +1131,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen7)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_SHORE_UP; j < MOVES_COUNT_GEN7; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -1162,11 +1194,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -1187,17 +1219,22 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen8)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_DYNAMAX_CANNON; j < MOVES_COUNT_GEN8; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -1245,11 +1282,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -1270,10 +1307,15 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } @@ -1281,7 +1323,7 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to boost (Gen9)") { s16 damage1, damage2; - u32 move = 0; + enum Move move = 0; for (u32 j = MOVE_TERA_BLAST; j < MOVES_COUNT; j++) { if (GetMoveCategory(j) != DAMAGE_CATEGORY_STATUS && !IgnoreMoveForSheerForceBoost(j)) @@ -1329,11 +1371,11 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to case EFFECT_SOLAR_BEAM: case EFFECT_SKY_DROP: TURN { SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } - TURN { ; } + TURN {} break; case EFFECT_FUTURE_SIGHT: - TURN { ; } - TURN { ; } + TURN {} + TURN {} break; case EFFECT_BIDE: TURN { MOVE(opponentRight, MOVE_WATER_GUN, target: playerLeft); MOVE(playerRight, MOVE_WATER_GUN, target: opponentLeft); SKIP_TURN(playerLeft); SKIP_TURN(opponentLeft); } @@ -1354,10 +1396,15 @@ DOUBLE_BATTLE_TEST("Sheer Force only boosts the damage of moves it's supposed to HP_BAR(opponentRight, captureDamage: &damage1); } } THEN { - if (IsMoveSheerForceBoosted(move)) + if (IsMoveSheerForceBoosted(move)) { + if (!(damage1 > damage2)) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_GT(damage1, damage2); - else + } else { + if (damage1 != damage2) + DebugPrintf("Move that failed: %S", gMovesInfo[move].name); EXPECT_EQ(damage2, damage1); + } } } diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index 2fc4f51d5..f14975fac 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Shield Dust blocks secondary effects") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_NUZZLE; } PARAMETRIZE { move = MOVE_INFERNO; } PARAMETRIZE { move = MOVE_MORTAL_SPIN; } @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Shield Dust blocks secondary effects") SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_INFESTATION; } PARAMETRIZE { move = MOVE_THOUSAND_ARROWS; } PARAMETRIZE { move = MOVE_JAW_LOCK; } @@ -75,6 +75,8 @@ SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") case MOVE_PAY_DAY: MESSAGE("Coins were scattered everywhere!"); break; + default: + break; } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { @@ -86,7 +88,7 @@ SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary or secondary") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; } PARAMETRIZE { move = MOVE_FLAME_CHARGE; } PARAMETRIZE { move = MOVE_LEAF_STORM; } @@ -117,13 +119,15 @@ SINGLE_BATTLE_TEST("Shield Dust does not block self-targeting effects, primary o case MOVE_METEOR_ASSAULT: // second turn MESSAGE("Wobbuffet must recharge!"); break; + default: + break; } } } DOUBLE_BATTLE_TEST("Shield Dust does or does not block Sparkling Aria depending on number of targets hit") { - u32 moveToUse; + enum Move moveToUse; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_SCRATCH; } GIVEN { diff --git a/test/battle/ability/shields_down.c b/test/battle/ability/shields_down.c index 554e67b0d..d16aa240d 100644 --- a/test/battle/ability/shields_down.c +++ b/test/battle/ability/shields_down.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Minior Core transforms into Minior Meteor on battle start if PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); HP(51); MaxHP(101); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_SHIELDS_DOWN); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponent); diff --git a/test/battle/ability/slush_rush.c b/test/battle/ability/slush_rush.c index 76509db01..770fb4df1 100644 --- a/test/battle/ability/slush_rush.c +++ b/test/battle/ability/slush_rush.c @@ -54,7 +54,8 @@ SINGLE_BATTLE_TEST("Slush Rush doesn't prevent non-Ice types from taking damage GIVEN { ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE); ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CETITAN) { Ability(ABILITY_SLUSH_RUSH); } } WHEN { diff --git a/test/battle/ability/snow_warning.c b/test/battle/ability/snow_warning.c index 171ad23b4..bfb27c5f4 100644 --- a/test/battle/ability/snow_warning.c +++ b/test/battle/ability/snow_warning.c @@ -1,30 +1,138 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Snow Warning summons hail (Gen4-8)") +SINGLE_BATTLE_TEST("Snow Warning sets up hail for 5 turns (Gen6-8)") { GIVEN { - WITH_CONFIG(GEN_SNOW_WARNING, GEN_8); - PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } - OPPONENT(SPECIES_WOBBUFFET); + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN {} + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - MESSAGE("It started to hail!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES); + ABILITY_POPUP(player, ABILITY_SNOW_WARNING); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail stopped."); } } -SINGLE_BATTLE_TEST("Snow Warning summons snow (Gen9+)") +SINGLE_BATTLE_TEST("Snow Warning sets up hail for 8 turns with Icy Rock (Gen6-8)") { GIVEN { - WITH_CONFIG(GEN_SNOW_WARNING, GEN_9); - PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); } - OPPONENT(SPECIES_WOBBUFFET); + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); + PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); Item(ITEM_ICY_ROCK); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN {} + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - MESSAGE("It started to snow!"); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES); + ABILITY_POPUP(player, ABILITY_SNOW_WARNING); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail stopped."); + } +} + +SINGLE_BATTLE_TEST("Snow Warning sets up permanent hail (Gen4-5)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_8); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_5); + PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SNOW_WARNING); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + MESSAGE("The hail is crashing down."); + NOT MESSAGE("The hail stopped."); + } +} + +SINGLE_BATTLE_TEST("Snow Warning sets up snow for 5 turns (Gen9+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_9); + PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SNOW_WARNING); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("The snow stopped."); + } +} + +SINGLE_BATTLE_TEST("Snow Warning sets up snow for 8 turns with Icy Rock (Gen9+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_SNOW_WARNING, GEN_9); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_9); + PLAYER(SPECIES_ABOMASNOW) { Moves(MOVE_CELEBRATE); Ability(ABILITY_SNOW_WARNING); Item(ITEM_ICY_ROCK); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SNOW_WARNING); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("Snow continues to fall."); + MESSAGE("The snow stopped."); } } diff --git a/test/battle/ability/solar_power.c b/test/battle/ability/solar_power.c index 1fdccad5b..97a0f0633 100644 --- a/test/battle/ability/solar_power.c +++ b/test/battle/ability/solar_power.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Solar Power increases a Sp. Attack by x1.5 in Sun", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; } GIVEN { @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Solar Power increases a Sp. Attack by x1.5 in Sun", s16 dama SINGLE_BATTLE_TEST("Solar Power doesn't increases a Sp. Attack if Cloud Nine/Air Lock is on the field", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; } GIVEN { diff --git a/test/battle/ability/solid_rock.c b/test/battle/ability/solid_rock.c index 56c01e255..d25fca625 100644 --- a/test/battle/ability/solid_rock.c +++ b/test/battle/ability/solid_rock.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Solid Rock reduces damage to Super Effective moves by 0.75", GIVEN { ASSUME(gSpeciesInfo[SPECIES_CARRACOSTA].types[0] == TYPE_WATER); ASSUME(gSpeciesInfo[SPECIES_CARRACOSTA].types[1] == TYPE_ROCK); - ASSUME(gMovesInfo[MOVE_CLOSE_COMBAT].type == TYPE_FIGHTING); + ASSUME(GetMoveType(MOVE_CLOSE_COMBAT) == TYPE_FIGHTING); ASSUME(gTypeEffectivenessTable[TYPE_FIGHTING][TYPE_ROCK] > UQ_4_12(1.0)); ASSUME(gTypeEffectivenessTable[TYPE_FIGHTING][TYPE_WATER] == UQ_4_12(1.0)); PLAYER(SPECIES_CARRACOSTA) { Ability(ability); } diff --git a/test/battle/ability/stalwart.c b/test/battle/ability/stalwart.c index 6bebe17cb..3cca8e58a 100644 --- a/test/battle/ability/stalwart.c +++ b/test/battle/ability/stalwart.c @@ -21,10 +21,13 @@ DOUBLE_BATTLE_TEST("Stalwart ignores redirection from Follow-Me") DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirecting moves") { enum Ability ability; - u32 species; - PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; } - PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; } + u32 species, config; + PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STALWART); } @@ -39,15 +42,14 @@ DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirectin MOVE(playerLeft, MOVE_WATER_GUN, target: opponentRight); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { - HP_BAR(opponentRight); + HP_BAR(opponentRight); + if (config >= GEN_5) { NONE_OF { ABILITY_POPUP(opponentLeft, ability); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Raichu's Sp. Atk rose!"); } } else { - HP_BAR(opponentRight); NONE_OF { HP_BAR(opponentLeft); } diff --git a/test/battle/ability/stamina.c b/test/battle/ability/stamina.c index 39113fd15..db6558336 100644 --- a/test/battle/ability/stamina.c +++ b/test/battle/ability/stamina.c @@ -18,10 +18,10 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move") { s16 turnOneHit, turnTwoHit; - u16 move; + enum Move move; - PARAMETRIZE {move = MOVE_SCRATCH; } - PARAMETRIZE {move = MOVE_GUST; } + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_GUST; } GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); @@ -51,18 +51,18 @@ DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the abili { enum Ability abilityLeft, abilityRight; - PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; } - PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; } - PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_STAMINA; } + PARAMETRIZE { abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; } + PARAMETRIZE { abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; } + PARAMETRIZE { abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_STAMINA; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WOBBUFFET) { Ability(abilityRight); Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(15); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } } WHEN { - TURN { MOVE(opponentLeft, MOVE_EARTHQUAKE);} + TURN { MOVE(opponentLeft, MOVE_EARTHQUAKE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft); diff --git a/test/battle/ability/stance_change.c b/test/battle/ability/stance_change.c index 0c82c9317..488fc63e3 100644 --- a/test/battle/ability/stance_change.c +++ b/test/battle/ability/stance_change.c @@ -1,10 +1,9 @@ #include "global.h" #include "test/battle.h" - SINGLE_BATTLE_TEST("Stance Change changes Aegislash from Shield to Blade when using a damaging move") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } PARAMETRIZE { move = MOVE_GROWL; } @@ -34,7 +33,7 @@ SINGLE_BATTLE_TEST("Stance Change changes Aegislash from Shield to Blade when us SINGLE_BATTLE_TEST("Stance Change changes Aegislash from Blade to Shield when using King's Shield") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_PROTECT; } PARAMETRIZE { move = MOVE_KINGS_SHIELD; } GIVEN { diff --git a/test/battle/ability/static.c b/test/battle/ability/static.c index 110cfbaa0..5a2580e98 100644 --- a/test/battle/ability/static.c +++ b/test/battle/ability/static.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Static inflicts paralysis on contact") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { @@ -30,11 +30,14 @@ SINGLE_BATTLE_TEST("Static inflicts paralysis on contact") } } -SINGLE_BATTLE_TEST("Static triggers 30% of the time") +SINGLE_BATTLE_TEST("Static triggers 1/3 times (Gen3) or 30% (Gen4+) of the time") { - PASSES_RANDOMLY(3, 10, RNG_STATIC); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_3; passes = 1; trials = 3; } // 33.3% + PARAMETRIZE { config = GEN_4; passes = 3; trials = 10; } // 30% + PASSES_RANDOMLY(passes, trials, RNG_STATIC); GIVEN { - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_4); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } diff --git a/test/battle/ability/steam_engine.c b/test/battle/ability/steam_engine.c index 1f487bf6b..f998f21c4 100644 --- a/test/battle/ability/steam_engine.c +++ b/test/battle/ability/steam_engine.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Steam Engine raises speed when hit by a Fire or Water move") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_EMBER; } PARAMETRIZE { move = MOVE_WATER_GUN; } diff --git a/test/battle/ability/steelworker.c b/test/battle/ability/steelworker.c index b4fa720cd..4d8ac05b5 100644 --- a/test/battle/ability/steelworker.c +++ b/test/battle/ability/steelworker.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } diff --git a/test/battle/ability/stench.c b/test/battle/ability/stench.c index 84cbf20f6..e6a5c9cdc 100644 --- a/test/battle/ability/stench.c +++ b/test/battle/ability/stench.c @@ -63,7 +63,7 @@ DOUBLE_BATTLE_TEST("Stench doesn't trigger if partner uses a move") PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_GRIMER) { Speed(100); Ability(ABILITY_STENCH); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { TURN { MOVE(playerLeft, MOVE_FAKE_OUT, target: opponentLeft); diff --git a/test/battle/ability/storm_drain.c b/test/battle/ability/storm_drain.c index 962317b10..0f3c9c1cd 100644 --- a/test/battle/ability/storm_drain.c +++ b/test/battle/ability/storm_drain.c @@ -1,16 +1,20 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. Attack [Gen5+]") +SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. Attack (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GASTRODON_EAST) { Ability(ABILITY_STORM_DRAIN); } } WHEN { TURN { MOVE(player, MOVE_WATER_GUN); MOVE(opponent, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, player); HP_BAR(opponent); @@ -31,9 +35,13 @@ SINGLE_BATTLE_TEST("Storm Drain absorbs Water-type moves and increases the Sp. A } } -DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target the Pokémon with this Ability.") +DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target the Pokémon with this Ability") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -47,7 +55,7 @@ DOUBLE_BATTLE_TEST("Storm Drain forces single-target Water-type moves to target MOVE(opponentRight, MOVE_CELEBRATE); } } SCENE { - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) { + if (config >= GEN_5) { NONE_OF { HP_BAR(opponentLeft); HP_BAR(opponentRight); diff --git a/test/battle/ability/sturdy.c b/test/battle/ability/sturdy.c index 5ba7e16ea..7087de3a0 100644 --- a/test/battle/ability/sturdy.c +++ b/test/battle/ability/sturdy.c @@ -18,18 +18,37 @@ SINGLE_BATTLE_TEST("Sturdy prevents OHKO moves") } } -SINGLE_BATTLE_TEST("Sturdy prevents OHKOs") +SINGLE_BATTLE_TEST("Sturdy prevents OHKOs (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_STURDY, config); PLAYER(SPECIES_GEODUDE) { Ability(ABILITY_STURDY); MaxHP(100); HP(100); } + PLAYER(SPECIES_GEODUDE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_SEISMIC_TOSS); } + TURN { + MOVE(opponent, MOVE_SEISMIC_TOSS); + if (config < GEN_5) { + SEND_OUT(player, 1); + } + } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SEISMIC_TOSS, opponent); - HP_BAR(player, hp: 1); - ABILITY_POPUP(player, ABILITY_STURDY); - MESSAGE("Geodude endured the hit using Sturdy!"); + if (config >= GEN_5) { + HP_BAR(player, hp: 1); + ABILITY_POPUP(player, ABILITY_STURDY); + MESSAGE("Geodude endured the hit using Sturdy!"); + } else { + HP_BAR(player, hp: 0); + NONE_OF { + ABILITY_POPUP(player, ABILITY_STURDY); + MESSAGE("Geodude endured the hit using Sturdy!"); + } + SEND_IN_MESSAGE("Geodude"); + } } } diff --git a/test/battle/ability/super_luck.c b/test/battle/ability/super_luck.c index 016ff3fae..d271c6ff6 100644 --- a/test/battle/ability/super_luck.c +++ b/test/battle/ability/super_luck.c @@ -11,8 +11,8 @@ SINGLE_BATTLE_TEST("Super Luck increases the critical hit ratio by 1 stage") PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { ASSUME(GetSpeciesBaseSpeed(SPECIES_TOGEPI) == 20); - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); - PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); }; + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); + PLAYER(SPECIES_TOGEPI) { Ability(ABILITY_SUPER_LUCK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } diff --git a/test/battle/ability/supersweet_syrup.c b/test/battle/ability/supersweet_syrup.c index cd819eda7..572f69775 100644 --- a/test/battle/ability/supersweet_syrup.c +++ b/test/battle/ability/supersweet_syrup.c @@ -34,7 +34,7 @@ DOUBLE_BATTLE_TEST("Supersweet Syrup lowers evasion of both opposing mon's in ba OPPONENT(SPECIES_DIPPLIN) { Ability(ABILITY_SUPERSWEET_SYRUP); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_SUPERSWEET_SYRUP); MESSAGE("A supersweet aroma is wafting from the syrup covering the opposing Dipplin!"); diff --git a/test/battle/ability/supreme_overlord.c b/test/battle/ability/supreme_overlord.c index 759202cc1..103c99d36 100644 --- a/test/battle/ability/supreme_overlord.c +++ b/test/battle/ability/supreme_overlord.c @@ -95,8 +95,8 @@ SINGLE_BATTLE_TEST("Supreme Overlord does not boost attack if party members are SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_KINGAMBIT) { Ability(ABILITY_SUPREME_OVERLORD); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -116,10 +116,10 @@ SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all batt SINGLE_BATTLE_TEST("Supreme Overlord's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_KINGAMBIT) { Ability(ABILITY_SUPREME_OVERLORD); } } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } diff --git a/test/battle/ability/swift_swim.c b/test/battle/ability/swift_swim.c index 4282ac274..eacbccfde 100644 --- a/test/battle/ability/swift_swim.c +++ b/test/battle/ability/swift_swim.c @@ -1,6 +1,57 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Swift Swim doubles speed if it's raining"); -TO_DO_BATTLE_TEST("Swift Swim doesn't double speed if Cloud Nine/Air Lock is on the field"); -TO_DO_BATTLE_TEST("Swift Swim doesn't double speed if they have an Utility Umbrella"); +SINGLE_BATTLE_TEST("Swift Swim doubles speed if it's raining") +{ + GIVEN { + PLAYER(SPECIES_LUDICOLO) { Ability(ABILITY_SWIFT_SWIM); Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(199); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_RAIN_DANCE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } +} + +SINGLE_BATTLE_TEST("Swift Swim doesn't double speed if Cloud Nine/Air Lock is on the field") +{ + u16 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; } + + GIVEN { + PLAYER(SPECIES_LUDICOLO) { Ability(ABILITY_SWIFT_SWIM); Speed(100); } + OPPONENT(species) { Speed(199); Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_RAIN_DANCE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} + +SINGLE_BATTLE_TEST("Swift Swim doesn't double speed if they have an Utility Umbrella") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + PLAYER(SPECIES_LUDICOLO) { Ability(ABILITY_SWIFT_SWIM); Speed(100); Item(ITEM_UTILITY_UMBRELLA); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(199); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_RAIN_DANCE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} diff --git a/test/battle/ability/sword_of_ruin.c b/test/battle/ability/sword_of_ruin.c index a891f7d5a..a5a808daf 100644 --- a/test/battle/ability/sword_of_ruin.c +++ b/test/battle/ability/sword_of_ruin.c @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Sword of Ruin reduces Defense if opposing mon's ability does SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_CHIEN_PAO); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -55,10 +55,10 @@ SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battler SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_CHIEN_PAO); } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } @@ -77,7 +77,7 @@ SINGLE_BATTLE_TEST("Sword of Ruin's message displays correctly after all battler DOUBLE_BATTLE_TEST("Sword of Ruin increases damage taken by special moves in Wonder Room", s16 damage) { bool32 useWonderRoom; - u32 move; + enum Move move; PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_SCRATCH; } PARAMETRIZE { useWonderRoom = FALSE; move = MOVE_ROUND; } @@ -165,7 +165,7 @@ DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is not ignored by Mold Bre DOUBLE_BATTLE_TEST("Sword of Ruin's Defense reduction is ignored by Gastro Acid", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GASTRO_ACID; } PARAMETRIZE { move = MOVE_CELEBRATE; } diff --git a/test/battle/ability/symbiosis.c b/test/battle/ability/symbiosis.c index 932008d9d..44e7c5f1b 100644 --- a/test/battle/ability/symbiosis.c +++ b/test/battle/ability/symbiosis.c @@ -132,3 +132,49 @@ DOUBLE_BATTLE_TEST("Symbiosis transfers its item to an ally after it consumes a EXPECT_EQ(playerRight->item, ITEM_NONE); } } + +DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption and move execution (Gen7+)") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); + WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_7); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ABILITY_POPUP(playerRight, ABILITY_SYMBIOSIS); + STATUS_ICON(playerLeft, STATUS1_TOXIC_POISON); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_TOXIC_ORB); + EXPECT_EQ(playerRight->item, ITEM_NONE); + } +} + +DOUBLE_BATTLE_TEST("Symbiosis transfers its item after Gem consumption, but before move execution (Gen6)") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_NORMAL_GEM) == HOLD_EFFECT_GEMS); + WITH_CONFIG(CONFIG_SYMBIOSIS_GEMS, GEN_6); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } + PLAYER(SPECIES_ORANGURU) { Ability(ABILITY_SYMBIOSIS); Item(ITEM_TOXIC_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); + MESSAGE("The Normal Gem strengthened Wobbuffet's power!"); + ABILITY_POPUP(playerRight, ABILITY_SYMBIOSIS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + STATUS_ICON(playerLeft, STATUS1_TOXIC_POISON); + } THEN { + EXPECT_EQ(playerLeft->item, ITEM_TOXIC_ORB); + EXPECT_EQ(playerRight->item, ITEM_NONE); + } +} diff --git a/test/battle/ability/synchronize.c b/test/battle/ability/synchronize.c index e150e2950..8604814fa 100644 --- a/test/battle/ability/synchronize.c +++ b/test/battle/ability/synchronize.c @@ -3,11 +3,13 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opposing mon") { - + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); - ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + WITH_CONFIG(CONFIG_SYNCHRONIZE_TOXIC, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } } WHEN { @@ -18,13 +20,17 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp STATUS_ICON(opponent, badPoison: TRUE); ABILITY_POPUP(opponent, ABILITY_SYNCHRONIZE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, player); - STATUS_ICON(player, badPoison: TRUE); + if (config >= GEN_5) + STATUS_ICON(player, badPoison: TRUE); + else + STATUS_ICON(player, poison: TRUE); } } SINGLE_BATTLE_TEST("Synchronize will still show up the ability pop up even if it fails") { GIVEN { + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); ASSUME(MoveMakesContact(MOVE_TACKLE)); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); } OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } diff --git a/test/battle/ability/tablets_of_ruin.c b/test/battle/ability/tablets_of_ruin.c index 0b58edc79..de7bd7ddd 100644 --- a/test/battle/ability/tablets_of_ruin.c +++ b/test/battle/ability/tablets_of_ruin.c @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Tablets of Ruin reduces Attack if opposing mon's ability doe SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WO_CHIEN); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -55,10 +55,10 @@ SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battl SINGLE_BATTLE_TEST("Tablets of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WO_CHIEN); } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } diff --git a/test/battle/ability/tangling_hair.c b/test/battle/ability/tangling_hair.c index fdae4de06..4e12d1b5c 100644 --- a/test/battle/ability/tangling_hair.c +++ b/test/battle/ability/tangling_hair.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Tangling Hair drops opposing mon's speed if ability user got hit by a contact move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Tangling Hair does not trigger on Clear Body") { GIVEN { PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } - OPPONENT(SPECIES_BELDUM) { Ability(ABILITY_CLEAR_BODY); }; + OPPONENT(SPECIES_BELDUM) { Ability(ABILITY_CLEAR_BODY); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { @@ -103,7 +103,7 @@ SINGLE_BATTLE_TEST("Tangling Hair will trigger if move is boosted by Sheer Force ASSUME(MoveIsAffectedBySheerForce(MOVE_POISON_JAB)); GIVEN { PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_TANGLING_HAIR); } - OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); }; + OPPONENT(SPECIES_NIDOKING) { Ability(ABILITY_SHEER_FORCE); } } WHEN { TURN { MOVE(opponent, MOVE_POISON_JAB); } } SCENE { diff --git a/test/battle/ability/tera_shell.c b/test/battle/ability/tera_shell.c index 55a6c3d62..11a77ca71 100644 --- a/test/battle/ability/tera_shell.c +++ b/test/battle/ability/tera_shell.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Tera Shell makes all moves against Terapagos not very effect PARAMETRIZE { hp = 100; } PARAMETRIZE { hp = 99; } GIVEN { - PLAYER(SPECIES_TERAPAGOS_TERASTAL) { Ability(ABILITY_TERA_SHELL); HP(hp); MaxHP(100);} + PLAYER(SPECIES_TERAPAGOS_TERASTAL) { Ability(ABILITY_TERA_SHELL); HP(hp); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } diff --git a/test/battle/ability/tera_shift.c b/test/battle/ability/tera_shift.c index 9149160cd..f081d5ef6 100644 --- a/test/battle/ability/tera_shift.c +++ b/test/battle/ability/tera_shift.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Tera Shift transforms Terapagos into its Terastal form on sw PLAYER(SPECIES_TERAPAGOS_NORMAL) { Ability(ABILITY_TERA_SHIFT); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { ; } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_TERA_SHIFT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); @@ -23,13 +23,31 @@ SINGLE_BATTLE_TEST("Tera Shift can't be suppressed by Neutralizing Gas") PLAYER(SPECIES_TERAPAGOS_NORMAL) { Ability(ABILITY_TERA_SHIFT); } OPPONENT(SPECIES_KOFFING) { Ability(ABILITY_NEUTRALIZING_GAS); } } WHEN { - TURN { ; } + TURN {} } SCENE { - ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); ABILITY_POPUP(player, ABILITY_TERA_SHIFT); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); MESSAGE("Terapagos transformed!"); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); } THEN { EXPECT_EQ(player->species, SPECIES_TERAPAGOS_TERASTAL); } } + +SINGLE_BATTLE_TEST("Tera Shift activates before Neutralizing Gas regardless of Speed") +{ + u32 speed = 0; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 150; } + + GIVEN { + PLAYER(SPECIES_TERAPAGOS_NORMAL) { Speed(speed); Ability(ABILITY_TERA_SHIFT); } + OPPONENT(SPECIES_KOFFING) { Speed(100); Ability(ABILITY_NEUTRALIZING_GAS); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(player, ABILITY_TERA_SHIFT); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + } +} diff --git a/test/battle/ability/teraform_zero.c b/test/battle/ability/teraform_zero.c index f6620d662..17f086bf0 100644 --- a/test/battle/ability/teraform_zero.c +++ b/test/battle/ability/teraform_zero.c @@ -6,8 +6,8 @@ DOUBLE_BATTLE_TEST("Teraform Zero clears weather and terrain upon activation") GIVEN { PLAYER(SPECIES_TERAPAGOS_TERASTAL); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_KYOGRE) {Ability(ABILITY_DRIZZLE); } - OPPONENT(SPECIES_TAPU_KOKO) {Ability(ABILITY_ELECTRIC_SURGE); } + OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { TURN { MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } SCENE { @@ -22,9 +22,9 @@ DOUBLE_BATTLE_TEST("Teraform Zero can be supressed") GIVEN { PLAYER(SPECIES_TERAPAGOS_TERASTAL); PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WEEZING) {Ability(ABILITY_NEUTRALIZING_GAS); } - OPPONENT(SPECIES_KYOGRE) {Ability(ABILITY_DRIZZLE); } - OPPONENT(SPECIES_TAPU_KOKO) {Ability(ABILITY_ELECTRIC_SURGE); } + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } SCENE { @@ -87,10 +87,10 @@ DOUBLE_BATTLE_TEST("Teraform Zero shouldn't cause Neutralizing Gas to show it's { GIVEN { PLAYER(SPECIES_TERAPAGOS_TERASTAL); - PLAYER(SPECIES_ABSOL) {Ability(ABILITY_PRESSURE); } - PLAYER(SPECIES_WEEZING) {Ability(ABILITY_NEUTRALIZING_GAS); } - OPPONENT(SPECIES_KYOGRE) {Ability(ABILITY_DRIZZLE); } - OPPONENT(SPECIES_TAPU_KOKO) {Ability(ABILITY_ELECTRIC_SURGE); } + PLAYER(SPECIES_ABSOL) { Ability(ABILITY_PRESSURE); } + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); } + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { TURN { SWITCH(playerRight, 2); MOVE(playerLeft, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } SCENE { diff --git a/test/battle/ability/thick_fat.c b/test/battle/ability/thick_fat.c index bcc4c9487..4a3cde843 100644 --- a/test/battle/ability/thick_fat.c +++ b/test/battle/ability/thick_fat.c @@ -1,4 +1,39 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Thick Fat (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_POWDER_SNOW) == TYPE_ICE); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); +} + +SINGLE_BATTLE_TEST("Thick Fat halves damage from fire and ice type moves", s16 damage[2]) +{ + enum Move move; + + PARAMETRIZE { move = MOVE_POWDER_SNOW; } + PARAMETRIZE { move = MOVE_EMBER; } + + GIVEN { + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_SNORLAX) { Ability(ABILITY_THICK_FAT); } + } + WHEN { + TURN { MOVE(player, move); } + TURN { MOVE(player, MOVE_WORRY_SEED); } + TURN { MOVE(player, move); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage[1]); + } + FINALLY { + EXPECT_MUL_EQ(results[0].damage[0], Q_4_12(2), results[0].damage[1]); + EXPECT_MUL_EQ(results[1].damage[0], Q_4_12(2), results[1].damage[1]); + } +} + diff --git a/test/battle/ability/toxic_boost.c b/test/battle/ability/toxic_boost.c index 85960c5b0..35a233ec2 100644 --- a/test/battle/ability/toxic_boost.c +++ b/test/battle/ability/toxic_boost.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Toxic Boost (Ability) test titles") +SINGLE_BATTLE_TEST("Toxic Boost increases Attack by 50% when the Pokémon is poisoned", s16 damage) +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_NONE; } + PARAMETRIZE { status1 = STATUS1_POISON; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_ZANGOOSE) { Ability(ABILITY_TOXIC_BOOST); Status1(status1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[2].damage); + } +} diff --git a/test/battle/ability/toxic_chain.c b/test/battle/ability/toxic_chain.c index b93af761c..cb0f0d24f 100644 --- a/test/battle/ability/toxic_chain.c +++ b/test/battle/ability/toxic_chain.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Toxic Chain inflicts bad poison on any hit of a multi-hit mo { GIVEN { ASSUME(GetMoveCategory(MOVE_DOUBLE_SLAP) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveEffect(MOVE_DOUBLE_SLAP) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_DOUBLE_SLAP)); ASSUME(GetMovePower(MOVE_DOUBLE_SLAP) > 0); ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } @@ -52,7 +52,7 @@ DOUBLE_BATTLE_TEST("Toxic Chain can inflict bad poison on both foes") { GIVEN { ASSUME(GetMoveCategory(MOVE_RAZOR_LEAF) != DAMAGE_CATEGORY_STATUS); - ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == TARGET_BOTH); ASSUME(GetMovePower(MOVE_RAZOR_LEAF) > 0); PLAYER(SPECIES_OKIDOGI) { Ability(ABILITY_TOXIC_CHAIN); } PLAYER(SPECIES_WOBBUFFET); @@ -79,7 +79,7 @@ DOUBLE_BATTLE_TEST("Toxic Chain can inflict bad poison on both foes") SINGLE_BATTLE_TEST("Toxic Chain makes Lum/Pecha Berry trigger before being knocked off") { - u16 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_PECHA_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } diff --git a/test/battle/ability/toxic_debris.c b/test/battle/ability/toxic_debris.c index 466184990..086304ca7 100644 --- a/test/battle/ability/toxic_debris.c +++ b/test/battle/ability/toxic_debris.c @@ -9,10 +9,10 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Toxic Debris sets Toxic Spikes on the opposing side if hit by a physical attack") { - u32 move; + enum Move move; - PARAMETRIZE { move = MOVE_SCRATCH;} - PARAMETRIZE { move = MOVE_SWIFT;} + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { PLAYER(SPECIES_GLIMMORA) { Ability(ABILITY_TOXIC_DEBRIS); } @@ -100,9 +100,9 @@ SINGLE_BATTLE_TEST("Toxic Debris activates if user faints after physical hit") TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - MESSAGE("Glimmora fainted!"); ABILITY_POPUP(player, ABILITY_TOXIC_DEBRIS); MESSAGE("Poison spikes were scattered on the ground all around the opposing team!"); + MESSAGE("Glimmora fainted!"); } } diff --git a/test/battle/ability/trace.c b/test/battle/ability/trace.c index 71d503508..d52da6646 100644 --- a/test/battle/ability/trace.c +++ b/test/battle/ability/trace.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Trace copies opponents ability") PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_TRACE); MESSAGE("It traced the opposing Torchic's Blaze!"); @@ -48,7 +48,7 @@ DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly") { enum Ability ability1, ability2; - PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE;} + PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE; } PARAMETRIZE { ability1 = ABILITY_BLAZE; ability2 = ABILITY_SPEED_BOOST; } PASSES_RANDOMLY(1, 2, RNG_TRACE); @@ -58,7 +58,7 @@ DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly") OPPONENT(SPECIES_TORCHIC) { Ability(ability1); } OPPONENT(SPECIES_TORCHIC) { Ability(ability2); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_TRACE); MESSAGE("It traced the opposing Torchic's Blaze!"); @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Trace copies opponent's Intimidate and triggers it immediate PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); } OPPONENT(SPECIES_MASQUERAIN) { Ability(ABILITY_INTIMIDATE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_TRACE); ABILITY_POPUP(player, ABILITY_INTIMIDATE); @@ -103,7 +103,7 @@ DOUBLE_BATTLE_TEST("Trace respects the turn order") OPPONENT(SPECIES_HIPPOWDON) { Speed(10); Ability(ABILITY_SAND_STREAM); } OPPONENT(SPECIES_DEOXYS_SPEED) { Speed(30); Ability(ABILITY_PRESSURE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_PRESSURE); ABILITY_POPUP(opponentRight, ABILITY_PRESSURE); diff --git a/test/battle/ability/transistor.c b/test/battle/ability/transistor.c index e57043a5c..9100d9a6a 100644 --- a/test/battle/ability/transistor.c +++ b/test/battle/ability/transistor.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; } diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c index 4498bb492..5f1369293 100644 --- a/test/battle/ability/unburden.c +++ b/test/battle/ability/unburden.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") OPPONENT(SPECIES_RILLABOOM) { Speed(7); Ability(ABILITY_GRASSY_SURGE); } } WHEN { TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, opponent); ABILITY_POPUP(opponent, ABILITY_GRASSY_SURGE); @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user gets their item knocked off OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } } WHEN { TURN { MOVE(opponent, MOVE_KNOCK_OFF); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Unburden doesn't activate when item is consumed in Neutraliz } WHEN { TURN { MOVE(opponent, MOVE_KNOCK_OFF); } TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Unburden doubling speed effect is ignored by Neutralizing Ga TURN { MOVE(opponent, MOVE_KNOCK_OFF); } TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 0); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index 8bbc9f924..74d53874e 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own ber PLAYER(mon) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RAWST_BERRY); Status1(STATUS1_BURN); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ability); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); @@ -99,3 +99,46 @@ SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in") } } + +DOUBLE_BATTLE_TEST("Unnerve stops applying on death but applies on revive") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + ASSUME(gItemsInfo[ITEM_RAWST_BERRY].holdEffect == HOLD_EFFECT_CURE_BRN); + ASSUME(gItemsInfo[ITEM_REVIVE].battleUsage == EFFECT_ITEM_REVIVE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(mon) { Ability(ability); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RAWST_BERRY); Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_RAWST_BERRY); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); MOVE(opponentLeft, MOVE_WILL_O_WISP, target: opponentRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_BRN, opponentRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } + +} + +SINGLE_BATTLE_TEST("Unnerve activates before other switch in abilities regardless of Speed") +{ + u32 speed = 0; + + PARAMETRIZE { speed = 50; } + PARAMETRIZE { speed = 150; } + + GIVEN { + PLAYER(SPECIES_PINSIR) { Speed(100); Ability(ABILITY_MOLD_BREAKER); } + OPPONENT(SPECIES_JOLTIK) { Speed(speed); Ability(ABILITY_UNNERVE); } + } WHEN { + TURN {} + } SCENE { + ABILITY_POPUP(opponent, ABILITY_UNNERVE); + ABILITY_POPUP(player, ABILITY_MOLD_BREAKER); + } +} diff --git a/test/battle/ability/vessel_of_ruin.c b/test/battle/ability/vessel_of_ruin.c index 1a075db8c..970715f54 100644 --- a/test/battle/ability/vessel_of_ruin.c +++ b/test/battle/ability/vessel_of_ruin.c @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Vessel of Ruin reduces Sp. Atk if opposing mon's ability doe SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_TING_LU); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -55,10 +55,10 @@ SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battle SINGLE_BATTLE_TEST("Vessel of Ruin's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_TING_LU); } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } diff --git a/test/battle/ability/volt_absorb.c b/test/battle/ability/volt_absorb.c index becc76fd1..1ce970429 100644 --- a/test/battle/ability/volt_absorb.c +++ b/test/battle/ability/volt_absorb.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Volt Absorb is only triggered once on multi strike moves") { GIVEN { ASSUME(GetMoveType(MOVE_FURY_SWIPES) == TYPE_NORMAL); - ASSUME(GetMoveEffect(MOVE_FURY_SWIPES) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_FURY_SWIPES)); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_GRAVELER_ALOLA) { Ability(ABILITY_GALVANIZE); } } WHEN { @@ -65,7 +65,7 @@ DOUBLE_BATTLE_TEST("Volt Absorb does not stop Electric Typed Explosion from dama { s16 damage1, damage2; GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); ASSUME(GetMoveType(MOVE_EXPLOSION) == TYPE_NORMAL); PLAYER(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); HP(1); MaxHP(100); } PLAYER(SPECIES_ABRA); diff --git a/test/battle/ability/wandering_spirit.c b/test/battle/ability/wandering_spirit.c index 9d8d7fad3..42ada866f 100644 --- a/test/battle/ability/wandering_spirit.c +++ b/test/battle/ability/wandering_spirit.c @@ -3,7 +3,7 @@ TO_DO_BATTLE_TEST("TODO: Write Wandering Spirit (Ability) test titles") -SINGLE_BATTLE_TEST("Wandering Spirit copied ability should not trigger on fainted mon") +SINGLE_BATTLE_TEST("Wandering Spirit copied ability triggers on fainted mon") { GIVEN { PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } @@ -14,6 +14,6 @@ SINGLE_BATTLE_TEST("Wandering Spirit copied ability should not trigger on fainte TURN { MOVE(player, MOVE_POISON_FANG); SEND_OUT(opponent, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_POISON_FANG, player); - NOT ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); } } diff --git a/test/battle/ability/water_absorb.c b/test/battle/ability/water_absorb.c index 1c0406ebd..288a04df2 100644 --- a/test/battle/ability/water_absorb.c +++ b/test/battle/ability/water_absorb.c @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Water Absorb is only triggered once on multi strike moves") { GIVEN { ASSUME(GetMoveType(MOVE_WATER_SHURIKEN) == TYPE_WATER); - ASSUME(GetMoveEffect(MOVE_WATER_SHURIKEN) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_WATER_SHURIKEN)); PLAYER(SPECIES_POLIWAG) { Ability(ABILITY_WATER_ABSORB); HP(1); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -63,7 +63,7 @@ SINGLE_BATTLE_TEST("Water Absorb is only triggered once on multi strike moves") SINGLE_BATTLE_TEST("Water Absorb prevents Absorb Bulb and Luminous Moss from activating") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABSORB_BULB; } PARAMETRIZE { item = ITEM_LUMINOUS_MOSS; } GIVEN { diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index c443d39c2..1e55c8454 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -11,14 +11,15 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 1 (Gen5-6) or 2 (Gen7+) when hit by a physical attack") { - u16 move, gen; + enum Move move; + u32 gen; PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_6; } PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_7; } PARAMETRIZE { move = MOVE_GUST; gen = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, gen); + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -84,7 +85,7 @@ SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower" PARAMETRIZE { gen = GEN_6; } PARAMETRIZE { gen = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, gen); + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -144,7 +145,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' { u32 j; GIVEN { - WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7); + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { @@ -183,7 +184,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't { u32 j; GIVEN { - WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7); + WITH_CONFIG(CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { diff --git a/test/battle/ability/wind_power.c b/test/battle/ability/wind_power.c index c38bbf356..c938a8f12 100644 --- a/test/battle/ability/wind_power.c +++ b/test/battle/ability/wind_power.c @@ -3,14 +3,15 @@ ASSUMPTIONS { - ASSUME(!IsBattleMoveStatus(MOVE_THUNDERBOLT)); - ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(!IsBattleMoveStatus(MOVE_NUZZLE)); + ASSUME(GetMoveType(MOVE_NUZZLE) == TYPE_ELECTRIC); ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); + ASSUME(!IsWindMove(MOVE_SCRATCH)); ASSUME(!IsBattleMoveStatus(MOVE_AIR_CUTTER)); - ASSUME(GetMoveTarget(MOVE_AIR_CUTTER) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_AIR_CUTTER) == TARGET_BOTH); ASSUME(IsWindMove(MOVE_AIR_CUTTER)); ASSUME(!IsBattleMoveStatus(MOVE_PETAL_BLIZZARD)); - ASSUME(GetMoveTarget(MOVE_PETAL_BLIZZARD) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_PETAL_BLIZZARD) == TARGET_FOES_AND_ALLY); ASSUME(IsWindMove(MOVE_PETAL_BLIZZARD)); ASSUME(!IsWindMove(MOVE_SCRATCH)); } @@ -18,19 +19,19 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move") { s16 dmgBefore, dmgAfter; - u16 move; + enum Move move; - PARAMETRIZE {move = MOVE_SCRATCH; } - PARAMETRIZE {move = MOVE_AIR_CUTTER; } + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_AIR_CUTTER; } GIVEN { PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(10); } - OPPONENT(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(5); } // Limber, so it doesn't get paralyzed. } WHEN { - TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } - TURN { MOVE(player, MOVE_THUNDERBOLT), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_NUZZLE), MOVE(opponent, move); } + TURN { MOVE(player, MOVE_NUZZLE), MOVE(opponent, move); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); HP_BAR(opponent, captureDamage: &dmgBefore); ANIMATION(ANIM_TYPE_MOVE, move, opponent); @@ -40,7 +41,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move MESSAGE("Being hit by Air Cutter charged Wattrel with power!"); } - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); HP_BAR(opponent, captureDamage: &dmgAfter); ANIMATION(ANIM_TYPE_MOVE, move, opponent); @@ -63,19 +64,19 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for player when hit by a wind move SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind move") { s16 dmgBefore, dmgAfter; - u16 move; + enum Move move; - PARAMETRIZE {move = MOVE_SCRATCH; } - PARAMETRIZE {move = MOVE_AIR_CUTTER; } + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_AIR_CUTTER; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Ability(ABILITY_LIMBER); Speed(5) ;} // Limber, so it doesn't get paralyzed. + PLAYER(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(5); } // Limber, so it doesn't get paralyzed. OPPONENT(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(10); } } WHEN { - TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } - TURN { MOVE(opponent, MOVE_THUNDERBOLT), MOVE(player, move); } + TURN { MOVE(opponent, MOVE_NUZZLE), MOVE(player, move); } + TURN { MOVE(opponent, MOVE_NUZZLE), MOVE(player, move); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); HP_BAR(player, captureDamage: &dmgBefore); ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -85,7 +86,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo MESSAGE("Being hit by Air Cutter charged the opposing Wattrel with power!"); } - ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, opponent); HP_BAR(player, captureDamage: &dmgAfter); ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -105,21 +106,59 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo } } +SINGLE_BATTLE_TEST("Wind Power sets up Charge for only one attack when hit by a wind move") +{ + s16 dmgCharged, dmgAfter; + enum Move move; + + PARAMETRIZE { move = MOVE_SCRATCH; } + PARAMETRIZE { move = MOVE_AIR_CUTTER; } + + GIVEN { + PLAYER(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(5); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(10); } // Limber, so it doesn't get paralyzed. + } WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_NUZZLE); } + TURN { MOVE(player, MOVE_NUZZLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + HP_BAR(player); + if (move == MOVE_AIR_CUTTER) { + ABILITY_POPUP(player, ABILITY_WIND_POWER); + MESSAGE("Being hit by Air Cutter charged Wattrel with power!"); + } + + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); + HP_BAR(opponent, captureDamage: &dmgCharged); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_NUZZLE, player); + HP_BAR(opponent, captureDamage: &dmgAfter); + } + THEN { + if (move == MOVE_AIR_CUTTER) { + EXPECT_MUL_EQ(dmgAfter, Q_4_12(2.0), dmgCharged); + } + else { + EXPECT_EQ(dmgAfter, dmgCharged); + } + } +} + DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 2/3 target move") { enum Ability abilityLeft, abilityRight; - PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER;} - PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } - PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE { abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE { abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } + PARAMETRIZE { abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } GIVEN { PLAYER(SPECIES_WATTREL) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WATTREL) { Ability(abilityRight); Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(15); } } WHEN { - TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER); MOVE(opponentRight, MOVE_AIR_CUTTER);} + TURN { MOVE(opponentLeft, MOVE_AIR_CUTTER); MOVE(opponentRight, MOVE_AIR_CUTTER); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_AIR_CUTTER, opponentLeft); @@ -150,17 +189,17 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab { enum Ability abilityLeft, abilityRight; - PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } - PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } - PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE { abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; } + PARAMETRIZE { abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; } + PARAMETRIZE { abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_WIND_POWER; } GIVEN { PLAYER(SPECIES_WATTREL) { Ability(abilityLeft); Speed(10); } PLAYER(SPECIES_WATTREL) { Ability(abilityRight); Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(20); } - OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_LIMBER); Speed(15); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(20); } + OPPONENT(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); Speed(15); } } WHEN { - TURN { MOVE(opponentLeft, MOVE_PETAL_BLIZZARD);} + TURN { MOVE(opponentLeft, MOVE_PETAL_BLIZZARD); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_PETAL_BLIZZARD, opponentLeft); @@ -189,8 +228,8 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly when Tailwind is used") { bool8 opponentSide; - PARAMETRIZE {opponentSide = TRUE;} - PARAMETRIZE {opponentSide = FALSE;} + PARAMETRIZE { opponentSide = TRUE; } + PARAMETRIZE { opponentSide = FALSE; } GIVEN { ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); @@ -199,7 +238,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly when Tailwind is used") OPPONENT(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(20); } OPPONENT(SPECIES_WATTREL) { Ability(ABILITY_WIND_POWER); Speed(15); } } WHEN { - TURN { MOVE((opponentSide == TRUE) ? opponentLeft : playerLeft, MOVE_TAILWIND);} + TURN { MOVE((opponentSide == TRUE) ? opponentLeft : playerLeft, MOVE_TAILWIND); } } SCENE { if (opponentSide) { ANIMATION(ANIM_TYPE_MOVE, MOVE_TAILWIND, opponentLeft); diff --git a/test/battle/ability/zen_mode.c b/test/battle/ability/zen_mode.c index 1e73961cd..96f47a318 100644 --- a/test/battle/ability/zen_mode.c +++ b/test/battle/ability/zen_mode.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less ABILITY_POPUP(player, ABILITY_ZEN_MODE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); } THEN { - ASSUME(player->hp <= player->maxHP / 2); + EXPECT_LT(player->hp, player->maxHP / 2); EXPECT_EQ(player->species, zenSpecies); } } diff --git a/test/battle/ability/zero_to_hero.c b/test/battle/ability/zero_to_hero.c index 7df3f0770..af90f500d 100644 --- a/test/battle/ability/zero_to_hero.c +++ b/test/battle/ability/zero_to_hero.c @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Zero to Hero will activate if a switch move is used") SINGLE_BATTLE_TEST("Gastro Acid, Worry Seed, and Simple Beam fail if the target has the Ability Zero to Hero") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_GASTRO_ACID; } PARAMETRIZE { move = MOVE_WORRY_SEED; } @@ -139,9 +139,9 @@ SINGLE_BATTLE_TEST("Imposter doesn't apply the heroic transformation message whe SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Player") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_PALAFIN_ZERO); - PLAYER(SPECIES_WOBBUFFET) { HP(1);} + PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -162,11 +162,11 @@ SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers SINGLE_BATTLE_TEST("Zero to Hero's message displays correctly after all battlers fainted - Opponent") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PALAFIN_ZERO); - OPPONENT(SPECIES_WOBBUFFET) { HP(1);} + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(opponent, MOVE_FLIP_TURN); SEND_OUT(opponent, 1); } TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 0); } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 3ee1f28c1..78de4fa3a 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -10,6 +10,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower") PARAMETRIZE { speedPlayer = 10; speedAi = 200; } GIVEN { + ASSUME(GetMovePower(MOVE_WATER_GUN) == GetMovePower(MOVE_BUBBLE)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SCIZOR) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Speed(speedAi); } @@ -34,6 +35,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has PARAMETRIZE { abilityAI = ABILITY_MOXIE; } PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } // Mold Breaker ignores Contrary. GIVEN { + ASSUME(GetMovePower(MOVE_BUBBLE) == GetMovePower(MOVE_WATER_GUN)); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_SHUCKLE) { Ability(ABILITY_CONTRARY); } OPPONENT(SPECIES_PINSIR) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Ability(abilityAI); } @@ -51,8 +53,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they both require the same number of hits to ko") { - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 hp, expectedMove, turns, expectedMove2; + enum Move move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + enum Move expectedMove, expectedMove2; + u16 hp, turns; enum Ability abilityAtk; abilityAtk = ABILITY_NONE; @@ -136,8 +139,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they b AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves which are super-effective but deal less damage") { u8 turns = 0; - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 expectedMove; + enum Move move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + enum Move expectedMove; enum Ability abilityAtk, abilityDef; abilityAtk = ABILITY_NONE; @@ -152,6 +155,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves ASSUME(GetMoveCategory(MOVE_SCALD) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_POISON_JAB) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetSpeciesBaseAttack(SPECIES_NIDOQUEEN) == 92); // Gen 5's 82 Base Attack causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_TYPHLOSION) { Ability(abilityDef); } PLAYER(SPECIES_WOBBUFFET); @@ -195,8 +199,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers Earthquake over Drill Run if both require the AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effect if both require the same number of hits to ko") { - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 hp, expectedMove, turns; + enum Move move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + enum Move expectedMove; + u16 hp, turns; // Both moves require the same number of turns but Flamethrower will be chosen over Overheat (powerful effect) PARAMETRIZE { move1 = MOVE_OVERHEAT; move2 = MOVE_FLAMETHROWER; hp = 300; expectedMove = MOVE_FLAMETHROWER; turns = 2; } @@ -206,6 +211,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effec GIVEN { ASSUME(GetMoveCategory(MOVE_FLAMETHROWER) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet + // With Gen 5 data, it chooses Overheat instead + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); // In Gen 5, it's 95 + ASSUME(GetMovePower(MOVE_OVERHEAT) == 130); // In Gen 5, it's 140. AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(hp); } PLAYER(SPECIES_WOBBUFFET); @@ -230,7 +238,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves with the best possible score, chosen ran { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET) { HP(5); }; + PLAYER(SPECIES_WOBBUFFET) { HP(5); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_TAKE_DOWN); } } WHEN { @@ -247,7 +255,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose a status move that boosts the attack by two ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_HORN_ATTACK) == DAMAGE_CATEGORY_PHYSICAL); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET) { HP(277); }; + PLAYER(SPECIES_WOBBUFFET) { HP(277); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KANGASKHAN) { Moves(MOVE_STRENGTH, MOVE_HORN_ATTACK, MOVE_SWORDS_DANCE); } } WHEN { @@ -258,8 +266,8 @@ AI_SINGLE_BATTLE_TEST("AI can choose a status move that boosts the attack by two AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking into account accuracy and move effect") { - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 expectedMove, expectedMove2 = MOVE_NONE; + enum Move move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + enum Move expectedMove, expectedMove2 = MOVE_NONE; enum Ability abilityAtk = ABILITY_NONE; u32 holdItemAtk = ITEM_NONE; @@ -286,7 +294,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking OPPONENT(SPECIES_GEODUDE) { Moves(move1, move2, move3, move4); Ability(abilityAtk); Item(holdItemAtk); } } WHEN { TURN { if (expectedMove2 == MOVE_NONE) { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); } - else {EXPECT_MOVES(opponent, expectedMove, expectedMove2); SCORE_EQ(opponent, expectedMove, expectedMove2); SEND_OUT(player, 1);} + else { EXPECT_MOVES(opponent, expectedMove, expectedMove2); SCORE_EQ(opponent, expectedMove, expectedMove2); SEND_OUT(player, 1); } } } SCENE { @@ -294,33 +302,20 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking } } -AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking into account accuracy and move effect failing") +AI_SINGLE_BATTLE_TEST("AI scores KOs with two turn moves correctly, considering Power Herb") { - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - u16 expectedMove, expectedMove2 = MOVE_NONE; - enum Ability abilityAtk = ABILITY_NONE; - u32 holdItemAtk = ITEM_NONE; + u32 aiItem; - // Fiery Dance and Skull Bash are chosen because user is holding Power Herb - PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_FIERY_DANCE; move4 = MOVE_DOUBLE_EDGE; - expectedMove = MOVE_FIERY_DANCE; expectedMove2 = MOVE_SKULL_BASH; } - // Crabhammer is chosen even if Skull Bash is more accurate, the user has no Power Herb - PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_SLAM; move4 = MOVE_CRABHAMMER; - expectedMove = MOVE_CRABHAMMER; } + PARAMETRIZE { aiItem = ITEM_POWER_HERB; } + PARAMETRIZE { aiItem= ITEM_NONE; } - KNOWN_FAILING; GIVEN { + ASSUME(GetItemHoldEffect(ITEM_POWER_HERB) == HOLD_EFFECT_POWER_HERB); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET) { HP(5); } - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GEODUDE) { Moves(move1, move2, move3, move4); Ability(abilityAtk); Item(holdItemAtk); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); HP(5); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_FOCUS_BLAST, MOVE_SKULL_BASH, MOVE_FIERY_DANCE, MOVE_CRABHAMMER); Item(aiItem); } } WHEN { - TURN { if (expectedMove2 == MOVE_NONE) { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); } - else {EXPECT_MOVES(opponent, expectedMove, expectedMove2); SCORE_EQ(opponent, expectedMove, expectedMove2); SEND_OUT(player, 1);} - } - } - SCENE { - MESSAGE("Wobbuffet fainted!"); + TURN { aiItem == ITEM_POWER_HERB ? EXPECT_MOVE(opponent, MOVE_SKULL_BASH) : SCORE_EQ(opponent, MOVE_FIERY_DANCE, MOVE_SKULL_BASH); } } } @@ -331,11 +326,11 @@ AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user PARAMETRIZE { abilityAtk = ABILITY_DROUGHT; } PARAMETRIZE { holdItemAtk = ITEM_POWER_HERB; } - PARAMETRIZE { } GIVEN { ASSUME(GetMoveCategory(MOVE_SOLAR_BEAM) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_GRASS_PLEDGE) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePower(MOVE_GRASS_PLEDGE) == 80); // Gen 5's 50 power causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(211); } PLAYER(SPECIES_WOBBUFFET); @@ -483,7 +478,7 @@ AI_SINGLE_BATTLE_TEST("AI will only choose Surf 1/3 times if the opposing mon ha GIVEN { ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_SURF); } @@ -500,7 +495,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Thunderbolt then Surf 2/3 times if the opp GIVEN { ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT); } @@ -515,8 +510,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary" { enum Ability ability; - PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } - PARAMETRIZE {ability = ABILITY_CONTRARY; } + PARAMETRIZE { ability = ABILITY_SUCTION_CUPS; } + PARAMETRIZE { ability = ABILITY_CONTRARY; } GIVEN { ASSUME(GetMovePower(MOVE_SCRATCH) == 40); ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); @@ -541,8 +536,8 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") { enum Ability ability; - PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; } - PARAMETRIZE {ability = ABILITY_CONTRARY; } + PARAMETRIZE { ability = ABILITY_SUCTION_CUPS; } + PARAMETRIZE { ability = ABILITY_CONTRARY; } GIVEN { ASSUME(GetMovePower(MOVE_SUPERPOWER) == 120); ASSUME(GetMoveType(MOVE_SUPERPOWER) == TYPE_FIGHTING); @@ -588,7 +583,7 @@ AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical i AI_SINGLE_BATTLE_TEST("AI avoids contact moves against rocky helmet") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_ROCKY_HELMET; } @@ -692,10 +687,11 @@ AI_SINGLE_BATTLE_TEST("AI won't use thawing moves if target is frozen unless it PARAMETRIZE { status = STATUS1_FROSTBITE; aiMove = MOVE_EMBER; aiFlags = AI_FLAG_CHECK_BAD_MOVE; } GIVEN { + WITH_CONFIG(CONFIG_BURN_HIT_THAW, GEN_6); // In Gen 5, non-Fire burning moves didn't cause thawing ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL); - ASSUME(gMovesInfo[MOVE_SCALD].thawsUser == TRUE); + ASSUME(MoveThawsUser(MOVE_SCALD) == TRUE); AI_FLAGS(aiFlags | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); Status1(status); } OPPONENT(SPECIES_VULPIX) { Moves(MOVE_TACKLE, aiMove); } @@ -838,6 +834,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_RAZOR_LEAF) != TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_METAL_CLAW) != TYPE_ELECTRIC); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_CELEBRATE); } PLAYER(SPECIES_KRABBY) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_CELEBRATE); } @@ -858,7 +855,8 @@ AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") PARAMETRIZE { ability = ABILITY_DAMP; } GIVEN { - ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); PLAYER(SPECIES_GOLDUCK) { Ability(ability); Moves(MOVE_SCRATCH); } OPPONENT(SPECIES_KABUTOPS) { Ability(ABILITY_SWIFT_SWIM); Moves(MOVE_RAIN_DANCE, MOVE_POUND); } @@ -933,11 +931,12 @@ AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage") AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); - PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); }; + PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); } OPPONENT(SPECIES_GLOOM) { Moves(MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_LEECH_SEED, MOVE_SYNTHESIS); } } WHEN { - TURN { MOVE(player, MOVE_ABSORB); EXPECT_MOVE(opponent, MOVE_MEGA_DRAIN);} + TURN { MOVE(player, MOVE_ABSORB); EXPECT_MOVE(opponent, MOVE_MEGA_DRAIN); } } } @@ -977,7 +976,7 @@ AI_SINGLE_BATTLE_TEST("AI will use Recovery move if it outheals your damage and AI_SINGLE_BATTLE_TEST("AI will use recovery move if it outheals your damage and is outsped") { - u32 aiMove = MOVE_NONE; + enum Move aiMove = MOVE_NONE; PASSES_RANDOMLY(100, 100, RNG_AI_SHOULD_RECOVER); PARAMETRIZE{ aiMove = MOVE_RECOVER; } PARAMETRIZE{ aiMove = MOVE_STRENGTH_SAP; } @@ -1028,3 +1027,246 @@ AI_DOUBLE_BATTLE_TEST("AI won't be confused by player's previous priority moves TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_DETECT); EXPECT_MOVE(opponentLeft, MOVE_POWER_GEM, target:playerLeft); EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); } } } + +AI_SINGLE_BATTLE_TEST("AI will see 2HKOs through resist berries") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { HP(117); Moves(MOVE_CELEBRATE); Item(ITEM_CHOPLE_BERRY); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_JUMP_KICK, MOVE_HEADBUTT); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_JUMP_KICK); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will prioritize a regular OHKO over a berry-ignoring OHKO") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { HP(75); Moves(MOVE_CELEBRATE); Item(ITEM_CHOPLE_BERRY); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_BOOMBURST, MOVE_VITAL_THROW); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVES(opponent, MOVE_BOOMBURST, MOVE_VITAL_THROW); } + SCORE_GT(opponent, MOVE_BOOMBURST, MOVE_VITAL_THROW); + } +} + +AI_SINGLE_BATTLE_TEST("AI will not prioritize a regular OHKO over a berry-reduced OHKO") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { HP(1); Moves(MOVE_CELEBRATE); Item(ITEM_CHOPLE_BERRY); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH, MOVE_KARATE_CHOP); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVES(opponent, MOVE_SCRATCH, MOVE_KARATE_CHOP); } + SCORE_EQ(opponent, MOVE_SCRATCH, MOVE_KARATE_CHOP); + } +} + +AI_SINGLE_BATTLE_TEST("AI won't increase its stats if it's about to fall asleep due to Yawn") +{ + u32 aiMove; + PARAMETRIZE { aiMove = MOVE_CELEBRATE; } + PARAMETRIZE { aiMove = MOVE_SWORDS_DANCE; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_YAWN, MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(aiMove, MOVE_SCRATCH); } + } WHEN { + if (aiMove == MOVE_CELEBRATE) + TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + else + TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will consider using Explosion inversely proportional to its missing HP") +{ + u32 monHP; u32 passesChance; + PARAMETRIZE { monHP = 20; passesChance = EXPLOSION_MINIMUM_CHANCE; } + PARAMETRIZE { monHP = 1; passesChance = EXPLOSION_MAXIMUM_CHANCE; } + PASSES_RANDOMLY(passesChance, 100, RNG_AI_CONSIDER_EXPLOSION); + GIVEN { + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + ASSUME(EXPLOSION_LOWER_HP_THRESHOLD == 10); + ASSUME(EXPLOSION_HIGHER_HP_THRESHOLD == 90); + ASSUME(LAST_MON_PREFERS_NOT_SACRIFICE == FALSE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_ZIGZAGOON) { Level(5); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); HP(monHP); MaxHP(20); Moves(MOVE_SCRATCH, MOVE_EXPLOSION); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_EXPLOSION); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will prioritize non-self-sacrificing moves if they have the same hits to KO") +{ + u32 selfSacrificeMove; + PARAMETRIZE { selfSacrificeMove = MOVE_EXPLOSION; } + PARAMETRIZE { selfSacrificeMove = MOVE_FINAL_GAMBIT; } + PASSES_RANDOMLY(100, 100, RNG_AI_CONSIDER_EXPLOSION); + GIVEN { + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); + ASSUME(EXPLOSION_LOWER_HP_THRESHOLD == 10); + ASSUME(EXPLOSION_HIGHER_HP_THRESHOLD == 90); + ASSUME(LAST_MON_PREFERS_NOT_SACRIFICE == FALSE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_ZIGZAGOON) { Level(5); HP(1); Speed(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); HP(1); MaxHP(20); Speed(2); Moves(MOVE_SCRATCH, selfSacrificeMove); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will consider using Final Gambit if it expects to KO and outspeeds") +{ + u32 aiOmniscientFlag; + PARAMETRIZE { aiOmniscientFlag = AI_FLAG_OMNISCIENT; } + PARAMETRIZE { aiOmniscientFlag = 0 ;} + PASSES_RANDOMLY(FINAL_GAMBIT_CHANCE, 100, RNG_AI_FINAL_GAMBIT); + GIVEN { + ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); + ASSUME(LAST_MON_PREFERS_NOT_SACRIFICE == FALSE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiOmniscientFlag); + PLAYER(SPECIES_ZIGZAGOON) { Level(5); MaxHP(20); Speed(1); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); MaxHP(20); Speed(2); Moves(MOVE_SCRATCH, MOVE_FINAL_GAMBIT); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_FINAL_GAMBIT); } + } +} + +AI_SINGLE_BATTLE_TEST("AI's Explosion scoring handles multiple move effects and the Explosion defense config") +{ + u32 genConfig; u32 passesChance; + PARAMETRIZE { genConfig = GEN_5; passesChance = 0; } + PARAMETRIZE { genConfig = GEN_4; passesChance = EXPLOSION_MAXIMUM_CHANCE; } + PASSES_RANDOMLY(passesChance, 100, RNG_AI_CONSIDER_EXPLOSION); + GIVEN { + WITH_CONFIG(CONFIG_EXPLOSION_DEFENSE, genConfig); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CLOYSTER) { Level(44); HP(68); Moves(MOVE_DETECT, MOVE_RAZOR_SHELL, MOVE_ICICLE_SPEAR, MOVE_ICE_SHARD); } + OPPONENT(SPECIES_GLALIE_MEGA) { Level(44); HP(1); Ability(ABILITY_REFRIGERATE); Friendship(MAX_FRIENDSHIP); Moves(MOVE_RETURN, MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_CRUNCH); } + } WHEN { + TURN { MOVE(player, MOVE_DETECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI won't be confused by player's one-shot-priority moves (ie. Fake Out, Detect) when comparing speed") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + ASSUME(GetMovePriority(MOVE_DETECT) > GetMovePriority(MOVE_AQUA_JET)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_COMBUSKEN) { Level(20); HP(1); Ability(ABILITY_SPEED_BOOST); Item(ITEM_BRIGHT_POWDER); Moves(MOVE_DETECT, MOVE_DOUBLE_KICK); } + PLAYER(SPECIES_QUILAVA) { Level(20); Ability(ABILITY_ADAPTABILITY); Item(ITEM_ORAN_BERRY); Moves(MOVE_MUD_SHOT, MOVE_INCINERATE); } + OPPONENT(SPECIES_PARAS) { Level(16); Ability(ABILITY_DRY_SKIN); Item(ITEM_QUICK_CLAW); Moves(MOVE_SLEEP_POWDER, MOVE_BUG_BITE, MOVE_AERIAL_ACE, MOVE_POISON_FANG); } + OPPONENT(SPECIES_BUIZEL) { Level(16); Ability(ABILITY_SWIFT_SWIM); Item(ITEM_DAMP_ROCK); Moves(MOVE_RAIN_DANCE, MOVE_HELPING_HAND, MOVE_ICE_FANG, MOVE_AQUA_JET); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_DETECT); MOVE(playerRight, MOVE_INCINERATE, target:opponentLeft); EXPECT_MOVE(opponentRight, MOVE_AQUA_JET, target:playerLeft); } + } +} + +TEST("AI hits to KO damage rounding works correctly") +{ + EXPECT_EQ(GetNoOfHitsToKO(4, 12), 3); + EXPECT_EQ(GetNoOfHitsToKO(16, 50), 4); +} + +AI_SINGLE_BATTLE_TEST("AI is encouraged to use pivot moves if it outspeeds and should switch") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_SCRATCH, MOVE_GROWL); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(2); HP(3); MaxHP(5); Moves(MOVE_U_TURN, MOVE_STRENGTH); } + OPPONENT(SPECIES_METAGROSS) { Speed(2); Moves(MOVE_METEOR_MASH); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_MOVE(opponent, MOVE_U_TURN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI is encouraged to use pivot moves if it is outsped, survives a hit, and should switch") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_MACHAMP) { Speed(2); Moves(MOVE_DRAGON_RAGE, MOVE_GROWL); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); MaxHP(41); Moves(MOVE_U_TURN, MOVE_STRENGTH); } + OPPONENT(SPECIES_METAGROSS) { Speed(2); Moves(MOVE_METEOR_MASH); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_MOVE(opponent, MOVE_U_TURN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI is encouraged to use pivot moves if the target has a Sash or Multiscale effect and the AI has a good switchin") +{ + PASSES_RANDOMLY(SHOULD_PIVOT_BREAK_SASH_CHANCE, 100, RNG_AI_SHOULD_PIVOT_BREAK_SASH); + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Item(ITEM_FOCUS_SASH); Moves(MOVE_GROWL); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_U_TURN, MOVE_STRENGTH); } + OPPONENT(SPECIES_METAGROSS) { Moves(MOVE_METEOR_MASH); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_MOVE(opponent, MOVE_U_TURN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI is encouraged to use pivot moves if it benefits from Regenerator and has a good switchin") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_DRAGON_RAGE, MOVE_GROWL); } + OPPONENT(SPECIES_TANGELA) { Speed(2); HP(30); MaxHP(100); Ability(ABILITY_REGENERATOR); Moves(MOVE_U_TURN, MOVE_MAGICAL_LEAF); } + OPPONENT(SPECIES_METAGROSS) { Speed(2); Moves(MOVE_METEOR_MASH); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_MOVE(opponent, MOVE_U_TURN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI is discouraged from using pivot moves if it has no good switchin and does not KO") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(1); Moves(MOVE_SCRATCH, MOVE_GROWL); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(2); HP(3); MaxHP(5); Moves(MOVE_U_TURN, MOVE_STRENGTH); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(1); Level(1); } + } WHEN { + TURN { MOVE(player, MOVE_GROWL); EXPECT_MOVE(opponent, MOVE_STRENGTH); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will try to withstand hit with absorbing move") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_DRAGON_RAGE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); HP(39); Moves(MOVE_ENERGY_BALL, MOVE_GIGA_DRAIN); } + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); EXPECT_MOVE(opponent, MOVE_GIGA_DRAIN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will not try to withstand hit with absorbing move if it will still be KO'd") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_DRAGON_RAGE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); MaxHP(40); HP(39); Moves(MOVE_ENERGY_BALL, MOVE_GIGA_DRAIN); } + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_RAGE); EXPECT_MOVE(opponent, MOVE_ENERGY_BALL); } + } +} diff --git a/test/battle/ai/ai_calc_best_move_score.c b/test/battle/ai/ai_calc_best_move_score.c index cfad45a0a..7fd3ff546 100644 --- a/test/battle/ai/ai_calc_best_move_score.c +++ b/test/battle/ai/ai_calc_best_move_score.c @@ -4,18 +4,17 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it knows it faints to target: AI faster") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_HOWL; } PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP - || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_CELEBRATE); }; + PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_CELEBRATE); } OPPONENT(SPECIES_KANGASKHAN) { Speed(20); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } } WHEN { TURN { MOVE(player, MOVE_SKY_UPPERCUT); EXPECT_MOVE(opponent, move); } @@ -25,18 +24,17 @@ AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it AI_SINGLE_BATTLE_TEST("AI will not further increase Attack / Sp. Atk stat if it knows it faints to target: AI slower") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_HOWL; } PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP - || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); }; + PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); } OPPONENT(SPECIES_KANGASKHAN) { Speed(15); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } } WHEN { TURN { MOVE(player, MOVE_DOUBLE_KICK); EXPECT_MOVE(opponent, move); } @@ -48,7 +46,7 @@ AI_SINGLE_BATTLE_TEST("AI will increase speed if it is slower") { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); }; + PLAYER(SPECIES_COMBUSKEN) { Speed(20); Moves(MOVE_DOUBLE_KICK, MOVE_CELEBRATE); } OPPONENT(SPECIES_KANGASKHAN) { Speed(15); Moves(MOVE_CHIP_AWAY, MOVE_AGILITY); } } WHEN { TURN { MOVE(player, MOVE_DOUBLE_KICK); EXPECT_MOVE(opponent, MOVE_AGILITY); } @@ -58,18 +56,17 @@ AI_SINGLE_BATTLE_TEST("AI will increase speed if it is slower") AI_SINGLE_BATTLE_TEST("AI will not waste a turn setting up if it knows target can faint it") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_HOWL; } PARAMETRIZE { move = MOVE_CALM_MIND; } GIVEN { ASSUME(GetMovePower(MOVE_SKY_UPPERCUT) == 85); - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP - || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP); ASSUME(GetMoveEffect(MOVE_CALM_MIND) == EFFECT_CALM_MIND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); - PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_DOUBLE_KICK, MOVE_FLAME_WHEEL, MOVE_CELEBRATE); }; + PLAYER(SPECIES_COMBUSKEN) { Speed(15); Moves(MOVE_SKY_UPPERCUT, MOVE_DOUBLE_KICK, MOVE_FLAME_WHEEL, MOVE_CELEBRATE); } OPPONENT(SPECIES_KANGASKHAN) { Speed(20); Moves(MOVE_CHIP_AWAY, MOVE_SWIFT, move); } } WHEN { TURN { MOVE(player, MOVE_DOUBLE_KICK); EXPECT_MOVE(opponent, move); } @@ -86,12 +83,12 @@ AI_SINGLE_BATTLE_TEST("AI will not use Throat Chop if opposing mon has a better ASSUME(GetMovePower(MOVE_FLAME_BURST) == 70); ASSUME(MoveHasAdditionalEffect(MOVE_THROAT_CHOP, MOVE_EFFECT_THROAT_CHOP) == TRUE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_DISARMING_VOICE, MOVE_FLAME_BURST); }; + PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_DISARMING_VOICE, MOVE_FLAME_BURST); } OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Moves(MOVE_THROAT_CHOP, MOVE_PSYCHIC_FANGS); } } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_FLAME_BURST); } TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_DISARMING_VOICE); } - TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_FLAME_BURST);} + TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_FLAME_BURST); } } } @@ -104,11 +101,187 @@ AI_SINGLE_BATTLE_TEST("AI will select Throat Chop if the sound move is the best ASSUME(GetMovePower(MOVE_FLAME_BURST) == 70); ASSUME(GetMovePower(MOVE_HYPER_VOICE) == 90); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_HYPER_VOICE, MOVE_FLAME_BURST); }; + PLAYER(SPECIES_REGIROCK) { Speed(15); Moves(MOVE_HYPER_VOICE, MOVE_FLAME_BURST); } OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Moves(MOVE_THROAT_CHOP, MOVE_PSYCHIC_FANGS); } } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_FLAME_BURST); } TURN { EXPECT_MOVE(opponent, MOVE_PSYCHIC_FANGS); MOVE(player, MOVE_HYPER_VOICE); } - TURN { EXPECT_MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_HYPER_VOICE);} + TURN { EXPECT_MOVE(opponent, MOVE_THROAT_CHOP); MOVE(player, MOVE_HYPER_VOICE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI will incentivise multiple best damage moves in cases of damage ties and KOs") +{ + u32 hp; + + PARAMETRIZE { hp = 120; } + PARAMETRIZE { hp = 20; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Speed(15); HP(hp); } + OPPONENT(SPECIES_KANGASKHAN) { Speed(20); Level(40); Moves(MOVE_SONICBOOM, MOVE_DRAGON_RAGE, MOVE_NIGHT_SHADE, MOVE_SEISMIC_TOSS); } + } WHEN { + if (hp == 120) + { + TURN { + SCORE_EQ_VAL(opponent, MOVE_SONICBOOM, AI_SCORE_DEFAULT); + SCORE_EQ_VAL(opponent, MOVE_DRAGON_RAGE, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE)); + SCORE_EQ_VAL(opponent, MOVE_NIGHT_SHADE, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE)); + SCORE_EQ_VAL(opponent, MOVE_SEISMIC_TOSS, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE)); + } + } + else + { + TURN { + SCORE_EQ_VAL(opponent, MOVE_SONICBOOM, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL)); + SCORE_EQ_VAL(opponent, MOVE_DRAGON_RAGE, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL)); + SCORE_EQ_VAL(opponent, MOVE_NIGHT_SHADE, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL)); + SCORE_EQ_VAL(opponent, MOVE_SEISMIC_TOSS, (AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL)); + } + } + } +} + +AI_SINGLE_BATTLE_TEST("Clangorous Soul - gets best move boost when player does under 67 pct damage") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SOLAR_BEAM; } + PARAMETRIZE { move = MOVE_AIR_SLASH; } + ASSUME(GetMovePower(MOVE_SOLAR_BEAM) == 120); + ASSUME(GetMovePower(MOVE_AIR_SLASH) == 75); + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 95)); + ASSUME(GetMovePower(MOVE_CLANGING_SCALES) == 110); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 80 : 90)); + ASSUME(GetMovePower(MOVE_FLASH_CANNON) == 80); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CHARIZARD){ Level(80); Nature(NATURE_TIMID); Ability(ABILITY_BLAZE); Item(ITEM_CHARIZARDITE_Y); Speed(221); Moves(MOVE_FLAMETHROWER, move); } + OPPONENT(SPECIES_KOMMO_O){ Level(80); Nature(NATURE_TIMID); Ability(ABILITY_OVERCOAT); Item(ITEM_THROAT_SPRAY); Speed(181); Moves(MOVE_CLANGOROUS_SOUL, MOVE_CLANGING_SCALES, MOVE_AURA_SPHERE, MOVE_FLASH_CANNON); } + } WHEN { + TURN { MOVE(player, move); EXPECT_MOVE(opponent, move == MOVE_AIR_SLASH ? MOVE_CLANGING_SCALES : MOVE_CLANGOROUS_SOUL); } + } +} + +AI_SINGLE_BATTLE_TEST("Clangorous Soul - unusable under 33 pct HP") +{ + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 95)); + ASSUME(GetMovePower(MOVE_CLANGING_SCALES) == 110); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 80 : 90)); + ASSUME(GetMovePower(MOVE_FLASH_CANNON) == 80); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CHARIZARD){ Level(80); Nature(NATURE_TIMID); Ability(ABILITY_BLAZE); Item(ITEM_CHARIZARDITE_Y); Speed(221); Moves(MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_KOMMO_O){ Level(80); MaxHP(234); HP(76); Nature(NATURE_TIMID); Ability(ABILITY_OVERCOAT); Item(ITEM_THROAT_SPRAY); Speed(181); Moves(MOVE_CLANGOROUS_SOUL, MOVE_CLANGING_SCALES, MOVE_AURA_SPHERE, MOVE_FLASH_CANNON); } + } WHEN { + TURN { MOVE(player, MOVE_FLAMETHROWER); EXPECT_MOVE(opponent, MOVE_CLANGING_SCALES); } + } +} + +AI_SINGLE_BATTLE_TEST("Clangorous Soul - unaware prevents score boost") +{ + ASSUME(GetMovePower(MOVE_POISON_JAB) == 80); + ASSUME(GetMovePower(MOVE_CLANGING_SCALES) == 110); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 80 : 90)); + ASSUME(GetMovePower(MOVE_FLASH_CANNON) == 80); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_CLODSIRE){ Level(80); Nature(NATURE_IMPISH); Ability(ABILITY_UNAWARE); Item(ITEM_BLACK_SLUDGE); Speed(61); Moves(MOVE_POISON_JAB); } + OPPONENT(SPECIES_KOMMO_O){ Level(80); MaxHP(234); Nature(NATURE_TIMID); Ability(ABILITY_OVERCOAT); Item(ITEM_THROAT_SPRAY); Speed(181); Moves(MOVE_CLANGOROUS_SOUL, MOVE_CLANGING_SCALES, MOVE_AURA_SPHERE, MOVE_FLASH_CANNON); } + } WHEN { + TURN { MOVE(player, MOVE_POISON_JAB); EXPECT_MOVE(opponent, MOVE_CLANGING_SCALES); } + } +} + +AI_SINGLE_BATTLE_TEST("Belly Drum - physical move >50 pct damage gets blocked by ice face, allowing setup") +{ + ASSUME(GetMovePower(MOVE_FLAME_WHEEL) == 60); + ASSUME(GetMovePower(MOVE_ICICLE_CRASH) == 85); + ASSUME(GetMovePower(MOVE_LIQUIDATION) == 85); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_EMBOAR){ Level(44); Nature(NATURE_BRAVE); Ability(ABILITY_BLAZE); Item(ITEM_IRON_BALL); HP(164); MaxHP(164); Speed(33); Moves(MOVE_FLAME_WHEEL); } + OPPONENT(SPECIES_EISCUE){ Level(42); Nature(NATURE_JOLLY); Ability(ABILITY_ICE_FACE); Item(ITEM_SALAC_BERRY); HP(128); MaxHP(128); Speed(66); Moves(MOVE_BELLY_DRUM, MOVE_ICICLE_CRASH, MOVE_LIQUIDATION); } + } WHEN { + TURN { MOVE(player, MOVE_FLAME_WHEEL); EXPECT_MOVE(opponent, MOVE_BELLY_DRUM); } + } +} + +AI_SINGLE_BATTLE_TEST("Belly Drum - special move vs ice face active correctly handled") +{ + ASSUME(GetMovePower(MOVE_FLAMETHROWER) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 95)); + ASSUME(GetMovePower(MOVE_ICICLE_CRASH) == 85); + ASSUME(GetMovePower(MOVE_LIQUIDATION) == 85); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_EMBOAR){ Level(44); Nature(NATURE_ADAMANT); Ability(ABILITY_BLAZE); Item(ITEM_MUSCLE_BAND); HP(164); MaxHP(164); Speed(75); Moves(MOVE_FLAMETHROWER); } + OPPONENT(SPECIES_EISCUE){ Level(42); Nature(NATURE_JOLLY); Ability(ABILITY_ICE_FACE); Item(ITEM_SALAC_BERRY); HP(128); MaxHP(128); Speed(66); Moves(MOVE_BELLY_DRUM, MOVE_ICICLE_CRASH, MOVE_LIQUIDATION); } + } WHEN { + TURN { MOVE(player, MOVE_FLAMETHROWER); EXPECT_MOVE(opponent, MOVE_LIQUIDATION); } + } +} + +AI_SINGLE_BATTLE_TEST("Belly Drum - physical move >50pct damage vs ice face already used") +{ + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == 100); + ASSUME(GetMovePower(MOVE_ICICLE_CRASH) == 85); + ASSUME(GetMovePower(MOVE_LIQUIDATION) == 85); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_EMBOAR){ Level(44); Nature(NATURE_ADAMANT); Ability(ABILITY_BLAZE); Item(ITEM_MUSCLE_BAND); HP(164); MaxHP(164); Speed(75); Moves(MOVE_EARTHQUAKE); } + OPPONENT(SPECIES_EISCUE_NOICE){ Level(42); Nature(NATURE_JOLLY); Ability(ABILITY_ICE_FACE); Item(ITEM_SALAC_BERRY); HP(128); MaxHP(128); Speed(139); Moves(MOVE_BELLY_DRUM, MOVE_ICICLE_CRASH, MOVE_LIQUIDATION); } + } WHEN { + TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_LIQUIDATION); } + } +} + +AI_SINGLE_BATTLE_TEST("HasMoveThatChangesKOThreshold - AI should not see self-targeted speed drops as preventing setup moves in 2hko cases") +{ + enum Move move; + PARAMETRIZE { move = MOVE_EARTHQUAKE; } + PARAMETRIZE { move = MOVE_BULLDOZE; } + GIVEN { + ASSUME(MoveHasAdditionalEffectSelf(MOVE_HAMMER_ARM, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1) == TRUE); + ASSUME(GetMoveEffect(MOVE_NASTY_PLOT) == EFFECT_SPECIAL_ATTACK_UP_2); + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == 100); + ASSUME(GetMovePower(MOVE_HAMMER_ARM) == 100); + ASSUME(GetMovePower(MOVE_BULLDOZE) == 60); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_RHYDON) { Level(100); Nature(NATURE_ADAMANT); Item(ITEM_EVIOLITE); Speed(1); Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_HAMMER_ARM, move); } + OPPONENT(SPECIES_GRIMMSNARL) { Level(100); Nature(NATURE_JOLLY); Ability(ABILITY_INFILTRATOR); Speed(2); HP(300); Moves(MOVE_NASTY_PLOT, MOVE_AURA_SPHERE); } + } WHEN { + TURN { MOVE(player, MOVE_HAMMER_ARM); EXPECT_MOVE(opponent, move == MOVE_EARTHQUAKE ? MOVE_NASTY_PLOT : MOVE_AURA_SPHERE); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_IsMoveEffectInPlus - AI should not see secondary effect of Sheer Force boosted moves as beneficial") +{ + GIVEN { + ASSUME(GetMovePower(MOVE_PSYCHIC) == 90); + ASSUME(MoveHasAdditionalEffect(MOVE_PSYCHIC, MOVE_EFFECT_SP_DEF_MINUS_1) == TRUE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_STEELIX) { Level(100); Nature(NATURE_SASSY); Item(ITEM_STEELIXITE); Ability(ABILITY_STURDY); Speed(58); Moves(MOVE_GYRO_BALL); } + OPPONENT(SPECIES_BRAVIARY_HISUI) { Level(100); Nature(NATURE_TIMID); Ability(ABILITY_SHEER_FORCE); Speed(251); Moves(MOVE_PSYCHIC, MOVE_NIGHT_SHADE); } + } WHEN { + TURN { MOVE(player, MOVE_GYRO_BALL); SCORE_EQ_VAL(opponent, MOVE_PSYCHIC, 101); SCORE_EQ_VAL(opponent, MOVE_NIGHT_SHADE, 101); } + } +} + +AI_SINGLE_BATTLE_TEST("Fillet Away AI handling") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SCALD; } + PARAMETRIZE { move = MOVE_THUNDERBOLT; } + ASSUME(GetMovePower(MOVE_THUNDERBOLT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 95)); + ASSUME(GetMovePower(MOVE_SCALD) == 80); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_SLOWBRO){ Level(100); Nature(NATURE_BOLD); Ability(ABILITY_REGENERATOR); Speed(96); Moves(move); } + OPPONENT(SPECIES_VELUZA){ Level(100); Nature(NATURE_ADAMANT); Ability(ABILITY_SHARPNESS); Speed(176); Moves(MOVE_FILLET_AWAY, MOVE_AQUA_CUTTER); } + } WHEN { + TURN { MOVE(player, move); EXPECT_MOVE(opponent, move == MOVE_SCALD ? MOVE_FILLET_AWAY : MOVE_AQUA_CUTTER); } } } diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 77de2ba1c..b12e3d1dc 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -18,6 +18,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade") PARAMETRIZE { status1 = STATUS1_BURN; expectedMove = MOVE_FACADE; } GIVEN { + WITH_CONFIG(CONFIG_BURN_FACADE_DMG, GEN_6); ASSUME(GetMoveEffect(MOVE_FACADE) == EFFECT_FACADE); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(60); } @@ -76,7 +77,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Wake Up Slap") AI_SINGLE_BATTLE_TEST("AI sees increased base power of Grav Apple") { - u32 movePlayer; + enum Move movePlayer; u16 expectedMove; PARAMETRIZE { movePlayer = MOVE_CELEBRATE; expectedMove = MOVE_DRUM_BEATING; } @@ -152,16 +153,19 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Spit Up") AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted move split is correct and user doesn't faint") { - u16 playerMove = MOVE_NONE, opponentMove = MOVE_NONE; + enum Move playerMove = MOVE_NONE, opponentMove = MOVE_NONE; PARAMETRIZE { playerMove = MOVE_STRENGTH; opponentMove = MOVE_COUNTER; } PARAMETRIZE { playerMove = MOVE_POWER_GEM; opponentMove = MOVE_MIRROR_COAT; } GIVEN { - ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); - ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == (1u << DAMAGE_CATEGORY_PHYSICAL)); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == (1u << DAMAGE_CATEGORY_SPECIAL)); ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL); + ASSUME(GetMovePower(MOVE_POWER_GEM) == 80); // Gen 5's 70 power causes the test to fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(102); Speed(100); Moves(opponentMove, MOVE_STRENGTH); } @@ -216,7 +220,7 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -230,6 +234,29 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner") } } +AI_DOUBLE_BATTLE_TEST("AI uses Refresh only when curing status is worthwhile") +{ + u32 status1; + enum Ability ability; + u32 expectedMove; + + PARAMETRIZE { status1 = STATUS1_BURN; ability = ABILITY_GUTS; expectedMove = MOVE_ROCK_SLIDE; } + PARAMETRIZE { status1 = STATUS1_BURN; ability = ABILITY_PRESSURE; expectedMove = MOVE_REFRESH; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; ability = ABILITY_POISON_HEAL; expectedMove = MOVE_ROCK_SLIDE; } + PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; expectedMove = MOVE_REFRESH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_REFRESH) == EFFECT_REFRESH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_ROCK_SLIDE, MOVE_REFRESH); Status1(status1); Ability(ability); } + OPPONENT(SPECIES_EXPLOUD) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, expectedMove); } + } +} + AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") { u32 status, config; @@ -242,7 +269,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") GIVEN { ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK) { Moves(MOVE_BODY_PRESS, MOVE_HEAL_BELL); } @@ -292,7 +319,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") { - u32 move; + enum Move move; u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT; PARAMETRIZE { move = MOVE_REST; } @@ -313,7 +340,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest") AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm") { - enum Ability ability, move; + enum Ability ability; + enum Move move; PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_LEAF_STORM; } PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_CHARGE_BEAM; } PARAMETRIZE { ability = ABILITY_OVERGROW; move = MOVE_CHARGE_BEAM; } @@ -431,7 +459,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees type-changing moves as the correct type") PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(fieldStatus, MOVE_RETURN, MOVE_TAUNT); } - OPPONENT(species) { Ability(ability); Moves(MOVE_HYPER_VOICE); } + OPPONENT(species) { Ability(ability); Moves(MOVE_HYPER_VOICE); } } WHEN { if (ability != ABILITY_NONE) TURN { EXPECT_MOVE(opponentLeft, fieldStatus); } diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index e8d3a8e42..410b3fc53 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -61,7 +61,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves whe AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") { - // Moves defined by MOVE_TARGET_USER (with exceptions?) + // Moves defined by TARGET_USER (with exceptions?) u32 j, heldItem = ITEM_NONE; enum Ability ability = ABILITY_NONE; @@ -78,7 +78,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves") } GIVEN { - ASSUME(GetMoveTarget(MOVE_SWORDS_DANCE) == MOVE_TARGET_USER); + ASSUME(GetMoveTarget(MOVE_SWORDS_DANCE) == TARGET_USER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_RHYDON) OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_SWORDS_DANCE, MOVE_SCRATCH); Item(heldItem); Ability(ability); } @@ -130,7 +130,9 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the on AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they don't have a good switchin") { - u32 j, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; + u32 j; + enum Move move = MOVE_NONE; + u32 species = SPECIES_NONE, heldItem = ITEM_NONE; enum Ability ability = ABILITY_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, @@ -165,7 +167,9 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they don't have AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are trapped") { - u32 j, aiAbility = ABILITY_NONE, playerAbility = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE; + u32 j; + enum Ability aiAbility = ABILITY_NONE, playerAbility = ABILITY_NONE; + u32 species = SPECIES_NONE, heldItem = ITEM_NONE; static const u32 choiceItems[] = { ITEM_CHOICE_SPECS, diff --git a/test/battle/ai/ai_double_ace.c b/test/battle/ai/ai_double_ace.c index 3fa9ce77e..38b7d1dcd 100644 --- a/test/battle/ai/ai_double_ace.c +++ b/test/battle/ai/ai_double_ace.c @@ -94,3 +94,35 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: Ace mons won't be switched in TURN { EXPECT_SWITCH(opponentLeft, 2); } } } + +AI_DOUBLE_BATTLE_TEST("AI_FLAG_DOUBLE_ACE_POKEMON: sends out Ace mons when no other options remain mid-battle") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_SMART_SWITCHING | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_DOUBLE_ACE_POKEMON); + + PLAYER(SPECIES_WOBBUFFET) { Level(50); Speed(200); Moves(MOVE_THUNDERBOLT, MOVE_CELEBRATE); SpAttack(200); } + PLAYER(SPECIES_WOBBUFFET) { Level(50); Speed(150); Moves(MOVE_THUNDERBOLT, MOVE_CELEBRATE); SpAttack(200); } + + OPPONENT(SPECIES_ZIGZAGOON) { Level(5); HP(1); Speed(1); Moves(MOVE_SPLASH); } + OPPONENT(SPECIES_POOCHYENA) { Level(5); HP(1); Speed(1); Moves(MOVE_SPLASH); } + + // Aces + OPPONENT(SPECIES_MIGHTYENA) { Level(50); Speed(10); Moves(MOVE_CRUNCH); } + OPPONENT(SPECIES_GENGAR) { Level(50); Speed(10); Moves(MOVE_SPLASH); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_THUNDERBOLT, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH); + EXPECT_MOVE(opponentRight, MOVE_SPLASH); + EXPECT_SEND_OUT(opponentLeft, 3); + } + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_THUNDERBOLT, target: opponentRight); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH); + EXPECT_MOVE(opponentRight, MOVE_SPLASH); + EXPECT_SEND_OUT(opponentRight, 2); + } + } +} diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index 82e8d9537..3844533e3 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -4,9 +4,9 @@ AI_DOUBLE_BATTLE_TEST("AI won't use a Weather changing move if partner already chose such move") { - u32 j, k; - static const u16 weatherMoves[] = {MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_RAIN_DANCE, MOVE_SANDSTORM, MOVE_SNOWSCAPE}; - u16 weatherMoveLeft = MOVE_NONE, weatherMoveRight = MOVE_NONE; + enum Move j, k; + static const enum Move weatherMoves[] = {MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_RAIN_DANCE, MOVE_SANDSTORM, MOVE_SNOWSCAPE}; + enum Move weatherMoveLeft = MOVE_NONE, weatherMoveRight = MOVE_NONE; for (j = 0; j < ARRAY_COUNT(weatherMoves); j++) { @@ -23,17 +23,18 @@ AI_DOUBLE_BATTLE_TEST("AI won't use a Weather changing move if partner already c OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherMoveLeft); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, weatherMoveRight); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, weatherMoveRight); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:opponentLeft); - } + TURN { + NOT_EXPECT_MOVE(opponentRight, weatherMoveRight); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:opponentLeft); + } } } AI_DOUBLE_BATTLE_TEST("AI will not use Helping Hand if partner does not have any damage moves") { - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + enum Move move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; PARAMETRIZE { move1 = MOVE_LEER; move2 = MOVE_TOXIC; } PARAMETRIZE { move1 = MOVE_HELPING_HAND; move2 = MOVE_PROTECT; } @@ -46,20 +47,225 @@ AI_DOUBLE_BATTLE_TEST("AI will not use Helping Hand if partner does not have any OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_SCRATCH); } OPPONENT(SPECIES_WOBBUFFET) { Moves(move1, move2, move3, move4); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:opponentLeft); - } + TURN { + NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:opponentLeft); + } } SCENE { NOT MESSAGE("The opposing Wobbuffet used Helping Hand!"); } } +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow when items are missing or target already holds one") +{ + enum Move move = MOVE_NONE; + u32 atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_NONE; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_NONE; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_LEFTOVERS; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Item(targetItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow with unexchangeable items") +{ + enum Move move = MOVE_NONE; + u32 atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORANGE_MAIL; targetItem = ITEM_NONE; } + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_ORANGE_MAIL; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORANGE_MAIL; targetItem = ITEM_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Item(targetItem); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick around Sticky Hold") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_LEFTOVERS); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_PRESSURE); Item(ITEM_ORAN_BERRY); Moves(MOVE_TRICK, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI skips Trick/Bestow if the target has a Substitute") +{ + ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); + + enum Move move = MOVE_NONE; + u32 atkItem = ITEM_NONE, targetItem = ITEM_NONE; + + PARAMETRIZE { move = MOVE_TRICK; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_LEFTOVERS; } + PARAMETRIZE { move = MOVE_BESTOW; atkItem = ITEM_ORAN_BERRY; targetItem = ITEM_NONE; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SUBSTITUTE, MOVE_CELEBRATE); Item(targetItem); Speed(20); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Item(atkItem); Speed(1); Attack(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Speed(1); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SUBSTITUTE); + MOVE(playerRight, MOVE_CELEBRATE); + } + TURN { NOT_EXPECT_MOVE(opponentLeft, move); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI considers status orbs and abilities for Trick/Bestow") +{ + u16 move = MOVE_NONE, item = ITEM_NONE, status = STATUS1_NONE, species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; + u8 turnToTrick = 0; + + PARAMETRIZE { move = MOVE_TRICK; item = ITEM_TOXIC_ORB; status = STATUS1_NONE; species = SPECIES_WAILMER; ability = ABILITY_PRESSURE; turnToTrick = 1; } + PARAMETRIZE { move = MOVE_TRICK; item = ITEM_FLAME_ORB; status = STATUS1_NONE; species = SPECIES_WAILMER; ability = ABILITY_PRESSURE; turnToTrick = 1; } + PARAMETRIZE { move = MOVE_BESTOW; item = ITEM_TOXIC_ORB; status = STATUS1_NONE; species = SPECIES_GLISCOR; ability = ABILITY_POISON_HEAL; turnToTrick = 2; } + PARAMETRIZE { move = MOVE_BESTOW; item = ITEM_FLAME_ORB; status = STATUS1_NONE; species = SPECIES_RATTATA; ability = ABILITY_GUTS; turnToTrick = 2; } + PARAMETRIZE { move = MOVE_TRICK; item = ITEM_TOXIC_ORB; status = STATUS1_POISON; species = SPECIES_GLISCOR; ability = ABILITY_POISON_HEAL; turnToTrick = 1; } + PARAMETRIZE { move = MOVE_TRICK; item = ITEM_FLAME_ORB; status = STATUS1_BURN; species = SPECIES_RATTATA; ability = ABILITY_GUTS; turnToTrick = 1; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + ASSUME(gItemsInfo[ITEM_FLAME_ORB].holdEffect == HOLD_EFFECT_FLAME_ORB); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); Item(item); Moves(move, MOVE_SCRATCH); Status1(status); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + if (turnToTrick == 1) + { + TURN { EXPECT_MOVE(opponentLeft, move, target: playerLeft); } + } + else if (turnToTrick == 2) + { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { EXPECT_MOVE(opponentLeft, move, target: playerLeft); } + } + else + { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI gifts Utility Umbrella only when it removes the foe's weather benefit") +{ + u16 weatherSpecies = SPECIES_NONE, targetSpecies = SPECIES_NONE, attackerSpecies = SPECIES_NONE; + enum Ability weatherAbility = ABILITY_NONE, targetAbility = ABILITY_NONE, attackerAbility = ABILITY_NONE; + bool32 expectTrick = FALSE; + + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_EXEGGCUTE; targetAbility = ABILITY_CHLOROPHYLL; attackerSpecies = SPECIES_PARAS; attackerAbility = ABILITY_DRY_SKIN; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_FOMANTIS; targetAbility = ABILITY_LEAF_GUARD; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_CHERRIM; targetAbility = ABILITY_FLOWER_GIFT; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_TROPIUS; targetAbility = ABILITY_SOLAR_POWER; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_KORAIDON; targetAbility = ABILITY_ORICHALCUM_PULSE; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_LOTAD; targetAbility = ABILITY_SWIFT_SWIM; attackerSpecies = SPECIES_PARAS; attackerAbility = ABILITY_DRY_SKIN; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_LOTAD; targetAbility = ABILITY_RAIN_DISH; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_PARAS; targetAbility = ABILITY_DRY_SKIN; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_WINGULL; targetAbility = ABILITY_HYDRATION; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(targetSpecies) { Ability(targetAbility); } + PLAYER(weatherSpecies) { Ability(weatherAbility); } + OPPONENT(attackerSpecies) { Ability(attackerAbility); Item(ITEM_UTILITY_UMBRELLA); Moves(MOVE_TRICK, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + if (expectTrick) + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI steals Utility Umbrella to handle sun and Dry Skin but keeps its own weather perks") +{ + u16 weatherSpecies = SPECIES_NONE, targetSpecies = SPECIES_NONE, attackerSpecies = SPECIES_NONE; + enum Ability weatherAbility = ABILITY_NONE, targetAbility = ABILITY_NONE, attackerAbility = ABILITY_NONE; + bool32 expectTrick = FALSE; + + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_PARAS; attackerAbility = ABILITY_DRY_SKIN; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_PARAS; targetAbility = ABILITY_DRY_SKIN; attackerSpecies = SPECIES_WAILMER; attackerAbility = ABILITY_PRESSURE; expectTrick = TRUE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_EXEGGCUTE; attackerAbility = ABILITY_CHLOROPHYLL; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_CHERRIM; attackerAbility = ABILITY_FLOWER_GIFT; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_FOMANTIS; attackerAbility = ABILITY_LEAF_GUARD; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_TROPIUS; attackerAbility = ABILITY_SOLAR_POWER; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_TORKOAL; weatherAbility = ABILITY_DROUGHT; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_KORAIDON; attackerAbility = ABILITY_ORICHALCUM_PULSE; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_LOTAD; attackerAbility = ABILITY_SWIFT_SWIM; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_LOTAD; attackerAbility = ABILITY_RAIN_DISH; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_WINGULL; attackerAbility = ABILITY_HYDRATION; expectTrick = FALSE; } + PARAMETRIZE { weatherSpecies = SPECIES_POLITOED; weatherAbility = ABILITY_DRIZZLE; targetSpecies = SPECIES_WAILMER; targetAbility = ABILITY_PRESSURE; attackerSpecies = SPECIES_PARAS; attackerAbility = ABILITY_DRY_SKIN; expectTrick = FALSE; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(targetSpecies) { Ability(targetAbility); Item(ITEM_UTILITY_UMBRELLA); } + PLAYER(weatherSpecies) { Ability(weatherAbility); } + OPPONENT(attackerSpecies) { Ability(attackerAbility); Item(ITEM_NONE); Moves(MOVE_TRICK, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + if (expectTrick) + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI treats Harvest as a sun benefit only when a berry is involved") +{ + u16 targetItem = ITEM_NONE; + bool32 expectTrick = FALSE; + + PARAMETRIZE { targetItem = ITEM_ORAN_BERRY; expectTrick = TRUE; } + PARAMETRIZE { targetItem = ITEM_LEFTOVERS; expectTrick = FALSE; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + ASSUME(GetItemPocket(ITEM_ORAN_BERRY) == POCKET_BERRIES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_EXEGGCUTE) { Ability(ABILITY_HARVEST); Item(targetItem); } + PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); } + OPPONENT(SPECIES_WAILMER) { Ability(ABILITY_PRESSURE); Item(ITEM_UTILITY_UMBRELLA); Moves(MOVE_TRICK, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE); } + } WHEN { + if (expectTrick) + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK, target: playerLeft); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose Helping Hand") { - s32 j; - u32 statusMove = MOVE_NONE; + enum Move j; + enum Move statusMove = MOVE_NONE; for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++) { @@ -73,14 +279,15 @@ AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose He PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_EXPLOSION); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); } + OPPONENT(SPECIES_BIBAREL) { Moves(MOVE_SCRATCH, statusMove, MOVE_WATER_GUN); Ability(ABILITY_SIMPLE); Item(ITEM_WHITE_HERB); } } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); - NOT_EXPECT_MOVE(opponentRight, statusMove); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); - } + TURN { + EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + NOT_EXPECT_MOVE(opponentRight, statusMove); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); + } } SCENE { MESSAGE("The opposing Wobbuffet used Helping Hand!"); } @@ -93,7 +300,7 @@ TO_DO_BATTLE_TEST("AI understands Wide Guard") AI_DOUBLE_BATTLE_TEST("AI won't use the same nondamaging move as its partner for no reason") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_AROMATHERAPY; } PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } PARAMETRIZE { move = MOVE_FOLLOW_ME; } @@ -139,9 +346,35 @@ AI_DOUBLE_BATTLE_TEST("AI won't use the same nondamaging move as its partner for } } +AI_DOUBLE_BATTLE_TEST("Heal Bell and Jungle Healing skip curing a partner that benefits from burn") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_HEAL_BELL; } + PARAMETRIZE { move = MOVE_JUNGLE_HEALING; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_JUNGLE_HEALING) == EFFECT_JUNGLE_HEALING); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_MEMENTO); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_MEMENTO); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_SCRATCH); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_GUTS); Moves(MOVE_TACKLE); Status1(STATUS1_BURN); MaxHP(200); HP(200); Speed(10); } + } WHEN { + TURN { + NOT_EXPECT_MOVE(opponentLeft, move); + EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); + EXPECT_MOVE(opponentRight, MOVE_TACKLE, target: playerLeft); + MOVE(playerLeft, MOVE_MEMENTO); + MOVE(playerRight, MOVE_MEMENTO); + } + } +} + AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner without a positive effect") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); u32 species; @@ -150,7 +383,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner w PARAMETRIZE { species = SPECIES_CHIKORITA; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -166,10 +399,10 @@ AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner w AI_DOUBLE_BATTLE_TEST("AI recognizes its ally's Telepathy") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -182,7 +415,7 @@ AI_DOUBLE_BATTLE_TEST("AI recognizes its ally's Telepathy") AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability but will not KO the ally needlessly") { - ASSUME(GetMoveTarget(MOVE_BULLDOZE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_BULLDOZE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1)); @@ -237,11 +470,11 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Beat Up on an ally with Justified if it wi AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -255,7 +488,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon and does not kill the partner needlessly") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); u32 currentHP; @@ -263,7 +496,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon an PARAMETRIZE { currentHP = 200; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } @@ -279,11 +512,11 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon an AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon and a partner it believes is about to die") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } PLAYER(SPECIES_WOBBUFFET) { HP(1); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } @@ -298,16 +531,16 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon an AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills both opposing mons") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } - OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); HP(1); } + OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); HP(1); } } WHEN { TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } } @@ -316,7 +549,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills both opposing mons" AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") { ASSUME(gItemsInfo[ITEM_WEAKNESS_POLICY].holdEffect == HOLD_EFFECT_WEAKNESS_POLICY); - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); u32 species; @@ -324,12 +557,12 @@ AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") PARAMETRIZE { species = SPECIES_CLEFFA; } GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_STOMPING_TANTRUM); } - OPPONENT(species) { Moves(MOVE_CELEBRATE); Item(ITEM_WEAKNESS_POLICY); } + OPPONENT(species) { Moves(MOVE_CELEBRATE); Item(ITEM_WEAKNESS_POLICY); } } WHEN { if (species == SPECIES_INCINEROAR) TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } @@ -340,8 +573,8 @@ AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (doubles)") { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); u32 aiFlags; @@ -365,8 +598,8 @@ AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field wit AI_DOUBLE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (doubles)") { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); u32 aiFlags; u32 battler; @@ -395,17 +628,18 @@ AI_DOUBLE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (doubles)" AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); - ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_LAVA_PLUME) == TYPE_FIRE); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); enum Ability ability; - u32 move, species; + enum Move move; + u32 species; PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } @@ -420,7 +654,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") PARAMETRIZE { species = SPECIES_ORTHWORM; ability = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE; } GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -437,13 +671,14 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (gen 4)") { KNOWN_FAILING; - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); enum Ability ability; - u32 move, species; + enum Move move; + u32 species; PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } @@ -462,32 +697,38 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (ge AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (gen 5+)") { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); + enum Move move, expectedMove; + u32 species, config; enum Ability ability; - u32 move, species; - PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } - PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_4; expectedMove = MOVE_HEADBUTT; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_4; expectedMove = MOVE_HEADBUTT; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_5; expectedMove = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_5; expectedMove = MOVE_SURF; } GIVEN { + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); - WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, GEN_5); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_HEADBUTT); } OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_ROUND); } } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, expectedMove); } } } AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") { - KNOWN_FAILING; // MGriffin's PR that switched two turn charging moves in AI tests broke this test, waiting on a fix GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_MAGNETON); @@ -495,7 +736,7 @@ AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } } WHEN { - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } + TURN { NOT_EXPECT_MOVES(opponentLeft, MOVE_THUNDERSHOCK, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } } THEN { EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); } @@ -574,7 +815,7 @@ AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally") PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(goodTerrain, badTerrain, MOVE_RETURN, MOVE_TAUNT); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(terrainTrigger, MOVE_EARTH_POWER); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(terrainTrigger, MOVE_EARTH_POWER); } } WHEN { TURN { EXPECT_MOVE(opponentLeft, goodTerrain); } } @@ -582,7 +823,7 @@ AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally") AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TRICK_ROOM; } PARAMETRIZE { move = MOVE_MOONBLAST; } @@ -590,6 +831,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") GIVEN { ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(4); } @@ -605,7 +847,9 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room") AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") { - u32 move, ability, speed; + enum Move move; + enum Ability ability; + u32 speed; PARAMETRIZE { move = MOVE_DRAINING_KISS; ability = ABILITY_SYNCHRONIZE; speed = 4; } PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; ability = ABILITY_SYNCHRONIZE; speed = 4; } @@ -617,6 +861,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently") GIVEN { ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(speed); } @@ -641,12 +886,12 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room with both battlers on the turn it expi OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TRICK_ROOM, MOVE_PSYCHIC); Speed(1); } } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } - } + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); } + } } AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") @@ -664,10 +909,10 @@ AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die") OPPONENT(SPECIES_WOBBUFFET) { HP(hp); Moves(MOVE_HELPING_HAND, MOVE_MUDDY_WATER); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_MUDDY_WATER); } } WHEN { - if (hp == 1) - TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } - else - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + if (hp == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); } } } @@ -687,6 +932,20 @@ AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if the ally does notably more damage } } +AI_DOUBLE_BATTLE_TEST("AI does not use Helping Hand on Good as Gold ally") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_HELPING_HAND) == EFFECT_HELPING_HAND); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_MUD_SLAP); } + OPPONENT(SPECIES_GHOLDENGO) { Ability(ABILITY_GOOD_AS_GOLD); Moves(MOVE_MUDDY_WATER); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_MUD_SLAP); } + } +} + AI_DOUBLE_BATTLE_TEST("AI uses Tailwind") { u32 speed1, speed2, speed3, speed4; diff --git a/test/battle/ai/ai_flag_attacks_partner.c b/test/battle/ai/ai_flag_attacks_partner.c index 4f2533fa5..02b5f3125 100644 --- a/test/battle/ai/ai_flag_attacks_partner.c +++ b/test/battle/ai/ai_flag_attacks_partner.c @@ -4,9 +4,10 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER is willing to kill either the partner or the player") { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); - u32 move, level; + enum Move move; + u32 level; PARAMETRIZE { move = MOVE_BRUTAL_SWING; level = 1; } PARAMETRIZE { move = MOVE_MIGHTY_CLEAVE; level = 1; } @@ -26,12 +27,11 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER is willing to kill either the par ASSUME(gSpeciesInfo[SPECIES_ZIGZAGOON].baseDefense == 41); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); PLAYER(SPECIES_ZIGZAGOON) { Level(50); } - PLAYER(SPECIES_ZIGZAGOON) { Level(16); } + PLAYER(SPECIES_ZIGZAGOON) { Level(16); } OPPONENT(SPECIES_ZIGZAGOON) { Level(50); Moves(move, MOVE_OVERDRIVE, MOVE_TACKLE); } OPPONENT(SPECIES_ZIGZAGOON) { Level(level); Moves(MOVE_CELEBRATE); } } WHEN { - TURN - { + TURN { if (move == MOVE_MIGHTY_CLEAVE) { if (level == 1) @@ -46,7 +46,7 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER is willing to kill either the par else EXPECT_MOVE(opponentLeft, MOVE_OVERDRIVE); } - } + } } } @@ -59,18 +59,16 @@ AI_DOUBLE_BATTLE_TEST("AI_FLAG_ATTACKS_PARTNER steps on its ally's weather") GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ATTACKS_PARTNER); - PLAYER(SPECIES_WOBBUFFET) { Speed(50); } - PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(75); Moves(weather1, move1, MOVE_HEADBUTT); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); Moves(weather2, move2, MOVE_HEADBUTT); } } WHEN { - TURN - { + TURN { EXPECT_MOVE(opponentLeft, weather1); EXPECT_MOVE(opponentRight, weather2); } - TURN - { + TURN { EXPECT_MOVE(opponentLeft, move1); EXPECT_MOVE(opponentRight, weather2); } diff --git a/test/battle/ai/ai_flag_predict_ability.c b/test/battle/ai/ai_flag_predict_ability.c index 9d85773e3..46ffb53ca 100644 --- a/test/battle/ai/ai_flag_predict_ability.c +++ b/test/battle/ai/ai_flag_predict_ability.c @@ -8,7 +8,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_WEIGH_ABILITY_PREDICTION: AI will predict opposin GIVEN { ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_WEIGH_ABILITY_PREDICTION); - PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); }; + PLAYER(SPECIES_LANTURN) { Ability(ABILITY_VOLT_ABSORB); } OPPONENT(SPECIES_LANTURN) { Moves(MOVE_THUNDERBOLT, MOVE_ICE_BEAM, MOVE_SURF); } } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_THUNDERBOLT); } diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c index 8530c4967..6f484b637 100644 --- a/test/battle/ai/ai_flag_predict_switch.c +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: Considers ShouldSwitch and GetMos // Switching in trapper is an advanced feature of ShouldSwitch that requires GetMostSuitableMonToSwitchInto to also return a specific mon; this passing means the AI can use both in prediction PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH | AI_FLAG_PREDICT_INCOMING_MON); PLAYER(SPECIES_SKARMORY) { Moves(MOVE_SCRATCH); } PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ACROBATICS); } diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index befefb814..f6cbeb7a7 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -9,7 +9,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Mirror Coat against specia PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == (1u << DAMAGE_CATEGORY_SPECIAL)); ASSUME(GetSpeciesBaseSpAttack(SPECIES_GROVYLE) == 85); ASSUME(GetSpeciesBaseAttack(SPECIES_GROVYLE) == 65); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); @@ -28,7 +29,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: AI will blindly Counter against physical a PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { - ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == (1u << DAMAGE_CATEGORY_PHYSICAL)); ASSUME(GetSpeciesBaseAttack(SPECIES_MARSHTOMP) == 85); ASSUME(GetSpeciesBaseSpAttack(SPECIES_MARSHTOMP) == 60); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiRiskyFlag); diff --git a/test/battle/ai/ai_flag_sequence_switching.c b/test/battle/ai/ai_flag_sequence_switching.c index 56d7eb881..e232a9cbe 100644 --- a/test/battle/ai/ai_flag_sequence_switching.c +++ b/test/battle/ai/ai_flag_sequence_switching.c @@ -41,10 +41,10 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will always switch after a AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: Roar and Dragon Tail still force switch to random party member") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_ROAR; } - PARAMETRIZE {move = MOVE_DRAGON_TAIL; } + PARAMETRIZE { move = MOVE_DRAGON_TAIL; } PASSES_RANDOMLY(1, 2, RNG_FORCE_RANDOM_SWITCH); GIVEN { @@ -85,7 +85,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SEQUENCE_SWITCHING: AI will always switch into lo ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); - ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); + ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_WEATHER_AND_SWITCH); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSequenceSwitchingFlag); PLAYER(SPECIES_SWELLOW) { Level (50); } OPPONENT(SPECIES_MACHOP) { Level(1); Moves(move); } diff --git a/test/battle/ai/ai_multi.c b/test/battle/ai/ai_multi.c index ddbfdb49b..b61aefa36 100644 --- a/test/battle/ai/ai_multi.c +++ b/test/battle/ai/ai_multi.c @@ -4,8 +4,8 @@ AI_MULTI_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (multi)") { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); u32 aiFlags; u32 battler; @@ -34,8 +34,8 @@ AI_MULTI_BATTLE_TEST("AI will only explode and kill everything on the field with AI_ONE_VS_TWO_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide (1v2)") { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); u32 aiFlags; u32 battler; @@ -73,10 +73,10 @@ AI_MULTI_BATTLE_TEST("AI partner makes sensible move selections in battle (multi MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; - } + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); } + } } // Used to test EXPECT_MOVE only on partner @@ -90,16 +90,16 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner makes sensible move selections in battle ( MULTI_PARTNER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL, MOVE_AURA_SPHERE); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); HP(1); } MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); }; - } + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:opponentRight); EXPECT_MOVE(playerRight, MOVE_AURA_SPHERE, target:opponentLeft); } + } } AI_TWO_VS_ONE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (2v1)") { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); u32 aiFlags; u32 battler; @@ -125,3 +125,129 @@ AI_TWO_VS_ONE_BATTLE_TEST("Battler 3 has Battler 1 AI flags set correctly (2v1)" TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION, target: playerLeft); EXPECT_MOVE(opponentRight, MOVE_EXPLOSION); } } } + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon when running out") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft); } + TURN {} + } THEN { + EXPECT_EQ(gAbsentBattlerFlags, (1u << GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))); + } +} + +AI_MULTI_BATTLE_TEST("Partner will not steal your pokemon to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_PLAYER_RIGHT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WYNAUT) { Moves(MOVE_MEMENTO); } + MULTI_PARTNER(SPECIES_METAGROSS) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(playerRight, MOVE_MEMENTO, target:opponentLeft); } + TURN {} + } THEN { + EXPECT_EQ(SPECIES_METAGROSS, playerRight->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle to delay using their ace") +{ + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); HP(1); } + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out") +{ + enum Item item; + enum Move move; + PARAMETRIZE { item = ITEM_EJECT_BUTTON; move = MOVE_TACKLE; } + PARAMETRIZE { item = ITEM_EJECT_PACK; move = MOVE_TAIL_WHIP; } + PARAMETRIZE { item = ITEM_NONE; move = MOVE_ROAR; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); Item(item); } + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, move, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("AI opponents do not steal their partner pokemon in multi battle when forced out 2") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + BATTLER_AI_FLAGS(B_POSITION_OPPONENT_LEFT, AI_FLAG_ACE_POKEMON); + MULTI_PLAYER(SPECIES_WOBBUFFET) { } + MULTI_PARTNER(SPECIES_WOBBUFFET) { } + MULTI_OPPONENT_A(SPECIES_GOLISOPOD) { Moves(MOVE_CELEBRATE); HP(101); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } + MULTI_OPPONENT_A(SPECIES_VENUSAUR) { Moves(MOVE_GIGA_DRAIN); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } + } THEN { + EXPECT_EQ(SPECIES_VENUSAUR, opponentLeft->species); + } +} + +AI_MULTI_BATTLE_TEST("Pollen Puff: AI correctly scores moves with EFFECT_HIT_ENEMY_HEAL_ALLY as damaging opponents but not allies") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + ASSUME(GetMoveEffect(MOVE_POLLEN_PUFF) == EFFECT_HIT_ENEMY_HEAL_ALLY); + // Speed tie so all think they are faster + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF, MOVE_CELEBRATE); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); HP(50); Moves(MOVE_POLLEN_PUFF); } + } WHEN { + TURN { + // Targeting ally + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:opponentRight); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:playerLeft); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + WEAK_EFFECT, target:opponentLeft); + + // Targeting opponent + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerLeft); + SCORE_EQ_VAL(opponentLeft, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerRight); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:opponentLeft); + SCORE_EQ_VAL(playerRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:opponentRight); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerLeft); + SCORE_EQ_VAL(opponentRight, MOVE_POLLEN_PUFF, AI_SCORE_DEFAULT + BEST_DAMAGE_MOVE + FAST_KILL, target:playerRight); + } + } +} diff --git a/test/battle/ai/ai_powerful_status.c b/test/battle/ai/ai_powerful_status.c index c504a74b8..f822ecbac 100644 --- a/test/battle/ai/ai_powerful_status.c +++ b/test/battle/ai/ai_powerful_status.c @@ -40,7 +40,8 @@ AI_SINGLE_BATTLE_TEST("AI will try to do damage on target instead of setting up AI_SINGLE_BATTLE_TEST("AI will not set up Rain if it is already raining") { GIVEN { - ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); ASSUME(GetMovePower(MOVE_SCRATCH) > 0); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_POWERFUL_STATUS); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/ai/ai_smart_tera.c b/test/battle/ai/ai_smart_tera.c index 7bed476b4..c2127a578 100644 --- a/test/battle/ai/ai_smart_tera.c +++ b/test/battle/ai/ai_smart_tera.c @@ -31,7 +31,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_TERA: AI will not tera if it gets outsped a OPPONENT(SPECIES_WOBBUFFET) { HP(60); Speed(1); Moves(MOVE_SEED_BOMB); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); TeraType(TYPE_FIRE); } } WHEN { - TURN { } + TURN {} } SCENE { NOT MESSAGE("The opposing Wobbuffet terastallized into the Grass type!"); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index f3c8cb610..f96f64c1f 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -21,6 +21,61 @@ AI_SINGLE_BATTLE_TEST("AI gets baited by Protect Switch tactics") // This behavi } } +AI_SINGLE_BATTLE_TEST("AI picks an injured ally to receive Healing Wish") // Healing Wish heals the next switch-in; expect the AI to pick its 1 HP burned mon +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEALING_WISH); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Status1(STATUS1_BURN); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI avoids wasting Healing Wish on a mon that dies to hazards") // Stealth Rock up; AI should not send in a 1 HP mon weak to Rock +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_SHUCKLE) { Moves(MOVE_STEALTH_ROCK); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HEALING_WISH); } + OPPONENT(SPECIES_CHARIZARD) { HP(1); Moves(MOVE_SCRATCH); } // would faint on entry + OPPONENT(SPECIES_BLISSEY) { HP(50); MaxHP(400); Moves(MOVE_SEISMIC_TOSS); } + } WHEN { + TURN { MOVE(player, MOVE_STEALTH_ROCK); EXPECT_MOVE(opponent, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI chooses best post-KO switch with stored Wish") // Wish is active; should pick mon that benefits from heal AND can win 1v1 +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_BLISSEY) { HP(1); Moves(MOVE_WISH); } + OPPONENT(SPECIES_PIDGEOT) { HP(100); MaxHP(200); Moves(MOVE_GUST); } // 50% HP, gains 50% from Wish (>25% threshold), can win 1v1 + OPPONENT(SPECIES_GOLEM) { HP(390); MaxHP(400); Moves(MOVE_ROCK_THROW); } // 97.5% HP, gains only 2.5% (<25% threshold) + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_WISH); MOVE(player, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI revives the best fainted ally with Revival Blessing") // Fainted Pidgey (has damaging move) should be picked over Splash Magikarp +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_AUDINO) { Moves(MOVE_REVIVAL_BLESSING); } + OPPONENT(SPECIES_PIDGEY) { HP(0); Moves(MOVE_GUST); } + OPPONENT(SPECIES_MAGIKARP) { HP(0); Moves(MOVE_SPLASH); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_REVIVAL_BLESSING); } + } SCENE { + MESSAGE("The opposing Audino used Revival Blessing!"); + MESSAGE("Pidgey was revived and is ready to fight again!"); + } +} + // General switching behaviour AI_SINGLE_BATTLE_TEST("AI switches if Perish Song is about to kill") { @@ -28,12 +83,12 @@ AI_SINGLE_BATTLE_TEST("AI switches if Perish Song is about to kill") GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) {Moves(MOVE_SCRATCH); } - OPPONENT(SPECIES_CROBAT) {Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_CROBAT) { Moves(MOVE_SCRATCH); } } WHEN { TURN { MOVE(player, MOVE_PERISH_SONG); } - TURN { ; } - TURN { ; } + TURN {} + TURN {} TURN { EXPECT_SWITCH(opponent, 1); } } SCENE { MESSAGE(AI_TRAINER_NAME " sent out Crobat!"); @@ -47,13 +102,13 @@ AI_SINGLE_BATTLE_TEST("AI sees on-field player ability correctly and does not se PARAMETRIZE { testAbility = ABILITY_VOLT_ABSORB; } GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); - PLAYER(SPECIES_PIKACHU) {Level(100); Moves(MOVE_VOLT_SWITCH, MOVE_SPARKLY_SWIRL); Ability(ABILITY_LIGHTNING_ROD); }; - PLAYER(SPECIES_LANTURN) {Level(44); Moves(MOVE_SCALD); Ability(testAbility); }; - OPPONENT(SPECIES_SOBBLE) {Level(44); Moves(MOVE_SCRATCH); } - OPPONENT(SPECIES_BOMBIRDIER) {Level(42); Moves(MOVE_ROCK_SLIDE); } - OPPONENT(SPECIES_IRON_THORNS) {Level(43); Moves(MOVE_SUPERCELL_SLAM, MOVE_ICE_PUNCH); } + PLAYER(SPECIES_PIKACHU) { Level(100); Moves(MOVE_VOLT_SWITCH, MOVE_SPARKLY_SWIRL); Ability(ABILITY_LIGHTNING_ROD); } + PLAYER(SPECIES_LANTURN) { Level(44); Moves(MOVE_SCALD); Ability(testAbility); } + OPPONENT(SPECIES_SOBBLE) { Level(44); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_BOMBIRDIER) { Level(42); Moves(MOVE_ROCK_SLIDE); } + OPPONENT(SPECIES_IRON_THORNS) { Level(43); Moves(MOVE_SUPERCELL_SLAM, MOVE_ICE_PUNCH); } } WHEN { - TURN { + TURN { MOVE(player, MOVE_VOLT_SWITCH); SEND_OUT(player, 1); EXPECT_MOVE(opponent, MOVE_SCRATCH); @@ -66,12 +121,12 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same Pokémon for 2 spo { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); PLAYER(SPECIES_RATTATA); PLAYER(SPECIES_RATTATA); // No moves to damage player. @@ -80,7 +135,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same Pokémon for 2 spo OPPONENT(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } OPPONENT(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } } WHEN { - TURN { EXPECT_SWITCH(opponentLeft, 3); }; + TURN { EXPECT_SWITCH(opponentLeft, 3); } } SCENE { MESSAGE(AI_TRAINER_NAME " withdrew Gengar!"); MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); @@ -96,12 +151,12 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch mid-turn into a player Pokémon { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_HAUNTER); MULTI_PLAYER(SPECIES_RATTATA); // No moves to damage opponents. @@ -110,9 +165,9 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch mid-turn into a player Pokémon MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { EXPECT_SWITCH(playerRight, 5); }; + TURN { EXPECT_SWITCH(playerRight, 5); } } SCENE { MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); @@ -128,12 +183,12 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch mid-turn into a player Pok { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_HAUNTER); MULTI_PLAYER(SPECIES_RATTATA); // No moves to damage opponents. @@ -142,9 +197,9 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch mid-turn into a player Pok MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { EXPECT_SWITCH(playerRight, 5); }; + TURN { EXPECT_SWITCH(playerRight, 5); } } SCENE { MESSAGE(AI_PARTNER_NAME " withdrew Gengar!"); MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); @@ -160,12 +215,12 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon after fa { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE {flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_GENGAR); MULTI_PLAYER(SPECIES_RATTATA); // No moves to damage opponents. @@ -174,9 +229,9 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon after fa MULTI_PARTNER(SPECIES_HAUNTER); MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_B(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); } } SCENE { MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); NONE_OF { @@ -190,12 +245,12 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon aft { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_GENGAR); MULTI_PLAYER(SPECIES_RATTATA); // No moves to damage opponents. @@ -204,9 +259,9 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon aft MULTI_PARTNER(SPECIES_HAUNTER); MULTI_OPPONENT_A(SPECIES_TRAPINCH) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_A(SPECIES_VIBRAVA) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); }; + TURN { EXPECT_MOVE(playerRight, MOVE_CELEBRATE); EXPECT_SEND_OUT(playerRight, 5); } } SCENE { MESSAGE(AI_PARTNER_NAME " sent out Haunter!"); NONE_OF { @@ -220,8 +275,8 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon (multi)" { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = 0; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { @@ -233,10 +288,10 @@ AI_MULTI_BATTLE_TEST("AI partner will not switch into a player Pokémon (multi)" MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_B(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; - TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); } + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); } } SCENE { MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); NONE_OF { @@ -250,12 +305,12 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon (2v { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_HAUNTER); MULTI_PLAYER(SPECIES_RATTATA); // No moves to damage opponents. @@ -263,10 +318,10 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI partner will not switch into a player Pokémon (2v MULTI_PARTNER(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); HP(1); } MULTI_OPPONENT_A(SPECIES_RATTATA) { Moves(MOVE_CELEBRATE); } MULTI_OPPONENT_A(SPECIES_KANGASKHAN) { Moves(MOVE_CELEBRATE); } - + } WHEN { - TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); }; - TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); }; + TURN { MOVE(playerLeft, MOVE_AURA_SPHERE, target:playerRight); EXPECT_SWITCH(playerRight, 4); EXPECT_SEND_OUT(playerRight, 3); } + TURN { EXPECT_MOVE(playerRight, MOVE_SHADOW_BALL, target:opponentLeft); } } SCENE { MESSAGE(AI_PARTNER_NAME " sent out Raticate!"); NONE_OF { @@ -279,12 +334,12 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE {flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE {flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_RATTATA); MULTI_PLAYER(SPECIES_RATTATA); MULTI_PARTNER(SPECIES_KANGASKHAN); @@ -294,7 +349,7 @@ AI_TWO_VS_ONE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 MULTI_OPPONENT_A(SPECIES_GASTLY) { Moves(MOVE_LICK); } MULTI_OPPONENT_A(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } } WHEN { - TURN { EXPECT_SWITCH(opponentLeft, 3); }; + TURN { EXPECT_SWITCH(opponentLeft, 3); } } SCENE { MESSAGE(AI_TRAINER_NAME " withdrew Gengar!"); MESSAGE(AI_TRAINER_NAME " sent out Raticate!"); @@ -309,12 +364,12 @@ AI_ONE_VS_TWO_BATTLE_TEST("AI will not switch into a partner Pokémon in a 1v2 b { u32 flags; - PARAMETRIZE {flags = AI_FLAG_SMART_SWITCHING; } - PARAMETRIZE {flags = 0; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PASSES_RANDOMLY(SHOULD_SWITCH_ALL_MOVES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_MOVES_BAD); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | flags); + AI_FLAGS(flags); MULTI_PLAYER(SPECIES_RATTATA); MULTI_PLAYER(SPECIES_KANGASKHAN); // No moves to damage player. @@ -322,9 +377,9 @@ AI_ONE_VS_TWO_BATTLE_TEST("AI will not switch into a partner Pokémon in a 1v2 b MULTI_OPPONENT_B(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } MULTI_OPPONENT_B(SPECIES_GASTLY) { Moves(MOVE_LICK); } MULTI_OPPONENT_B(SPECIES_RATICATE) { Moves(MOVE_HEADBUTT); } - + } WHEN { - TURN { EXPECT_SWITCH(opponentRight, 5); }; + TURN { EXPECT_SWITCH(opponentRight, 5); } } SCENE { MESSAGE(AI_TRAINER_2_NAME " withdrew Gengar!"); MESSAGE(AI_TRAINER_2_NAME " sent out Raticate!"); @@ -377,7 +432,7 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same Pokémon for 2 spo OPPONENT(SPECIES_LINOONE) { Moves(MOVE_SCRATCH); } OPPONENT(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } } WHEN { - TURN { EXPECT_SWITCH(opponentLeft, 3); }; + TURN { EXPECT_SWITCH(opponentLeft, 3); } } SCENE { MESSAGE(AI_TRAINER_NAME " withdrew Linoone!"); MESSAGE(AI_TRAINER_NAME " sent out Gengar!"); @@ -403,9 +458,9 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Switch effect moves will send ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); ASSUME(GetMoveEffect(MOVE_PARTING_SHOT) == EFFECT_PARTING_SHOT); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); - ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); + ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_WEATHER_AND_SWITCH); ASSUME(GetMoveEffect(MOVE_SHED_TAIL) == EFFECT_SHED_TAIL); - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(aiMove); } @@ -417,13 +472,13 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Switch effect moves will send AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Button will send out Ace Mon if it's the only one remaining") { - u32 aiSmartMonChoicesFlag; - PARAMETRIZE { aiSmartMonChoicesFlag = 0; } - PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + u32 flags; + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ACE_POKEMON; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + AI_FLAGS(flags); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } - OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_BUTTON); }; + OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_BUTTON); } OPPONENT(SPECIES_LINOONE); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); EXPECT_SEND_OUT(opponent, 1); } @@ -432,11 +487,11 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Button will send out Ace AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Eject Pack will send out Ace Mon if it's the only one remaining") { - u32 aiSmartMonChoicesFlag; - PARAMETRIZE { aiSmartMonChoicesFlag = 0; } - PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } + u32 flags; + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ACE_POKEMON; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_ACE_POKEMON; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag | AI_FLAG_ACE_POKEMON); + AI_FLAGS(flags); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } PLAYER(SPECIES_ARCANINE) { Ability(ABILITY_INTIMIDATE); Moves(MOVE_SCRATCH); } OPPONENT(SPECIES_ZIGZAGOON) { Item(ITEM_EJECT_PACK); Moves(MOVE_SCRATCH); } @@ -536,37 +591,37 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will not switch in a Pokemo AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI considers hazard damage when choosing which Pokemon to switch in") { u32 aiIsSmart = 0; - u32 aiSmartSwitchFlags = 0; + u32 flags = 0; - PARAMETRIZE { aiIsSmart = 0; aiSmartSwitchFlags = 0; } // AI doesn't care about hazard damage resulting in Pokemon being KO'd - PARAMETRIZE { aiIsSmart = 1; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } // AI_FLAG_SMART_MON_CHOICES avoids being KO'd as a result of hazards damage + PARAMETRIZE { aiIsSmart = 0; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } // AI doesn't care about hazard damage resulting in Pokemon being KO'd + PARAMETRIZE { aiIsSmart = 1; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES; } // AI_FLAG_SMART_MON_CHOICES avoids being KO'd as a result of hazards damage GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchFlags); + AI_FLAGS(flags); PLAYER(SPECIES_MEGANIUM) { Speed(100); SpDefense(328); SpAttack(265); Moves(MOVE_STEALTH_ROCK, MOVE_SURF); } // Meganium does ~56% minimum ~66% maximum, enough to KO Charizard after rocks and never KO Typhlosion after rocks OPPONENT(SPECIES_PONYTA) { Level(5); Speed(5); Moves(MOVE_SCRATCH); } OPPONENT(SPECIES_CHARIZARD) { Speed(200); Moves(MOVE_FLAMETHROWER); SpAttack(317); SpDefense(207); MaxHP(297); } // Outspeends and 2HKOs Meganium OPPONENT(SPECIES_TYPHLOSION) { Speed(200); Moves(MOVE_FLAMETHROWER); SpAttack(317); SpDefense(207); MaxHP(297); } // Outspeends and 2HKOs Meganium } WHEN { - TURN { MOVE(player, MOVE_STEALTH_ROCK) ;} + TURN { MOVE(player, MOVE_STEALTH_ROCK) ; } TURN { MOVE(player, MOVE_SURF); EXPECT_SEND_OUT(opponent, aiIsSmart ? 2 : 1); } // AI sends out Typhlosion to get the KO with the flag rather than Charizard } } AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize type matchup + SE move, then type matchup") { - u32 aiSmartSwitchFlags = 0; - u32 move1; - u32 move2; + u32 flags = 0; + enum Move move1; + enum Move move2; u32 expectedIndex; - PARAMETRIZE { expectedIndex = 3; move1 = MOVE_SCRATCH; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = 0; } // When not smart, AI will only switch in a defensive mon if it has a SE move, otherwise will just default to damage - PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = 0; } - PARAMETRIZE { expectedIndex = 2; move1 = MOVE_SCRATCH; move2 = MOVE_WATER_PULSE; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } // When smart, AI will prioritize SE move, but still switch in good type matchup without SE move - PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } + PARAMETRIZE { expectedIndex = 3; move1 = MOVE_SCRATCH; move2 = MOVE_SCRATCH; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } // When not smart, AI will only switch in a defensive mon if it has a SE move, otherwise will just default to damage + PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } + PARAMETRIZE { expectedIndex = 2; move1 = MOVE_SCRATCH; move2 = MOVE_WATER_PULSE; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES; } // When smart, AI will prioritize SE move, but still switch in good type matchup without SE move + PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchFlags); + AI_FLAGS(flags); PLAYER(SPECIES_MARSHTOMP) { Level(30); Moves(MOVE_MUD_BOMB, MOVE_WATER_GUN, MOVE_GROWL, MOVE_MUD_SHOT); Speed(5); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(6); } // Forces switchout OPPONENT(SPECIES_TANGELA) { Level(30); Moves(move1); Speed(4); } @@ -584,7 +639,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); SpAttack(50); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_IRON_HEAD); Speed(4); SpDefense(50); } // Mid battle, AI sends out Aron - OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53);} + OPPONENT(SPECIES_ELECTRODE) { Level(30); Ability(ABILITY_STATIC); Moves(MOVE_CHARGE_BEAM); Speed(6); SpDefense(53); } } WHEN { TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, 1); } } @@ -708,7 +763,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI switches out after sufficient AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if Pokemon would faint to hazards unless party member can clear them") { - u32 move1; + enum Move move1; PARAMETRIZE { move1 = MOVE_SCRATCH; } PARAMETRIZE { move1 = MOVE_RAPID_SPIN; } @@ -739,21 +794,21 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will not switch out if Pokemo // Trapping behaviour AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon mid battle") { - u32 aiSmartSwitchingFlag = 0; - PARAMETRIZE { aiSmartSwitchingFlag = 0; } - PARAMETRIZE { aiSmartSwitchingFlag = AI_FLAG_SMART_SWITCHING; } + u32 flags = 0; + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING; } PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { ASSUME(GetSpeciesType(SPECIES_GOLURK, 0) == TYPE_GROUND); ASSUME(GetSpeciesType(SPECIES_GOLURK, 1) == TYPE_GHOST); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartSwitchingFlag); + AI_FLAGS(flags); PLAYER(SPECIES_ELECTRODE) { Speed(4); Moves(MOVE_THUNDERBOLT, MOVE_AURA_SPHERE, MOVE_PROTECT); } - PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_SNORLAX) { Speed(1); Moves(MOVE_HEADBUTT); } OPPONENT(SPECIES_DUGTRIO) { Speed(3); Ability(ABILITY_ARENA_TRAP); Moves(MOVE_EARTHQUAKE); } OPPONENT(SPECIES_GOLURK) { Speed(5); Moves(MOVE_EARTHQUAKE); } } WHEN { - if (aiSmartSwitchingFlag == AI_FLAG_SMART_SWITCHING) + if (flags & AI_FLAG_SMART_SWITCHING) TURN { MOVE(player, MOVE_AURA_SPHERE) ; EXPECT_SWITCH(opponent, 1); } else TURN { MOVE(player, MOVE_AURA_SPHERE) ; EXPECT_MOVE(opponent, MOVE_HEADBUTT); } @@ -762,47 +817,47 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch in trapping mon m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will switch in trapping mon after KO") { - u32 aiSmartMonChoicesFlag = 0; // Enables trapping behaviour after KOs - PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour - PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches + u32 flags = 0; // Enables trapping behaviour after KOs + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } // No trapping behaviour + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); + AI_FLAGS(flags); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } PLAYER(SPECIES_WOBBUFFET) { Speed(1); } OPPONENT(SPECIES_SNORLAX) { Speed(3); Moves(MOVE_SELF_DESTRUCT); } OPPONENT(SPECIES_MAGNEZONE) { Speed(1); Ability(ABILITY_MAGNET_PULL); Moves(MOVE_SHOCK_WAVE); } OPPONENT(SPECIES_MEGANIUM) { Speed(3); Moves(MOVE_EARTH_POWER); } } WHEN { - if (aiSmartMonChoicesFlag == AI_FLAG_SMART_MON_CHOICES) + if (flags & AI_FLAG_SMART_MON_CHOICES) TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 1); } else - TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } } } AI_SINGLE_BATTLE_TEST("AI won't use trapping behaviour if player only has 1 mon left") { - u32 aiSmartMonChoicesFlag = 0; // Enables trapping behaviour after KOs - PARAMETRIZE { aiSmartMonChoicesFlag = 0; } // No trapping behaviour - PARAMETRIZE { aiSmartMonChoicesFlag = AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches + u32 flags = 0; // Enables trapping behaviour after KOs + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } // No trapping behaviour + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES; } // Traps with mid battle switches GIVEN { ASSUME(GetSpeciesType(SPECIES_MAWILE, 0) == TYPE_STEEL); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | aiSmartMonChoicesFlag); + AI_FLAGS(flags); PLAYER(SPECIES_MAWILE) { Speed(2); Moves(MOVE_PROTECT, MOVE_SCRATCH); } OPPONENT(SPECIES_SNORLAX) { Speed(3); Moves(MOVE_SELF_DESTRUCT); } OPPONENT(SPECIES_MAGNEZONE) { Speed(1); Ability(ABILITY_MAGNET_PULL); Moves(MOVE_SHOCK_WAVE); } OPPONENT(SPECIES_MEGANIUM) { Speed(3); Moves(MOVE_EARTH_POWER); } } WHEN { - TURN{ MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_SELF_DESTRUCT); EXPECT_SEND_OUT(opponent, 2); } } } -AI_SINGLE_BATTLE_TEST("AI will trap player using Trace if player has a trapper") +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will trap player using Trace if player has a trapper") { PASSES_RANDOMLY(SHOULD_SWITCH_TRAPPER_PERCENTAGE, 100, RNG_AI_SWITCH_TRAPPER); GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); Moves(MOVE_ROCK_TOMB); } PLAYER(SPECIES_DUGTRIO); OPPONENT(SPECIES_GENGAR); @@ -824,7 +879,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_ELECTRODE) { Moves(MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK); } - OPPONENT(SPECIES_PELIPPER) { Moves(MOVE_EARTHQUAKE); }; + OPPONENT(SPECIES_PELIPPER) { Moves(MOVE_EARTHQUAKE); } OPPONENT(SPECIES_RHYDON) { Moves(MOVE_EARTHQUAKE); Ability(ABILITY_ROCK_HEAD); } } WHEN { TURN { MOVE(player, MOVE_THUNDERBOLT) ; EXPECT_SWITCH(opponent, 1); } @@ -880,6 +935,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee GIVEN { ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); // Gen 5's 90 power causes too much damage AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH, MOVE_CELEBRATE, MOVE_TOXIC, MOVE_AURA_SPHERE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -1091,24 +1147,25 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber") { - u32 aiMon; u32 move; + u32 aiMon; + enum Move move; enum Ability absorbingAbility; - PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER;} - PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF;} - PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF;} - PARAMETRIZE { aiMon = SPECIES_GASTRODON; absorbingAbility = ABILITY_STORM_DRAIN; move = MOVE_SURF;} - PARAMETRIZE { aiMon = SPECIES_JOLTEON; absorbingAbility = ABILITY_VOLT_ABSORB; move = MOVE_THUNDERBOLT;} - PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT;} - PARAMETRIZE { aiMon = SPECIES_MANECTRIC; absorbingAbility = ABILITY_LIGHTNING_ROD; move = MOVE_THUNDERBOLT;} - PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT;} - PARAMETRIZE { aiMon = SPECIES_AZUMARILL; absorbingAbility = ABILITY_SAP_SIPPER; move = MOVE_GIGA_DRAIN;} - PARAMETRIZE { aiMon = SPECIES_ORTHWORM; absorbingAbility = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE;} - PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE;} - PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE;} - PARAMETRIZE { aiMon = SPECIES_CHESNAUGHT; absorbingAbility = ABILITY_BULLETPROOF; move = MOVE_SLUDGE_BOMB;} - PARAMETRIZE { aiMon = SPECIES_BRAMBLEGHAST; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;} + PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER; } + PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF; } + PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF; } + PARAMETRIZE { aiMon = SPECIES_GASTRODON; absorbingAbility = ABILITY_STORM_DRAIN; move = MOVE_SURF; } + PARAMETRIZE { aiMon = SPECIES_JOLTEON; absorbingAbility = ABILITY_VOLT_ABSORB; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { aiMon = SPECIES_MANECTRIC; absorbingAbility = ABILITY_LIGHTNING_ROD; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { aiMon = SPECIES_ELECTIVIRE; absorbingAbility = ABILITY_MOTOR_DRIVE; move = MOVE_THUNDERBOLT; } + PARAMETRIZE { aiMon = SPECIES_AZUMARILL; absorbingAbility = ABILITY_SAP_SIPPER; move = MOVE_GIGA_DRAIN; } + PARAMETRIZE { aiMon = SPECIES_ORTHWORM; absorbingAbility = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE; } + PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE; } + PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE; } + PARAMETRIZE { aiMon = SPECIES_CHESNAUGHT; absorbingAbility = ABILITY_BULLETPROOF; move = MOVE_SLUDGE_BOMB; } + PARAMETRIZE { aiMon = SPECIES_BRAMBLEGHAST; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE; } GIVEN { - ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(move); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -1121,7 +1178,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if opponent uses two-turn move and it has a switchin that wins 1v1") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SKY_ATTACK; } PARAMETRIZE { move = MOVE_FLY; } @@ -1184,6 +1241,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into { GIVEN { ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + ASSUME(GetSpeciesType(SPECIES_AZURILL, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_AZURILL, 1) == TYPE_FAIRY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); } OPPONENT(SPECIES_ODDISH) { Moves(MOVE_ACID); } @@ -1195,6 +1254,22 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into } AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); + GIVEN { + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); + PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); } + OPPONENT(SPECIES_ODDISH) { Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_ARON) { Moves(MOVE_METAL_CLAW); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_ENCORE); } + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if Encore'd into neutral move with good switchin 50% of the time (Gen 5+)") { PASSES_RANDOMLY(SHOULD_SWITCH_ENCORE_DAMAGE_PERCENTAGE, 100, RNG_AI_SWITCH_ENCORE); GIVEN { @@ -1223,6 +1298,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and oppon } } +#if 0 AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and opponent has invulnerability move and is faster") { PASSES_RANDOMLY(SHOULD_SWITCH_TRUANT_PERCENTAGE, 100, RNG_AI_SWITCH_TRUANT); @@ -1236,14 +1312,16 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if mon has Truant and oppon TURN { SKIP_TURN(player); EXPECT_SWITCH(opponent, 1); } } } +#endif AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attacking stat lowered by 2 stages with good switchin candidate 50% of the time") { - u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE; + u32 aiSpecies = SPECIES_NONE; + enum Move aiMove = MOVE_NONE, move = MOVE_NONE; PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); - PARAMETRIZE {move = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; - PARAMETRIZE {move = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_CONFUSION; }; + PARAMETRIZE { move = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; } + PARAMETRIZE { move = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_CONFUSION; } GIVEN { ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); @@ -1260,11 +1338,12 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attacking stat lowered by 3+ stages") { - u32 aiSpecies = SPECIES_NONE, aiMove = MOVE_NONE, move = MOVE_NONE, move2 = MOVE_NONE; + u32 aiSpecies = SPECIES_NONE; + enum Move aiMove = MOVE_NONE, move = MOVE_NONE, move2 = MOVE_NONE; PASSES_RANDOMLY(SHOULD_SWITCH_ATTACKING_STAT_MINUS_THREE_PLUS_PERCENTAGE, 100, RNG_AI_SWITCH_STATS_LOWERED); - PARAMETRIZE {move = MOVE_GROWL; move2 = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; }; - PARAMETRIZE {move = MOVE_CONFIDE; move2 = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_STORED_POWER; }; + PARAMETRIZE { move = MOVE_GROWL; move2 = MOVE_CHARM; aiSpecies = SPECIES_FLAREON; aiMove = MOVE_FIRE_FANG; } + PARAMETRIZE { move = MOVE_CONFIDE; move2 = MOVE_EERIE_IMPULSE; aiSpecies = SPECIES_ESPEON; aiMove = MOVE_STORED_POWER; } GIVEN { ASSUME(GetMoveEffect(MOVE_CHARM) == EFFECT_ATTACK_DOWN_2); @@ -1282,7 +1361,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if main attac AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup and SE move if current mon has no SE move and no stats raised") { - u32 odds = 0, species = SPECIES_NONE, move = MOVE_NONE; + u32 odds = 0, species = SPECIES_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { odds = 33; species = SPECIES_SCIZOR; move = MOVE_X_SCISSOR; } PARAMETRIZE { odds = 50; species = SPECIES_DUSCLOPS; move = MOVE_SHADOW_BALL; } PASSES_RANDOMLY(odds, 100, RNG_AI_SWITCH_SE_DEFENSIVE); @@ -1300,7 +1380,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities when scoring moves") { GIVEN { - WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); + WITH_CONFIG(CONFIG_PRANKSTER_DARK_TYPES, GEN_7); ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } @@ -1313,18 +1393,18 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out if Yawn'd with only Ace mon remaining") { - u32 aceFlag; - PARAMETRIZE{ aceFlag = 0; } - PARAMETRIZE{ aceFlag = AI_FLAG_ACE_POKEMON; } + u32 flags; + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING | AI_FLAG_ACE_POKEMON; } GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING); + AI_FLAGS(flags); PLAYER(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH, MOVE_YAWN); } OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_SCRATCH); } OPPONENT(SPECIES_SLAKOTH) { Moves(MOVE_HEADBUTT); } } WHEN { TURN { MOVE(player, MOVE_YAWN); EXPECT_MOVE(opponent, MOVE_SCRATCH); } - if (aceFlag) + if (flags & AI_FLAG_ACE_POKEMON) TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_SCRATCH); } else TURN { MOVE(player, MOVE_SCRATCH); EXPECT_SWITCH(opponent, 1); } @@ -1333,17 +1413,17 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch out if Yawn'd wi AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch in ace mon after U-Turn if other options available") { - u32 aceFlag; - PARAMETRIZE{ aceFlag = 0; } - PARAMETRIZE{ aceFlag = AI_FLAG_ACE_POKEMON; } + u32 flags; + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING; } + PARAMETRIZE { flags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ACE_POKEMON | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_SMART_SWITCHING); + AI_FLAGS(flags); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SURF); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_U_TURN); } OPPONENT(SPECIES_NUMEL) { Level(5); Moves(MOVE_SPLASH); } OPPONENT(SPECIES_SCIZOR) { Moves(MOVE_BUG_BITE); } } WHEN { - if (aceFlag) + if (flags & AI_FLAG_ACE_POKEMON) TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 1); MOVE(player, MOVE_SURF); } else TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 2); MOVE(player, MOVE_SURF); } @@ -1352,17 +1432,17 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch in ace mon after AI_SINGLE_BATTLE_TEST("Switch AI: AI won't switch in ace mon after U-Turn if other options available") { - u32 aceFlag; - PARAMETRIZE{ aceFlag = 0; } - PARAMETRIZE{ aceFlag = AI_FLAG_ACE_POKEMON; } + u32 flag; + PARAMETRIZE{ flag = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT; } + PARAMETRIZE{ flag = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_ACE_POKEMON | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT; } GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | aceFlag | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + AI_FLAGS(flag); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SURF); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_U_TURN); } OPPONENT(SPECIES_NUMEL) { Level(5); Moves(MOVE_SPLASH); } OPPONENT(SPECIES_SCIZOR) { Moves(MOVE_BUG_BITE); } } WHEN { - if (aceFlag) + if (flag & AI_FLAG_ACE_POKEMON) TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 1); MOVE(player, MOVE_SURF); } else TURN { EXPECT_MOVE(opponent, MOVE_U_TURN); EXPECT_SEND_OUT(opponent, 2); MOVE(player, MOVE_SURF); } @@ -1385,7 +1465,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't switch in absorbing mon AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider choice-locked player when determining which mon to send out") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_CHOICE_BAND; } GIVEN { @@ -1452,18 +1532,154 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch out if Palafin-Zero isn't trans } } -AI_SINGLE_BATTLE_TEST("Switch AI: AI will use pivot move to activate Palafin's Zero to Hero rather than hard switching") +AI_SINGLE_BATTLE_TEST("Switch AI: Palafin uses Flip Turn when faster to transform (Single)") { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_FINIZEN); - OPPONENT(SPECIES_PALAFIN_ZERO) { Moves(MOVE_FLIP_TURN); } - OPPONENT(SPECIES_FINIZEN); + PLAYER(SPECIES_GLISCOR) { Speed(10); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(5); } } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_FLIP_TURN); EXPECT_SEND_OUT(opponent, 1); } } } +AI_DOUBLE_BATTLE_TEST("Switch AI: Palafin uses Flip Turn when faster to transform (Doubles)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_GLISCOR) { Speed(10); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_GLISCOR) { Speed(15); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(5); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_GLISCOR) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE, target:opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE, target:opponentLeft); + EXPECT_MOVE(opponentLeft, MOVE_FLIP_TURN, target:playerLeft); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); + EXPECT_SEND_OUT(opponentLeft, 2); + } + } +} + +AI_SINGLE_BATTLE_TEST("Switch AI: Palafin hard switches when slower even with Flip Turn (Single)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_GLISCOR) { Speed(30); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(10); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("Switch AI: Palafin hard switches when slower even with Flip Turn (Doubles)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_GLISCOR) { Speed(25); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_GLISCOR) { Speed(15); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(10); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(8); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_GLISCOR) { Speed(7); Moves(MOVE_TACKLE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE, target:opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE, target:opponentLeft); + EXPECT_SWITCH(opponentLeft, 2); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); + } + } +} + +AI_SINGLE_BATTLE_TEST("Switch AI: Palafin hard switches into absorb abilities instead of Flip Turn (Single)") +{ + enum Ability palafinAbsorbAbility; + PARAMETRIZE { palafinAbsorbAbility = ABILITY_STORM_DRAIN; } + PARAMETRIZE { palafinAbsorbAbility = ABILITY_WATER_ABSORB; } + PARAMETRIZE { palafinAbsorbAbility = ABILITY_DRY_SKIN; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_GLISCOR) { Speed(10); Ability(palafinAbsorbAbility); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(8); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("Switch AI: Palafin hard switches into absorb abilities instead of Flip Turn (Doubles)") +{ + enum Ability palafinAbsorbAbility; + PARAMETRIZE { palafinAbsorbAbility = ABILITY_STORM_DRAIN; } + PARAMETRIZE { palafinAbsorbAbility = ABILITY_WATER_ABSORB; } + PARAMETRIZE { palafinAbsorbAbility = ABILITY_DRY_SKIN; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_GLISCOR) { Speed(5); Ability(palafinAbsorbAbility); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_GLISCOR) { Speed(4); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(1); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_GLISCOR) { Speed(8); } + } WHEN { + if (palafinAbsorbAbility == ABILITY_STORM_DRAIN) + { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE, target:opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE, target:opponentLeft); + EXPECT_SWITCH(opponentLeft, 2); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); + } + } + else + { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE, target:opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE, target:opponentLeft); + EXPECT_MOVE(opponentLeft, MOVE_FLIP_TURN, target:playerRight); + EXPECT_SEND_OUT(opponentLeft, 2); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); + } + } + } +} + +AI_SINGLE_BATTLE_TEST("Switch AI: Palafin hard switches under harsh sunlight (Single)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_GROUDON_PRIMAL) { Speed(15); Ability(ABILITY_DESOLATE_LAND); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("Switch AI: Palafin hard switches under harsh sunlight (Doubles)") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_GROUDON_PRIMAL) { Speed(18); Ability(ABILITY_DESOLATE_LAND); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_GLISCOR) { Speed(16); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); Speed(20); Moves(MOVE_FLIP_TURN, MOVE_TACKLE); } + OPPONENT(SPECIES_GLISCOR) { Speed(6); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_GLISCOR) { Speed(7); Moves(MOVE_TACKLE); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE, target:opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE, target:opponentLeft); + EXPECT_SWITCH(opponentLeft, 2); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE); + } + } +} + AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't send out defensive mon that can lose 1v1, or switch out a mon that can win 1v1 even with bad type matchup") { PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_HASBADODDS); @@ -1573,6 +1789,8 @@ AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting abi AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup") { GIVEN { + ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 0) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 1) == TYPE_FAIRY); // Gen 5's pure Grass type makes the test fail AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); } OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_SCRATCH); } @@ -1637,11 +1855,42 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's priori } } +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's endure effects when evaluating Bad Odds 1v1") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_HASBADODDS_PERCENTAGE, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + OPPONENT(SPECIES_SCRAFTY) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Item(ITEM_FOCUS_SASH); Moves(MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_KNOCK_OFF); EXPECT_SWITCH(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider player's endure effects when evaluating switchin candidates") +{ + enum Item item; + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_FOCUS_SASH; } + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + OPPONENT(SPECIES_ZIGZAGOON) { Speed(10); HP(1); MaxHP(400); Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_GENGAR) { Speed(10); Moves(MOVE_FOCUS_BLAST); } + OPPONENT(SPECIES_SCRAFTY) { Speed(5); Moves(MOVE_DRAIN_PUNCH); } + PLAYER(SPECIES_KINGAMBIT) { Speed(2); Item(item); Moves(MOVE_PROTECT, MOVE_KNOCK_OFF); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); item == ITEM_FOCUS_SASH ? EXPECT_SEND_OUT(opponent, 2) : EXPECT_SEND_OUT(opponent, 1); } + } +} + AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will consider Hidden Power when triggering absorbing switches") { PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_HIDDEN_POWER_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING_HIDDEN_POWER); GIVEN { - ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_HIDDEN_POWER); HPIV(31); AttackIV(30); DefenseIV(31); SpAttackIV(30); SpDefenseIV(31); SpeedIV(30); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -1669,7 +1918,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: Fake Out style moves won't confu AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider choice-locked player priority when determining which mon to send out") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_CHOICE_BAND; } GIVEN { @@ -1683,3 +1932,117 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will consider choice-locked TURN { MOVE(player, MOVE_MIGHTY_CLEAVE); EXPECT_MOVE(opponent, MOVE_TACKLE); item == ITEM_NONE ? EXPECT_SEND_OUT(opponent, 1) : EXPECT_SEND_OUT(opponent, 2); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI considers both meeting and exceeding KO thresholds correctly") +{ + u32 hp; + PARAMETRIZE { hp = 40; } + PARAMETRIZE { hp = 80; } + PARAMETRIZE { hp = 79; } + PARAMETRIZE { hp = 81; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_DRAGON_RAGE) == EFFECT_FIXED_HP_DAMAGE); + ASSUME(GetMoveFixedHPDamage(MOVE_DRAGON_RAGE) == 40); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Speed(5); HP(hp); Moves(MOVE_PROTECT, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(6); Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(6); Moves(MOVE_DRAGON_RAGE); } + OPPONENT(SPECIES_BELDUM) { Speed(4); Moves(MOVE_TACKLE); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); hp > 80 ? EXPECT_SEND_OUT(opponent, 2) : EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will not choose to switch out Dondozo with Commander Tatsugiri") +{ + PASSES_RANDOMLY(100, 100); + GIVEN { + ASSUME(GetMoveEffect(MOVE_PERISH_SONG) == EFFECT_PERISH_SONG); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + OPPONENT(SPECIES_DONDOZO) { Level(50); Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_TATSUGIRI) { Moves(MOVE_WATER_GUN); Ability(ABILITY_COMMANDER); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_HEADBUTT); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE, MOVE_PERISH_SONG); } + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_ZIGZAGOON) { Moves (MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_PERISH_SONG); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); } + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } + TURN { MOVE(playerLeft, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); EXPECT_MOVE(opponentLeft, MOVE_WATER_GUN); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_RANDOMIZE_SWITCHIN: AI will randomly choose between eligible switchin candidates of the same category") +{ + u32 trials; // Two trial counts to ensure randomization is scalable + PARAMETRIZE { trials = 30; } + PARAMETRIZE { trials = 50; } + PASSES_RANDOMLY(10, trials, RNG_AI_RANDOM_SWITCHIN_POST_KO); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_RANDOMIZE_SWITCHIN); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_PROTECT, MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_CLOSE_COMBAT); } + if (trials == 50) + { + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_CLOSE_COMBAT); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_CLOSE_COMBAT); } + } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_FLAG_RANDOMIZE_SWITCHIN: AI will randomly choose between all valid switchin candidates if no good options are available") +{ + u32 trials; // Two trial counts to ensure randomization is scalable + PARAMETRIZE { trials = 30; } + PARAMETRIZE { trials = 50; } + PASSES_RANDOMLY(10, trials, RNG_AI_RANDOM_VALID_SWITCHIN_POST_KO); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_RANDOMIZE_SWITCHIN); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_PROTECT, MOVE_BITE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_GASTLY) { Moves(MOVE_LICK); } + OPPONENT(SPECIES_GASTLY) { Moves(MOVE_LICK); } + OPPONENT(SPECIES_GASTLY) { Moves(MOVE_LICK); } + if (trials == 50) + { + OPPONENT(SPECIES_GASTLY) { Moves(MOVE_LICK); } + OPPONENT(SPECIES_GASTLY) { Moves(MOVE_LICK); } + } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); EXPECT_SEND_OUT(opponent, 2); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own terrain setting ability when considering switchin candidates") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_MACHAMP) { Speed(1); Ability(ABILITY_NO_GUARD); Moves(MOVE_PROTECT, MOVE_SHEER_COLD); } + OPPONENT(SPECIES_ZIGZAGOON) { Speed(2); Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_INDEEDEE_F) { Speed(2); Ability(ABILITY_PSYCHIC_SURGE); Moves(MOVE_PSYCHIC); } + OPPONENT(SPECIES_INDEEDEE_F) { Speed(2); Ability(ABILITY_INNER_FOCUS); Moves(MOVE_PSYCHIC); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); EXPECT_SEND_OUT(opponent, 1); } + } +} + +AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own terrain setting ability's effect on failed moves when considering switchin candidates") +{ + KNOWN_FAILING; // Fails because the AI can't currently see the arbitrary terrain passed to AI_CalcDamage in CanAbilityBlockMove + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_PROTECT, MOVE_QUICK_ATTACK); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_EXPLOSION); } + OPPONENT(SPECIES_INDEEDEE_F) { HP(1); Ability(ABILITY_PSYCHIC_SURGE); Moves(MOVE_CONFUSION); } + OPPONENT(SPECIES_INDEEDEE_F) { HP(1); Ability(ABILITY_INNER_FOCUS); Moves(MOVE_CONFUSION); } + } WHEN { + TURN { MOVE(player, MOVE_PROTECT); EXPECT_MOVE(opponent, MOVE_EXPLOSION); EXPECT_SEND_OUT(opponent, 1); } + } +} diff --git a/test/battle/ai/ai_test_test_runner.c b/test/battle/ai/ai_test_test_runner.c new file mode 100644 index 000000000..6ff6c395e --- /dev/null +++ b/test/battle/ai/ai_test_test_runner.c @@ -0,0 +1,219 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_SINGLE_BATTLE_TEST("TIE_BREAK_SCORE with SCORE_TIE_CHOSEN can control AI move selection when scores are tied (Singles)") +{ + u32 tiedMove; + u16 expectedMove; + PARAMETRIZE { tiedMove = 3; expectedMove = MOVE_ICE_BEAM; } + PARAMETRIZE { tiedMove = 2; expectedMove = MOVE_FLAMETHROWER; } + PARAMETRIZE { tiedMove = 1; expectedMove = MOVE_SLUDGE_BOMB; } + PARAMETRIZE { tiedMove = 0; expectedMove = MOVE_THUNDERBOLT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_SINGLES, SCORE_TIE_CHOSEN, tiedMove); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + } WHEN { + TURN { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_SCORE with SCORE_TIE_CHOSEN can control AI move selection when scores are tied (Doubles)") +{ + u32 tiedMove; + u16 expectedMove; + PARAMETRIZE { tiedMove = 3; expectedMove = MOVE_ICE_BEAM; } + PARAMETRIZE { tiedMove = 2; expectedMove = MOVE_FLAMETHROWER; } + PARAMETRIZE { tiedMove = 1; expectedMove = MOVE_SLUDGE_BOMB; } + PARAMETRIZE { tiedMove = 0; expectedMove = MOVE_THUNDERBOLT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_DOUBLES_MOVE, SCORE_TIE_CHOSEN, tiedMove); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, expectedMove, target: playerRight); EXPECT_MOVE(opponentRight, expectedMove, target: playerRight); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +// SCORE_TIE_RANDOM tested separately as needs larger sample size +AI_SINGLE_BATTLE_TEST("TIE_BREAK_SCORE correctly controls AI move selection when scores are tied for all values in enum ScoreTieResolution (Singles)") +{ + u32 enumValue; + u16 expectedMove; + PARAMETRIZE { enumValue = SCORE_TIE_NONE; expectedMove = MOVE_THUNDERBOLT; } + PARAMETRIZE { enumValue = SCORE_TIE_LO; expectedMove = MOVE_THUNDERBOLT; } + PARAMETRIZE { enumValue = SCORE_TIE_HI; expectedMove = MOVE_ICE_BEAM; } + PARAMETRIZE { enumValue = SCORE_TIE_CHOSEN; expectedMove = MOVE_FLAMETHROWER; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_SINGLES, enumValue, 2); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + } WHEN { + TURN { EXPECT_MOVE(opponent, expectedMove); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +// SCORE_TIE_RANDOM tested separately as needs larger sample size +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_SCORE correctly controls AI move selection when scores are tied for all values in enum ScoreTieResolution (Doubles)") +{ + u32 enumValue; + u16 expectedMove; + PARAMETRIZE { enumValue = SCORE_TIE_NONE; expectedMove = MOVE_THUNDERBOLT; } + PARAMETRIZE { enumValue = SCORE_TIE_LO; expectedMove = MOVE_THUNDERBOLT; } + PARAMETRIZE { enumValue = SCORE_TIE_HI; expectedMove = MOVE_ICE_BEAM; } + PARAMETRIZE { enumValue = SCORE_TIE_CHOSEN; expectedMove = MOVE_FLAMETHROWER; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_DOUBLES_MOVE, enumValue, 2); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, expectedMove, target: playerRight); EXPECT_MOVE(opponentRight, expectedMove, target: playerRight); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_SINGLE_BATTLE_TEST("TIE_BREAK_SCORE with SCORE_TIE_RANDOM randomizes AI move selection (Singles)") +{ + PASSES_RANDOMLY(25, 100, RNG_AI_SCORE_TIE_SINGLES); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_SINGLES, SCORE_TIE_RANDOM, 0); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_ICE_BEAM); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_SCORE with SCORE_TIE_RANDOM randomizes AI move selection (Doubles)") +{ + PASSES_RANDOMLY(25, 100, RNG_AI_SCORE_TIE_DOUBLES_MOVE); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_SCORE(RNG_AI_SCORE_TIE_DOUBLES_MOVE, SCORE_TIE_RANDOM, 0); + TIE_BREAK_TARGET(TARGET_TIE_HI, 0); + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_SLUDGE_BOMB, MOVE_FLAMETHROWER, MOVE_ICE_BEAM); Speed(3); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_ICE_BEAM, target: playerRight); + EXPECT_MOVE(opponentRight, MOVE_ICE_BEAM, target: playerRight); + SEND_OUT(playerLeft, 2); + SEND_OUT(playerRight, 3); + } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_TARGET with TARGET_TIE_CHOSEN can correctly control AI target selection when scores are tied") +{ + u32 targetValue; + struct BattlePokemon *expectedTarget = playerLeft; + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { targetValue = 0; expectedTarget = playerLeft; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_TARGET(TARGET_TIE_CHOSEN, targetValue); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_THUNDERBOLT, target: expectedTarget); EXPECT_MOVE(opponentRight, MOVE_THUNDERBOLT, target: expectedTarget); + SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +// TARGET_TIE_RANDOM tested separately as needs larger sample size +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_TARGET correctly controls AI target selection when scores are tied for all values in enum TargetTieResolution") +{ + u32 enumValue, targetValue; + struct BattlePokemon *expectedTarget = playerLeft; + PARAMETRIZE { enumValue = TARGET_TIE_NONE; targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { enumValue = TARGET_TIE_LO; targetValue = 0; expectedTarget = playerLeft; } + PARAMETRIZE { enumValue = TARGET_TIE_HI; targetValue = 1; expectedTarget = playerRight; } + PARAMETRIZE { enumValue = TARGET_TIE_CHOSEN; targetValue = 1; expectedTarget = playerRight; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_TARGET(enumValue, targetValue); + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_THUNDERBOLT, target: expectedTarget); EXPECT_MOVE(opponentRight, MOVE_THUNDERBOLT, target: expectedTarget); + SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + } +} + +AI_DOUBLE_BATTLE_TEST("TIE_BREAK_TARGET with TARGET_TIE_RANDOM randomizes AI target") +{ + PASSES_RANDOMLY(50, 100, RNG_AI_SCORE_TIE_DOUBLES_TARGET); + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + TIE_BREAK_TARGET(TARGET_TIE_RANDOM, 0); + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(5); Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT); Speed(3); } + } WHEN { + TURN { EXPECT_MOVE(opponentRight, MOVE_THUNDERBOLT, target: playerRight); SEND_OUT(playerLeft, 2); SEND_OUT(playerRight, 3); } + } SCENE { + MESSAGE("Wobbuffet fainted!"); + MESSAGE("Wobbuffet fainted!"); + } +} diff --git a/test/battle/ai/ai_trytofaint.c b/test/battle/ai/ai_trytofaint.c index 50ab37650..f8bdded93 100644 --- a/test/battle/ai/ai_trytofaint.c +++ b/test/battle/ai/ai_trytofaint.c @@ -64,11 +64,12 @@ AI_SINGLE_BATTLE_TEST("AI sees Parental Bond killing through sturdy") { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); - PLAYER(SPECIES_MAGNEZONE){Level(64); Ability(ABILITY_STURDY); Moves(MOVE_TACKLE, MOVE_LIGHT_SCREEN); } - OPPONENT(SPECIES_KANGASKHAN_MEGA){Level(64); Moves(MOVE_DRAIN_PUNCH, MOVE_TAUNT); } - } WHEN { - TURN{ MOVE(player, MOVE_TACKLE); - EXPECT_MOVE(opponent, MOVE_DRAIN_PUNCH); // AI should see drain punch as a kill due to multi hit, outscoring taunt + PLAYER(SPECIES_MAGNEZONE){ Level(64); Ability(ABILITY_STURDY); Moves(MOVE_TACKLE, MOVE_LIGHT_SCREEN); } + OPPONENT(SPECIES_KANGASKHAN_MEGA){ Level(64); Moves(MOVE_DRAIN_PUNCH, MOVE_TAUNT); } + } WHEN { + TURN { + MOVE(player, MOVE_TACKLE); + EXPECT_MOVE(opponent, MOVE_DRAIN_PUNCH); // AI should see drain punch as a kill due to multi hit, outscoring taunt } } } diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 0f75ac75a..78e115405 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -9,7 +9,6 @@ AI_DOUBLE_BATTLE_TEST("AI uses Final Gambit") { - KNOWN_FAILING; GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); @@ -20,13 +19,12 @@ AI_DOUBLE_BATTLE_TEST("AI uses Final Gambit") OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_FINAL_GAMBIT); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_FINAL_GAMBIT); SEND_OUT(playerLeft, 2); } } } AI_DOUBLE_BATTLE_TEST("AI uses Guillotine") { - KNOWN_FAILING; GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); @@ -37,13 +35,12 @@ AI_DOUBLE_BATTLE_TEST("AI uses Guillotine") OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_GUILLOTINE); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_GUILLOTINE); SEND_OUT(playerLeft, 2); } } } AI_DOUBLE_BATTLE_TEST("AI uses Sheer Cold") { - KNOWN_FAILING; GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); @@ -54,20 +51,20 @@ AI_DOUBLE_BATTLE_TEST("AI uses Sheer Cold") OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_SHEER_COLD); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_SHEER_COLD); SEND_OUT(playerLeft, 2); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") { - u32 moveStart = 0; - u32 moveCap = 100; + enum Move moveStart = 0; + enum Move moveCap = 100; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -116,20 +113,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200") { - u32 moveStart = 100; - u32 moveCap = 200; + enum Move moveStart = 100; + enum Move moveCap = 200; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -192,20 +189,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") { - u32 moveStart = 200; - u32 moveCap = 300; + enum Move moveStart = 200; + enum Move moveCap = 300; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -247,20 +244,13 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") // tests exist elsewhere case EFFECT_HEAL_BELL: - case EFFECT_SUNNY_DAY: - case EFFECT_RAIN_DANCE: - #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_SNOW - case EFFECT_SNOWSCAPE: - #else - case EFFECT_HAIL: - #endif + case EFFECT_WEATHER: case EFFECT_ROLE_PLAY: case EFFECT_REFRESH: // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: - case EFFECT_SANDSTORM: case EFFECT_DO_NOTHING: case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: @@ -281,20 +271,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") { - u32 moveStart = 300; - u32 moveCap = 400; + enum Move moveStart = 300; + enum Move moveCap = 400; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -318,6 +308,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") case EFFECT_LAST_RESORT: case EFFECT_AQUA_RING: case EFFECT_HEALING_WISH: + case EFFECT_LUNAR_DANCE: //TODO: AI TESTS case EFFECT_RESTORE_HP: @@ -332,7 +323,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") // tests exist elsewhere case EFFECT_GRAVITY: case EFFECT_HEAL_BELL: - case EFFECT_ATTACK_UP_USER_ALLY: // Skipped on purpose. case EFFECT_PROTECT: @@ -357,20 +347,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") { - u32 moveStart = 400; - u32 moveCap = 500; + enum Move moveStart = 400; + enum Move moveCap = 500; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -386,6 +376,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") { //TODO: AI HANDLING case EFFECT_HEALING_WISH: + case EFFECT_LUNAR_DANCE: case EFFECT_WONDER_ROOM: case EFFECT_FOLLOW_ME: case EFFECT_MAGIC_ROOM: @@ -424,20 +415,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") { - u32 moveStart = 515; - u32 moveCap = 600; + enum Move moveStart = 515; + enum Move moveCap = 600; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -499,20 +490,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") { - u32 moveStart = 600; - u32 moveCap = 700; + enum Move moveStart = 600; + enum Move moveCap = 700; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -547,7 +538,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") case EFFECT_AURORA_VEIL: case EFFECT_GEAR_UP: case EFFECT_MAGNETIC_FLUX: - + // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -571,20 +562,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") { - u32 moveStart = 700; - u32 moveCap = 800; + enum Move moveStart = 700; + enum Move moveCap = 800; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -640,20 +631,20 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") { - u32 moveStart = 800; - u32 moveCap = 900; + enum Move moveStart = 800; + enum Move moveCap = 900; if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; s32 j; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; enum BattleMoveEffects effect; @@ -672,13 +663,18 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") case EFFECT_FAIL_IF_NOT_ARG_TYPE: //TODO: AI TESTS - case EFFECT_CHILLY_RECEPTION: + case EFFECT_WEATHER_AND_SWITCH: case EFFECT_TIDY_UP: // tests exist elsewhere - case EFFECT_SNOWSCAPE: case EFFECT_DRAGON_CHEER: - + break; + case EFFECT_WEATHER: + if (GetMoveWeatherType(j) == BATTLE_WEATHER_SNOW) + break; + else + PARAMETRIZE { move = j; } + break; // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -702,6 +698,6 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, move); } + TURN { EXPECT_MOVE(opponentLeft, move); } } } diff --git a/test/battle/ai/check_bad_move.c b/test/battle/ai/check_bad_move.c index ab6241dcb..62fc86001 100644 --- a/test/battle/ai/check_bad_move.c +++ b/test/battle/ai/check_bad_move.c @@ -1,6 +1,7 @@ #include "global.h" #include "test/battle.h" #include "battle_ai_util.h" +#include "move.h" AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is protected by it's ability") { @@ -16,7 +17,7 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot PARAMETRIZE { ability = ABILITY_CLEAR_BODY; species = SPECIES_BELDUM; move = MOVE_NOBLE_ROAR; } GIVEN { - WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9); + WITH_CONFIG(CONFIG_ILLUMINATE_EFFECT, GEN_9); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, move); } @@ -28,7 +29,7 @@ AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot AI_DOUBLE_BATTLE_TEST("AI will not try to lower opposing stats if target is protected by Flower Veil") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SCARY_FACE; } PARAMETRIZE { move = MOVE_GROWL; } @@ -48,3 +49,172 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to lower opposing stats if target is prot TURN { SCORE_LT_VAL(opponentLeft, move, AI_SCORE_DEFAULT, target: playerRight); } } } + +AI_SINGLE_BATTLE_TEST("Protect: AI avoids Protect vs Unseen Fist contact (Single)") +{ + static const enum Move protectMoves[] = + { + MOVE_PROTECT, + MOVE_DETECT, + MOVE_SPIKY_SHIELD, + MOVE_KINGS_SHIELD, + MOVE_BANEFUL_BUNKER, + MOVE_BURNING_BULWARK, + MOVE_OBSTRUCT, + MOVE_SILK_TRAP, + }; + u32 species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; + enum Move protectMove = MOVE_NONE; + bool32 shouldProtect = FALSE; + + for (u32 paramIdx = 0; paramIdx < ARRAY_COUNT(protectMoves); paramIdx++) + { + PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; shouldProtect = TRUE; protectMove = protectMoves[paramIdx]; } + PARAMETRIZE { species = SPECIES_URSHIFU; ability = ABILITY_UNSEEN_FIST; shouldProtect = FALSE; protectMove = protectMoves[paramIdx]; } + } + + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + ASSUME(GetMoveEffect(protectMove) == EFFECT_PROTECT); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(species) { Ability(ability); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(protectMove, MOVE_SCRATCH); } + } WHEN { + if (shouldProtect) + { + TURN { + MOVE(player, MOVE_TACKLE); + SCORE_GT(opponent, protectMove, MOVE_SCRATCH); + } + } + else + { + TURN { + MOVE(player, MOVE_TACKLE); + SCORE_LT(opponent, protectMove, MOVE_SCRATCH); + } + } + } +} + +AI_DOUBLE_BATTLE_TEST("Protect: AI avoids Protect vs Unseen Fist contact (Doubles)") +{ + static const enum Move protectMoves[] = + { + MOVE_PROTECT, + MOVE_DETECT, + MOVE_SPIKY_SHIELD, + MOVE_KINGS_SHIELD, + MOVE_BANEFUL_BUNKER, + MOVE_BURNING_BULWARK, + MOVE_OBSTRUCT, + MOVE_SILK_TRAP, + }; + u32 species = SPECIES_NONE; + enum Ability ability = ABILITY_NONE; + enum Move protectMove = MOVE_NONE; + bool32 shouldProtect = FALSE; + + for (u32 paramIdx = 0; paramIdx < ARRAY_COUNT(protectMoves); paramIdx++) + { + PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; shouldProtect = TRUE; protectMove = protectMoves[paramIdx]; } + PARAMETRIZE { species = SPECIES_URSHIFU; ability = ABILITY_UNSEEN_FIST; shouldProtect = FALSE; protectMove = protectMoves[paramIdx]; } + } + + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + ASSUME(GetMoveEffect(protectMove) == EFFECT_PROTECT); + ASSUME(MoveMakesContact(MOVE_TACKLE)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(species) { Ability(ability); Moves(MOVE_TACKLE); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(protectMove, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH); } + } WHEN { + if (shouldProtect) + { + TURN { + MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + SCORE_GT(opponentLeft, protectMove, MOVE_SCRATCH, target: playerLeft); + } + } + else + { + TURN { + MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + SCORE_LT(opponentLeft, protectMove, MOVE_SCRATCH, target: playerLeft); + } + } + } +} + +AI_SINGLE_BATTLE_TEST("Protect: AI avoids Protect vs moves that ignore protection (Single)") +{ + enum Move move = MOVE_NONE; + bool32 shouldProtect = FALSE; + + PARAMETRIZE { move = MOVE_TACKLE; shouldProtect = TRUE; } + PARAMETRIZE { move = MOVE_FEINT; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_SHADOW_FORCE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_PHANTOM_FORCE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_HYPERSPACE_HOLE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_HYPERSPACE_FURY; shouldProtect = FALSE; } + + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + if (shouldProtect) + ASSUME(!MoveIgnoresProtect(move)); + else + ASSUME(MoveIgnoresProtect(move)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Moves(move); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_PROTECT, MOVE_SCRATCH); } + } WHEN { + TURN { + MOVE(player, move); + if (shouldProtect) + SCORE_GT(opponent, MOVE_PROTECT, MOVE_SCRATCH); + else + SCORE_LT(opponent, MOVE_PROTECT, MOVE_SCRATCH); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Protect: AI avoids Protect vs moves that ignore protection (Doubles)") +{ + enum Move move = MOVE_NONE; + bool32 shouldProtect = FALSE; + + PARAMETRIZE { move = MOVE_TACKLE; shouldProtect = TRUE; } + PARAMETRIZE { move = MOVE_FEINT; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_SHADOW_FORCE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_PHANTOM_FORCE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_HYPERSPACE_HOLE; shouldProtect = FALSE; } + PARAMETRIZE { move = MOVE_HYPERSPACE_FURY; shouldProtect = FALSE; } + + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + if (shouldProtect) + ASSUME(!MoveIgnoresProtect(move)); + else + ASSUME(MoveIgnoresProtect(move)); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_WOBBUFFET) { Moves(move); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_PROTECT, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, move, target: opponentLeft); + MOVE(playerRight, MOVE_CELEBRATE); + if (shouldProtect) + SCORE_GT(opponentLeft, MOVE_PROTECT, MOVE_SCRATCH, target: playerLeft); + else + SCORE_LT(opponentLeft, MOVE_PROTECT, MOVE_SCRATCH, target: playerLeft); + } + } +} diff --git a/test/battle/ai/gimmick_dynamax.c b/test/battle/ai/gimmick_dynamax.c index 7e99a883c..99e6157c9 100644 --- a/test/battle/ai/gimmick_dynamax.c +++ b/test/battle/ai/gimmick_dynamax.c @@ -37,5 +37,29 @@ AI_SINGLE_BATTLE_TEST("AI uses Dynamax -- AI does not dynamax before using a uti } } +AI_TWO_VS_ONE_BATTLE_TEST("AI only Dynamaxes once per trainer in 2v1 multi battles") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_SPLASH); DynamaxLevel(10); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_DYNAMAX); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + TURN { + MOVE(playerLeft, MOVE_SPLASH); + MOVE(playerRight, MOVE_SPLASH); + EXPECT_MOVE(opponentLeft, MOVE_SPLASH, gimmick: GIMMICK_NONE); + EXPECT_MOVE(opponentRight, MOVE_SPLASH, gimmick: GIMMICK_NONE); + } + } +} + // Copycatting an ally's Max Guard rendition of Trick Room was a notable strategy. TO_DO_BATTLE_TEST("TODO: AI uses Dynamax -- AI uses Copycat against a Dynamaxed Pokemon intelligently") diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index fcc8d8165..1d344c5a4 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -3,7 +3,7 @@ #include "battle_ai_util.h" #include "constants/battle_z_move_effects.h" -AI_SINGLE_BATTLE_TEST("AI uses Z-moves.") +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves.") { GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); @@ -15,7 +15,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-moves.") } } -AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would faint anyway.") +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- conserves Z-move if target will faint anyway.") { u32 currentHP; PARAMETRIZE { currentHP = 1; } @@ -32,6 +32,24 @@ AI_SINGLE_BATTLE_TEST("AI does not use damaging Z-moves if the player would fain TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_NONE); } } } + +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves to ensure a low-accuracy KO.") +{ + u32 species, ability; + PARAMETRIZE { species = SPECIES_TORKOAL; ability = ABILITY_DROUGHT; } + PARAMETRIZE { species = SPECIES_PELIPPER; ability = ABILITY_DRIZZLE; } + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + PLAYER(species) { Ability(ability); HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ELECTRIUM_Z); Moves(MOVE_THUNDER); } + } WHEN { + if (ability == ABILITY_DROUGHT) + TURN { EXPECT_MOVE(opponent, MOVE_THUNDER, gimmick: GIMMICK_Z_MOVE); } + else + TURN { EXPECT_MOVE(opponent, MOVE_THUNDER, gimmick: GIMMICK_NONE); } + } +} + AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") { GIVEN { @@ -47,6 +65,18 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") } } +AI_SINGLE_BATTLE_TEST("AI uses Z-Moves to bypass move limitations") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); + ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_POUND, MOVE_LAST_RESORT); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } + } +} + AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt") { GIVEN { @@ -110,7 +140,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Z-Moves -- Z-Destiny Bond is used when about to d AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Detect") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THUNDERBOLT; } PARAMETRIZE { move = MOVE_CLOSE_COMBAT; } diff --git a/test/battle/badge_boost.c b/test/battle/badge_boost.c index eb8cecb24..bc60778cb 100644 --- a/test/battle/badge_boost.c +++ b/test/battle/badge_boost.c @@ -8,17 +8,17 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_ATTACK boost Attack", s16 dmg) u32 genConfig = 0; for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) { - PARAMETRIZE{badge = FALSE; genConfig = gen;} - PARAMETRIZE{badge = TRUE; genConfig = gen;} + PARAMETRIZE { badge = FALSE; genConfig = gen; } + PARAMETRIZE { badge = TRUE; genConfig = gen; } } GIVEN { if (badge) FlagSet(B_FLAG_BADGE_BOOST_ATTACK); else FlagClear(B_FLAG_BADGE_BOOST_ATTACK); - WITH_CONFIG(GEN_CONFIG_BADGE_BOOST, genConfig); - PLAYER(SPECIES_WOBBUFFET) {} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { @@ -40,17 +40,17 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPATK boost Special Attack", s u32 genConfig = 0; for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) { - PARAMETRIZE{badge = FALSE; genConfig = gen;} - PARAMETRIZE{badge = TRUE; genConfig = gen;} + PARAMETRIZE { badge = FALSE; genConfig = gen; } + PARAMETRIZE { badge = TRUE; genConfig = gen; } } GIVEN { if (badge) FlagSet(B_FLAG_BADGE_BOOST_SPATK); else FlagClear(B_FLAG_BADGE_BOOST_SPATK); - WITH_CONFIG(GEN_CONFIG_BADGE_BOOST, genConfig); - PLAYER(SPECIES_WOBBUFFET) {} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_THUNDER_SHOCK); } } SCENE { @@ -72,8 +72,8 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_DEFENSE boost Defense", s16 dm u32 genConfig = 0; for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) { - PARAMETRIZE{badge = FALSE; genConfig = gen;} - PARAMETRIZE{badge = TRUE; genConfig = gen;} + PARAMETRIZE { badge = FALSE; genConfig = gen; } + PARAMETRIZE { badge = TRUE; genConfig = gen; } } GIVEN { @@ -81,9 +81,9 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_DEFENSE boost Defense", s16 dm FlagSet(B_FLAG_BADGE_BOOST_DEFENSE); else FlagClear(B_FLAG_BADGE_BOOST_DEFENSE); - WITH_CONFIG(GEN_CONFIG_BADGE_BOOST, genConfig); - PLAYER(SPECIES_WOBBUFFET) {} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { @@ -105,8 +105,8 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPDEF boost Special Defense", u32 genConfig = 0; for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) { - PARAMETRIZE{badge = FALSE; genConfig = gen;} - PARAMETRIZE{badge = TRUE; genConfig = gen;} + PARAMETRIZE { badge = FALSE; genConfig = gen; } + PARAMETRIZE { badge = TRUE; genConfig = gen; } } GIVEN { @@ -114,9 +114,9 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPDEF boost Special Defense", FlagSet(B_FLAG_BADGE_BOOST_SPDEF); else FlagClear(B_FLAG_BADGE_BOOST_SPDEF); - WITH_CONFIG(GEN_CONFIG_BADGE_BOOST, genConfig); - PLAYER(SPECIES_WOBBUFFET) {} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_THUNDER_SHOCK); } } SCENE { @@ -138,19 +138,19 @@ WILD_BATTLE_TEST("Badge boost: B_FLAG_BADGE_BOOST_SPEED boost Speed", s16 dmg) u32 genConfig = 0; for (u32 gen = GEN_1; gen <= GEN_LATEST; gen++) { - PARAMETRIZE{badge = FALSE; genConfig = gen;} - PARAMETRIZE{badge = TRUE; genConfig = gen;} + PARAMETRIZE { badge = FALSE; genConfig = gen; } + PARAMETRIZE { badge = TRUE; genConfig = gen; } } GIVEN { if (badge) FlagSet(B_FLAG_BADGE_BOOST_SPEED); else FlagClear(B_FLAG_BADGE_BOOST_SPEED); - WITH_CONFIG(GEN_CONFIG_BADGE_BOOST, genConfig); + WITH_CONFIG(CONFIG_BADGE_BOOST, genConfig); PLAYER(SPECIES_WOBBUFFET) { Speed(100); HP(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(101); HP(1); } } WHEN { - TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_SCRATCH);} + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_SCRATCH); } } THEN { if (badge && genConfig <= GEN_3) { diff --git a/test/battle/battle_message.c b/test/battle/battle_message.c index 423da7cf0..ac8917a15 100644 --- a/test/battle/battle_message.c +++ b/test/battle/battle_message.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Battle Message: Send-in message depends on foe HP") PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET) { HP(hp); MaxHP(100); } } WHEN { - TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 1); } } SCENE { if (hp > 69) MESSAGE("Go! Wynaut!"); @@ -34,7 +34,7 @@ TO_DO_BATTLE_TEST("Battle Message: Switch-out message changes based on condition PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 1); } } SCENE { if (???) MESSAGE("Wynaut, that's enough! Come back!"); diff --git a/test/battle/capture.c b/test/battle/capture.c new file mode 100644 index 000000000..150c44a1e --- /dev/null +++ b/test/battle/capture.c @@ -0,0 +1,234 @@ +#include "global.h" +#include "event_data.h" +#include "pokedex.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gSpeciesInfo[SPECIES_CLEFFA].catchRate == 150); +} + +WILD_BATTLE_TEST("Capture: Incapacitated catch bonus apply correcly with all gen configs") +{ + u32 expectedOdds; + u32 recordedOdds; + u32 status; + u32 gen; + + PARAMETRIZE(expectedOdds = 100, status = STATUS1_SLEEP, gen = GEN_4); + PARAMETRIZE(expectedOdds = 100, status = STATUS1_FREEZE, gen = GEN_4); + PARAMETRIZE(expectedOdds = 125, status = STATUS1_SLEEP, gen = GEN_5); + PARAMETRIZE(expectedOdds = 125, status = STATUS1_FREEZE, gen = GEN_5); + + GIVEN { + WITH_CONFIG(CONFIG_INCAPACITATED_CATCH_BONUS, gen); + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFFA) {Status1(status);} + } WHEN { + TURN { USE_ITEM(player, ITEM_POKE_BALL); } + } SCENE { + CATCHING_CHANCE(&recordedOdds); + } THEN { + EXPECT_EQ(expectedOdds, recordedOdds); + } +} + +WILD_BATTLE_TEST("Capture: Low level catch bonus apply correcly with all gen configs") +{ + u32 expectedOdds; + u32 recordedOdds; + u32 level; + u32 gen; + + PARAMETRIZE(expectedOdds = 50, level = 10, gen = GEN_7); + PARAMETRIZE(expectedOdds = 50, level = 15, gen = GEN_7); + PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_7); + PARAMETRIZE(expectedOdds = 100, level = 10, gen = GEN_8); + PARAMETRIZE(expectedOdds = 75, level = 15, gen = GEN_8); + PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_8); + PARAMETRIZE(expectedOdds = 80, level = 10, gen = GEN_9); + PARAMETRIZE(expectedOdds = 50, level = 15, gen = GEN_9); + PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_9); + + GIVEN { + WITH_CONFIG(CONFIG_LOW_LEVEL_CATCH_BONUS, gen); + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFFA) {Level(level);} + } WHEN { + TURN { USE_ITEM(player, ITEM_POKE_BALL); } + } SCENE { + CATCHING_CHANCE(&recordedOdds); + } THEN { + EXPECT_EQ(expectedOdds, recordedOdds); + } +} + +WILD_BATTLE_TEST("Capture: Missing badge malus apply correcly in gen 8") +{ + u32 expectedOdds = 0; + u32 recordedOdds; + u32 playerLevel = 0; + u32 numBadges = 0; + + for (u32 j = 0; j < 8; j++) + { + PARAMETRIZE(expectedOdds = 50, playerLevel = 100, numBadges = j); + PARAMETRIZE(expectedOdds = 5, playerLevel = 99, numBadges = j); + } + PARAMETRIZE(expectedOdds = 50, playerLevel = 100, numBadges = 8); + PARAMETRIZE(expectedOdds = 50, playerLevel = 99, numBadges = 8); + PARAMETRIZE(expectedOdds = 50, playerLevel = 21, numBadges = 8); + + GIVEN { + for (u32 j = 0; j < 8; j++) + { + if (j < numBadges) + FlagSet(FLAG_BADGE01_GET + j); + else + FlagClear(FLAG_BADGE01_GET + j); + } + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_8); + PLAYER(SPECIES_WOBBUFFET) {Level(playerLevel);} + OPPONENT(SPECIES_CLEFFA); + } WHEN { + TURN { USE_ITEM(player, ITEM_POKE_BALL); } + } SCENE { + CATCHING_CHANCE(&recordedOdds); + } THEN { + EXPECT_EQ(expectedOdds, recordedOdds); + } +} + +WILD_BATTLE_TEST("Capture: Missing badge malus apply correcly in gen 9") +{ + u32 expectedOdds; + u32 recordedOdds; + u32 level = 0; + u32 numBadges = 0; + + PARAMETRIZE(expectedOdds = 250, level = 100, numBadges = 8); + PARAMETRIZE(expectedOdds = 200, level = 100, numBadges = 7); + PARAMETRIZE(expectedOdds = 160, level = 100, numBadges = 6); + PARAMETRIZE(expectedOdds = 128, level = 100, numBadges = 5); + PARAMETRIZE(expectedOdds = 250, level = 40, numBadges = 4); + PARAMETRIZE(expectedOdds = 250, level = 40, numBadges = 3); + PARAMETRIZE(expectedOdds = 200, level = 40, numBadges = 2); + PARAMETRIZE(expectedOdds = 160, level = 40, numBadges = 1); + PARAMETRIZE(expectedOdds = 128, level = 40, numBadges = 0); + + GIVEN { + for (u32 j = 0; j < 8; j++) + { + if (j < numBadges) + FlagSet(FLAG_BADGE01_GET + j); + else + FlagClear(FLAG_BADGE01_GET + j); + } + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_9); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CLEFFA) {Level(level);}; + } WHEN { + TURN { USE_ITEM(player, ITEM_QUICK_BALL); } + } SCENE { + CATCHING_CHANCE(&recordedOdds); + } THEN { + EXPECT_EQ(expectedOdds, recordedOdds); + } +} + +WILD_BATTLE_TEST("Capture: when CRITICAL_CAPTURE_IF_OWNED is enabled, capture of owned pokemon always appear critical") +{ + enum Item item; + bool32 alreadyOwned; + u32 catchingChance; + + PARAMETRIZE(item = ITEM_POKE_BALL, alreadyOwned = FALSE); + PARAMETRIZE(item = ITEM_QUICK_BALL, alreadyOwned = FALSE); + PARAMETRIZE(item = ITEM_MASTER_BALL, alreadyOwned = FALSE); + PARAMETRIZE(item = ITEM_POKE_BALL, alreadyOwned = TRUE); + PARAMETRIZE(item = ITEM_QUICK_BALL, alreadyOwned = TRUE); + PARAMETRIZE(item = ITEM_MASTER_BALL, alreadyOwned = TRUE); + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_CATERPIE].catchRate > 155); + if (alreadyOwned) + GetSetPokedexFlag(SPECIES_CATERPIE, FLAG_SET_CAUGHT); + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7); + WITH_CONFIG(CONFIG_CRITICAL_CAPTURE_IF_OWNED, GEN_9); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CATERPIE); + } WHEN { + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); } + } SCENE { + CATCHING_CHANCE(&catchingChance); + if (alreadyOwned) + { + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW); + NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW); + } + else + { + NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW); + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW); + } + } THEN { + if (item == ITEM_POKE_BALL) + EXPECT_LT(catchingChance, 255); + else + EXPECT_GT(catchingChance, 255); + } +} + +WILD_BATTLE_TEST("Capture: when CRITICAL_CAPTURE_IF_OWNED is enabled, failed capture of owned pokemon does not appear critical") +{ + bool32 success; + PARAMETRIZE(success = TRUE); + PARAMETRIZE(success = FALSE); + + GIVEN { + GetSetPokedexFlag(SPECIES_CATERPIE, FLAG_SET_CAUGHT); + WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7); + WITH_CONFIG(CONFIG_CRITICAL_CAPTURE_IF_OWNED, GEN_9); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CATERPIE); + } WHEN { + TURN { USE_ITEM(player, ITEM_POKE_BALL, WITH_RNG(RNG_BALLTHROW_SHAKE, success ? 0 : MAX_u16)); } + } SCENE { + if (success) + { + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW); + NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW); + } + else + { + NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW); + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW); + } + } +} + +WILD_BATTLE_TEST("Capture: ball data is properly set in captured pokemon") +{ + u32 item = ITEM_NONE; + for (enum PokeBall ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++) + { + PARAMETRIZE(item = gBallItemIds[ballId]); + } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); } + } SCENE { + ONE_OF + { + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW); + ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW); + } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKEBALL), GetItemSecondaryId(item)); + } +} diff --git a/test/battle/crit_chance.c b/test/battle/crit_chance.c index 5a4dd8d65..58650f7f5 100644 --- a/test/battle/crit_chance.c +++ b/test/battle/crit_chance.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Critical hits without modifiers occur at different rates by PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -35,10 +35,10 @@ SINGLE_BATTLE_TEST("Crit Chance: Raising critical hit rate to 3 guarantees a cri PARAMETRIZE { genConfig = j; passes = 1, trials = 1; } // 100% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); - PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); }; + PLAYER(SPECIES_TOGEKISS) { Ability(ABILITY_SUPER_LUCK); Item(ITEM_SCOPE_LENS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SLASH); } diff --git a/test/battle/damage_formula.c b/test/battle/damage_formula.c index 702feaa83..b62ed36ad 100644 --- a/test/battle/damage_formula.c +++ b/test/battle/damage_formula.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+") } } -SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)") +SINGLE_BATTLE_TEST("Damage calculation matches Gen6+ (Muscle Band, crit)") { s16 dmg; s16 expectedDamage; @@ -62,6 +62,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)") PARAMETRIZE { expectedDamage = 276; } PARAMETRIZE { expectedDamage = 268; } GIVEN { + WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, GEN_6); ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); Item(ITEM_MUSCLE_BAND); } OPPONENT(SPECIES_GARCHOMP) { Defense(163); } @@ -383,7 +384,7 @@ DOUBLE_BATTLE_TEST("Transistor Damage calculation", s16 damage) } } GIVEN { - WITH_CONFIG(GEN_CONFIG_TRANSISTOR_BOOST, gen); + WITH_CONFIG(CONFIG_TRANSISTOR_BOOST, gen); ASSUME(GetMoveType(MOVE_WILD_CHARGE) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); ASSUME(GetMoveCategory(MOVE_WILD_CHARGE) == DAMAGE_CATEGORY_PHYSICAL); diff --git a/test/battle/end_turn_effects.c b/test/battle/end_turn_effects.c index 95ae96889..eaccb053f 100644 --- a/test/battle/end_turn_effects.c +++ b/test/battle/end_turn_effects.c @@ -29,6 +29,30 @@ DOUBLE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (d } } +DOUBLE_BATTLE_TEST("End Turn Effects: Effects are applied by Speed Order") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT) { MaxHP(200); HP(100); Speed(3); } + PLAYER(SPECIES_RILLABOOM) { MaxHP(200); HP(100); Speed(1); Ability(ABILITY_GRASSY_SURGE); } + OPPONENT(SPECIES_MEWTWO) { MaxHP(200); HP(100); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(200); HP(100); Speed(4); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_FAKE_OUT, target: playerLeft); + MOVE(playerRight, MOVE_FAKE_OUT, target: opponentRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, playerRight); + HP_BAR(opponentRight); + + HP_BAR(opponentRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerRight); + } +} MULTI_BATTLE_TEST("End Turn Effects: First Event Block is executed correctly (multibattle)") { @@ -65,7 +89,7 @@ TWO_VS_ONE_BATTLE_TEST("End Turn Effects: First Event Block is executed correctl s16 damage; GIVEN { - MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1); } MULTI_PARTNER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } @@ -94,7 +118,7 @@ ONE_VS_TWO_BATTLE_TEST("End Turn Effects: First Event Block is executed correctl s16 damage; GIVEN { - MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1);} + MULTI_PLAYER(SPECIES_WYNAUT) { HP(100); Speed(1); } MULTI_PLAYER(SPECIES_EKANS) { HP(100); Ability(ABILITY_SHED_SKIN); Status1(STATUS1_BURN); Speed(2); } MULTI_OPPONENT_A(SPECIES_WYNAUT) { HP(100); Item(ITEM_LEFTOVERS); Speed(3); } MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { HP(100); Item(ITEM_BLACK_SLUDGE); Speed(4); } @@ -116,3 +140,33 @@ ONE_VS_TWO_BATTLE_TEST("End Turn Effects: First Event Block is executed correctl } } +DOUBLE_BATTLE_TEST("End Turn Effects: New mons will switch in after if previous mons died due to hazards") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WYNAUT) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SPIKES); + MOVE(playerRight, MOVE_HYPER_VOICE); + SEND_OUT(opponentLeft, 2); + SEND_OUT(opponentRight, 3); + SEND_OUT(opponentLeft, 4); + SEND_OUT(opponentRight, 5); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerRight); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} diff --git a/test/battle/evolution_tracker.c b/test/battle/evolution_tracker.c new file mode 100644 index 000000000..58aa835fb --- /dev/null +++ b/test/battle/evolution_tracker.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gSpeciesInfo[SPECIES_BISHARP].evolutions[0].params->condition == IF_DEFEAT_X_WITH_ITEMS); + ASSUME(gSpeciesInfo[SPECIES_BISHARP].evolutions[0].params->arg1 == SPECIES_BISHARP); + ASSUME(gSpeciesInfo[SPECIES_BISHARP].evolutions[0].params->arg2 == ITEM_LEADERS_CREST); +} + +WILD_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing a Bisharp that holds Leader's Crest increases tracker") +{ + GIVEN { + PLAYER(SPECIES_BISHARP); + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 1); + } +} + +// To be replaced with WILD_DOUBLE_BATTLE_TEST when that is made possible (also see TryUpdateEvolutionTracker) +DOUBLE_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing multiple Bisharps holding Leader's Crest increases tracker multiple times") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_BISHARP); + PLAYER(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_LAVA_PLUME); } + } SCENE { + HP_BAR(opponentLeft, hp: 0); + HP_BAR(playerRight, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 2); + } +} + +WILD_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing a Bisharp that doesn't hold Leader's Crest doesn't increase tracker") +{ + GIVEN { + PLAYER(SPECIES_BISHARP); + OPPONENT(SPECIES_BISHARP) { HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} + +WILD_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing a non-Bisharp that holds Leader's Crest doesn't increase tracker") +{ + u32 species; + + PARAMETRIZE { species = SPECIES_WOBBUFFET; } + PARAMETRIZE { species = SPECIES_PAWNIARD; } + GIVEN { + PLAYER(SPECIES_BISHARP); + OPPONENT(species) { Item(ITEM_LEADERS_CREST); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} + +WILD_BATTLE_TEST("Evolution Tracker: Pawniard KO-ing a Bisharp that holds Leader's Crest doesn't increase tracker") +{ + GIVEN { + PLAYER(SPECIES_PAWNIARD); + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} + +WILD_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing eligible battler from contact effects doesn't increase tracker") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_ROCKY_HELMET) == HOLD_EFFECT_ROCKY_HELMET); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_BISHARP) { Item(ITEM_ROCKY_HELMET); } + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} + +WILD_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing eligible battler with passive damage doesn't increase tracker") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + PLAYER(SPECIES_BISHARP); + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_LEECH_SEED); } + } SCENE { + HP_BAR(opponent, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} + +// To be replaced with WILD_DOUBLE_BATTLE_TEST when that is made possible (also see TryUpdateEvolutionTracker) +DOUBLE_BATTLE_TEST("Evolution Tracker: Bisharp KO-ing eligible battler with bursting flames doesn't increase tracker") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_FLAME_BURST, MOVE_EFFECT_FLAME_BURST)); + PLAYER(SPECIES_BISHARP); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_BISHARP) { Item(ITEM_LEADERS_CREST); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_FLAME_BURST, target: opponentRight); } + } SCENE { + HP_BAR(opponentLeft, hp: 0); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_EVOLUTION_TRACKER), 0); + } +} diff --git a/test/battle/exp.c b/test/battle/exp.c index 12c9c1e9b..3ed52a989 100644 --- a/test/battle/exp.c +++ b/test/battle/exp.c @@ -1,31 +1,32 @@ #include "global.h" #include "test/battle.h" -#if B_EXP_CATCH >= GEN_6 - -WILD_BATTLE_TEST("Pokemon gain exp after catching a Pokemon") +WILD_BATTLE_TEST("Pokemon gain experience after catching a Pokemon (Gen6+)") { u8 level = 0; + u32 config = 0; - PARAMETRIZE { level = 50; } - PARAMETRIZE { level = MAX_LEVEL; } + PARAMETRIZE { level = MAX_LEVEL; config = GEN_5; } + PARAMETRIZE { level = 50; config = GEN_5; } + PARAMETRIZE { level = 50; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_EXP_CATCH, config); PLAYER(SPECIES_WOBBUFFET) { Level(level); } OPPONENT(SPECIES_CATERPIE) { HP(1); } } WHEN { - TURN { USE_ITEM(player, ITEM_ULTRA_BALL); } + TURN { USE_ITEM(player, ITEM_ULTRA_BALL, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); } } SCENE { MESSAGE("You used Ultra Ball!"); ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW, player); - if (level != MAX_LEVEL) { + if (level != MAX_LEVEL && config >= GEN_6) { EXPERIENCE_BAR(player); + } else { + NOT EXPERIENCE_BAR(player); } } } -#endif // B_EXP_CATCH - WILD_BATTLE_TEST("Higher leveled Pokemon give more exp", s32 exp) { u8 level = 0; @@ -49,7 +50,7 @@ WILD_BATTLE_TEST("Higher leveled Pokemon give more exp", s32 exp) WILD_BATTLE_TEST("Lucky Egg boosts gained exp points by 50%", s32 exp) { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_LUCKY_EGG; } PARAMETRIZE { item = ITEM_NONE; } @@ -123,7 +124,7 @@ WILD_BATTLE_TEST("Large exp gains are supported", s32 exp) // #1455 WILD_BATTLE_TEST("Exp Share(held) gives Experience to mons which did not participate in battle") { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_EXP_SHARE; } diff --git a/test/battle/form_change/battle_after_move.c b/test/battle/form_change/battle_after_move.c index 2dc9d95a1..fed249d94 100644 --- a/test/battle/form_change/battle_after_move.c +++ b/test/battle/form_change/battle_after_move.c @@ -66,9 +66,9 @@ SINGLE_BATTLE_TEST("Relic Song transformation is the last thing that happens aft } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); HP_BAR(opponent); - MESSAGE("The opposing Gossifleur fainted!"); ABILITY_POPUP(opponent, ABILITY_COTTON_DOWN); MESSAGE("Meloetta's Speed fell!"); + MESSAGE("The opposing Gossifleur fainted!"); MESSAGE("Meloetta transformed!"); } THEN { EXPECT_EQ(player->species, SPECIES_MELOETTA_PIROUETTE); diff --git a/test/battle/form_change/begin_battle.c b/test/battle/form_change/begin_battle.c index bee9c4fe6..0f026ee2c 100644 --- a/test/battle/form_change/begin_battle.c +++ b/test/battle/form_change/begin_battle.c @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Xerneas changes into Active Form upon battle start") SINGLE_BATTLE_TEST("Zacian changes into its Crowned Form when holding the Rusted Sword upon battle start") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_RUSTED_SWORD; } GIVEN { @@ -39,14 +39,14 @@ SINGLE_BATTLE_TEST("Zacian's Iron Head becomes Behemoth Blade upon form change") } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { - ASSUME(player->species == SPECIES_ZACIAN_CROWNED); // Assumes form change worked. + EXPECT_EQ(player->species, SPECIES_ZACIAN_CROWNED); EXPECT_EQ(player->moves[0], MOVE_BEHEMOTH_BLADE); } } SINGLE_BATTLE_TEST("Zamazenta changes into its Crowned Form when holding the Rusted Shield upon battle start") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_RUSTED_SHIELD; } GIVEN { @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Zamazenta's Iron Head becomes Behemoth Bash upon form change } WHEN { TURN { MOVE(player, MOVE_CELEBRATE); } } THEN { - ASSUME(player->species == SPECIES_ZAMAZENTA_CROWNED); // Assumes form change worked. + EXPECT_EQ(player->species, SPECIES_ZAMAZENTA_CROWNED); EXPECT_EQ(player->moves[0], MOVE_BEHEMOTH_BASH); } } diff --git a/test/battle/form_change/end_battle.c b/test/battle/form_change/end_battle.c new file mode 100644 index 000000000..d4f29e431 --- /dev/null +++ b/test/battle/form_change/end_battle.c @@ -0,0 +1,287 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Xerneas returns its Neutral Form upon battle end") +{ + GIVEN { + PLAYER(SPECIES_XERNEAS_NEUTRAL); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_XERNEAS_NEUTRAL); + } +} + +SINGLE_BATTLE_TEST("Zacian returns its Hero Form upon battle end") +{ + GIVEN { + PLAYER(SPECIES_ZACIAN_HERO) { Item(ITEM_RUSTED_SWORD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ZACIAN_HERO); + } +} + +SINGLE_BATTLE_TEST("Zacian returns its Hero Form upon battle end") +{ + GIVEN { + ASSUME(GetMovePP(MOVE_BEHEMOTH_BLADE) == 5); + PLAYER(SPECIES_ZACIAN_HERO) { Item(ITEM_RUSTED_SWORD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ZACIAN_HERO); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), MOVE_IRON_HEAD); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_PP1), 5); // Behemoth Blade's PP + } +} + +SINGLE_BATTLE_TEST("Zamazenta returns its Hero Form upon battle end") +{ + GIVEN { + PLAYER(SPECIES_ZAMAZENTA_HERO) { Item(ITEM_RUSTED_SHIELD); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ZAMAZENTA_HERO); + } +} + +SINGLE_BATTLE_TEST("Zamazenta returns its Hero Form upon battle end") +{ + GIVEN { + ASSUME(GetMovePP(MOVE_BEHEMOTH_BASH) == 5); + PLAYER(SPECIES_ZAMAZENTA_HERO) { Item(ITEM_RUSTED_SHIELD); Moves(MOVE_IRON_HEAD, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_ZAMAZENTA_HERO); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), MOVE_IRON_HEAD); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_PP1), 5); // Behemoth Bash's PP + } +} + +SINGLE_BATTLE_TEST("Palafin returns to Zero form upon battle end") +{ + GIVEN { + PLAYER(SPECIES_PALAFIN_ZERO) { Ability(ABILITY_ZERO_TO_HERO); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } SCENE { + SWITCH_OUT_MESSAGE("Palafin"); + SEND_IN_MESSAGE("Wobbuffet"); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Palafin"); + ABILITY_POPUP(player, ABILITY_ZERO_TO_HERO); + MESSAGE("Palafin underwent a heroic transformation!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_PALAFIN_ZERO); + } +} + +SINGLE_BATTLE_TEST("Shaymin retains Land form if it was frozen or frostbitten in battle") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE)); + PLAYER(SPECIES_SHAYMIN_SKY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER_SNOW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER_SNOW, opponent); + FREEZE_OR_FROSTBURN_STATUS(player, TRUE); + NOT HP_BAR(player); // Regression caused by Mimikyu form change + MESSAGE("Shaymin transformed!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_SHAYMIN_LAND); + } +} + +SINGLE_BATTLE_TEST("Meloetta returns to Aria form upon battle end after using Relic Song") +{ + GIVEN { + PLAYER(SPECIES_MELOETTA_ARIA); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RELIC_SONG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RELIC_SONG, player); + HP_BAR(opponent); + MESSAGE("Meloetta transformed!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_MELOETTA_ARIA); + } +} + +SINGLE_BATTLE_TEST("Battle Bond Greninja returns to base form upon battle end after knocking out an opponent") +{ + GIVEN { + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); + PLAYER(SPECIES_GRENINJA_BATTLE_BOND); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WATER_GUN); SEND_OUT(opponent, 1); } + } SCENE { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet fainted!"); + ABILITY_POPUP(player, ABILITY_BATTLE_BOND); + MESSAGE("Greninja became fully charged due to its bond with its trainer!"); + MESSAGE("Greninja became Ash-Greninja!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_GRENINJA_BATTLE_BOND); + } +} + +SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon battle end after using an attack") +{ + GIVEN { + PLAYER(SPECIES_AEGISLASH_SHIELD); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + } +} + +SINGLE_BATTLE_TEST("Wishiwashi reverts to Solo form upon battle end after changing form at the beginning of the battle") +{ + GIVEN { + PLAYER(SPECIES_WISHIWASHI_SOLO) { Level(100); Ability(ABILITY_SCHOOLING); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { } + } SCENE { + ABILITY_POPUP(player, ABILITY_SCHOOLING); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WISHIWASHI_SOLO); + } +} + +SINGLE_BATTLE_TEST("Minior Meteor reverts to Core form upon battle end after changing form at the beginning of the battle") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_MINIOR_CORE) { Ability(ABILITY_SHIELDS_DOWN); HP(51); MaxHP(101); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); SEND_OUT(player, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_SHIELDS_DOWN); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_SPECIES), SPECIES_MINIOR_CORE); + } +} + +SINGLE_BATTLE_TEST("Mimikyu Busted reverts to Disguised form upon battle end after busting its Disguise in battle") +{ + u32 species; + PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; } + PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); + PLAYER(species) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_AERIAL_ACE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AERIAL_ACE, opponent); + ABILITY_POPUP(player, ABILITY_DISGUISE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); + } +} + +SINGLE_BATTLE_TEST("Cramorant reverts to base Form upon battle end after using Surf in battle") +{ + GIVEN { + PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SURF); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_CRAMORANT); + } +} + +SINGLE_BATTLE_TEST("Eiscue Noice reverts to Ice Form upon battle end after being hit by a physical move in battle") +{ + GIVEN { + ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_EISCUE_ICE); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ABILITY_POPUP(player, ABILITY_ICE_FACE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + MESSAGE("Eiscue transformed!"); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_EISCUE_ICE); + } +} + +SINGLE_BATTLE_TEST("Morpeko Hangry reverts to Full Belly Form upon battle end after changing forms at the end of the turn") +{ + GIVEN { + PLAYER(SPECIES_MORPEKO_FULL_BELLY) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + MESSAGE("Morpeko used Celebrate!"); + MESSAGE("The opposing Wobbuffet used Celebrate!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_MORPEKO_FULL_BELLY); + } +} + +SINGLE_BATTLE_TEST("Ogerpon reverts to the correct form upon battle end after terastallizing") +{ + u32 species; + PARAMETRIZE { species = SPECIES_OGERPON_TEAL; } + PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; } + PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; } + PARAMETRIZE { species = SPECIES_OGERPON_CORNERSTONE; } + GIVEN { + PLAYER(species); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); + } +} + +SINGLE_BATTLE_TEST("Terapagos reverts to the correct form upon battle end after terastallizing") +{ + GIVEN { + PLAYER(SPECIES_TERAPAGOS_NORMAL); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_TERAPAGOS_NORMAL); + } +} diff --git a/test/battle/form_change/end_battle_environment.c b/test/battle/form_change/end_battle_environment.c new file mode 100644 index 000000000..d4dfee3f5 --- /dev/null +++ b/test/battle/form_change/end_battle_environment.c @@ -0,0 +1,33 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Burmy changes form based on the environment it appeared in-battle") +{ + u32 currentForm = 0, newForm = 0, environment = 0; + + static u32 sBurmyForms[] = { + SPECIES_BURMY_PLANT, + SPECIES_BURMY_SANDY, + SPECIES_BURMY_TRASH, + }; + + for (u32 j = 0; j < ARRAY_COUNT(sBurmyForms); j++) { + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_PLANT; environment = BATTLE_ENVIRONMENT_GRASS; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_PLANT; environment = BATTLE_ENVIRONMENT_LONG_GRASS; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_PLANT; environment = BATTLE_ENVIRONMENT_POND; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_PLANT; environment = BATTLE_ENVIRONMENT_MOUNTAIN; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_PLANT; environment = BATTLE_ENVIRONMENT_PLAIN; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_SANDY; environment = BATTLE_ENVIRONMENT_CAVE; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_SANDY; environment = BATTLE_ENVIRONMENT_SAND; } + PARAMETRIZE { currentForm = sBurmyForms[j]; newForm = SPECIES_BURMY_TRASH; environment = BATTLE_ENVIRONMENT_BUILDING; } + } + GIVEN { + PLAYER(currentForm); + OPPONENT(SPECIES_WOBBUFFET); + Environment(environment); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), newForm); + } +} diff --git a/test/battle/form_change/faint.c b/test/battle/form_change/faint.c index 316ecca0b..4f66dc84c 100644 --- a/test/battle/form_change/faint.c +++ b/test/battle/form_change/faint.c @@ -8,12 +8,19 @@ SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon fainting (start as Shi PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_GUST); SEND_OUT(player, 1); } + TURN { MOVE(opponent, MOVE_GUST); SEND_OUT(player, 1); } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } } SCENE { - MESSAGE("The opposing Wobbuffet used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponent); + HP_BAR(player); MESSAGE("Aegislash fainted!"); + SEND_IN_MESSAGE("Wobbuffet"); + SWITCH_OUT_MESSAGE("Wobbuffet") + SEND_IN_MESSAGE("Aegislash"); } THEN { - EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + // We do not check gPlayerParty data to avoid triggering FORM_CHANGE_END_BATTLE. + EXPECT_EQ(player->species, SPECIES_AEGISLASH_SHIELD); } } @@ -25,11 +32,18 @@ SINGLE_BATTLE_TEST("Aegislash reverts to Shield Form upon fainting (start as Bla OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_GUST); SEND_OUT(player, 1); } + TURN { USE_ITEM(player, ITEM_REVIVE, 0); } + TURN { SWITCH(player, 0); } } SCENE { - MESSAGE("The opposing Wobbuffet used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponent); + HP_BAR(player); MESSAGE("Aegislash fainted!"); + SEND_IN_MESSAGE("Wobbuffet"); + SWITCH_OUT_MESSAGE("Wobbuffet") + SEND_IN_MESSAGE("Aegislash"); } THEN { - EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_AEGISLASH_SHIELD); + // We do not check gPlayerParty data to avoid triggering FORM_CHANGE_END_BATTLE. + EXPECT_EQ(player->species, SPECIES_AEGISLASH_SHIELD); } } diff --git a/test/battle/form_change/gigantamax.c b/test/battle/form_change/gigantamax.c new file mode 100644 index 000000000..92e2b4922 --- /dev/null +++ b/test/battle/form_change/gigantamax.c @@ -0,0 +1,45 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms change upon Dynamaxing") +{ + u32 species; + bool32 gigantamaxFactor; + PARAMETRIZE { gigantamaxFactor = FALSE; species = SPECIES_VENUSAUR; } + PARAMETRIZE { gigantamaxFactor = TRUE; species = SPECIES_VENUSAUR_GMAX; } + GIVEN { + PLAYER(SPECIES_VENUSAUR) { GigantamaxFactor(gigantamaxFactor); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + } THEN { + EXPECT_EQ(player->species, species); + } +} + +SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms revert upon switching") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + } THEN { + EXPECT_EQ(player->species, SPECIES_VENUSAUR); + } +} + +SINGLE_BATTLE_TEST("Dynamax: Venusaur returns its base Form upon battle end after Gigantamaxing") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { GigantamaxFactor(TRUE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_VENUSAUR); + } +} diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index 3e27a8460..f246cf1cc 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -74,39 +74,39 @@ SINGLE_BATTLE_TEST("Rayquaza can Mega Evolve knowing Dragon Ascent") SINGLE_BATTLE_TEST("Mega Evolution doesn't affect turn order (Gen6)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_6); + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_6); PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); } - OPPONENT(SPECIES_WOBBUFFET) {} + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } } SCENE { MESSAGE("The opposing Wobbuffet used Celebrate!"); MESSAGE("Gardevoir used Celebrate!"); } THEN { - ASSUME(player->speed == 205); + EXPECT_EQ(player->speed, 205); } } SINGLE_BATTLE_TEST("Mega Evolution affects turn order (Gen7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); - PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE);} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } } SCENE { MESSAGE("Gardevoir used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); } THEN { - ASSUME(player->speed == 205); + EXPECT_EQ(player->speed, 205); } } SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn order") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL && GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL); PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); } @@ -117,7 +117,7 @@ SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn orde MESSAGE("Sableye used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); } THEN { - ASSUME(player->speed == 105); + EXPECT_EQ(player->speed, 105); } } @@ -192,3 +192,27 @@ SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting" } } } + +SINGLE_BATTLE_TEST("Venusaur returns its base Form upon battle end after Mega Evolving") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Item(ITEM_VENUSAURITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_VENUSAUR); + } +} + +SINGLE_BATTLE_TEST("Rayquaza returns its base Form upon battle end after Mega Evolving") +{ + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { Moves(MOVE_DRAGON_ASCENT, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_RAYQUAZA); + } +} diff --git a/test/battle/form_change/primal_reversion.c b/test/battle/form_change/primal_reversion.c index 7ae591f27..cbd7435a7 100644 --- a/test/battle/form_change/primal_reversion.c +++ b/test/battle/form_change/primal_reversion.c @@ -4,9 +4,9 @@ SINGLE_BATTLE_TEST("Primal reversion happens for Groudon only when holding Red Orb") { u16 heldItem; - PARAMETRIZE { heldItem = ITEM_NONE;} - PARAMETRIZE { heldItem = ITEM_RED_ORB;} - PARAMETRIZE { heldItem = ITEM_BLUE_ORB;} + PARAMETRIZE { heldItem = ITEM_NONE; } + PARAMETRIZE { heldItem = ITEM_RED_ORB; } + PARAMETRIZE { heldItem = ITEM_BLUE_ORB; } GIVEN { PLAYER(SPECIES_GROUDON) { Item(heldItem); } OPPONENT(SPECIES_WOBBUFFET); @@ -36,9 +36,9 @@ SINGLE_BATTLE_TEST("Primal reversion happens for Groudon only when holding Red O SINGLE_BATTLE_TEST("Primal reversion happens for Kyogre only when holding Blue Orb") { u16 heldItem; - PARAMETRIZE { heldItem = ITEM_NONE;} - PARAMETRIZE { heldItem = ITEM_RED_ORB;} - PARAMETRIZE { heldItem = ITEM_BLUE_ORB;} + PARAMETRIZE { heldItem = ITEM_NONE; } + PARAMETRIZE { heldItem = ITEM_RED_ORB; } + PARAMETRIZE { heldItem = ITEM_BLUE_ORB; } GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KYOGRE) { Item(heldItem); } @@ -68,8 +68,8 @@ SINGLE_BATTLE_TEST("Primal reversion happens for Kyogre only when holding Blue O DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - opponent faster") { GIVEN { - PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(5); }; - PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(15); }; + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(5); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(15); } OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(10); } OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); } } WHEN { @@ -94,8 +94,8 @@ DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - opponent f DOUBLE_BATTLE_TEST("Primal reversion's order is determined by Speed - player faster") { GIVEN { - PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); }; - PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(30); }; + PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(20); } + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(30); } OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(10); } OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); Speed(2); } } WHEN { @@ -121,7 +121,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a mon is sent out after a mon { GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); - PLAYER(SPECIES_WOBBUFFET) {HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -158,7 +158,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Eject B GIVEN { ASSUME(!IsBattleMoveStatus(MOVE_SCRATCH)); ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); - PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_EJECT_BUTTON); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -181,7 +181,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after a switch-in caused by Red Car ASSUME(gItemsInfo[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } - OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { @@ -203,7 +203,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens after the entry hazards damage") OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SPIKES); } - TURN { MOVE(opponent, MOVE_SPIKES); SWITCH(player, 1);} + TURN { MOVE(opponent, MOVE_SPIKES); SWITCH(player, 1); } } SCENE { SEND_IN_MESSAGE("Groudon"); HP_BAR(player); @@ -239,7 +239,7 @@ SINGLE_BATTLE_TEST("Primal reversion happens immediately if it was brought in by DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CATERPIE) { HP(1); } PLAYER(SPECIES_RESHIRAM); @@ -262,8 +262,8 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for multiple battlers if multiple DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_CATERPIE) { HP(1); } PLAYER(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } @@ -290,19 +290,19 @@ DOUBLE_BATTLE_TEST("Primal reversion triggers for all battlers if multiple faint DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all battlers if multiple fainted the previous turn") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_CATERPIE) { HP(1); } - PLAYER(SPECIES_SCRAFTY) { Ability(ABILITY_INTIMIDATE); } - PLAYER(SPECIES_RESHIRAM); - OPPONENT(SPECIES_CATERPIE) { HP(1); } - OPPONENT(SPECIES_CATERPIE) { HP(1); } - OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } - OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_CATERPIE) { Speed(8); HP(1); } + PLAYER(SPECIES_SCRAFTY) { Speed(100); Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_RESHIRAM) { Speed(90); } + OPPONENT(SPECIES_CATERPIE) { Speed(9); HP(1); } + OPPONENT(SPECIES_CATERPIE) { Speed(7); HP(1); } + OPPONENT(SPECIES_KYOGRE) { Speed(80); Item(ITEM_BLUE_ORB); } + OPPONENT(SPECIES_GROUDON) { Speed(70); Item(ITEM_RED_ORB); } } WHEN { TURN { MOVE(playerLeft, MOVE_STICKY_WEB); MOVE(opponentLeft, MOVE_SPIKES); @@ -332,3 +332,18 @@ DOUBLE_BATTLE_TEST("Primal reversion and other switch-in effects trigger for all EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); } } + +SINGLE_BATTLE_TEST("Primal reversion is reverted upon battle end") +{ + u32 species, item; + PARAMETRIZE { species = SPECIES_GROUDON; item = ITEM_RED_ORB; } + PARAMETRIZE { species = SPECIES_KYOGRE; item = ITEM_BLUE_ORB; } + GIVEN { + PLAYER(species) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); + } +} diff --git a/test/battle/form_change/status.c b/test/battle/form_change/status.c index 612c12549..11da875bc 100644 --- a/test/battle/form_change/status.c +++ b/test/battle/form_change/status.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitten") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_POWDER_SNOW; } PARAMETRIZE { move = MOVE_EMBER; } @@ -35,6 +35,5 @@ SINGLE_BATTLE_TEST("Shaymin-Sky reverts to Shaymin-Land when frozen or frostbitt EXPECT_EQ(player->species, SPECIES_SHAYMIN_LAND); else EXPECT_EQ(player->species, SPECIES_SHAYMIN_SKY); - } } diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index 4b1bf6a8e..fcb0efded 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -58,16 +58,16 @@ DOUBLE_BATTLE_TEST("Ultra Burst's order is determined by Speed - player faster") SINGLE_BATTLE_TEST("Ultra Burst affects turn order") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); - PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z);} - OPPONENT(SPECIES_WOBBUFFET) {} + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); + PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); } } SCENE { MESSAGE("Necrozma used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); } THEN { - ASSUME(player->speed == 263); + EXPECT_EQ(player->speed, 263); } } @@ -119,3 +119,19 @@ SINGLE_BATTLE_TEST("Ultra Burst and Mega Evolution can happen on the same turn") EXPECT_EQ(opponent->species, SPECIES_GARDEVOIR_MEGA); } } + +SINGLE_BATTLE_TEST("Necrozma returns its proper Form upon battle end after Ultra Bursting") +{ + u32 species; + PARAMETRIZE { species = SPECIES_NECROZMA_DUSK_MANE; } + PARAMETRIZE { species = SPECIES_NECROZMA_DAWN_WINGS; } + GIVEN { + PLAYER(species) { Item(ITEM_ULTRANECROZIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_ULTRA_BURST); } + } THEN { + EXPECT_EQ(player->species, SPECIES_NECROZMA_ULTRA); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), species); + } +} diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index d97fb20f0..387de6ab1 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -144,7 +144,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamax expires after three turns and correctly con } WHEN { TURN { MOVE(player, MOVE_CELEBRATE, gimmick: dynamax); } TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_SCRATCH, WITH_RNG(RNG_DAMAGE_MODIFIER, 24)); } - TURN { } + TURN {} } SCENE { if (dynamax) ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); @@ -232,7 +232,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot be hit by OHKO moves") SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are affected by Grudge") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_GRUDGE); MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } @@ -270,7 +270,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by phazing moves { GIVEN { ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); - PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -354,8 +354,8 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon can have base moves disabled on t { GIVEN { ASSUME(B_DISABLE_TURNS >= GEN_5); - PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SCRATCH); } TURN { MOVE(opponent, MOVE_DISABLE); MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } @@ -423,7 +423,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain { u16 capturedHP, finalHP; GIVEN { - WITH_CONFIG(GEN_CONFIG_BATTLE_BOND, GEN_8); + WITH_CONFIG(CONFIG_BATTLE_BOND, GEN_8); PLAYER(SPECIES_GRENINJA_BATTLE_BOND) { Ability(ABILITY_BATTLE_BOND); HP(100); Speed(100); } OPPONENT(SPECIES_CATERPIE) { HP(1); Speed(1000); } OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } @@ -532,45 +532,14 @@ DOUBLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are immune to Instruct") } } -SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms change upon Dynamaxing") -{ - u32 species; - bool32 gigantamaxFactor; - PARAMETRIZE { gigantamaxFactor = FALSE; species = SPECIES_VENUSAUR; } - PARAMETRIZE { gigantamaxFactor = TRUE; species = SPECIES_VENUSAUR_GMAX; } - GIVEN { - PLAYER(SPECIES_VENUSAUR) { GigantamaxFactor(gigantamaxFactor); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } - } THEN { - EXPECT_EQ(player->species, species); - } -} - -SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms revert upon switching") -{ - GIVEN { - PLAYER(SPECIES_VENUSAUR); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } - TURN { SWITCH(player, 1); } - TURN { SWITCH(player, 0); } - } THEN { - EXPECT_EQ(player->species, SPECIES_VENUSAUR); - } -} - SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by Choice items", s16 damage) { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_CHOICE_BAND; } PARAMETRIZE { item = ITEM_NONE; } GIVEN { ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); - PLAYER(SPECIES_WOBBUFFET) { Item(item); }; + PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } @@ -588,7 +557,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot use Max Guard while holdin { GIVEN { ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ASSAULT_VEST); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } @@ -733,7 +702,7 @@ DOUBLE_BATTLE_TEST("Dynamax: Max Strike lowers both opponents' speed") ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); PLAYER(SPECIES_WOBBUFFET) { Speed(80); } PLAYER(SPECIES_WOBBUFFET) { Speed(79); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } OPPONENT(SPECIES_WOBBUFFET) { Speed(99); } } WHEN { TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); \ @@ -886,8 +855,8 @@ SINGLE_BATTLE_TEST("Dynamax: Max Overgrowth sets up Grassy Terrain") GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_OVERGROWTH, MOVE_EFFECT_GRASSY_TERRAIN)); ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); - OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; - PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); }; + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); } + PLAYER(SPECIES_WOBBUFFET) { MaxHP(maxHP); HP(maxHP / 2); } } WHEN { TURN { MOVE(player, MOVE_VINE_WHIP, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_CELEBRATE); } TURN { MOVE(player, MOVE_VINE_WHIP); MOVE(opponent, MOVE_CELEBRATE); } @@ -971,6 +940,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Stonesurge sets up Stealth Rocks") SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") { GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); } OPPONENT(SPECIES_WOBBUFFET); @@ -978,7 +948,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") } WHEN { TURN { MOVE(player, MOVE_IRON_HEAD, gimmick: GIMMICK_DYNAMAX); } TURN { SWITCH(opponent, 1); } - TURN { } // wait out Dynamax + TURN {} // wait out Dynamax TURN { MOVE(opponent, MOVE_DEFOG); } } SCENE { // turn 1 @@ -998,7 +968,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") // The test below should apply to G-Max Fireball and G-Max Drum Solo, too. SINGLE_BATTLE_TEST("Dynamax: G-Max Hydrosnipe has fixed power and ignores abilities", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_WATER_GUN; } PARAMETRIZE { move = MOVE_HYDRO_CANNON; } GIVEN { @@ -1300,10 +1270,10 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Wildfire sets a field effect that damages non OPPONENT(SPECIES_ARCANINE); } WHEN { TURN { MOVE(playerLeft, MOVE_EMBER, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } - TURN { } + TURN {} TURN { SWITCH(opponentLeft, 2); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { // turn 1 MESSAGE("Charizard used G-Max Wildfire!"); @@ -1374,7 +1344,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Snooze makes only the target drowsy") OPPONENT(SPECIES_CHANSEY); } WHEN { TURN { MOVE(playerLeft, MOVE_DARK_PULSE, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } - TURN { } + TURN {} } SCENE { // turn 1 MESSAGE("Grimmsnarl used G-Max Snooze!"); @@ -1464,7 +1434,7 @@ DOUBLE_BATTLE_TEST("Dynamax: G-Max Chi Strike boosts allies' crit chance by 1 st { u32 j; GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, GEN_6); + WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_6); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CHI_STRIKE, MOVE_EFFECT_CRIT_PLUS_SIDE)); PLAYER(SPECIES_MACHAMP) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_MACHOP); @@ -1550,7 +1520,7 @@ DOUBLE_BATTLE_TEST("Dynamax: Max Flare doesn't softlock the game when fainting p { GIVEN { PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -1558,7 +1528,7 @@ DOUBLE_BATTLE_TEST("Dynamax: Max Flare doesn't softlock the game when fainting p TURN { MOVE(playerLeft, MOVE_PROTECT, gimmick: GIMMICK_DYNAMAX); MOVE(opponentLeft, MOVE_V_CREATE, target: playerRight, gimmick: GIMMICK_DYNAMAX); SEND_OUT(playerRight, 2); } - TURN { } + TURN {} } } @@ -1566,7 +1536,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Moves don't execute effects on fainted battlers { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } } SCENE { @@ -1608,18 +1578,19 @@ SINGLE_BATTLE_TEST("Dynamax: Max Attacks prints a message when hitting into Max SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") { - u32 move, species; + enum Move move; + u32 species; enum Ability ability; - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } - PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; } - PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; } - PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; } - PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } - PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } - PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_WATER_ABSORB; species = SPECIES_LANTURN; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_FLASH_FIRE; species = SPECIES_HEATRAN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_PIKACHU; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_STORM_DRAIN; species = SPECIES_GASTRODON; } + PARAMETRIZE { move = MOVE_EMBER; ability = ABILITY_WELL_BAKED_BODY; species = SPECIES_DACHSBUN; } + PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_MOTOR_DRIVE; species = SPECIES_ELECTIVIRE; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_DRY_SKIN; species = SPECIES_PARASECT; } + PARAMETRIZE { move = MOVE_MUD_BOMB; ability = ABILITY_EARTH_EATER; species = SPECIES_ORTHWORM; } + PARAMETRIZE { move = MOVE_VINE_WHIP; ability = ABILITY_SAP_SIPPER; species = SPECIES_MILTANK; } GIVEN { ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); @@ -1627,6 +1598,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); ASSUME(GetMoveType(MOVE_MUD_BOMB) == TYPE_GROUND); ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species) { Ability(ability); } } WHEN { @@ -1659,5 +1631,87 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamax is reverted before switch out") } } +SINGLE_BATTLE_TEST("Dynamax: max move against semi-invulnerable target prints the correct message") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_FLY); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); + MESSAGE("Wobbuffet used Max Strike!"); + MESSAGE("The opposing Wobbuffet avoided the attack!"); + } +} + +DOUBLE_BATTLE_TEST("Dynamax stat lowering moves don't make stat-changing abilities apply to partner") +{ + enum Move move = MOVE_NONE; + u32 stat = 0; + enum Ability ability = ABILITY_NONE; + u32 abilityList[] = {ABILITY_COMPETITIVE, ABILITY_DEFIANT, ABILITY_CONTRARY, ABILITY_SIMPLE}; + for (u32 j = 0; j < 4; j++) + { + PARAMETRIZE { move = MOVE_SCRATCH; stat = STAT_SPEED; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_FURY_CUTTER; stat = STAT_SPATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_LICK; stat = STAT_DEF; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_DRAGON_CLAW; stat = STAT_ATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_CRUNCH; stat = STAT_SPDEF; ability = abilityList[j]; } + } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLUTTERBY, MOVE_EFFECT_LOWER_SP_ATK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_PHANTASM, MOVE_EFFECT_LOWER_DEFENSE_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_WYRMWIND, MOVE_EFFECT_LOWER_ATTACK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_DARKNESS, MOVE_EFFECT_LOWER_SP_DEF_SIDE)); + PLAYER(SPECIES_WOBBUFFET) { } + PLAYER(SPECIES_WOBBUFFET) { } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + } WHEN { + TURN { MOVE(playerLeft, move, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentRight->statStages[stat], DEFAULT_STAT_STAGE - 1); + } +} + +DOUBLE_BATTLE_TEST("Dynamax stat raising moves don't make stat-changing abilities apply to partner") +{ + enum Move move = MOVE_NONE; + u32 stat = 0; + enum Ability ability = ABILITY_NONE; + u32 abilityList[] = {ABILITY_CONTRARY, ABILITY_SIMPLE}; + for (u32 j = 0; j < 2; j++) + { + PARAMETRIZE { move = MOVE_PECK; stat = STAT_SPEED; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_POISON_JAB; stat = STAT_SPATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_BULLET_PUNCH; stat = STAT_DEF; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_DOUBLE_KICK; stat = STAT_ATK; ability = abilityList[j]; } + PARAMETRIZE { move = MOVE_MUD_SLAP; stat = STAT_SPDEF; ability = abilityList[j]; } + } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLUTTERBY, MOVE_EFFECT_LOWER_SP_ATK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_PHANTASM, MOVE_EFFECT_LOWER_DEFENSE_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_WYRMWIND, MOVE_EFFECT_LOWER_ATTACK_SIDE)); + ASSUME(MoveHasAdditionalEffect(MOVE_MAX_DARKNESS, MOVE_EFFECT_LOWER_SP_DEF_SIDE)); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); } + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, move, target: opponentLeft, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); + } THEN { + EXPECT_EQ(playerRight->statStages[stat], DEFAULT_STAT_STAGE + 1); + } +} + TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-lowering Max Moves, without showing a message") TO_DO_BATTLE_TEST("Dynamax: Contrary inverts stat-increasing Max Moves, without showing a message") diff --git a/test/battle/gimmick/terastal.c b/test/battle/gimmick/terastal.c index 56adddee1..0de100776 100644 --- a/test/battle/gimmick/terastal.c +++ b/test/battle/gimmick/terastal.c @@ -298,7 +298,7 @@ SINGLE_BATTLE_TEST("(TERA) Roost does not remove the user's Flying type while Te SINGLE_BATTLE_TEST("(TERA) Type-changing moves fail against a Terastallized Pokemon") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SOAK; } PARAMETRIZE { move = MOVE_FORESTS_CURSE; } PARAMETRIZE { move = MOVE_TRICK_OR_TREAT; } @@ -327,33 +327,6 @@ SINGLE_BATTLE_TEST("(TERA) Reflect Type fails if used by a Terastallized Pokemon } } -SINGLE_BATTLE_TEST("(TERA) Conversion fails if used by a Terastallized Pokemon") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_CONVERSION, gimmick: GIMMICK_TERA); } - } SCENE { - MESSAGE("Wobbuffet used Conversion!"); - MESSAGE("But it failed!"); - } -} - -SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if used by a Terastallized Pokemon") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_SCRATCH); } - TURN { MOVE(player, MOVE_CONVERSION_2, gimmick: GIMMICK_TERA); } - } SCENE { - MESSAGE("Wobbuffet used Conversion 2!"); - MESSAGE("But it failed!"); - } -} - SINGLE_BATTLE_TEST("(TERA) Reflect Type copies a Terastallized Pokemon's Tera Type") { GIVEN { @@ -420,8 +393,8 @@ SINGLE_BATTLE_TEST("(TERA) Double Shock does not remove the user's Electric type TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } - TURN { SWITCH(player, 1); MOVE(opponent, MOVE_RECOVER); } - TURN { SWITCH(player, 0); MOVE(opponent, MOVE_RECOVER); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); MOVE(opponent, MOVE_RECOVER); } TURN { MOVE(player, MOVE_DOUBLE_SHOCK); } } SCENE { @@ -506,26 +479,6 @@ SINGLE_BATTLE_TEST("(TERA) Revelation Dance uses a Stellar-type Pokemon's base t } } -#if B_UPDATED_CONVERSION_2 < GEN_5 -SINGLE_BATTLE_TEST("(TERA) Conversion2 fails if last hit by a Stellar-type move") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); } - TURN { MOVE(opponent, MOVE_CONVERSION_2); } - } SCENE { - // turn 1 - MESSAGE("Wobbuffet used Tera Blast!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TERA_BLAST, player); - // turn 2 - MESSAGE("The opposing Wobbuffet used Conversion 2!"); - MESSAGE("But it failed!"); - } -} -#endif - SINGLE_BATTLE_TEST("(TERA) Roost does not remove Flying-type ground immunity when Terastallized into the Stellar type") { GIVEN { @@ -639,17 +592,21 @@ SINGLE_BATTLE_TEST("(TERA) Terastallizing into the Stellar type boosts all moves } } -SINGLE_BATTLE_TEST("(TERA) Protean cannot change the type of a Terastallized Pokemon") +SINGLE_BATTLE_TEST("(TERA) Protean/Libero cannot change the type of a Terastallized Pokemon") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); TeraType(TYPE_GRASS); } + PLAYER(species) { Ability(ability); TeraType(TYPE_GRASS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BUBBLE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_EMBER); } } SCENE { - MESSAGE("Greninja used Bubble!"); - MESSAGE("The opposing Wobbuffet used Ember!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BUBBLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, opponent); MESSAGE("It's super effective!"); } } @@ -724,7 +681,7 @@ SINGLE_BATTLE_TEST("(TERA) Stellar type's one-time boost factors in dynamically- SINGLE_BATTLE_TEST("(TERA) Terapagos retains the Stellar type boost at all times") { s16 damage[2]; - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_MACH_PUNCH; } GIVEN { @@ -883,3 +840,101 @@ SINGLE_BATTLE_TEST("(TERA) All type indicators function correctly - Opponent") TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } } } + +SINGLE_BATTLE_TEST("(TERA) Every battler can use Terastalization - Singles") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = player; } + PARAMETRIZE { battler = opponent; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, battler); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, battler); + } +} + +DOUBLE_BATTLE_TEST("(TERA) Every battler can use Terastalization - Doubles") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + OPPONENT(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, battler); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, battler); + } +} + +MULTI_BATTLE_TEST("(TERA) Every battler can use Terastalization - Multi") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, battler); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, battler); + } +} + +TWO_VS_ONE_BATTLE_TEST("(TERA) Every battler can use Terastalization - 2v1") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, battler); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, battler); + } +} + +ONE_VS_TWO_BATTLE_TEST("(TERA) Every battler can use Terastalization - 1v2") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { TeraType(TYPE_NORMAL); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_CHARGE, battler); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_TERA_ACTIVATE, battler); + } +} diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 29538891e..d95322c6d 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -6,7 +6,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -115,10 +115,16 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_ALL_STATS_UP raises all of a battler's sta } } -SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio") +SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio by 2 stages") { - PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT); + u32 genConfig = 0, chance; + for (u32 j = GEN_1; j <= GEN_5; j++) + PARAMETRIZE { genConfig = j; chance = 4; } // 25% + for (u32 j = GEN_6; j <= GEN_9; j++) + PARAMETRIZE { genConfig = j; chance = 2; } // 50% + PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveType(MOVE_FORESIGHT) == TYPE_NORMAL); ASSUME(GetMoveZEffect(MOVE_FORESIGHT) == Z_EFFECT_BOOST_CRITS); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } @@ -307,8 +313,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Me First raises the user's speed by two stages an SINGLE_BATTLE_TEST("(Z-MOVE) Z-Nature Power transforms into different Z-Moves based on the current terrain") { - u32 terrainMove = MOVE_NONE; - u32 zMove = MOVE_NONE; + enum Move terrainMove = MOVE_NONE; + enum Move zMove = MOVE_NONE; PARAMETRIZE { terrainMove = MOVE_ELECTRIC_TERRAIN; zMove = gTypesInfo[TYPE_ELECTRIC].zMove; } PARAMETRIZE { terrainMove = MOVE_PSYCHIC_TERRAIN; zMove = gTypesInfo[TYPE_PSYCHIC].zMove; } PARAMETRIZE { terrainMove = MOVE_GRASSY_TERRAIN; zMove = gTypesInfo[TYPE_GRASS].zMove; } @@ -348,8 +354,8 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Hidden Power always transforms into Breakneck Bli SINGLE_BATTLE_TEST("(Z-MOVE) Z-Weather Ball transforms into different Z-Moves based on current weather") { - u32 weatherMove = MOVE_NONE; - u32 zMove = MOVE_NONE; + enum Move weatherMove = MOVE_NONE; + enum Move zMove = MOVE_NONE; PARAMETRIZE { weatherMove = MOVE_RAIN_DANCE; zMove = gTypesInfo[TYPE_WATER].zMove; } PARAMETRIZE { weatherMove = MOVE_SUNNY_DAY; zMove = gTypesInfo[TYPE_FIRE].zMove; } PARAMETRIZE { weatherMove = MOVE_SANDSTORM; zMove = gTypesInfo[TYPE_ROCK].zMove; } @@ -527,7 +533,7 @@ SINGLE_BATTLE_TEST("(Z-MOVE) 10,000,000 Volt Thunderbolt has an increased critic PARAMETRIZE { genConfig = j; chance = 2; } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_10_000_000_VOLT_THUNDERBOLT) == 2); ASSUME(GetSpeciesBaseSpeed(SPECIES_PIKACHU_PARTNER) == 90); PLAYER(SPECIES_PIKACHU_PARTNER) { Item(ITEM_PIKASHUNIUM_Z); } @@ -681,6 +687,99 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Revelation Dance always transforms into Breakneck } } +SINGLE_BATTLE_TEST("(Z-MOVE) Every battler can use Z-Moves - Singles") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = player; } + PARAMETRIZE { battler = opponent; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, battler); + } +} + +DOUBLE_BATTLE_TEST("(Z-MOVE) Every battler can use Z-Moves - Doubles") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, battler); + } +} + +MULTI_BATTLE_TEST("(Z-MOVE) Every battler can use Z-Moves - Multi") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, battler); + } +} + +TWO_VS_ONE_BATTLE_TEST("(Z-MOVE) Every battler can use Z-Moves - 2v1") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, battler); + } +} + +ONE_VS_TWO_BATTLE_TEST("(Z-MOVE) Every battler can use Z-Moves - 1v2") +{ + struct BattlePokemon *battler = NULL; + PARAMETRIZE { battler = playerLeft; } + PARAMETRIZE { battler = playerRight; } + PARAMETRIZE { battler = opponentLeft; } + PARAMETRIZE { battler = opponentRight; } + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { MOVE(battler, MOVE_CELEBRATE, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ZMOVE_ACTIVATE, battler); + } +} + TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from status Z-Moves are not inverted by Contrary") TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from Extreme Evoboost are inverted by Contrary") TO_DO_BATTLE_TEST("(Z-MOVE) Stat changes from Clangorous Soulblaze are inverted by Contrary") diff --git a/test/battle/hazards.c b/test/battle/hazards.c index ea0aef70e..aa67c983f 100644 --- a/test/battle/hazards.c +++ b/test/battle/hazards.c @@ -64,8 +64,6 @@ SINGLE_BATTLE_TEST("Hazards are applied correctly after a battler faints") SINGLE_BATTLE_TEST("Toxic Spikes can be removed after fainting to other hazards") { - KNOWN_FAILING; // tryfaintmon changes something that doesn't allow other switch-in effects on the battler - GIVEN { PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_GRIMER) { HP(1); } @@ -134,13 +132,13 @@ DOUBLE_BATTLE_TEST("Hazards can trigger Emergency Exit and hazards still activat { GIVEN { ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - PLAYER(SPECIES_GOLISOPOD) { HP(105); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } - PLAYER(SPECIES_WYNAUT); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); HP(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); HP(1); } + PLAYER(SPECIES_GOLISOPOD) { Speed(10); HP(105); MaxHP(200); Ability(ABILITY_EMERGENCY_EXIT); } + PLAYER(SPECIES_WYNAUT) { Speed(5); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WYNAUT) { Speed(5); } } WHEN { TURN { MOVE(opponentLeft, MOVE_STEALTH_ROCK); MOVE(opponentRight, MOVE_TOXIC_SPIKES); } TURN { MOVE(opponentLeft, MOVE_STICKY_WEB); MOVE(opponentRight, MOVE_SPIKES); } diff --git a/test/battle/hold_effect/ability_shield.c b/test/battle/hold_effect/ability_shield.c index 9f98ea98e..40ea3328d 100644 --- a/test/battle/hold_effect/ability_shield.c +++ b/test/battle/hold_effect/ability_shield.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -17,7 +17,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") PLAYER(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); Item(item); } OPPONENT(SPECIES_KOFFING) { Ability(ABILITY_NEUTRALIZING_GAS); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); MESSAGE("Neutralizing gas filled the area!"); @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Neutralizing Gas") SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker (no message)") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -65,7 +65,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mold Breaker (no message)") SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might (no message)") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Mycelium Might (no message)" SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike (no message)") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -122,9 +122,62 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Sunsteel Strike (no message) } } -SINGLE_BATTLE_TEST("Ability Shield protects the user's ability from being suppressed by Gastro Acid") +SINGLE_BATTLE_TEST("Ability Shield activates a previously suppressed ability when obtained") { - u32 item; + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_POTION); } + OPPONENT(SPECIES_KOFFING) { Ability(ABILITY_NEUTRALIZING_GAS); Item(ITEM_ABILITY_SHIELD); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); MOVE(opponent, MOVE_TRICK); } + TURN { MOVE(opponent, MOVE_TRICK); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + } +} + +SINGLE_BATTLE_TEST("Ability Shield doesn't reactivate an ability when receiving if user already had an Ability Shield") +{ + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); + PLAYER(SPECIES_GYARADOS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ABILITY_SHIELD); } + OPPONENT(SPECIES_KOFFING) { Ability(ABILITY_NEUTRALIZING_GAS); Item(ITEM_ABILITY_SHIELD); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + MESSAGE("Neutralizing gas filled the area!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Gyarados's Ability is protected by the effects of its Ability Shield!"); + ABILITY_POPUP(player, ABILITY_INTIMIDATE); + } + } +} + +SINGLE_BATTLE_TEST("Ability Shield protects the user from having its ability suppressed by Gastro Acid") +{ + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -146,9 +199,27 @@ SINGLE_BATTLE_TEST("Ability Shield protects the user's ability from being suppre } } +SINGLE_BATTLE_TEST("Ability Shield doesn't protect the user's ability from being suppressed by Gastro Acid") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_GASTRO_ACID) == EFFECT_GASTRO_ACID); + ASSUME(GetMoveEffect(MOVE_TRICK) == EFFECT_TRICK); + PLAYER(SPECIES_BLAZIKEN) { Ability(ABILITY_SPEED_BOOST); Item(ITEM_POTION); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ABILITY_SHIELD); } + } WHEN { + TURN { MOVE(opponent, MOVE_GASTRO_ACID); MOVE(player, MOVE_TRICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GASTRO_ACID, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + NOT ABILITY_POPUP(player, ABILITY_SPEED_BOOST); + } THEN { + EXPECT_EQ(player->item, ITEM_ABILITY_SHIELD); + } +} + SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } @@ -176,7 +247,7 @@ SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap") SINGLE_BATTLE_TEST("Ability Shield protects against Skill Swap even if user has Klutz") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_ABILITY_SHIELD; } PARAMETRIZE { item = ITEM_NONE; } diff --git a/test/battle/hold_effect/absorb_bulb.c b/test/battle/hold_effect/absorb_bulb.c new file mode 100644 index 000000000..63daaae02 --- /dev/null +++ b/test/battle/hold_effect/absorb_bulb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Absorb Bulb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/adamant_orb.c b/test/battle/hold_effect/adamant_orb.c new file mode 100644 index 000000000..3120e5433 --- /dev/null +++ b/test/battle/hold_effect/adamant_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Adamant Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/adrenaline_orb.c b/test/battle/hold_effect/adrenaline_orb.c new file mode 100644 index 000000000..595539203 --- /dev/null +++ b/test/battle/hold_effect/adrenaline_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Adrenaline Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/air_balloon.c b/test/battle/hold_effect/air_balloon.c index ad0fb457a..6caa4fecf 100644 --- a/test/battle/hold_effect/air_balloon.c +++ b/test/battle/hold_effect/air_balloon.c @@ -12,7 +12,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Air Balloon prevents the holder from taking damage from ground type moves") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_EARTHQUAKE); } @@ -24,11 +24,25 @@ SINGLE_BATTLE_TEST("Air Balloon prevents the holder from taking damage from grou } } -SINGLE_BATTLE_TEST("Air Balloon pops when the holder is hit by a move that is not ground type") +SINGLE_BATTLE_TEST("Air Balloon only displays entry message when user switches in") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("Wobbuffet floats in the air with its Air Balloon!"); + NOT MESSAGE("Wobbuffet floats in the air with its Air Balloon!"); + } +} + +SINGLE_BATTLE_TEST("Air Balloon pops when the holder is hit by a move that is not ground type") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { @@ -41,7 +55,7 @@ SINGLE_BATTLE_TEST("Air Balloon pops when the holder is hit by a move that is no SINGLE_BATTLE_TEST("Air Balloon no longer prevents the holder from taking damage from ground type moves once it has been popped") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } @@ -59,7 +73,7 @@ SINGLE_BATTLE_TEST("Air Balloon no longer prevents the holder from taking damage SINGLE_BATTLE_TEST("Air Balloon can not be restored with Recycle after it has been popped") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { @@ -78,7 +92,7 @@ SINGLE_BATTLE_TEST("Air Balloon can not be restored with Recycle after it has be SINGLE_BATTLE_TEST("Air Balloon prevents the user from being healed by Grassy Terrain") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); MaxHP(100); HP(1); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); MaxHP(100); HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } @@ -91,8 +105,8 @@ SINGLE_BATTLE_TEST("Air Balloon prevents the user from being healed by Grassy Te SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen with Magician") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; - OPPONENT(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } + OPPONENT(SPECIES_DELPHOX) { Ability(ABILITY_MAGICIAN); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } } SCENE { @@ -106,7 +120,7 @@ SINGLE_BATTLE_TEST("Air Balloon pops before it can be stolen by Thief") { GIVEN { ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_AIR_BALLOON); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_THIEF); } diff --git a/test/battle/hold_effect/assault_vest.c b/test/battle/hold_effect/assault_vest.c new file mode 100644 index 000000000..815a9fddc --- /dev/null +++ b/test/battle/hold_effect/assault_vest.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Assault Vest (Hold Effect) test titles") diff --git a/test/battle/hold_effect/attack_up.c b/test/battle/hold_effect/attack_up.c index e9efef9ad..21ceae808 100644 --- a/test/battle/hold_effect/attack_up.c +++ b/test/battle/hold_effect/attack_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Liechi Berry raises the holder's Attack by one stage when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/berserk_gene.c b/test/battle/hold_effect/berserk_gene.c index 5331f5784..c024ff7a4 100644 --- a/test/battle/hold_effect/berserk_gene.c +++ b/test/battle/hold_effect/berserk_gene.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a single battle", s16 damage) { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a single DOUBLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a double battle", s16 damage) { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { @@ -60,7 +60,7 @@ DOUBLE_BATTLE_TEST("Berserk Gene sharply raises attack at the start of a double SINGLE_BATTLE_TEST("Berserk Gene activates on switch in", s16 damage) { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { @@ -87,7 +87,7 @@ SINGLE_BATTLE_TEST("Berserk Gene activates on switch in", s16 damage) SINGLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but still raises attack sharply in a single battle", s16 damage) { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BERSERK_GENE; } GIVEN { @@ -115,7 +115,7 @@ SINGLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but s DOUBLE_BATTLE_TEST("Berserk Gene does not confuse a Pokemon with Own Tempo but still raises attack sharply in a double battle", s16 damage) { - u16 item; + enum Item item; bool8 positionLeft = FALSE; PARAMETRIZE { item = ITEM_NONE; } @@ -252,3 +252,54 @@ SINGLE_BATTLE_TEST("Berserk Gene does not cause an infinite loop") MESSAGE("Using Berserk Gene, the Attack of the opposing Wobbuffet sharply rose!"); } } + +SINGLE_BATTLE_TEST("Berserker Gene confusion can be healed with bag items") +{ + enum Item item; + PARAMETRIZE { item = ITEM_FULL_HEAL; } + PARAMETRIZE { item = ITEM_HEAL_POWDER; } + PARAMETRIZE { item = ITEM_PEWTER_CRUNCHIES; } + PARAMETRIZE { item = ITEM_LAVA_COOKIE; } + PARAMETRIZE { item = ITEM_RAGE_CANDY_BAR; } + PARAMETRIZE { item = ITEM_OLD_GATEAU; } + PARAMETRIZE { item = ITEM_CASTELIACONE; } + PARAMETRIZE { item = ITEM_LUMIOSE_GALETTE; } + PARAMETRIZE { item = ITEM_SHALOUR_SABLE; } + PARAMETRIZE { item = ITEM_BIG_MALASADA; } + PARAMETRIZE { item = ITEM_JUBILIFE_MUFFIN; } + GIVEN { + ASSUME(gItemsInfo[item].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BERSERK_GENE); } + OPPONENT(SPECIES_GENGAR); + } WHEN { + TURN { USE_ITEM(player, item, partyIndex: 0); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + MESSAGE("Wobbuffet had its status healed!"); + } THEN { + EXPECT(player->volatiles.infiniteConfusion == 0); + } +} + +SINGLE_BATTLE_TEST("Berserker Gene confusion can be healed with used held items") +{ + enum Item item; + PARAMETRIZE { item = ITEM_PERSIM_BERRY; } + PARAMETRIZE { item = ITEM_LUM_BERRY; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_PERSIM_BERRY].holdEffect == HOLD_EFFECT_CURE_CONFUSION); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_BERSERK_GENE); } + OPPONENT(SPECIES_WOBBUFFET) { Item(item); } + } WHEN { + TURN { MOVE(player, MOVE_COVET, WITH_RNG(RNG_CONFUSION, FALSE)); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + } THEN { + EXPECT(player->volatiles.infiniteConfusion == 0); + } +} diff --git a/test/battle/hold_effect/big_root.c b/test/battle/hold_effect/big_root.c index 3d2256ea3..ba63185b4 100644 --- a/test/battle/hold_effect/big_root.c +++ b/test/battle/hold_effect/big_root.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Big Root increases healing from absorbing moves", s16 damage, s16 heal) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BIG_ROOT; } @@ -30,8 +30,8 @@ SINGLE_BATTLE_TEST("Big Root increases healing from absorbing moves", s16 damage SINGLE_BATTLE_TEST("Big Root increases the damage restored from Leech Seed, Ingrain and Aqua Ring", s16 heal, s16 damage) { - u32 item; - u32 move; + enum Item item; + enum Move move; PARAMETRIZE { item = ITEM_NONE; move = MOVE_LEECH_SEED; } PARAMETRIZE { item = ITEM_BIG_ROOT; move = MOVE_LEECH_SEED; } @@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Big Root increases the damage restored from Leech Seed, Ingr SINGLE_BATTLE_TEST("Big Root increases damage from absorbing Liquid Ooze", s16 damage) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BIG_ROOT; } diff --git a/test/battle/hold_effect/binding_band.c b/test/battle/hold_effect/binding_band.c new file mode 100644 index 000000000..315ac7a7a --- /dev/null +++ b/test/battle/hold_effect/binding_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Binding Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/black_sludge.c b/test/battle/hold_effect/black_sludge.c new file mode 100644 index 000000000..9d7d845c5 --- /dev/null +++ b/test/battle/hold_effect/black_sludge.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Black Sludge (Hold Effect) test titles") diff --git a/test/battle/hold_effect/booster_energy.c b/test/battle/hold_effect/booster_energy.c index 2cfd3a13c..6803ffc4c 100644 --- a/test/battle/hold_effect/booster_energy.c +++ b/test/battle/hold_effect/booster_energy.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Quark Drive after Electric Terr { GIVEN { PLAYER(SPECIES_IRON_MOTH) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } - OPPONENT(SPECIES_TAPU_KOKO) { Speed(100); Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_TAPU_KOKO) { Speed(100); Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { TURN {} TURN {} @@ -38,9 +38,9 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Quark Drive after Electric Terr SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunlight ends") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ABILITY_WEATHER, GEN_6); + WITH_CONFIG(CONFIG_ABILITY_WEATHER, GEN_6); PLAYER(SPECIES_RAGING_BOLT) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } - OPPONENT(SPECIES_TORKOAL) { Speed(100); Ability(ABILITY_DROUGHT); }; + OPPONENT(SPECIES_TORKOAL) { Speed(100); Ability(ABILITY_DROUGHT); } } WHEN { TURN {} TURN {} @@ -65,6 +65,29 @@ SINGLE_BATTLE_TEST("Booster Energy will activate Protosynthesis after harsh sunl } } +SINGLE_BATTLE_TEST("Booster Energy's Protosynthesis boost is preserved when weather changes") +{ + GIVEN { + PLAYER(SPECIES_RAGING_BOLT) { Attack(110); Defense(100); Speed(100); SpAttack(100); SpDefense(100); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_SUNNY_DAY, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUNNY_DAY); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Raging Bolt used its Booster Energy to activate Protosynthesis!"); + MESSAGE("Raging Bolt's Attack was heightened!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent); + MESSAGE("The sunlight faded."); + } THEN { + EXPECT(gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.paradoxBoostedStat == STAT_ATK); + } +} + SINGLE_BATTLE_TEST("Booster Energy activates Protosynthesis and increases highest stat") { u32 attack, defense, speed, spAttack, spDefense; @@ -77,9 +100,9 @@ SINGLE_BATTLE_TEST("Booster Energy activates Protosynthesis and increases highes GIVEN { PLAYER(SPECIES_RAGING_BOLT) { Attack(attack); Defense(defense); Speed(speed); SpAttack(spAttack); SpDefense(spDefense); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); @@ -111,9 +134,9 @@ SINGLE_BATTLE_TEST("Booster Energy activates Quark Drive and increases highest s GIVEN { PLAYER(SPECIES_IRON_MOTH) { Attack(attack); Defense(defense); Speed(speed); SpAttack(spAttack); SpDefense(spDefense); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); if (attack == 110) @@ -131,11 +154,34 @@ SINGLE_BATTLE_TEST("Booster Energy activates Quark Drive and increases highest s } } +SINGLE_BATTLE_TEST("Booster Energy's Quark Drive boost is preserved when terrain changes") +{ + GIVEN { + PLAYER(SPECIES_IRON_MOTH) { Attack(110); Defense(100); Speed(100); SpAttack(100); SpDefense(100); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); Moves(MOVE_GRASSY_TERRAIN, MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(opponent, MOVE_GRASSY_TERRAIN); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Iron Moth used its Booster Energy to activate Quark Drive!"); + MESSAGE("Iron Moth's Attack was heightened!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRASSY_TERRAIN, opponent); + MESSAGE("The grass disappeared from the battlefield."); + } THEN { + EXPECT(gBattleMons[B_POSITION_PLAYER_LEFT].volatiles.paradoxBoostedStat == STAT_ATK); + } +} + SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the highest stat", s16 damage) { u32 species; enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_BOOSTER_ENERGY; } @@ -146,7 +192,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special attack by 30% if it is the GIVEN { ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); PLAYER(species) { Attack(100); Defense(100); Speed(100); SpAttack(110); SpDefense(100); Ability(ability); Item(item); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(player, MOVE_ROUND); } } SCENE { @@ -161,7 +207,7 @@ SINGLE_BATTLE_TEST("Booster Energy increases special defense by 30% if it is the { u32 species; enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_RAGING_BOLT; ability = ABILITY_PROTOSYNTHESIS; item = ITEM_BOOSTER_ENERGY; } @@ -172,14 +218,15 @@ SINGLE_BATTLE_TEST("Booster Energy increases special defense by 30% if it is the GIVEN { ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); PLAYER(species) { Attack(100); Defense(100); Speed(100); SpAttack(100); SpDefense(110); Ability(ability); Item(item); } - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_ROUND); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponent); HP_BAR(player, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.7), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.77), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(0.77), results[3].damage); } } @@ -242,9 +289,9 @@ DOUBLE_BATTLE_TEST("Booster Energy activates on any terrain") PLAYER(SPECIES_IRON_MOTH) { Speed(110); Ability(ABILITY_QUARK_DRIVE); Item(ITEM_BOOSTER_ENERGY); } PLAYER(SPECIES_WOBBUFFET) { Speed(80); } OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } - OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); ABILITY_POPUP(playerLeft, ABILITY_QUARK_DRIVE); @@ -259,7 +306,7 @@ DOUBLE_BATTLE_TEST("Booster Energy activates on air locked sun") PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_RAGING_BOLT) { Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } OPPONENT(SPECIES_PSYDUCK) { Ability(ABILITY_CLOUD_NINE); } - OPPONENT(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); }; + OPPONENT(SPECIES_TORKOAL) { Ability(ABILITY_DROUGHT); } } WHEN { TURN { SWITCH(playerLeft, 2); } } SCENE { @@ -275,9 +322,9 @@ DOUBLE_BATTLE_TEST("Booster Energy will not activate on terrain if user has Prot PLAYER(SPECIES_RAGING_BOLT) { Speed(110); Ability(ABILITY_PROTOSYNTHESIS); Item(ITEM_BOOSTER_ENERGY); } PLAYER(SPECIES_WOBBUFFET) { Speed(80); } OPPONENT(SPECIES_TAPU_BULU) { Speed(100); Ability(ABILITY_GRASSY_SURGE); } - OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_TAPU_KOKO) { Speed(10); Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_GRASSY_SURGE); NOT ABILITY_POPUP(playerLeft, ABILITY_PROTOSYNTHESIS); diff --git a/test/battle/hold_effect/can_always_run.c b/test/battle/hold_effect/can_always_run.c new file mode 100644 index 000000000..cb5fa5cfb --- /dev/null +++ b/test/battle/hold_effect/can_always_run.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Smoke Ball (Hold Effect) test titles") diff --git a/test/battle/hold_effect/cell_battery.c b/test/battle/hold_effect/cell_battery.c new file mode 100644 index 000000000..ed17597a1 --- /dev/null +++ b/test/battle/hold_effect/cell_battery.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Cell Battery (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_band.c b/test/battle/hold_effect/choice_band.c new file mode 100644 index 000000000..f082befaf --- /dev/null +++ b/test/battle/hold_effect/choice_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_scarf.c b/test/battle/hold_effect/choice_scarf.c new file mode 100644 index 000000000..7eff5a8e0 --- /dev/null +++ b/test/battle/hold_effect/choice_scarf.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Scarf (Hold Effect) test titles") diff --git a/test/battle/hold_effect/choice_specs.c b/test/battle/hold_effect/choice_specs.c new file mode 100644 index 000000000..7eff5a8e0 --- /dev/null +++ b/test/battle/hold_effect/choice_specs.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Choice Scarf (Hold Effect) test titles") diff --git a/test/battle/hold_effect/clear_amulet.c b/test/battle/hold_effect/clear_amulet.c index 5c69655dc..6cb17ccf1 100644 --- a/test/battle/hold_effect/clear_amulet.c +++ b/test/battle/hold_effect/clear_amulet.c @@ -12,9 +12,9 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents Intimidate") s16 turnTwoHit; GIVEN { - PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); }; - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }; + PLAYER(SPECIES_EKANS) { Ability(ABILITY_SHED_SKIN); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SCRATCH); } @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents Intimidate") SINGLE_BATTLE_TEST("Clear Amulet prevents stat reducing effects") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GROWL; } PARAMETRIZE { move = MOVE_LEER; } @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents stat reducing effects") ASSUME(GetMoveEffect(MOVE_SWEET_SCENT) == (B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN)); ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); } } WHEN { TURN { MOVE(player, move); } } SCENE { @@ -61,7 +61,7 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents stat reducing effects") SINGLE_BATTLE_TEST("Clear Amulet prevents secondary effects that reduce stats") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_AURORA_BEAM; } PARAMETRIZE { move = MOVE_ROCK_SMASH; } @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents secondary effects that reduce stats") ASSUME(MoveHasAdditionalEffect(MOVE_PSYCHIC, MOVE_EFFECT_SP_DEF_MINUS_1) == TRUE); ASSUME(MoveHasAdditionalEffect(MOVE_MUD_SLAP, MOVE_EFFECT_ACC_MINUS_1) == TRUE); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CLEAR_AMULET); } } WHEN { TURN { MOVE(player, move); } } SCENE { @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Clear Amulet prevents secondary effects that reduce stats") SINGLE_BATTLE_TEST("Clear Amulet protects from Protect's secondary effects") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } diff --git a/test/battle/hold_effect/confuse_bitter.c b/test/battle/hold_effect/confuse_bitter.c new file mode 100644 index 000000000..f2faae1ec --- /dev/null +++ b/test/battle/hold_effect/confuse_bitter.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Aguav Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_dry.c b/test/battle/hold_effect/confuse_dry.c new file mode 100644 index 000000000..bbd462f6b --- /dev/null +++ b/test/battle/hold_effect/confuse_dry.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wiki Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_sour.c b/test/battle/hold_effect/confuse_sour.c new file mode 100644 index 000000000..0d87fab14 --- /dev/null +++ b/test/battle/hold_effect/confuse_sour.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Iapapa Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_spicy.c b/test/battle/hold_effect/confuse_spicy.c new file mode 100644 index 000000000..527002347 --- /dev/null +++ b/test/battle/hold_effect/confuse_spicy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Figy Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/confuse_sweet.c b/test/battle/hold_effect/confuse_sweet.c new file mode 100644 index 000000000..46907373c --- /dev/null +++ b/test/battle/hold_effect/confuse_sweet.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mago Berry (Hold Effect) test titles") diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index 64f75703c..ac81409b8 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Covert Cloak blocks secondary effects") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_NUZZLE; } PARAMETRIZE { move = MOVE_INFERNO; } PARAMETRIZE { move = MOVE_MORTAL_SPIN; } @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Covert Cloak blocks secondary effects") SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_INFESTATION; } PARAMETRIZE { move = MOVE_THOUSAND_ARROWS; } PARAMETRIZE { move = MOVE_JAW_LOCK; } @@ -79,6 +79,8 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") case MOVE_PAY_DAY: MESSAGE("Coins were scattered everywhere!"); break; + default: + break; } } THEN { // Can't find good way to test trapping if (move == MOVE_JAW_LOCK) { @@ -90,7 +92,7 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary or secondary") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_POWER_UP_PUNCH; } PARAMETRIZE { move = MOVE_FLAME_CHARGE; } PARAMETRIZE { move = MOVE_LEAF_STORM; } @@ -120,13 +122,15 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block self-targeting effects, primary case MOVE_METEOR_ASSAULT: // second turn MESSAGE("Wobbuffet must recharge!"); break; + default: + break; } } } DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending on number of targets hit") { - u32 moveToUse; + enum Move moveToUse; PARAMETRIZE { moveToUse = MOVE_FINAL_GAMBIT; } PARAMETRIZE { moveToUse = MOVE_SCRATCH; } GIVEN { @@ -152,7 +156,7 @@ DOUBLE_BATTLE_TEST("Covert Cloak does or does not block Sparkling Aria depending DOUBLE_BATTLE_TEST("Covert Cloak does block Sparkling Aria when only one mon is hit") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_PROTECT; } PARAMETRIZE { move = MOVE_FLY; } diff --git a/test/battle/hold_effect/critical_hit_up.c b/test/battle/hold_effect/critical_up.c similarity index 97% rename from test/battle/hold_effect/critical_hit_up.c rename to test/battle/hold_effect/critical_up.c index 770505115..90a04e15d 100644 --- a/test/battle/hold_effect/critical_hit_up.c +++ b/test/battle/hold_effect/critical_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by two stages when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } @@ -57,7 +57,7 @@ SINGLE_BATTLE_TEST("Lansat Berry raises the holder's critical-hit-ratio by 2 sta PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); PLAYER(SPECIES_WOBBUFFET) { MaxHP(160); HP(80); Item(ITEM_LANSAT_BERRY); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/cure_brn.c b/test/battle/hold_effect/cure_brn.c new file mode 100644 index 000000000..5c5971a75 --- /dev/null +++ b/test/battle/hold_effect/cure_brn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Rawst Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_confusion.c b/test/battle/hold_effect/cure_confusion.c new file mode 100644 index 000000000..297d01113 --- /dev/null +++ b/test/battle/hold_effect/cure_confusion.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Persim Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_frz.c b/test/battle/hold_effect/cure_frz.c new file mode 100644 index 000000000..b70b0dd92 --- /dev/null +++ b/test/battle/hold_effect/cure_frz.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Aspear Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_par.c b/test/battle/hold_effect/cure_par.c new file mode 100644 index 000000000..07f771f7c --- /dev/null +++ b/test/battle/hold_effect/cure_par.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Cheri Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_psn.c b/test/battle/hold_effect/cure_psn.c new file mode 100644 index 000000000..3be395ac8 --- /dev/null +++ b/test/battle/hold_effect/cure_psn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Pecha Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_slp.c b/test/battle/hold_effect/cure_slp.c new file mode 100644 index 000000000..aeb464c78 --- /dev/null +++ b/test/battle/hold_effect/cure_slp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Chesto Berry are handled in test/battle/hold_effect/cure_status.c diff --git a/test/battle/hold_effect/cure_status.c b/test/battle/hold_effect/cure_status.c index dabf44e08..f65c73d55 100644 --- a/test/battle/hold_effect/cure_status.c +++ b/test/battle/hold_effect/cure_status.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Pecha and Lum Berries cure poison") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_PECHA_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Pecha and Lum Berries cure poison") SINGLE_BATTLE_TEST("Pecha and Lum Berries cure bad poison") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_PECHA_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Pecha and Lum Berries cure bad poison") SINGLE_BATTLE_TEST("Rawst and Lum Berries cure burn") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_RAWST_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Rawst and Lum Berries cure burn") SINGLE_BATTLE_TEST("Aspear and Lum Berries cure freeze or frostbite") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_ASPEAR_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Aspear and Lum Berries cure freeze or frostbite") SINGLE_BATTLE_TEST("Chesto and Lum Berries cure sleep") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_CHESTO_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -116,11 +116,49 @@ SINGLE_BATTLE_TEST("Chesto and Lum Berries cure sleep") } } -TO_DO_BATTLE_TEST("Chesto and Lum Berries don't trigger if the holder has Comatose") +SINGLE_BATTLE_TEST("Chesto Berry cures sleep when Yawn takes effect") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHESTO_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_YAWN); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + STATUS_ICON(player, sleep: TRUE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + STATUS_ICON(player, sleep: FALSE); + } +} + +SINGLE_BATTLE_TEST("Chesto and Lum Berries don't trigger if the holder has Comatose") +{ + u16 item; + + PARAMETRIZE { item = ITEM_CHESTO_BERRY; } + PARAMETRIZE { item = ITEM_LUM_BERRY; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); + ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); Item(item); } + } WHEN { + TURN { } + } SCENE { + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } THEN { + EXPECT_EQ(opponent->item, item); + } +} SINGLE_BATTLE_TEST("Cheri and Lum Berries cure paralysis") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_CHERI_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -142,7 +180,7 @@ SINGLE_BATTLE_TEST("Cheri and Lum Berries cure paralysis") SINGLE_BATTLE_TEST("Perism and Lum Berries cure confusion") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_PERSIM_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -163,7 +201,7 @@ SINGLE_BATTLE_TEST("Perism and Lum Berries cure confusion") SINGLE_BATTLE_TEST("Berry hold effect cures status if a Pokémon enters a battle") { u16 status; - u16 item; + enum Item item; PARAMETRIZE { status = STATUS1_BURN; item = ITEM_RAWST_BERRY; } PARAMETRIZE { status = STATUS1_FREEZE; item = ITEM_ASPEAR_BERRY; } @@ -181,7 +219,7 @@ SINGLE_BATTLE_TEST("Berry hold effect cures status if a Pokémon enters a battle PLAYER(SPECIES_WOBBUFFET) { Status1(status); Item(ITEM_LUM_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Status1(status); Item(item); } } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); @@ -190,7 +228,7 @@ SINGLE_BATTLE_TEST("Berry hold effect cures status if a Pokémon enters a battle SINGLE_BATTLE_TEST("Opponent Pokemon can be further poisoned with Toxic spikes after a status healing hold effect was previously used") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_PECHA_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -230,7 +268,7 @@ SINGLE_BATTLE_TEST("Opponent Pokemon can be further poisoned with Toxic spikes a // Basically same as above, but with the sides reversed. SINGLE_BATTLE_TEST("Player Pokemon can be further poisoned with Toxic spikes after a status healing hold effect was previously used") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_PECHA_BERRY; } PARAMETRIZE { item = ITEM_LUM_BERRY; } @@ -239,7 +277,7 @@ SINGLE_BATTLE_TEST("Player Pokemon can be further poisoned with Toxic spikes aft ASSUME(gItemsInfo[ITEM_PECHA_BERRY].holdEffect == HOLD_EFFECT_CURE_PSN); ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET) {Item(item); } + PLAYER(SPECIES_WOBBUFFET) { Item(item); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -293,3 +331,29 @@ DOUBLE_BATTLE_TEST("Lum Berry correctly cures all battlers if multiple fainted t EXPECT_EQ(opponentLeft->status1, STATUS1_NONE); } } + +SINGLE_BATTLE_TEST("Lum Berry properly cures a battler affected by a non-volatiles status and confusion") +{ + u32 status; + PARAMETRIZE { status = STATUS1_BURN; } + PARAMETRIZE { status = STATUS1_FREEZE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; } + PARAMETRIZE { status = STATUS1_POISON; } + PARAMETRIZE { status = STATUS1_TOXIC_POISON; } + PARAMETRIZE { status = STATUS1_SLEEP; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_CONFUSE_RAY) == EFFECT_CONFUSE); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); Speed(2); } + } WHEN { + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_CELEBRATE, WITH_RNG(RNG_FROZEN, 0)); } + TURN { MOVE(opponent, MOVE_SWITCHEROO); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + MESSAGE("Wobbuffet's Lum Berry normalized its status!"); + } THEN { + EXPECT_EQ(player->status1, STATUS1_NONE); + EXPECT(player->volatiles.confusionTurns == 0); + } +} diff --git a/test/battle/hold_effect/damp_rock.c b/test/battle/hold_effect/damp_rock.c new file mode 100644 index 000000000..a41ea6719 --- /dev/null +++ b/test/battle/hold_effect/damp_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Damp Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/deep_sea_scale.c b/test/battle/hold_effect/deep_sea_scale.c new file mode 100644 index 000000000..991a7db5c --- /dev/null +++ b/test/battle/hold_effect/deep_sea_scale.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Deep Sea Scale (Hold Effect) test titles") diff --git a/test/battle/hold_effect/deep_sea_tooth.c b/test/battle/hold_effect/deep_sea_tooth.c new file mode 100644 index 000000000..54003e718 --- /dev/null +++ b/test/battle/hold_effect/deep_sea_tooth.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Deep Sea Tooth (Hold Effect) test titles") diff --git a/test/battle/hold_effect/defense_up.c b/test/battle/hold_effect/defense_up.c index a29f75b1e..94df8dc78 100644 --- a/test/battle/hold_effect/defense_up.c +++ b/test/battle/hold_effect/defense_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Ganlon Berry raises the holder's Defense by one stage when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/destiny_knot.c b/test/battle/hold_effect/destiny_knot.c index b8097c601..566ded573 100644 --- a/test/battle/hold_effect/destiny_knot.c +++ b/test/battle/hold_effect/destiny_knot.c @@ -9,10 +9,10 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is targeted") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } } WHEN { - TURN { MOVE(player, MOVE_ATTRACT); } + TURN { MOVE(player, MOVE_ATTRACT); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); MESSAGE("Wobbuffet fell in love because of the Destiny Knot!"); @@ -24,10 +24,10 @@ SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is targeted") SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is attacking") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); Item(ITEM_DESTINY_KNOT);} - OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM);} + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); Item(ITEM_DESTINY_KNOT); } + OPPONENT(SPECIES_CLEFAIRY) { Gender(MON_FEMALE); Ability(ABILITY_CUTE_CHARM); } } WHEN { - TURN { MOVE(player, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); } } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); MESSAGE("The opposing Clefairy fell in love because of the Destiny Knot!"); @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Destiny Knot infatuates back when holder is attacking") SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is already infatuated") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } + PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } } WHEN { TURN { MOVE(opponent, MOVE_ATTRACT); MOVE(player, MOVE_ATTRACT, WITH_RNG(RNG_INFATUATION, FALSE)); } @@ -64,3 +64,17 @@ SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is oblivious") EXPECT(!player->volatiles.infatuation); } } + +SINGLE_BATTLE_TEST("Destiny Knot procs but fails if the target is already infatuated (cute charm)") +{ + GIVEN { + PLAYER(SPECIES_CLEFAIRY) { Gender(MON_MALE); Ability(ABILITY_CUTE_CHARM); } + OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); Item(ITEM_DESTINY_KNOT); } + } WHEN { + TURN { MOVE(opponent, MOVE_ATTRACT); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/hold_effect/double_prize.c b/test/battle/hold_effect/double_prize.c new file mode 100644 index 000000000..929a9aced --- /dev/null +++ b/test/battle/hold_effect/double_prize.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Amulet Coin (Hold Effect) test titles") diff --git a/test/battle/hold_effect/drive.c b/test/battle/hold_effect/drive.c new file mode 100644 index 000000000..e09ec3ba0 --- /dev/null +++ b/test/battle/hold_effect/drive.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Douse, Shock, Burn and Chill Drive (Hold Effect) test titles") diff --git a/test/battle/hold_effect/eject_button.c b/test/battle/hold_effect/eject_button.c index 681858605..8dc9e80c1 100644 --- a/test/battle/hold_effect/eject_button.c +++ b/test/battle/hold_effect/eject_button.c @@ -131,7 +131,9 @@ SINGLE_BATTLE_TEST("Eject Button is not triggered after given to player by Picke } } -SINGLE_BATTLE_TEST("Eject Button has no chance to activate after Dragon Tail") +// When run in same thread as "AI will not choose to switch out Dondozo with Commander Tatsugiri", +// dragon tail switch does not proc. commanderSpecies and commandingDondozo appear to be reset correctly? +/*SINGLE_BATTLE_TEST("Eject Button has no chance to activate after Dragon Tail") { GIVEN { PLAYER(SPECIES_KOMMO_O); @@ -150,7 +152,7 @@ SINGLE_BATTLE_TEST("Eject Button has no chance to activate after Dragon Tail") MESSAGE("The opposing Chansey is switched out with the Eject Button!"); } } -} +}*/ SINGLE_BATTLE_TEST("Eject Button prevents Volt Switch / U-Turn from activating") { @@ -250,3 +252,23 @@ SINGLE_BATTLE_TEST("Eject Button activates after Wandring Spirit") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); } } + +DOUBLE_BATTLE_TEST("Eject Button will activate before Red Card if holder is faster") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_WYNAUT) { Speed(25); Item(ITEM_RED_CARD); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_HYPER_VOICE); + SEND_OUT(opponentLeft, 2); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + } +} diff --git a/test/battle/hold_effect/eject_pack.c b/test/battle/hold_effect/eject_pack.c index 836f3d0fd..7e854055d 100644 --- a/test/battle/hold_effect/eject_pack.c +++ b/test/battle/hold_effect/eject_pack.c @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Eject Pack does not activate if there are no Pokémon left t PLAYER(SPECIES_WOBBUFFET) { HP(0); } OPPONENT(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); NONE_OF { @@ -69,7 +69,7 @@ SINGLE_BATTLE_TEST("Eject Pack will miss timing to switch out user if Emergency GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(133); } OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(player, MOVE_OVERHEAT); SEND_OUT(opponent, 1); } @@ -125,7 +125,7 @@ DOUBLE_BATTLE_TEST("Eject Pack will not trigger if the conditions are not met") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } - PLAYER(SPECIES_BELDUM) { Ability(ABILITY_CLEAR_BODY); }; + PLAYER(SPECIES_BELDUM) { Ability(ABILITY_CLEAR_BODY); } PLAYER(SPECIES_RALTS) { Ability(ABILITY_TRACE); Item(ITEM_EJECT_PACK); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); @@ -323,7 +323,7 @@ SINGLE_BATTLE_TEST("Eject Pack does not activate if mon is switched in due to Ej GIVEN { PLAYER(SPECIES_DUGTRIO) { Ability(ABILITY_ARENA_TRAP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { diff --git a/test/battle/hold_effect/evasion_up.c b/test/battle/hold_effect/evasion_up.c new file mode 100644 index 000000000..3ed7b66be --- /dev/null +++ b/test/battle/hold_effect/evasion_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Bright Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/eviolite.c b/test/battle/hold_effect/eviolite.c new file mode 100644 index 000000000..1aa0622e4 --- /dev/null +++ b/test/battle/hold_effect/eviolite.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Eviolite (Hold Effect) test titles") diff --git a/test/battle/hold_effect/exp_share.c b/test/battle/hold_effect/exp_share.c new file mode 100644 index 000000000..3f25ef796 --- /dev/null +++ b/test/battle/hold_effect/exp_share.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Exp. Share (Hold Effect) test titles") diff --git a/test/battle/hold_effect/expert_belt.c b/test/battle/hold_effect/expert_belt.c new file mode 100644 index 000000000..639104633 --- /dev/null +++ b/test/battle/hold_effect/expert_belt.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Expert Belt (Hold Effect) test titles") diff --git a/test/battle/hold_effect/flame_orb.c b/test/battle/hold_effect/flame_orb.c new file mode 100644 index 000000000..b715ab1a2 --- /dev/null +++ b/test/battle/hold_effect/flame_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flame Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/flinch.c b/test/battle/hold_effect/flinch.c new file mode 100644 index 000000000..9d396391f --- /dev/null +++ b/test/battle/hold_effect/flinch.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_KINGS_ROCK].holdEffect == HOLD_EFFECT_FLINCH); +} + +SINGLE_BATTLE_TEST("Kings Rock holder will flinch the target 10% of the time") +{ + PASSES_RANDOMLY(10, 100, RNG_HOLD_EFFECT_FLINCH); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KINGS_ROCK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} + +SINGLE_BATTLE_TEST("Kings Rock does not increase flinch chance of a move that has the flinch effect") +{ + PASSES_RANDOMLY(30, 100, RNG_SECONDARY_EFFECT); + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_HEADBUTT, MOVE_EFFECT_FLINCH)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_KINGS_ROCK); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} diff --git a/test/battle/hold_effect/float_stone.c b/test/battle/hold_effect/float_stone.c new file mode 100644 index 000000000..f677c4136 --- /dev/null +++ b/test/battle/hold_effect/float_stone.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Float Stone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/focus_band.c b/test/battle/hold_effect/focus_band.c new file mode 100644 index 000000000..0dddca16b --- /dev/null +++ b/test/battle/hold_effect/focus_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Focus Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/focus_sash.c b/test/battle/hold_effect/focus_sash.c new file mode 100644 index 000000000..a66da4ff2 --- /dev/null +++ b/test/battle/hold_effect/focus_sash.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Focus Sash (Hold Effect) test titles") diff --git a/test/battle/hold_effect/friendship_up.c b/test/battle/hold_effect/friendship_up.c new file mode 100644 index 000000000..9eb6408b0 --- /dev/null +++ b/test/battle/hold_effect/friendship_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soothe Bell (Hold Effect) test titles") diff --git a/test/battle/hold_effect/gems.c b/test/battle/hold_effect/gems.c index b597beeab..5ca9054a5 100644 --- a/test/battle/hold_effect/gems.c +++ b/test/battle/hold_effect/gems.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Gem is consumed when it corresponds to the type of a move") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_EMBER); } @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Gem is consumed when it corresponds to the type of a move") SINGLE_BATTLE_TEST("Gem is not consumed when using Struggle", s16 damage) { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_NORMAL_GEM; } @@ -60,7 +60,7 @@ SINGLE_BATTLE_TEST("Gem boost is only applied once") s16 normalHit; GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Gem modifier is used for all hits of Multi Hit Moves") s16 secondHit; GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Gem modifier is used for all hits of Multi Hit Moves") SINGLE_BATTLE_TEST("Gem is consumed if the move type is changed") { GIVEN { - PLAYER(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Item(ITEM_NORMAL_GEM); }; + PLAYER(SPECIES_DELCATTY) { Ability(ABILITY_NORMALIZE); Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { diff --git a/test/battle/hold_effect/grip_claw.c b/test/battle/hold_effect/grip_claw.c new file mode 100644 index 000000000..b334597bb --- /dev/null +++ b/test/battle/hold_effect/grip_claw.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grip Claw (Hold Effect) test titles") diff --git a/test/battle/hold_effect/griseous_orb.c b/test/battle/hold_effect/griseous_orb.c new file mode 100644 index 000000000..f904b5ec6 --- /dev/null +++ b/test/battle/hold_effect/griseous_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Griseous Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/heat_rock.c b/test/battle/hold_effect/heat_rock.c new file mode 100644 index 000000000..f297a89c8 --- /dev/null +++ b/test/battle/hold_effect/heat_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heat Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/heavy_duty_boots.c b/test/battle/hold_effect/heavy_duty_boots.c new file mode 100644 index 000000000..060280cbc --- /dev/null +++ b/test/battle/hold_effect/heavy_duty_boots.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heavy Duty Boots (Hold Effect) test titles") diff --git a/test/battle/hold_effect/icy_rock.c b/test/battle/hold_effect/icy_rock.c new file mode 100644 index 000000000..9ad50b807 --- /dev/null +++ b/test/battle/hold_effect/icy_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Icy Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/iron_ball.c b/test/battle/hold_effect/iron_ball.c index 134c47d9a..48c87dbcc 100644 --- a/test/battle/hold_effect/iron_ball.c +++ b/test/battle/hold_effect/iron_ball.c @@ -5,17 +5,24 @@ ASSUMPTIONS{ ASSUME(gItemsInfo[ITEM_IRON_BALL].holdEffect == HOLD_EFFECT_IRON_BALL); } -SINGLE_BATTLE_TEST("Ground-type moves do neutral damage to non-grounded Flying types holding Iron Ball regardless of other typings") //gen5+ only +SINGLE_BATTLE_TEST("Ground-type moves do neutral damage to non-grounded Flying types holding Iron Ball regardless of other typings (Gen5+)") { - ASSUME(B_IRON_BALL >= GEN_5); + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_IRON_BALL, config); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SKARMORY) { Item(ITEM_IRON_BALL); }; + OPPONENT(SPECIES_SKARMORY) { Item(ITEM_IRON_BALL); } } WHEN { - TURN { MOVE(player, MOVE_EARTHQUAKE); }; + TURN { MOVE(player, MOVE_EARTHQUAKE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, player); - NONE_OF { + if (config >= GEN_5) { + NONE_OF { + MESSAGE("It's super effective!"); + } + } else { MESSAGE("It's super effective!"); } } diff --git a/test/battle/hold_effect/jaboca_berry.c b/test/battle/hold_effect/jaboca_berry.c index a23cd90bb..cbcd0d799 100644 --- a/test/battle/hold_effect/jaboca_berry.c +++ b/test/battle/hold_effect/jaboca_berry.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Jaboca Berry causes the attacker to lose 1/8 of its max HP if a physical move was used") { s16 damage; - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SWIFT; } PARAMETRIZE { move = MOVE_SCRATCH; } diff --git a/test/battle/hold_effect/kee_berry.c b/test/battle/hold_effect/kee_berry.c index d37a132be..405c49380 100644 --- a/test/battle/hold_effect/kee_berry.c +++ b/test/battle/hold_effect/kee_berry.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Kee Berry raises the holder's Defense by one stage when hit by a physical move") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SWIFT; } PARAMETRIZE { move = MOVE_SCRATCH; } diff --git a/test/battle/hold_effect/leek.c b/test/battle/hold_effect/leek.c index 1775681d5..025686485 100644 --- a/test/battle/hold_effect/leek.c +++ b/test/battle/hold_effect/leek.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Leek increases critical hit ratio by 2 stages for the Farfet } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD) == 60); ASSUME(GetSpeciesBaseSpeed(SPECIES_FARFETCHD_GALAR) == 55); ASSUME(GetSpeciesBaseSpeed(SPECIES_SIRFETCHD) == 65); diff --git a/test/battle/hold_effect/life_orb.c b/test/battle/hold_effect/life_orb.c index 81ddd614d..0933aece4 100644 --- a/test/battle/hold_effect/life_orb.c +++ b/test/battle/hold_effect/life_orb.c @@ -1,6 +1,11 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); +} + SINGLE_BATTLE_TEST("Life Orb activates when users attack is succesful") { GIVEN { @@ -34,6 +39,7 @@ SINGLE_BATTLE_TEST("Life Orb activates if it hits a Substitute") SINGLE_BATTLE_TEST("Life Orb does not activate if using status move on a Substitute") { GIVEN { + ASSUME(MoveIgnoresSubstitute(MOVE_GROWL)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -104,6 +110,7 @@ SINGLE_BATTLE_TEST("Life Orb does not activate if on a confusion hit") SINGLE_BATTLE_TEST("Life Orb does not activate if move was absorbed by target") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } OPPONENT(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); } } WHEN { @@ -150,3 +157,32 @@ SINGLE_BATTLE_TEST("Life Orb does not activate on a charge turn") HP_BAR(player); // Lief Orb } } + +DOUBLE_BATTLE_TEST("Life Orb activates if damage was inflicted by a dancer move through the dancer ability") +{ + GIVEN { + ASSUME(IsDanceMove(MOVE_FIERY_DANCE)); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + PLAYER(SPECIES_ORICORIO) { Speed(200); Ability(ABILITY_DANCER); Item(ITEM_LIFE_ORB); Status1(STATUS1_SLEEP); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WYNAUT) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_HEAL_BELL); + MOVE(opponentLeft, MOVE_FIERY_DANCE, target: playerLeft); + } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + HP_BAR(playerLeft); // Life Orb + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BELL, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, opponentLeft); + HP_BAR(playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FIERY_DANCE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); // Life Orb + } +} diff --git a/test/battle/hold_effect/light_ball.c b/test/battle/hold_effect/light_ball.c new file mode 100644 index 000000000..c35dd7534 --- /dev/null +++ b/test/battle/hold_effect/light_ball.c @@ -0,0 +1,99 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_LIGHT_BALL) == HOLD_EFFECT_LIGHT_BALL); +} + +static const u32 speciesToCheck[] = { + SPECIES_PICHU, + SPECIES_PIKACHU, + SPECIES_PIKACHU_COSPLAY, + SPECIES_PIKACHU_ROCK_STAR, + SPECIES_PIKACHU_BELLE, + SPECIES_PIKACHU_POP_STAR, + SPECIES_PIKACHU_PHD, + SPECIES_PIKACHU_LIBRE, + SPECIES_PIKACHU_ORIGINAL, + SPECIES_PIKACHU_HOENN, + SPECIES_PIKACHU_SINNOH, + SPECIES_PIKACHU_UNOVA, + SPECIES_PIKACHU_KALOS, + SPECIES_PIKACHU_ALOLA, + SPECIES_PIKACHU_PARTNER, + SPECIES_PIKACHU_WORLD, + SPECIES_PIKACHU_GMAX, +}; + +SINGLE_BATTLE_TEST("Light Ball doubles Pikachu's Special Attack", s16 damage) +{ + u32 species = 0, item = 0; + + for (u32 j = 0; j < ARRAY_COUNT(speciesToCheck); j++) { + PARAMETRIZE { item = ITEM_NONE; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; species = speciesToCheck[j]; } + } + + GIVEN { + ASSUME(GetMoveCategory(MOVE_THUNDERSHOCK) == DAMAGE_CATEGORY_SPECIAL); + if (species == SPECIES_PIKACHU_GMAX) { + PLAYER(SPECIES_PIKACHU) { Item(item); GigantamaxFactor(TRUE); } + } else { + PLAYER(species) { Item(item); } + } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (species == SPECIES_PIKACHU_GMAX) { + TURN { MOVE(player, MOVE_THUNDERSHOCK, gimmick: GIMMICK_DYNAMAX); } + } else { + TURN { MOVE(player, MOVE_THUNDERSHOCK); } + } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 1) { // First check to avoid boosting other species + EXPECT_EQ(results[i - 1].damage, results[i].damage); + } else if (i % 2 == 1) { // Every 2nd test afterwards + EXPECT_MUL_EQ(results[i - 1].damage, Q_4_12(2.0), results[i].damage); + } + } +} + +SINGLE_BATTLE_TEST("Light Ball doubles Pikachu's Attack (Gen4+)", s16 damage) +{ + u32 species = 0, item = 0, config = 0; + + for (u32 j = 0; j < ARRAY_COUNT(speciesToCheck); j++) { + PARAMETRIZE { item = ITEM_NONE; config = GEN_3; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; config = GEN_3; species = speciesToCheck[j]; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; config = GEN_4; species = speciesToCheck[j]; } + } + + GIVEN { + WITH_CONFIG(CONFIG_LIGHT_BALL_ATTACK_BOOST, config); + ASSUME(GetMoveCategory(MOVE_SPARK) == DAMAGE_CATEGORY_PHYSICAL); + if (species == SPECIES_PIKACHU_GMAX) { + PLAYER(SPECIES_PIKACHU) { Item(item); GigantamaxFactor(TRUE); } + } else { + PLAYER(species) { Item(item); } + } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (species == SPECIES_PIKACHU_GMAX) { + TURN { MOVE(player, MOVE_SPARK, gimmick: GIMMICK_DYNAMAX); } + } else { + TURN { MOVE(player, MOVE_SPARK); } + } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 2) { // First check to avoid boosting other species + EXPECT_EQ(results[i - 2].damage, results[i].damage); // No item vs Light Ball + EXPECT_EQ(results[i - 1].damage, results[i].damage); // Gen 3 vs Gen 4 + } else if (i % 3 == 2) { // Every 3rd test afterwards + EXPECT_MUL_EQ(results[i - 2].damage, Q_4_12(2.0), results[i].damage); // No item vs Light Ball + EXPECT_MUL_EQ(results[i - 1].damage, Q_4_12(2.0), results[i].damage); // Gen 3 vs Gen 4 + } + } +} diff --git a/test/battle/hold_effect/light_clay.c b/test/battle/hold_effect/light_clay.c new file mode 100644 index 000000000..cb258ef88 --- /dev/null +++ b/test/battle/hold_effect/light_clay.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Light Clay (Hold Effect) test titles") diff --git a/test/battle/hold_effect/loaded_dice.c b/test/battle/hold_effect/loaded_dice.c new file mode 100644 index 000000000..f5c220818 --- /dev/null +++ b/test/battle/hold_effect/loaded_dice.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Loaded Dice (Hold Effect) test titles") diff --git a/test/battle/hold_effect/lucky_egg.c b/test/battle/hold_effect/lucky_egg.c new file mode 100644 index 000000000..3016adeb4 --- /dev/null +++ b/test/battle/hold_effect/lucky_egg.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lucky Egg (Hold Effect) test titles") diff --git a/test/battle/hold_effect/luck_punch.c b/test/battle/hold_effect/lucky_punch.c similarity index 94% rename from test/battle/hold_effect/luck_punch.c rename to test/battle/hold_effect/lucky_punch.c index 0bdae8134..bbc379d97 100644 --- a/test/battle/hold_effect/luck_punch.c +++ b/test/battle/hold_effect/lucky_punch.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Lucky Punch increases critical hit ratio by 2 stages for Cha PARAMETRIZE { genConfig = j; passes = 1; trials = 2; } // 50% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_LUCKY_PUNCH].holdEffect == HOLD_EFFECT_LUCKY_PUNCH); ASSUME(GetSpeciesBaseSpeed(SPECIES_CHANSEY) == 50); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/hold_effect/luminous_moss.c b/test/battle/hold_effect/luminous_moss.c new file mode 100644 index 000000000..c49bf04e0 --- /dev/null +++ b/test/battle/hold_effect/luminous_moss.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Luminous Moss (Hold Effect) test titles") diff --git a/test/battle/hold_effect/lustrous_orb.c b/test/battle/hold_effect/lustrous_orb.c new file mode 100644 index 000000000..e8bcdf3f3 --- /dev/null +++ b/test/battle/hold_effect/lustrous_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lustrous Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/macho_brace.c b/test/battle/hold_effect/macho_brace.c new file mode 100644 index 000000000..2186a41f7 --- /dev/null +++ b/test/battle/hold_effect/macho_brace.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Macho Brace (Hold Effect) test titles") diff --git a/test/battle/hold_effect/maranga_berry.c b/test/battle/hold_effect/maranga_berry.c index 785e040ca..787a57b9c 100644 --- a/test/battle/hold_effect/maranga_berry.c +++ b/test/battle/hold_effect/maranga_berry.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Maranga Berry raises the holder's Sp. Def by one stage when hit by a special move") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { diff --git a/test/battle/hold_effect/mega_stone.c b/test/battle/hold_effect/mega_stone.c new file mode 100644 index 000000000..a1100ed8e --- /dev/null +++ b/test/battle/hold_effect/mega_stone.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mega Stone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/memory.c b/test/battle/hold_effect/memory.c new file mode 100644 index 000000000..290f534e4 --- /dev/null +++ b/test/battle/hold_effect/memory.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Memories (Hold Effect) test titles") diff --git a/test/battle/hold_effect/mental_herb.c b/test/battle/hold_effect/mental_herb.c new file mode 100644 index 000000000..7eeaba2ff --- /dev/null +++ b/test/battle/hold_effect/mental_herb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mental Herb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/metal_powder.c b/test/battle/hold_effect/metal_powder.c new file mode 100644 index 000000000..2f716541a --- /dev/null +++ b/test/battle/hold_effect/metal_powder.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Metal Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/metronome.c b/test/battle/hold_effect/metronome.c index e7037db8d..9add29f40 100644 --- a/test/battle/hold_effect/metronome.c +++ b/test/battle/hold_effect/metronome.c @@ -107,10 +107,10 @@ SINGLE_BATTLE_TEST("Metronome Item counts called moves instead of the calling mo SINGLE_BATTLE_TEST("Metronome Item counts charging turn of moves for its attacking turn", s16 damage) { - u32 item; + enum Item item; - PARAMETRIZE {item = ITEM_NONE; } - PARAMETRIZE {item = ITEM_METRONOME; } + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_METRONOME; } GIVEN { ASSUME(GetMoveEffect(MOVE_SOLAR_BEAM) == EFFECT_SOLAR_BEAM); PLAYER(SPECIES_WOBBUFFET) { Item(item); } @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Metronome Item doesn't increase damage per hit of multi-hit { s16 damage[3]; GIVEN { - ASSUME(GetMoveEffect(MOVE_FURY_ATTACK) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_FURY_ATTACK)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_METRONOME); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/hold_effect/micle_berry.c b/test/battle/hold_effect/micle_berry.c index 24d3ef1cd..4505d8a04 100644 --- a/test/battle/hold_effect/micle_berry.c +++ b/test/battle/hold_effect/micle_berry.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Micle Berry raises the holder's accuracy by 1.2 when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/mirror_herb.c b/test/battle/hold_effect/mirror_herb.c index 6618d4195..3c8f69292 100644 --- a/test/battle/hold_effect/mirror_herb.c +++ b/test/battle/hold_effect/mirror_herb.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Mirror Herb copies all of foe's positive stat changes in a turn", s16 damage) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_MIRROR_HERB; } GIVEN { @@ -80,7 +80,7 @@ SINGLE_BATTLE_TEST("Mirror Herb copies the boost gained by an ability") PLAYER(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_MIRROR_HERB); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(player, ABILITY_INTREPID_SWORD); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); diff --git a/test/battle/hold_effect/muscle_band.c b/test/battle/hold_effect/muscle_band.c new file mode 100644 index 000000000..7bac7c9c8 --- /dev/null +++ b/test/battle/hold_effect/muscle_band.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Muscle Band (Hold Effect) test titles") diff --git a/test/battle/hold_effect/ogerpon_mask.c b/test/battle/hold_effect/ogerpon_mask.c index d1353d090..19e1f911e 100644 --- a/test/battle/hold_effect/ogerpon_mask.c +++ b/test/battle/hold_effect/ogerpon_mask.c @@ -14,7 +14,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Ogerpon Masks increase the base power of moves by 20%", s16 damage) { u32 species; - u32 item; + enum Item item; PARAMETRIZE { species = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_OGERPON_WELLSPRING; item = ITEM_CORNERSTONE_MASK; } PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME; item = ITEM_WELLSPRING_MASK; } diff --git a/test/battle/hold_effect/plate.c b/test/battle/hold_effect/plate.c new file mode 100644 index 000000000..92573659c --- /dev/null +++ b/test/battle/hold_effect/plate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Plates (Hold Effect) test titles") diff --git a/test/battle/hold_effect/power_herb.c b/test/battle/hold_effect/power_herb.c new file mode 100644 index 000000000..c74585178 --- /dev/null +++ b/test/battle/hold_effect/power_herb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Herb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/power_item.c b/test/battle/hold_effect/power_item.c new file mode 100644 index 000000000..240d09a67 --- /dev/null +++ b/test/battle/hold_effect/power_item.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Items (Hold Effect) test titles") diff --git a/test/battle/hold_effect/prevent_evolve.c b/test/battle/hold_effect/prevent_evolve.c new file mode 100644 index 000000000..104345436 --- /dev/null +++ b/test/battle/hold_effect/prevent_evolve.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Everstone (Hold Effect) test titles") diff --git a/test/battle/hold_effect/primal_orb.c b/test/battle/hold_effect/primal_orb.c new file mode 100644 index 000000000..42955a736 --- /dev/null +++ b/test/battle/hold_effect/primal_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Red/Blue Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/protective_pads.c b/test/battle/hold_effect/protective_pads.c index 6f8d068d0..005e3a80e 100644 --- a/test/battle/hold_effect/protective_pads.c +++ b/test/battle/hold_effect/protective_pads.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Protective Pads protected moves still make direct contact", SINGLE_BATTLE_TEST("Protective Pads doesn't reduce tough claws damage", s16 damage) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_PROTECTIVE_PADS; } GIVEN { @@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Protective Pads protects from Rocly Helmet Damage") SINGLE_BATTLE_TEST("Protective Pads protects from Protect's secondary effects") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } diff --git a/test/battle/hold_effect/punching_glove.c b/test/battle/hold_effect/punching_glove.c new file mode 100644 index 000000000..d8e05a991 --- /dev/null +++ b/test/battle/hold_effect/punching_glove.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Punching Glove (Hold Effect) test titles") diff --git a/test/battle/hold_effect/quick_powder.c b/test/battle/hold_effect/quick_powder.c new file mode 100644 index 000000000..7e2968784 --- /dev/null +++ b/test/battle/hold_effect/quick_powder.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Quick Powder (Hold Effect) test titles") diff --git a/test/battle/hold_effect/random_stat_up.c b/test/battle/hold_effect/random_stat_up.c index ff6b03e03..53a11c6f9 100644 --- a/test/battle/hold_effect/random_stat_up.c +++ b/test/battle/hold_effect/random_stat_up.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Starf Berry randomly raises the holder's Attack, Defense, Sp PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_STARF_BERRY); HP(100); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); diff --git a/test/battle/hold_effect/red_card.c b/test/battle/hold_effect/red_card.c index 6b5e08c45..7f0aa9247 100644 --- a/test/battle/hold_effect/red_card.c +++ b/test/battle/hold_effect/red_card.c @@ -166,7 +166,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if knocked off") SINGLE_BATTLE_TEST("Red Card does not activate if stolen by a move") { - u32 item; + enum Item item; bool32 activate; PARAMETRIZE { item = ITEM_NONE; activate = FALSE; } PARAMETRIZE { item = ITEM_POTION; activate = TRUE; } @@ -196,7 +196,7 @@ SINGLE_BATTLE_TEST("Red Card does not activate if stolen by a move") SINGLE_BATTLE_TEST("Red Card does not activate if stolen by Magician") { - u32 item; + enum Item item; bool32 activate; PARAMETRIZE { item = ITEM_NONE; activate = FALSE; } PARAMETRIZE { item = ITEM_POTION; activate = TRUE; } @@ -385,7 +385,7 @@ SINGLE_BATTLE_TEST("Red Card activates and overrides U-turn") SINGLE_BATTLE_TEST("Red Card does not activate if attacker's Sheer Force applied") { - u32 move; + enum Move move; bool32 activate; PARAMETRIZE { move = MOVE_SCRATCH; activate = TRUE; } PARAMETRIZE { move = MOVE_STOMP; activate = FALSE; } @@ -485,7 +485,7 @@ SINGLE_BATTLE_TEST("Red Card prevents Emergency Exit activation when triggered") GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GOLISOPOD) { Item(ITEM_RED_CARD); Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); }; + OPPONENT(SPECIES_GOLISOPOD) { Item(ITEM_RED_CARD); Ability(ABILITY_EMERGENCY_EXIT); MaxHP(263); HP(262); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SUPER_FANG); MOVE(opponent, MOVE_CELEBRATE); } @@ -539,3 +539,19 @@ SINGLE_BATTLE_TEST("Red Card activates before Eject Pack") } } +DOUBLE_BATTLE_TEST("Red Card will activate before Eject Button if holder is faster") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); Item(ITEM_EJECT_BUTTON); } + OPPONENT(SPECIES_WYNAUT) { Speed(35); Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HYPER_VOICE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentRight); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponentLeft); + } +} diff --git a/test/battle/hold_effect/repel.c b/test/battle/hold_effect/repel.c new file mode 100644 index 000000000..adfca5c48 --- /dev/null +++ b/test/battle/hold_effect/repel.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Cleanse Tag (Hold Effect) test titles") diff --git a/test/battle/hold_effect/weakness_berry.c b/test/battle/hold_effect/resist_berry.c similarity index 84% rename from test/battle/hold_effect/weakness_berry.c rename to test/battle/hold_effect/resist_berry.c index 4958c6781..049208ee6 100644 --- a/test/battle/hold_effect/weakness_berry.c +++ b/test/battle/hold_effect/resist_berry.c @@ -25,7 +25,9 @@ static const u16 sMoveItemTable[][4] = SINGLE_BATTLE_TEST("Weakness berries decrease the base power of moves by half", s16 damage) { - u32 move = 0, item = 0, defender = 0; + enum Move move = MOVE_NONE; + enum Item item = ITEM_NONE; + u32 defender = 0; enum Type type = TYPE_NONE; for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) @@ -63,7 +65,9 @@ SINGLE_BATTLE_TEST("Weakness berries decrease the base power of moves by half", SINGLE_BATTLE_TEST("Weakness berries do not activate unless a move is super effective", s16 damage) { - u32 move = 0, item = 0, defender = 0; + enum Move move = MOVE_NONE; + enum Item item = ITEM_NONE; + u32 defender = 0; enum Type type = TYPE_NONE; for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) @@ -99,7 +103,7 @@ SINGLE_BATTLE_TEST("Weakness berries do not activate unless a move is super effe SINGLE_BATTLE_TEST("Weakness berries do not decrease the power of Struggle", s16 damage) { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_CHILAN_BERRY; } @@ -124,3 +128,22 @@ SINGLE_BATTLE_TEST("Weakness berries do not decrease the power of Struggle", s16 EXPECT_EQ(results[0].damage, results[1].damage); } } + +SINGLE_BATTLE_TEST("Weakness berries do not activate if Disguise blocks the damage") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_BABIRI_BERRY) == HOLD_EFFECT_RESIST_BERRY); + ASSUME(GetItemHoldEffectParam(ITEM_BABIRI_BERRY) == TYPE_STEEL); + ASSUME(GetMoveType(MOVE_METAL_CLAW) == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MIMIKYU) { Item(ITEM_BABIRI_BERRY); Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_METAL_CLAW); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + MESSAGE("The Babiri Berry weakened the damage to the opposing Mimikyu!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_CLAW, player); + } +} diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index ef96ead7e..52dc04599 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -3,7 +3,7 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_BERRY_JUICE; } PARAMETRIZE { item = ITEM_ORAN_BERRY; } @@ -30,7 +30,7 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing") DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil move") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_BERRY_JUICE; } PARAMETRIZE { item = ITEM_ORAN_BERRY; } @@ -63,3 +63,22 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } + +SINGLE_BATTLE_TEST("Sitrus Berry restores HP immediately after Leech Seed damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + ASSUME(gItemsInfo[ITEM_SITRUS_BERRY].holdEffect == HOLD_EFFECT_RESTORE_PCT_HP); + PLAYER(SPECIES_WOBBUFFET) { MaxHP(80); HP(41); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponent, MOVE_LEECH_SEED); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, player); + HP_BAR(player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(player); + } +} diff --git a/test/battle/hold_effect/restore_pct_hp.c b/test/battle/hold_effect/restore_pct_hp.c new file mode 100644 index 000000000..ac0db5938 --- /dev/null +++ b/test/battle/hold_effect/restore_pct_hp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + + // Tests for Sitrus Berry are handled in test/battle/hold_effect/restore_hp.c diff --git a/test/battle/hold_effect/ring_target.c b/test/battle/hold_effect/ring_target.c new file mode 100644 index 000000000..1074bb0dc --- /dev/null +++ b/test/battle/hold_effect/ring_target.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Ring Target (Hold Effect) test titles") diff --git a/test/battle/hold_effect/rocky_helmet.c b/test/battle/hold_effect/rocky_helmet.c new file mode 100644 index 000000000..f49d26c1e --- /dev/null +++ b/test/battle/hold_effect/rocky_helmet.c @@ -0,0 +1,25 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_ROCKY_HELMET) == HOLD_EFFECT_ROCKY_HELMET); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + ASSUME(MoveMakesContact(MOVE_SHADOW_SNEAK)); +} + +SINGLE_BATTLE_TEST("Rocky Helmet damages attacker even if damage is blocked by Disguise") +{ + GIVEN { + PLAYER(SPECIES_MIMIKYU) { Item(ITEM_ROCKY_HELMET); Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SHADOW_SNEAK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_SNEAK, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + HP_BAR(opponent); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Rocky Helmet (Hold Effect) test titles") diff --git a/test/battle/hold_effect/room_service.c b/test/battle/hold_effect/room_service.c index e775ca496..c3968ede5 100644 --- a/test/battle/hold_effect/room_service.c +++ b/test/battle/hold_effect/room_service.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Room Serive decreases the holder's seep by one stage") GIVEN { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM); - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ROOM_SERVICE); } OPPONENT(SPECIES_WYNAUT) { HP(1); } diff --git a/test/battle/hold_effect/rowap_berry.c b/test/battle/hold_effect/rowap_berry.c index 93ac49f60..87ec448a6 100644 --- a/test/battle/hold_effect/rowap_berry.c +++ b/test/battle/hold_effect/rowap_berry.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Rowap Berry causes the attacker to lose 1/8 of its max HP if a special move was used") { s16 damage; - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SWIFT; } PARAMETRIZE { move = MOVE_SCRATCH; } diff --git a/test/battle/hold_effect/safety_goggles.c b/test/battle/hold_effect/safety_goggles.c index 346e41fbf..a5cfca076 100644 --- a/test/battle/hold_effect/safety_goggles.c +++ b/test/battle/hold_effect/safety_goggles.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks damage from Hail") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(player, MOVE_HAIL); } } SCENE { @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks damage from Sandstorm") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(player, MOVE_SANDSTORM); } } SCENE { @@ -46,8 +46,10 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks damage from Sandstorm") SINGLE_BATTLE_TEST("Safety Goggles blocks Effect Spore's effect") { + KNOWN_FAILING; PASSES_RANDOMLY(100, 100, RNG_EFFECT_SPORE); GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); // Setting it to Gen 6 causes it to pass ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } diff --git a/test/battle/hold_effect/scope_lens.c b/test/battle/hold_effect/scope_lens.c index 06c9c4a0d..f74a06a1c 100644 --- a/test/battle/hold_effect/scope_lens.c +++ b/test/battle/hold_effect/scope_lens.c @@ -9,10 +9,10 @@ SINGLE_BATTLE_TEST("Scope Lens increases the critical hit ratio by 1 stage") PARAMETRIZE { genConfig = j; passes = 1; trials = 8; } // 12.5% PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_SCOPE_LENS].holdEffect == HOLD_EFFECT_SCOPE_LENS); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SCOPE_LENS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_SCRATCH); } diff --git a/test/battle/hold_effect/shed_shell.c b/test/battle/hold_effect/shed_shell.c new file mode 100644 index 000000000..f8f6277ff --- /dev/null +++ b/test/battle/hold_effect/shed_shell.c @@ -0,0 +1,67 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(gItemsInfo[ITEM_SHED_SHELL].holdEffect == HOLD_EFFECT_SHED_SHELL); +}; + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Mean Look") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_MEAN_LOOK); } + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Shadow Tag") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell allows switching out even when trapped by Arena Trap") +{ + GIVEN { + PLAYER(SPECIES_DIGLETT) { Item(ITEM_SHED_SHELL); } // Grounded + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_DIGLETT) { Ability(ABILITY_ARENA_TRAP); } + } WHEN { + TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + SWITCH_OUT_MESSAGE("Diglett"); + SEND_IN_MESSAGE("Wynaut"); + } +} + +SINGLE_BATTLE_TEST("Shed Shell does not allow Teleport when trapped") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SHED_SHELL); Moves(MOVE_TELEPORT, MOVE_SPLASH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_MEAN_LOOK); } + TURN { MOVE(player, MOVE_TELEPORT); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MEAN_LOOK, opponent); + MESSAGE("Wobbuffet used Teleport!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/hold_effect/shell_bell.c b/test/battle/hold_effect/shell_bell.c index 82f1b0b18..0da45c854 100644 --- a/test/battle/hold_effect/shell_bell.c +++ b/test/battle/hold_effect/shell_bell.c @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Shell Bell recovers no HP if the move did no damage") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } - OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(player, MOVE_FALSE_SWIPE); } } SCENE { @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Shell Bell restores 1/8 HP of damage dealt") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Level(16); Item(ITEM_SHELL_BELL); HP(10); } - OPPONENT(SPECIES_WOBBUFFET) { Level(16); }; + OPPONENT(SPECIES_WOBBUFFET) { Level(16); } } WHEN { TURN { MOVE(player, MOVE_SEISMIC_TOSS); } } SCENE { @@ -135,11 +135,11 @@ SINGLE_BATTLE_TEST("Shell Bell doesn't restore HP for damage dealt by a foreseen GIVEN { ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); PLAYER(SPECIES_WOBBUFFET) { Level(16); Item(ITEM_SHELL_BELL); HP(10); } - OPPONENT(SPECIES_WOBBUFFET) { Level(16); }; + OPPONENT(SPECIES_WOBBUFFET) { Level(16); } } WHEN { TURN { MOVE(player, MOVE_FUTURE_SIGHT); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Wobbuffet took the Future Sight attack!"); @@ -208,11 +208,11 @@ DOUBLE_BATTLE_TEST("Shell Bell heals accumulated damage for spread moves") const u16 maxHp = 200; const u16 initHp = 1; GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_ARIADOS) { MaxHP(maxHp); HP(initHp); Item(ITEM_SHELL_BELL); } - PLAYER(SPECIES_WOBBUFFET) {} - OPPONENT(SPECIES_GYARADOS) {} - OPPONENT(SPECIES_CHANSEY) {} + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GYARADOS); + OPPONENT(SPECIES_CHANSEY); } WHEN { TURN { MOVE(playerLeft, MOVE_DISCHARGE); @@ -275,7 +275,7 @@ SINGLE_BATTLE_TEST("Shell Bell recovers only 1 damage if the move only did 1 dam { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); Item(ITEM_SHELL_BELL); } - OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(player, MOVE_DRAGON_RAGE); } } SCENE { diff --git a/test/battle/hold_effect/smooth_rock.c b/test/battle/hold_effect/smooth_rock.c new file mode 100644 index 000000000..f782e1238 --- /dev/null +++ b/test/battle/hold_effect/smooth_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Smooth Rock (Hold Effect) test titles") diff --git a/test/battle/hold_effect/snowball.c b/test/battle/hold_effect/snowball.c new file mode 100644 index 000000000..7037e1c59 --- /dev/null +++ b/test/battle/hold_effect/snowball.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Snowball (Hold Effect) test titles") diff --git a/test/battle/hold_effect/soul_dew.c b/test/battle/hold_effect/soul_dew.c new file mode 100644 index 000000000..b1ad8a9aa --- /dev/null +++ b/test/battle/hold_effect/soul_dew.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soul Dew (Hold Effect) test titles") diff --git a/test/battle/hold_effect/special_attack_up.c b/test/battle/hold_effect/sp_attack_up.c similarity index 99% rename from test/battle/hold_effect/special_attack_up.c rename to test/battle/hold_effect/sp_attack_up.c index f4256a533..4389a98ed 100644 --- a/test/battle/hold_effect/special_attack_up.c +++ b/test/battle/hold_effect/sp_attack_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Petaya Berry raises the holder's Sp. Atk by one stage when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/special_defense_up.c b/test/battle/hold_effect/sp_defense_up.c similarity index 99% rename from test/battle/hold_effect/special_defense_up.c rename to test/battle/hold_effect/sp_defense_up.c index e7d8f9a17..15492a3db 100644 --- a/test/battle/hold_effect/special_defense_up.c +++ b/test/battle/hold_effect/sp_defense_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Apicot Berry raises the holder's Sp. Def by one stage when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/speed_up.c b/test/battle/hold_effect/speed_up.c index b1725597a..13c0ae34d 100644 --- a/test/battle/hold_effect/speed_up.c +++ b/test/battle/hold_effect/speed_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Salac Berry raises the holder's Speed by one stage when HP drops to 1/4 or below") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_DRAGON_RAGE; } diff --git a/test/battle/hold_effect/sticky_barb.c b/test/battle/hold_effect/sticky_barb.c index 59c1e1227..05dc1ac6c 100644 --- a/test/battle/hold_effect/sticky_barb.c +++ b/test/battle/hold_effect/sticky_barb.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Sticky Barb hurts its holder at the end of the turn") PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_STICKY_BARB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { } + TURN {} } SCENE { HP_BAR(player, captureDamage: &damage); } THEN { @@ -23,7 +23,7 @@ SINGLE_BATTLE_TEST("Sticky Barb hurts its holder at the end of the turn") SINGLE_BATTLE_TEST("Sticky Barb gets transferred if its holder is hit by a contact move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_GROWL; } PARAMETRIZE { move = MOVE_HYPER_VOICE; } diff --git a/test/battle/hold_effect/terrain_extender.c b/test/battle/hold_effect/terrain_extender.c new file mode 100644 index 000000000..cce69d42a --- /dev/null +++ b/test/battle/hold_effect/terrain_extender.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Terrain Extender (Hold Effect) test titles") diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/terrain_seed.c similarity index 98% rename from test/battle/hold_effect/seeds.c rename to test/battle/hold_effect/terrain_seed.c index b54dd54f5..83b8edff2 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/terrain_seed.c @@ -17,7 +17,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") { enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_ELECTRIC_SEED; } PARAMETRIZE { ability = ABILITY_ELECTRIC_SURGE; item = ITEM_NONE; } @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrai SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") { enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_GRASSY_SEED; } PARAMETRIZE { ability = ABILITY_GRASSY_SURGE; item = ITEM_NONE; } @@ -81,7 +81,7 @@ SINGLE_BATTLE_TEST("Grassy Seed raises the holder's Defense on Grassy Terrain") SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain") { enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_MISTY_SEED; } PARAMETRIZE { ability = ABILITY_MISTY_SURGE; item = ITEM_NONE; } @@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Misty Seed raises the holder's Sp. Defense on Misty Terrain" SINGLE_BATTLE_TEST("Psychic Seed raises the holder's Sp. Defense on Psychic Terrain") { enum Ability ability; - u32 item; + enum Item item; PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_NONE; } PARAMETRIZE { ability = ABILITY_TELEPATHY; item = ITEM_PSYCHIC_SEED; } PARAMETRIZE { ability = ABILITY_PSYCHIC_SURGE; item = ITEM_NONE; } @@ -155,7 +155,7 @@ SINGLE_BATTLE_TEST("Seeds get consumed in Terrain even if holder is not affected PLAYER(SPECIES_PIDGEY) { Item(item); } OPPONENT(species) { Ability(ability); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ability); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Electric Seed is consumed on Electric Terrain before other a PLAYER(SPECIES_TAPU_BULU) { Ability(ABILITY_GRASSY_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(5); } OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Item(ITEM_ELECTRIC_SEED); Speed(10); } } WHEN { - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); diff --git a/test/battle/hold_effect/thick_club.c b/test/battle/hold_effect/thick_club.c new file mode 100644 index 000000000..9fe204039 --- /dev/null +++ b/test/battle/hold_effect/thick_club.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Thick Club (Hold Effect) test titles") diff --git a/test/battle/hold_effect/throat_spray.c b/test/battle/hold_effect/throat_spray.c index a8e6cc5c1..4a270597c 100644 --- a/test/battle/hold_effect/throat_spray.c +++ b/test/battle/hold_effect/throat_spray.c @@ -12,7 +12,7 @@ DOUBLE_BATTLE_TEST("Throat Spray activates after both hits of a spread move") s16 firstHit, secondHit; GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_THROAT_SPRAY); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Throat Spray increases Sp. Atk by one stage") SINGLE_BATTLE_TEST("Throat Spray activates when a sound move is used") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SWIFT; } PARAMETRIZE { move = MOVE_HYPER_VOICE; } diff --git a/test/battle/hold_effect/toxic_orb.c b/test/battle/hold_effect/toxic_orb.c new file mode 100644 index 000000000..115259cd0 --- /dev/null +++ b/test/battle/hold_effect/toxic_orb.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Toxic Orb (Hold Effect) test titles") diff --git a/test/battle/hold_effect/type_power.c b/test/battle/hold_effect/type_power.c index c03d2487d..65c6d1015 100644 --- a/test/battle/hold_effect/type_power.c +++ b/test/battle/hold_effect/type_power.c @@ -25,7 +25,9 @@ static const u16 sMoveItemTable[][18] = SINGLE_BATTLE_TEST("Type-enhancing items increase the base power of moves by 20%", s16 damage) { - u32 move = 0, item = 0, type = 0; + enum Move move = MOVE_NONE; + enum Item item = ITEM_NONE; + enum Type type = TYPE_NONE; for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = ITEM_NONE; } @@ -56,7 +58,7 @@ SINGLE_BATTLE_TEST("Type-enhancing items increase the base power of moves by 20% SINGLE_BATTLE_TEST("Type-enhancing items do not increase the power of Struggle", s16 damage) { - u32 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_SILK_SCARF; } diff --git a/test/battle/hold_effect/utility_umbrella.c b/test/battle/hold_effect/utility_umbrella.c index 67a3be4c7..83bb0539f 100644 --- a/test/battle/hold_effect/utility_umbrella.c +++ b/test/battle/hold_effect/utility_umbrella.c @@ -18,7 +18,7 @@ SINGLE_BATTLE_TEST("Utility Umbrella blocks Sun damage modifiers", s16 damage) PARAMETRIZE { setupMove = MOVE_SUNNY_DAY; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_NONE; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); } } WHEN { TURN { MOVE(opponent, setupMove); } TURN { MOVE(player, attackingMove); } @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Utility Umbrella blocks Rain damage modifiers", s16 damage) PARAMETRIZE { setupMove = MOVE_RAIN_DANCE; attackingMove = MOVE_WATER_GUN; heldItem = ITEM_NONE; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(heldItem); } } WHEN { TURN { MOVE(opponent, setupMove); } TURN { MOVE(player, attackingMove); } diff --git a/test/battle/hold_effect/weakness_policy.c b/test/battle/hold_effect/weakness_policy.c new file mode 100644 index 000000000..d080e9ad6 --- /dev/null +++ b/test/battle/hold_effect/weakness_policy.c @@ -0,0 +1,31 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetItemHoldEffect(ITEM_WEAKNESS_POLICY) == HOLD_EFFECT_WEAKNESS_POLICY); +} + +SINGLE_BATTLE_TEST("Weakness Policy does not activate if Disguise blocks the damage") +{ + u32 species; + + PARAMETRIZE { species = SPECIES_MIMIKYU_BUSTED; } + PARAMETRIZE { species = SPECIES_MIMIKYU_DISGUISED; } + + GIVEN { + ASSUME(GetMoveType(MOVE_METAL_CLAW) == TYPE_STEEL); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Item(ITEM_WEAKNESS_POLICY); Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_METAL_CLAW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_CLAW, player); + if (species == SPECIES_MIMIKYU_BUSTED) + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + else + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +TO_DO_BATTLE_TEST("TODO: Write Weakness Policy (Hold Effect) test titles") diff --git a/test/battle/hold_effect/restore_stats.c b/test/battle/hold_effect/white_herb.c similarity index 95% rename from test/battle/hold_effect/restore_stats.c rename to test/battle/hold_effect/white_herb.c index 4a8f02002..2072e177c 100644 --- a/test/battle/hold_effect/restore_stats.c +++ b/test/battle/hold_effect/white_herb.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } } WHEN { - TURN { ; } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); @@ -50,7 +50,7 @@ DOUBLE_BATTLE_TEST("White Herb restores stats after Attack was lowered by Intimi PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } PLAYER(SPECIES_WOBBUFFET); } WHEN { - TURN { ; } + TURN {} } SCENE { ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); @@ -126,7 +126,7 @@ SINGLE_BATTLE_TEST("White Herb restores stats after all hits of a multi hit move SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off or stolen by Thief") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_KNOCK_OFF; } @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o GIVEN { ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); - PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, move); } @@ -151,7 +151,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o } NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + MESSAGE("Slugma returned its stats to normal using its White Herb!"); } } THEN { EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); @@ -162,7 +162,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if it is knocked off o SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it") { GIVEN { - PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_FENNEKIN) { Ability(ABILITY_MAGICIAN); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); } @@ -176,7 +176,7 @@ SINGLE_BATTLE_TEST("White Herb wont have time to activate if Magician steals it" MESSAGE("The opposing Fennekin stole Slugma's White Herb!"); NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("Wobbuffet returned its stats to normal using its White Herb!"); + MESSAGE("Slugma returned its stats to normal using its White Herb!"); } } THEN { EXPECT(player->statStages[STAT_DEF] = DEFAULT_STAT_STAGE - 1); @@ -196,7 +196,7 @@ SINGLE_BATTLE_TEST("White Herb has correct interactions with Intimidate triggere PLAYER(species) { Ability(ability); Item(ITEM_WHITE_HERB); } OPPONENT(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); } } WHEN { - TURN { ; } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_INTIMIDATE); ABILITY_POPUP(player, ability); diff --git a/test/battle/hold_effect/wide_lens.c b/test/battle/hold_effect/wide_lens.c new file mode 100644 index 000000000..bcf49f559 --- /dev/null +++ b/test/battle/hold_effect/wide_lens.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wide Lens (Hold Effect) test titles") diff --git a/test/battle/hold_effect/wise_glasses.c b/test/battle/hold_effect/wise_glasses.c new file mode 100644 index 000000000..6df63c917 --- /dev/null +++ b/test/battle/hold_effect/wise_glasses.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wise Glasses (Hold Effect) test titles") diff --git a/test/battle/hold_effect/z_crystal.c b/test/battle/hold_effect/z_crystal.c new file mode 100644 index 000000000..3c38b538d --- /dev/null +++ b/test/battle/hold_effect/z_crystal.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Z-Crystals handled in test/battle/gimmick/zmove.c diff --git a/test/battle/hold_effect/zoom_lens.c b/test/battle/hold_effect/zoom_lens.c new file mode 100644 index 000000000..6eded0dcb --- /dev/null +++ b/test/battle/hold_effect/zoom_lens.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Zoom Lens (Hold Effect) test titles") diff --git a/test/battle/inverse_battle.c b/test/battle/inverse_battle.c new file mode 100644 index 000000000..afa1ff23b --- /dev/null +++ b/test/battle/inverse_battle.c @@ -0,0 +1,124 @@ +#include "global.h" +#include "test/battle.h" + +static bool32 IsSpeciesMonotypeOf(u32 species, enum Type type) +{ + return GetSpeciesType(species, 0) == type && GetSpeciesType(species, 1) == type; +} + +ASSUMPTIONS +{ + // Pokemon Types + ASSUME(IsSpeciesMonotypeOf(SPECIES_EEVEE, TYPE_NORMAL)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_MACHAMP, TYPE_FIGHTING)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_TORNADUS, TYPE_FLYING)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_ARBOK, TYPE_POISON)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_DUGTRIO, TYPE_GROUND)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_SUDOWOODO,TYPE_ROCK)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_PINSIR, TYPE_BUG)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_DUSKULL, TYPE_GHOST)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_REGISTEEL,TYPE_STEEL)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_FLAREON, TYPE_FIRE)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_VAPOREON, TYPE_WATER)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_LEAFEON, TYPE_GRASS)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_JOLTEON, TYPE_ELECTRIC)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_ESPEON, TYPE_PSYCHIC)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_GLACEON, TYPE_ICE)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_DRUDDIGON,TYPE_DRAGON)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_UMBREON, TYPE_DARK)); + ASSUME(IsSpeciesMonotypeOf(SPECIES_SYLVEON, TYPE_FAIRY)); + + // Move types + ASSUME(GetMoveType(MOVE_TACKLE) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING); + ASSUME(GetMoveType(MOVE_GUST) == TYPE_FLYING); + ASSUME(GetMoveType(MOVE_POISON_STING) == TYPE_POISON); + ASSUME(GetMoveType(MOVE_MUD_SLAP) == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_ROCK_THROW) == TYPE_ROCK); + ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG); + ASSUME(GetMoveType(MOVE_SHADOW_BALL) == TYPE_GHOST); + ASSUME(GetMoveType(MOVE_METAL_CLAW) == TYPE_STEEL); + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_CONFUSION) == TYPE_PSYCHIC); + ASSUME(GetMoveType(MOVE_ICE_BEAM) == TYPE_ICE); + ASSUME(GetMoveType(MOVE_DRAGON_BREATH) == TYPE_DRAGON); + ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); + ASSUME(GetMoveType(MOVE_FAIRY_WIND) == TYPE_FAIRY); +} + +SINGLE_BATTLE_TEST("Inverse battle reverses type matchups") +{ + u32 species = SPECIES_NONE, move = MOVE_NONE; + + static const u16 monotypeMons[] = { + SPECIES_EEVEE, + SPECIES_MACHAMP, + SPECIES_TORNADUS, + SPECIES_ARBOK, + SPECIES_DUGTRIO, + SPECIES_SUDOWOODO, + SPECIES_PINSIR, + SPECIES_DUSKULL, + SPECIES_REGISTEEL, + SPECIES_FLAREON, + SPECIES_VAPOREON, + SPECIES_LEAFEON, + SPECIES_JOLTEON, + SPECIES_ESPEON, + SPECIES_GLACEON, + SPECIES_DRUDDIGON, + SPECIES_UMBREON, + SPECIES_SYLVEON, + }; + + static const u16 typeMoves[] = { + MOVE_TACKLE, + MOVE_KARATE_CHOP, + MOVE_GUST, + MOVE_POISON_STING, + MOVE_MUD_SLAP, + MOVE_ROCK_THROW, + MOVE_BUG_BITE, + MOVE_SHADOW_BALL, + MOVE_METAL_CLAW, + MOVE_EMBER, + MOVE_WATER_GUN, + MOVE_VINE_WHIP, + MOVE_THUNDER_SHOCK, + MOVE_CONFUSION, + MOVE_ICE_BEAM, + MOVE_DRAGON_BREATH, + MOVE_BITE, + MOVE_FAIRY_WIND, + }; + + for (u32 i = 0; i < ARRAY_COUNT(monotypeMons); i++) + { + for (u32 j = 0; j < ARRAY_COUNT(typeMoves); j++) + { + PARAMETRIZE { species = monotypeMons[i]; move = typeMoves[j]; } + } + } + + GIVEN { + FLAG_SET(B_FLAG_INVERSE_BATTLE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species); + } + WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + TURN { MOVE(player, move); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent); + if (gTypeEffectivenessTable[GetMoveType(move)][GetSpeciesType(species, 0)] == Q_4_12(2)) + MESSAGE("It's not very effective…"); + if (gTypeEffectivenessTable[GetMoveType(move)][GetSpeciesType(species, 0)] == Q_4_12(0.5)) + MESSAGE("It's super effective!"); + } +} + diff --git a/test/battle/item_effect/cure_status.c b/test/battle/item_effect/cure_status.c index 919b4539a..7b656e5c4 100644 --- a/test/battle/item_effect/cure_status.c +++ b/test/battle/item_effect/cure_status.c @@ -31,6 +31,29 @@ SINGLE_BATTLE_TEST("Antidote heals a battler from being poisoned") } } +DOUBLE_BATTLE_TEST("Antidote heals a battler from being poisoned (doubles)") +{ + u32 index; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + PARAMETRIZE { index = 0; user = playerRight; target = playerLeft; } + PARAMETRIZE { index = 1; user = playerLeft; target = playerRight; } + PARAMETRIZE { index = 0; user = playerLeft; target = playerLeft; } + PARAMETRIZE { index = 1; user = playerRight; target = playerRight; } + + GIVEN { + ASSUME(gItemsInfo[ITEM_ANTIDOTE].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_ANTIDOTE, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Antidote heals a battler from being badly poisoned") { GIVEN { @@ -54,7 +77,7 @@ SINGLE_BATTLE_TEST("Antidote resets Toxic Counter") OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_TOXIC); } - TURN { ; } + TURN {} TURN { USE_ITEM(player, ITEM_ANTIDOTE, partyIndex: 0); } } SCENE { MESSAGE("The opposing Wobbuffet used Toxic!"); @@ -135,6 +158,43 @@ SINGLE_BATTLE_TEST("Full Heal heals a battler from any primary status") } } +DOUBLE_BATTLE_TEST("Full Heal heals a battler from any primary status (doubles)") +{ + u32 statusParameters[7] = + { + STATUS1_SLEEP, + STATUS1_POISON, + STATUS1_BURN, + STATUS1_FREEZE, + STATUS1_PARALYSIS, + STATUS1_TOXIC_POISON, + STATUS1_FROSTBITE + }; + + u16 status = 0; + u32 index = 0; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + for (u32 j = 0; j < 7; j++) + { + PARAMETRIZE { status = statusParameters[j]; user = playerRight; target = playerLeft; index = 0; } + PARAMETRIZE { status = statusParameters[j]; user = playerLeft; target = playerRight; index = 1; } + PARAMETRIZE { status = statusParameters[j]; user = playerLeft; target = playerLeft; index = 0; } + PARAMETRIZE { status = statusParameters[j]; user = playerRight; target = playerRight; index = 1; } + } + GIVEN { + ASSUME(gItemsInfo[ITEM_FULL_HEAL].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_FULL_HEAL, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") { u16 status; @@ -158,6 +218,43 @@ SINGLE_BATTLE_TEST("Heal Powder heals a battler from any primary status") } } +DOUBLE_BATTLE_TEST("Heal Powder heals a battler from any primary status (doubles)") +{ + u32 statusParameters[7] = + { + STATUS1_SLEEP, + STATUS1_POISON, + STATUS1_BURN, + STATUS1_FREEZE, + STATUS1_PARALYSIS, + STATUS1_TOXIC_POISON, + STATUS1_FROSTBITE + }; + + u16 status = 0; + u32 index = 0; + struct BattlePokemon *user = NULL; + struct BattlePokemon *target = NULL; + for (u32 j = 0; j < 7; j++) + { + PARAMETRIZE { status = statusParameters[j]; user = playerRight; target = playerLeft; index = 0; } + PARAMETRIZE { status = statusParameters[j]; user = playerLeft; target = playerRight; index = 1; } + PARAMETRIZE { status = statusParameters[j]; user = playerLeft; target = playerLeft; index = 0; } + PARAMETRIZE { status = statusParameters[j]; user = playerRight; target = playerRight; index = 1; } + } + GIVEN { + ASSUME(gItemsInfo[ITEM_HEAL_POWDER].battleUsage == EFFECT_ITEM_CURE_STATUS); + PLAYER(SPECIES_WOBBUFFET) { Status1(status); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { USE_ITEM(user, ITEM_HEAL_POWDER, partyIndex: index); } + } THEN { + EXPECT_EQ(target->status1, STATUS1_NONE); + } +} + SINGLE_BATTLE_TEST("Pewter Crunchies heals a battler from any primary status") { u16 status; @@ -290,7 +387,7 @@ SINGLE_BATTLE_TEST("Lumiose Galette heals a battler from any primary status") } WHEN { TURN { USE_ITEM(player, ITEM_LUMIOSE_GALETTE, partyIndex: 0); } } SCENE { - MESSAGE("Wobbuffet had its status healed!");; + MESSAGE("Wobbuffet had its status healed!"); } THEN { EXPECT_EQ(player->status1, STATUS1_NONE); } @@ -367,7 +464,7 @@ SINGLE_BATTLE_TEST("Jubilife Muffin heals a battler from any primary status") SINGLE_BATTLE_TEST("Full Heal, Heal Powder and Local Specialties heal a battler from being confused") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_FULL_HEAL; } PARAMETRIZE { item = ITEM_HEAL_POWDER; } PARAMETRIZE { item = ITEM_PEWTER_CRUNCHIES; } diff --git a/test/battle/item_effect/dire_hit.c b/test/battle/item_effect/dire_hit.c index 10b9a28a6..27f62e7d0 100644 --- a/test/battle/item_effect/dire_hit.c +++ b/test/battle/item_effect/dire_hit.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Dire Hit increases a battler's critical hit chance by 2 stag PARAMETRIZE { genConfig = j; chance = 2; } // 50% PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(gItemsInfo[ITEM_DIRE_HIT].battleUsage == EFFECT_ITEM_SET_FOCUS_ENERGY); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/item_effect/heal_and_cure_status.c b/test/battle/item_effect/heal_and_cure_status.c index 99507df3c..bb7562537 100644 --- a/test/battle/item_effect/heal_and_cure_status.c +++ b/test/battle/item_effect/heal_and_cure_status.c @@ -43,8 +43,8 @@ SINGLE_BATTLE_TEST("Full Restore restores a party members HP and cures any prima PARAMETRIZE { status = STATUS1_SLEEP; } PARAMETRIZE { status = STATUS1_NONE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); Status1(status); } - PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(300); Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); Status1(status); } + PLAYER(SPECIES_WYNAUT) { HP(100); MaxHP(300); Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 1); } @@ -114,9 +114,9 @@ SINGLE_BATTLE_TEST("Full Restore restores a battler's HP and cures confusion") PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN{ MOVE(opponent, MOVE_CONFUSE_RAY); } - TURN{ USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 0); } - TURN{ MOVE(player, MOVE_SCRATCH); } + TURN { MOVE(opponent, MOVE_CONFUSE_RAY); } + TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 0); } + TURN { MOVE(player, MOVE_SCRATCH); } } SCENE { MESSAGE("Wobbuffet had its HP restored."); NONE_OF { MESSAGE("Wobbuffet is confused!"); } @@ -132,7 +132,7 @@ SINGLE_BATTLE_TEST("Full Restore resets Toxic Counter") OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_TOXIC); } - TURN { ; } + TURN {} TURN { USE_ITEM(player, ITEM_FULL_RESTORE, partyIndex: 0); } } SCENE { MESSAGE("The opposing Wobbuffet used Toxic!"); diff --git a/test/battle/item_effect/increase_stat.c b/test/battle/item_effect/increase_stat.c index b56f1a2b8..37b8501c4 100644 --- a/test/battle/item_effect/increase_stat.c +++ b/test/battle/item_effect/increase_stat.c @@ -1,4 +1,5 @@ #include "global.h" +#include "overworld.h" #include "test/battle.h" #include "constants/item_effects.h" @@ -262,12 +263,13 @@ SINGLE_BATTLE_TEST("Max Mushrooms raises battler's Speed stat", s16 damage) SINGLE_BATTLE_TEST("Using X items in battle raises Friendship", s16 damage) { u32 startingFriendship; - u8 metLocation = MAPSEC_NONE; + u8 metLocation = GetCurrentRegionMapSectionId() + 1; + PARAMETRIZE { startingFriendship = 0; } PARAMETRIZE { startingFriendship = X_ITEM_MAX_FRIENDSHIP; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); }; - // Set met location to MAPSEC_NONE to avoid getting the friendship boost + PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); } + // Set met location to currentMapSec + 1 to avoid getting the friendship boost // from being met in the current map section SetMonData(&PLAYER_PARTY[0], MON_DATA_MET_LOCATION, &metLocation); OPPONENT(SPECIES_WOBBUFFET); @@ -280,3 +282,25 @@ SINGLE_BATTLE_TEST("Using X items in battle raises Friendship", s16 damage) EXPECT_EQ(player->friendship, X_ITEM_FRIENDSHIP_INCREASE); } } + +SINGLE_BATTLE_TEST("Using X items in battle where Pokemon was met raises Friendship with a bonus", s16 damage) +{ + u32 startingFriendship; + u8 metLocation = GetCurrentRegionMapSectionId(); + + PARAMETRIZE { startingFriendship = 0; } + PARAMETRIZE { startingFriendship = X_ITEM_MAX_FRIENDSHIP; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(startingFriendship); } + // Set met location to currentMapSec to get the friendship boost + SetMonData(&PLAYER_PARTY[0], MON_DATA_MET_LOCATION, &metLocation); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { USE_ITEM(player, ITEM_X_ACCURACY); MOVE(opponent, MOVE_CELEBRATE); } + } THEN { + if (startingFriendship == X_ITEM_MAX_FRIENDSHIP) + EXPECT_EQ(player->friendship, X_ITEM_MAX_FRIENDSHIP); + else + EXPECT_EQ(player->friendship, (ITEM_FRIENDSHIP_MAPSEC_BONUS + X_ITEM_FRIENDSHIP_INCREASE)); + } +} diff --git a/test/battle/item_effect/restore_hp.c b/test/battle/item_effect/restore_hp.c index 286b91ccf..b8ec44332 100644 --- a/test/battle/item_effect/restore_hp.c +++ b/test/battle/item_effect/restore_hp.c @@ -3,7 +3,8 @@ SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount (singles, player)") { - u32 item, hp; + enum Item item; + u32 hp; PARAMETRIZE { item = ITEM_POTION; hp = 20; } PARAMETRIZE { item = ITEM_SUPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 60 : 50; } PARAMETRIZE { item = ITEM_HYPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 120 : 200; } @@ -31,7 +32,8 @@ SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount (singles, SINGLE_BATTLE_TEST("Items can restore a battler's HP by a fixed amount (singles, opponent)") { - u32 item, hp; + enum Item item; + u32 hp; PARAMETRIZE { item = ITEM_POTION; hp = 20; } PARAMETRIZE { item = ITEM_SUPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 60 : 50; } PARAMETRIZE { item = ITEM_HYPER_POTION; hp = I_HEALTH_RECOVERY >= GEN_7 ? 120 : 200; } @@ -187,7 +189,8 @@ DOUBLE_BATTLE_TEST("Items can restore a partner battler's HP (opponentLeft to op SINGLE_BATTLE_TEST("Items can restore a battler's HP by a percentage") { - u32 item, percentage; + enum Item item; + u32 percentage; PARAMETRIZE { item = ITEM_MAX_POTION; percentage = 100; } #if I_SITRUS_BERRY_HEAL >= GEN_4 PARAMETRIZE { item = ITEM_SITRUS_BERRY; percentage = 25; } diff --git a/test/battle/item_effect/revive.c b/test/battle/item_effect/revive.c index 9ff693fc3..f12c208fb 100644 --- a/test/battle/item_effect/revive.c +++ b/test/battle/item_effect/revive.c @@ -99,4 +99,128 @@ DOUBLE_BATTLE_TEST("Revive works for a partner in a double battle") } } +DOUBLE_BATTLE_TEST("Revive can trigger switch-in abilities") +{ + GIVEN { + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 0); SKIP_TURN(playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Revive does reset abilities") +{ + GIVEN { + PLAYER(SPECIES_ARBOK) { Ability(ABILITY_INTIMIDATE); HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentRight, MOVE_WORRY_SEED, target: playerLeft); MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 0); SKIP_TURN(playerLeft); MOVE(opponentRight, MOVE_SPORE, target: playerLeft); } + } SCENE { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 2); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death status condition") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_SLEEP); HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); } + } THEN { + EXPECT_EQ(opponentRight->status1, 0); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death stat change") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerRight, MOVE_SWORDS_DANCE); MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); } + } THEN { + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Revive does not grant a mon its pre-death types") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_POOCHYENA); + } WHEN { + TURN { MOVE(playerRight, MOVE_REFLECT_TYPE, target: opponentRight); MOVE(opponentLeft, MOVE_PSYSHOCK, target: playerRight); MOVE(opponentRight, MOVE_SCRATCH, target: playerRight); } + TURN { USE_ITEM(playerLeft, ITEM_MAX_REVIVE, partyIndex: 1); SKIP_TURN(playerRight); MOVE(opponentLeft, MOVE_PSYCHIC, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT_TYPE, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYSHOCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHIC, opponentLeft); + } THEN { + EXPECT_LT(playerRight->hp, playerRight->maxHP); + } +} + +DOUBLE_BATTLE_TEST("Revive force revived pokemon to replace absent battler immediately", s16 damage) +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_INTIMIDATE; } + PARAMETRIZE { ability = ABILITY_SHED_SKIN; } + + GIVEN { + PLAYER(SPECIES_WYNAUT) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_ARBOK) { Ability(ability); HP(0); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + TURN { USE_ITEM(playerRight, ITEM_REVIVE, partyIndex: 2); SKIP_TURN(playerLeft); MOVE(opponentRight, MOVE_SCRATCH, target: playerRight); } + } SCENE { + if (ability == ABILITY_INTIMIDATE) + { + ABILITY_POPUP(playerLeft, ABILITY_INTIMIDATE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + } +} + TO_DO_BATTLE_TEST("Revive won't restore a battler's HP if it hasn't fainted") diff --git a/test/battle/move.c b/test/battle/move.c index 3efab260a..473cca443 100644 --- a/test/battle/move.c +++ b/test/battle/move.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Accuracy controls the proportion of misses") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_DYNAMIC_PUNCH; } PARAMETRIZE { move = MOVE_THUNDER; } PARAMETRIZE { move = MOVE_HYDRO_PUMP; } @@ -23,7 +23,8 @@ SINGLE_BATTLE_TEST("Accuracy controls the proportion of misses") SINGLE_BATTLE_TEST("AdditionalEffect.chance controls the proportion of secondary effects") { - u32 move, chance; + enum Move move; + u32 chance; PARAMETRIZE { move = MOVE_THUNDER_SHOCK; chance = 10; } PARAMETRIZE { move = MOVE_DISCHARGE; chance = 30; } PARAMETRIZE { move = MOVE_NUZZLE; chance = 100; } @@ -142,7 +143,7 @@ SINGLE_BATTLE_TEST("Critical hits deal 100% (Gen 1-5) or 50% (Gen 6+) more damag PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_5; } PARAMETRIZE { criticalHit = TRUE; genConfig = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_MULTIPLIER, genConfig); + WITH_CONFIG(CONFIG_CRIT_MULTIPLIER, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -157,7 +158,7 @@ SINGLE_BATTLE_TEST("Critical hits deal 100% (Gen 1-5) or 50% (Gen 6+) more damag SINGLE_BATTLE_TEST("Critical hits do not ignore positive stat stages", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HOWL; } PARAMETRIZE { move = MOVE_TAIL_WHIP; } @@ -178,7 +179,7 @@ SINGLE_BATTLE_TEST("Critical hits do not ignore positive stat stages", s16 damag SINGLE_BATTLE_TEST("Critical hits ignore negative stat stages", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HARDEN; } PARAMETRIZE { move = MOVE_GROWL; } @@ -273,7 +274,7 @@ DOUBLE_BATTLE_TEST("Moves do not fail if an alive partner is the target") DOUBLE_BATTLE_TEST("Moves fail if they target into a Pokémon that was fainted by the previous move") { GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } @@ -296,7 +297,7 @@ DOUBLE_BATTLE_TEST("Moves fail if they target into a Pokémon that was fainted b DOUBLE_BATTLE_TEST("Moves that target the field are not going to fail if one mon fainted by the previous move") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_animations/all_anims.c b/test/battle/move_animations/all_anims.c index 11b286084..78f870d02 100644 --- a/test/battle/move_animations/all_anims.c +++ b/test/battle/move_animations/all_anims.c @@ -11,67 +11,43 @@ static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies, u32 variation) { - if (gMovesInfo[j].effect == EFFECT_DARK_VOID) // User needs to be Darkrai + enum BattleMoveEffects effect = GetMoveEffect(j); + if (effect == EFFECT_DARK_VOID) // User needs to be Darkrai { *pMove = j; *pSpecies = SPECIES_DARKRAI; } - else if (gMovesInfo[j].effect == EFFECT_HYPERSPACE_FURY) // User needs to be Hoopa Unbound + else if (effect == EFFECT_HYPERSPACE_FURY) // User needs to be Hoopa Unbound { *pMove = j; *pSpecies = SPECIES_HOOPA_UNBOUND; } - else if (gMovesInfo[j].effect == EFFECT_AURA_WHEEL) // User needs to be Morpeko + else if (effect == EFFECT_AURA_WHEEL) // User needs to be Morpeko { *pMove = j; *pSpecies = SPECIES_MORPEKO_FULL_BELLY; } - else if (gMovesInfo[j].effect == EFFECT_ROTOTILLER || gMovesInfo[j].effect == EFFECT_FLOWER_SHIELD) // User needs to be Grass-type + else if (effect == EFFECT_ROTOTILLER || effect == EFFECT_FLOWER_SHIELD) // User needs to be Grass-type { *pMove = j; *pSpecies = SPECIES_TANGELA; } - else if (gMovesInfo[j].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && gMovesInfo[j].argument.type == TYPE_FIRE) // User needs to be Fire-type + else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_FIRE) // User needs to be Fire-type { *pMove = j; *pSpecies = SPECIES_FLAREON; } - else if (gMovesInfo[j].effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && gMovesInfo[j].argument.type == TYPE_ELECTRIC) // User needs to be Electric-type + else if (effect == EFFECT_FAIL_IF_NOT_ARG_TYPE && GetMoveArgType(j) == TYPE_ELECTRIC) // User needs to be Electric-type { *pMove = j; *pSpecies = SPECIES_JOLTEON; } - else if (gMovesInfo[j].effect == EFFECT_CURSE && variation == 1) // User needs to be Ghost-type - { - *pMove = j; - *pSpecies = SPECIES_GASTLY; - } - else if (gMovesInfo[j].effect == EFFECT_MAGNETIC_FLUX || gMovesInfo[j].effect == EFFECT_GEAR_UP) // User needs to have Plus + else if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // User needs to have Plus { *pMove = j; *pSpecies = SPECIES_KLINKLANG; } - else if (gMovesInfo[j].effect == EFFECT_IVY_CUDGEL && variation > 0) - { - *pMove = j; - if (variation == 1) - *pSpecies = SPECIES_OGERPON_WELLSPRING; - else if (variation == 2) - *pSpecies = SPECIES_OGERPON_HEARTHFLAME; - else - *pSpecies = SPECIES_OGERPON_CORNERSTONE; - } - else if (gMovesInfo[j].effect == EFFECT_DRAGON_DARTS && variation > 0) - { - *pMove = j; - *pSpecies = SPECIES_DRAGAPULT; - } - else if (gMovesInfo[j].effect == EFFECT_TERA_STARSTORM && variation == 1) - { - *pMove = j; - *pSpecies = SPECIES_TERAPAGOS_STELLAR; - } - else if (gMovesInfo[j].effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves + else if (effect == EFFECT_PLACEHOLDER) // Ignore placeholder *pMoves { *pMove = MOVE_POUND; *pSpecies = SPECIES_WOBBUFFET; @@ -83,7 +59,7 @@ static void ParametrizeMovesAndSpecies(u32 j, u32 *pMove, u32 *pSpecies, u32 var } } -static u32 ParametrizeFriendship(u32 move, u32 variation) +static u32 ParametrizeFriendship(enum Move move, u32 variation) { if (gMovesInfo[move].effect == EFFECT_FRUSTRATION || gMovesInfo[move].effect == EFFECT_RETURN @@ -101,7 +77,7 @@ static u32 ParametrizeFriendship(u32 move, u32 variation) return 0; } -static u32 GetParametrizedHP(u32 move, u32 variation) +static u32 GetParametrizedHP(enum Move move, u32 variation) { if (gMovesInfo[move].effect == EFFECT_POWER_BASED_ON_USER_HP && variation > 0) { @@ -115,7 +91,7 @@ static u32 GetParametrizedHP(u32 move, u32 variation) return 9997; } -static u32 GetParametrizedItem(u32 move, u32 variation) +static u32 GetParametrizedItem(enum Move move, u32 variation) { if ((move == MOVE_TECHNO_BLAST) && variation > 0) { @@ -131,7 +107,7 @@ static u32 GetParametrizedItem(u32 move, u32 variation) return ITEM_ORAN_BERRY; } -static u32 GetParametrizedLevel(u32 move, u32 variation) +static u32 GetParametrizedLevel(enum Move move, u32 variation) { if (gMovesInfo[move].effect == EFFECT_LEVEL_DAMAGE && variation > 0) { @@ -143,62 +119,67 @@ static u32 GetParametrizedLevel(u32 move, u32 variation) return 100; } -static bool32 GetParametrizedShinyness(u32 move, u32 variation) +static bool32 GetParametrizedShinyness(enum Move move, u32 variation) { - if ((gMovesInfo[move].effect == EFFECT_DRAGON_DARTS && variation == 2) - || (move == MOVE_SYRUP_BOMB && variation == 1) + if ((GetMoveAnimationScript(move) == gBattleAnimMove_DragonDarts && variation == 2) + || (GetMoveAnimationScript(move) == gBattleAnimMove_SyrupBomb && variation == 1) ) return TRUE; return FALSE; } -static bool32 TargetHasToMove(u32 move) // Opponent needs to hit the player first +static bool32 TargetHasToMove(enum Move move) // Opponent needs to hit the player first { - if (gMovesInfo[move].effect == EFFECT_COUNTER - || gMovesInfo[move].effect == EFFECT_MIRROR_MOVE - || gMovesInfo[move].effect == EFFECT_CONVERSION_2 - || gMovesInfo[move].effect == EFFECT_MIRROR_COAT - || gMovesInfo[move].effect == EFFECT_METAL_BURST - || gMovesInfo[move].effect == EFFECT_COPYCAT - || gMovesInfo[move].effect == EFFECT_SUCKER_PUNCH - || gMovesInfo[move].effect == EFFECT_INSTRUCT) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_REFLECT_DAMAGE + || effect == EFFECT_MIRROR_MOVE + || effect == EFFECT_CONVERSION_2 + || effect == EFFECT_COPYCAT + || effect == EFFECT_SUCKER_PUNCH + || effect == EFFECT_INSTRUCT + || effect == EFFECT_DISABLE + || effect == EFFECT_MIMIC + || effect == EFFECT_SPITE + || effect == EFFECT_ENCORE) return TRUE; return FALSE; } -static bool32 AttackerHasToSwitch(u32 move) // User needs to send out a different team member +static bool32 AttackerHasToSwitch(enum Move move) // User needs to send out a different team member { - if (gMovesInfo[move].effect == EFFECT_TELEPORT - || gMovesInfo[move].effect == EFFECT_EXPLOSION - || gMovesInfo[move].effect == EFFECT_MISTY_EXPLOSION - || gMovesInfo[move].effect == EFFECT_BATON_PASS - || gMovesInfo[move].effect == EFFECT_MEMENTO - || gMovesInfo[move].effect == EFFECT_HEALING_WISH - || gMovesInfo[move].effect == EFFECT_HIT_ESCAPE - || gMovesInfo[move].effect == EFFECT_FINAL_GAMBIT - || gMovesInfo[move].effect == EFFECT_PARTING_SHOT - || gMovesInfo[move].effect == EFFECT_SHED_TAIL - || gMovesInfo[move].effect == EFFECT_CHILLY_RECEPTION) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (IsExplosionMove(move) + || effect == EFFECT_TELEPORT + || effect == EFFECT_BATON_PASS + || effect == EFFECT_MEMENTO + || effect == EFFECT_HEALING_WISH + || effect == EFFECT_LUNAR_DANCE + || effect == EFFECT_HIT_ESCAPE + || effect == EFFECT_FINAL_GAMBIT + || effect == EFFECT_PARTING_SHOT + || effect == EFFECT_SHED_TAIL + || effect == EFFECT_WEATHER_AND_SWITCH) return TRUE; return FALSE; } -static bool32 UserHasToGoFirst(u32 move) // Player needs to go first +static bool32 UserHasToGoFirst(enum Move move) // Player needs to go first { - if (gMovesInfo[move].effect == EFFECT_PROTECT - || gMovesInfo[move].effect == EFFECT_ENDURE - || gMovesInfo[move].effect == EFFECT_FOLLOW_ME - || gMovesInfo[move].effect == EFFECT_MAGIC_COAT - || gMovesInfo[move].effect == EFFECT_ME_FIRST - || gMovesInfo[move].effect == EFFECT_QUASH - || gMovesInfo[move].effect == EFFECT_MAT_BLOCK - || gMovesInfo[move].effect == EFFECT_ELECTRIFY - || gMovesInfo[move].effect == EFFECT_SHELL_TRAP) + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_PROTECT + || effect == EFFECT_ENDURE + || effect == EFFECT_FOLLOW_ME + || effect == EFFECT_MAGIC_COAT + || effect == EFFECT_ME_FIRST + || effect == EFFECT_QUASH + || effect == EFFECT_MAT_BLOCK + || effect == EFFECT_ELECTRIFY + || effect == EFFECT_SHELL_TRAP) return TRUE; return FALSE; } -static u32 GetVariationsNumber(u32 move, bool8 isDouble) +static u32 GetVariationsNumber(enum Move move, bool8 isDouble) { u32 variationsNumber; @@ -213,7 +194,7 @@ static u32 GetVariationsNumber(u32 move, bool8 isDouble) variationsNumber = 4; else if (gMovesInfo[move].effect == EFFECT_SPIT_UP || gMovesInfo[move].effect == EFFECT_SWALLOW - || gMovesInfo[move].effect == EFFECT_DRAGON_DARTS + || GetMoveAnimationScript(move) == gBattleAnimMove_DragonDarts || move == MOVE_SEISMIC_TOSS) variationsNumber = 3; else if (gMovesInfo[move].effect == EFFECT_CURSE @@ -228,59 +209,60 @@ static u32 GetVariationsNumber(u32 move, bool8 isDouble) variationsNumber = 1; return variationsNumber; } -static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 variation) +static void WhenSingles(enum Move move, struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 variation) { + enum BattleMoveEffects effect = GetMoveEffect(move); // Setup turn - if (gMovesInfo[move].effect == EFFECT_SNORE - || gMovesInfo[move].effect == EFFECT_SLEEP_TALK) + if (effect == EFFECT_SNORE + || effect == EFFECT_SLEEP_TALK) { // attacker needs to be asleep TURN { MOVE(attacker, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_SPIT_UP - || gMovesInfo[move].effect == EFFECT_SWALLOW) + else if (effect == EFFECT_SPIT_UP + || effect == EFFECT_SWALLOW) { // attacker needs to have used Stockpile for (u32 i = 0; i <= variation; i++) { TURN { MOVE(attacker, MOVE_STOCKPILE); } } } - else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) + else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS)) { // defender needs to be paralyzed TURN { MOVE(attacker, MOVE_THUNDER_WAVE); } } - else if (gMovesInfo[move].effect == EFFECT_RECYCLE - || gMovesInfo[move].effect == EFFECT_BELCH) + else if (effect == EFFECT_RECYCLE + || effect == EFFECT_BELCH) { // attacker needs to have eaten its Berry TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); } } - else if (gMovesInfo[move].effect == EFFECT_REFRESH - || gMovesInfo[move].effect == EFFECT_PSYCHO_SHIFT) + else if (effect == EFFECT_REFRESH + || effect == EFFECT_PSYCHO_SHIFT) { // attacker needs to be paralyzed TURN { MOVE(defender, MOVE_THUNDER_WAVE); } } - else if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) + else if (effect == EFFECT_LAST_RESORT) { // attacker needs to have used all other moves TURN { MOVE(attacker, MOVE_POUND); } } - else if (gMovesInfo[move].effect == EFFECT_DREAM_EATER - || gMovesInfo[move].effect == EFFECT_NIGHTMARE) + else if (effect == EFFECT_DREAM_EATER + || effect == EFFECT_NIGHTMARE) { // defender needs to be asleep TURN { MOVE(defender, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_VENOM_DRENCH - || gMovesInfo[move].effect == EFFECT_PURIFY) + else if (effect == EFFECT_VENOM_DRENCH + || effect == EFFECT_PURIFY) { // defender needs to be poisoned TURN { MOVE(attacker, MOVE_POISON_POWDER); } } - else if (gMovesInfo[move].effect == EFFECT_TOPSY_TURVY) + else if (effect == EFFECT_TOPSY_TURVY) { // defender needs to have its stats buffed TURN { MOVE(defender, MOVE_SWORDS_DANCE); } } - else if (gMovesInfo[move].effect == EFFECT_AURORA_VEIL) + else if (effect == EFFECT_AURORA_VEIL) { // Has to be hailing TURN { MOVE(attacker, MOVE_HAIL); } } - else if (gMovesInfo[move].effect == EFFECT_STEEL_ROLLER) + else if (effect == EFFECT_STEEL_ROLLER) { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } @@ -312,17 +294,23 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP } // Effective turn TURN { - if (TargetHasToMove(move)) + if (effect == EFFECT_REFLECT_DAMAGE) { - MOVE(defender, gMovesInfo[move].effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND); + bool32 useSpecialMove = GetMoveReflectDamage_DamageCategories(move) == 1u << DAMAGE_CATEGORY_SPECIAL; + MOVE(defender, useSpecialMove ? MOVE_SWIFT : MOVE_POUND); MOVE(attacker, move); } - else if (gMovesInfo[move].effect == EFFECT_SNATCH) + else if (TargetHasToMove(move)) + { + MOVE(defender, MOVE_POUND); + MOVE(attacker, move); + } + else if (effect == EFFECT_SNATCH) { // defender needs to steal the defender's buffing move MOVE(attacker, move); MOVE(defender, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO || gMovesInfo[move].effect == EFFECT_SHEER_COLD) + else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD) { // defender needs to send out a different team member MOVE(attacker, move); SEND_OUT(defender, 1); @@ -337,17 +325,17 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move); MOVE(defender, MOVE_POUND); } - else if (gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING) + else if (effect == EFFECT_REVIVAL_BLESSING) { // attacker selects party member MOVE(attacker, move, partyIndex: 1); MOVE(defender, MOVE_HELPING_HAND); } - else if (gMovesInfo[move].effect == EFFECT_UPPER_HAND) + else if (effect == EFFECT_UPPER_HAND) { // defender needs to choose priority move MOVE(attacker, move); MOVE(defender, MOVE_QUICK_ATTACK); } - else if (gMovesInfo[move].effect == EFFECT_ACUPRESSURE) + else if (effect == EFFECT_ACUPRESSURE) { MOVE(attacker, move, target: attacker); } @@ -401,32 +389,33 @@ static void WhenSingles(u32 move, struct BattlePokemon *attacker, struct BattleP } else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) { - TURN {MOVE(attacker, move);}; - TURN {MOVE(attacker, move);}; - TURN {MOVE(attacker, move);}; - TURN {MOVE(attacker, move);}; - TURN {MOVE(attacker, MOVE_HELPING_HAND);}; + TURN { MOVE(attacker, move); } + TURN { MOVE(attacker, move); } + TURN { MOVE(attacker, move); } + TURN { MOVE(attacker, move); } + TURN { MOVE(attacker, MOVE_HELPING_HAND); } } } -static void SceneSingles(u32 move, struct BattlePokemon *mon) +static void SceneSingles(enum Move move, struct BattlePokemon *mon) { - if (gMovesInfo[move].effect == EFFECT_FOLLOW_ME - || gMovesInfo[move].effect == EFFECT_HELPING_HAND - || gMovesInfo[move].effect == EFFECT_AFTER_YOU - || gMovesInfo[move].effect == EFFECT_ALLY_SWITCH - || gMovesInfo[move].effect == EFFECT_AROMATIC_MIST + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_FOLLOW_ME + || effect == EFFECT_HELPING_HAND + || effect == EFFECT_AFTER_YOU + || effect == EFFECT_ALLY_SWITCH + || effect == EFFECT_AROMATIC_MIST || move == MOVE_HOLD_HANDS // Hack here because it shares its effect with Splash and Celebrate - || gMovesInfo[move].effect == EFFECT_COACHING - || gMovesInfo[move].effect == EFFECT_DRAGON_CHEER) + || effect == EFFECT_COACHING + || effect == EFFECT_DRAGON_CHEER) { // Moves that fail in Single Battles } - else if (gMovesInfo[move].effect == EFFECT_MIRROR_MOVE) // Copy the opponent's move + else if (effect == EFFECT_MIRROR_MOVE) // Copy the opponent's move { ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, mon); } - else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING + else if (effect == EFFECT_NATURE_POWER) // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING { ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, mon); } @@ -436,59 +425,60 @@ static void SceneSingles(u32 move, struct BattlePokemon *mon) } } -static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2, u32 variation) +static void DoublesWhen(enum Move move, struct BattlePokemon *attacker, struct BattlePokemon *target, struct BattlePokemon *ignore1, struct BattlePokemon *ignore2, u32 variation) { + enum BattleMoveEffects effect = GetMoveEffect(move); // Setup turn - if (gMovesInfo[move].effect == EFFECT_SNORE - || gMovesInfo[move].effect == EFFECT_SLEEP_TALK) + if (effect == EFFECT_SNORE + || effect == EFFECT_SLEEP_TALK) { // Player needs to be asleep TURN { MOVE(attacker, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_SPIT_UP - || gMovesInfo[move].effect == EFFECT_SWALLOW) + else if (effect == EFFECT_SPIT_UP + || effect == EFFECT_SWALLOW) { // Player needs to have used Stockpile for (u32 i = 0; i <= variation; i++) { TURN { MOVE(attacker, MOVE_STOCKPILE); } } } - else if ((gMovesInfo[move].effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && gMovesInfo[move].argument.status == STATUS1_PARALYSIS)) + else if ((effect == EFFECT_DOUBLE_POWER_ON_ARG_STATUS && GetMoveEffectArg_Status(move) == STATUS1_PARALYSIS)) { // Opponent needs to be paralyzed TURN { MOVE(attacker, MOVE_THUNDER_WAVE, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_RECYCLE - || gMovesInfo[move].effect == EFFECT_BELCH) + else if (effect == EFFECT_RECYCLE + || effect == EFFECT_BELCH) { // Player needs to have eaten its Berry TURN { MOVE(attacker, MOVE_STUFF_CHEEKS); } } - else if (gMovesInfo[move].effect == EFFECT_REFRESH - || gMovesInfo[move].effect == EFFECT_PSYCHO_SHIFT) + else if (effect == EFFECT_REFRESH + || effect == EFFECT_PSYCHO_SHIFT) { // Player needs to be paralyzed TURN { MOVE(target, MOVE_THUNDER_WAVE, target: attacker); } } - else if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) + else if (effect == EFFECT_LAST_RESORT) { // Player needs to have used all other moves TURN { MOVE(attacker, MOVE_POUND, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_DREAM_EATER - || gMovesInfo[move].effect == EFFECT_NIGHTMARE) + else if (effect == EFFECT_DREAM_EATER + || effect == EFFECT_NIGHTMARE) { // Opponent needs to be asleep TURN { MOVE(target, MOVE_REST); } } - else if (gMovesInfo[move].effect == EFFECT_VENOM_DRENCH - || gMovesInfo[move].effect == EFFECT_PURIFY) + else if (effect == EFFECT_VENOM_DRENCH + || effect == EFFECT_PURIFY) { // Opponent needs to be poisoned TURN { MOVE(attacker, MOVE_POISON_POWDER, target: target); } } - else if (gMovesInfo[move].effect == EFFECT_TOPSY_TURVY) + else if (effect == EFFECT_TOPSY_TURVY) { // Opponent needs to have its stats buffed TURN { MOVE(target, MOVE_SWORDS_DANCE); } } - else if (gMovesInfo[move].effect == EFFECT_AURORA_VEIL) + else if (effect == EFFECT_AURORA_VEIL) { // Has to be hailing TURN { MOVE(attacker, MOVE_HAIL); } } - else if (gMovesInfo[move].effect == EFFECT_STEEL_ROLLER) + else if (effect == EFFECT_STEEL_ROLLER) { // Needs a terrain TURN { MOVE(attacker, MOVE_ELECTRIC_TERRAIN); } } @@ -520,17 +510,23 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP } // Effective turn TURN { - if (TargetHasToMove(move)) - { // Opponent needs to hit the player first - MOVE(target, gMovesInfo[move].effect == EFFECT_MIRROR_COAT ? MOVE_SWIFT : MOVE_POUND, target: attacker); + if (effect == EFFECT_REFLECT_DAMAGE) + { + bool32 useSpecialMove = GetMoveReflectDamage_DamageCategories(move) == 1u << DAMAGE_CATEGORY_SPECIAL; + MOVE(target, useSpecialMove ? MOVE_SWIFT : MOVE_POUND, target: attacker); + MOVE(attacker, move); + } + else if (TargetHasToMove(move)) + { + MOVE(target, MOVE_POUND, target: attacker); MOVE(attacker, move, target: target); } - else if (gMovesInfo[move].effect == EFFECT_SNATCH) + else if (effect == EFFECT_SNATCH) { // Opponent needs to steal the opponent's buffing move MOVE(attacker, move, target: target); MOVE(target, MOVE_SWORDS_DANCE); } - else if (gMovesInfo[move].effect == EFFECT_OHKO || gMovesInfo[move].effect == EFFECT_SHEER_COLD) + else if (effect == EFFECT_OHKO || effect == EFFECT_SHEER_COLD) { // Opponent needs to send out a different team member MOVE(attacker, move, target: target); SEND_OUT(target, 2); @@ -545,19 +541,19 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(attacker, move, target: target); MOVE(target, MOVE_POUND, target: attacker); } - else if (gMovesInfo[move].effect == EFFECT_AFTER_YOU) + else if (effect == EFFECT_AFTER_YOU) { // Player goes first, opponent third MOVE(attacker, move, target: target); MOVE(ignore1, MOVE_CELEBRATE); MOVE(target, MOVE_POUND, target: attacker); MOVE(ignore2, MOVE_CELEBRATE); } - else if (gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING) + else if (effect == EFFECT_REVIVAL_BLESSING) { // Player selects party member MOVE(attacker, move, partyIndex: 2); MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side. } - else if (gMovesInfo[move].effect == EFFECT_UPPER_HAND) + else if (effect == EFFECT_UPPER_HAND) { // Opponent needs to choose priority move MOVE(attacker, move, target: target); MOVE(target, MOVE_QUICK_ATTACK, target: attacker); @@ -600,7 +596,7 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP MOVE(target, MOVE_LAST_RESORT, target: attacker); // Last Resort, so there's no anim on the opponent's side. MOVE(attacker, move, target: target); } - if (gMovesInfo[move].effect != EFFECT_AFTER_YOU) + if (effect != EFFECT_AFTER_YOU) { // Actions for the remaining battlers MOVE(ignore1, MOVE_CELEBRATE); @@ -618,25 +614,26 @@ static void DoublesWhen(u32 move, struct BattlePokemon *attacker, struct BattleP } else if (gMovesInfo[move].effect == EFFECT_ROLLOUT) { - TURN {MOVE(attacker, move, target: target);}; - TURN {MOVE(attacker, move, target: target);}; - TURN {MOVE(attacker, move, target: target);}; - TURN {MOVE(attacker, move, target: target);}; - TURN {MOVE(attacker, MOVE_LAST_RESORT, target: attacker);}; + TURN { MOVE(attacker, move, target: target); } + TURN { MOVE(attacker, move, target: target); } + TURN { MOVE(attacker, move, target: target); } + TURN { MOVE(attacker, move, target: target); } + TURN { MOVE(attacker, MOVE_LAST_RESORT, target: attacker); } } } -static void DoublesScene(u32 move, struct BattlePokemon *attacker) +static void DoublesScene(enum Move move, struct BattlePokemon *attacker) { - if (gMovesInfo[move].effect == EFFECT_MAGNETIC_FLUX || gMovesInfo[move].effect == EFFECT_GEAR_UP) // For some reason, Magnetic Flux and Gear Up are failing in Double Battles here + enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_MAGNETIC_FLUX || effect == EFFECT_GEAR_UP) // For some reason, Magnetic Flux and Gear Up are failing in Double Battles here { // Moves that fail in Double Battles } - else if (gMovesInfo[move].effect == EFFECT_MIRROR_MOVE) + else if (effect == EFFECT_MIRROR_MOVE) { // Copy the opponent's move ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, attacker); } - else if (gMovesInfo[move].effect == EFFECT_NATURE_POWER) + else if (effect == EFFECT_NATURE_POWER) { // Recorded battles always use BATTLE_ENVIRONMENT_BUILDING ANIMATION(ANIM_TYPE_MOVE, B_NATURE_POWER_MOVES >= GEN_4 ? MOVE_TRI_ATTACK : MOVE_SWIFT, attacker); } @@ -646,7 +643,7 @@ static void DoublesScene(u32 move, struct BattlePokemon *attacker) } } -//static void SameSideTargeting(u32 move, struct BattlePokemon *attacker) +//static void SameSideTargeting(enum Move move, struct BattlePokemon *attacker) //{ // // Don't know how to make sure this is correct, some moves don't display //} @@ -663,7 +660,7 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -671,18 +668,18 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op Level(GetParametrizedLevel(move, variation)); HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } @@ -692,9 +689,10 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (player to op SceneSingles(move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -710,7 +708,7 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -718,18 +716,18 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to Level(GetParametrizedLevel(move, variation)); HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } @@ -739,9 +737,10 @@ SINGLE_BATTLE_TEST("Move Animations don't leak when used - Singles (opponent to SceneSingles(move, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -761,7 +760,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -770,7 +769,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -782,7 +781,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -790,16 +789,16 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } @@ -809,9 +808,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -831,7 +831,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -840,7 +840,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -851,7 +851,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -859,17 +859,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -880,9 +880,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -902,7 +903,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -911,7 +912,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -922,7 +923,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -930,17 +931,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -951,9 +952,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -973,7 +975,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -982,7 +984,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -993,7 +995,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1001,17 +1003,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1022,9 +1024,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1044,7 +1047,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -1053,7 +1056,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1064,7 +1067,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1072,17 +1075,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1093,9 +1096,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1115,7 +1119,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -1124,7 +1128,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1135,7 +1139,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1143,17 +1147,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1164,9 +1168,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentLeft DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1186,7 +1191,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -1195,7 +1200,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1206,7 +1211,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == playerRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1214,17 +1219,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1235,9 +1240,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1257,7 +1263,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -1266,7 +1272,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1277,7 +1283,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); @@ -1285,17 +1291,17 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1306,9 +1312,10 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh DoublesScene(move, attacker); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1331,7 +1338,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1339,23 +1346,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1367,7 +1374,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerLeft t } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1390,7 +1397,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1398,23 +1405,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1426,7 +1433,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (playerRight } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1449,7 +1456,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1457,23 +1464,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1485,7 +1492,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentleft } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1508,7 +1515,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentLeft) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } @@ -1516,23 +1523,23 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh HP(9997); MaxHP(9999); Item(ITEM_ORAN_BERRY); if (attacker == opponentRight) { if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); } } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND, MOVE_CELEBRATE); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) { + if (GetMoveEffect(move) != EFFECT_BESTOW) { Item(ITEM_ORAN_BERRY); } } @@ -1544,7 +1551,7 @@ DOUBLE_BATTLE_TEST("Move Animations don't leak when used - Doubles (opponentRigh } THEN { FORCE_MOVE_ANIM(FALSE); if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); } } @@ -1562,7 +1569,7 @@ SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - for (k = 0; k < variationsNumber; k++) { ParametrizeMovesAndSpecies(j, &tempMove, &tempSpecies, k); tempFriendship = ParametrizeFriendship(j, k); - PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship;} + PARAMETRIZE { move = tempMove; species = tempSpecies; variation = k; friendship = tempFriendship; } } } GIVEN { @@ -1570,29 +1577,29 @@ SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - Level(GetParametrizedLevel(move, variation)); HP(GetParametrizedHP(move, variation)); MaxHP(9999); Item(GetParametrizedItem(move, variation)); if (species == SPECIES_WOBBUFFET) Gender(MON_FEMALE); - if (gMovesInfo[move].effect == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); + if (GetMoveEffect(move) == EFFECT_LAST_RESORT) Moves(move, MOVE_POUND); if (species == SPECIES_KLINKLANG) Ability(ABILITY_PLUS); if (friendship) Friendship(friendship); if (GetParametrizedShinyness(move, variation)) Shiny(TRUE); } PLAYER(SPECIES_WOBBUFFET) { Gender(MON_MALE); MaxHP(9999); Moves(MOVE_POUND); - HP(gMovesInfo[move].effect == EFFECT_REVIVAL_BLESSING ? 0 : 9998); + HP(GetMoveEffect(move) == EFFECT_REVIVAL_BLESSING ? 0 : 9998); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_MALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); Ability(ABILITY_TELEPATHY); - if (gMovesInfo[move].effect != EFFECT_BESTOW) + if (GetMoveEffect(move) != EFFECT_BESTOW) Item(ITEM_ORAN_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Gender(MON_FEMALE); HP(9998); MaxHP(9999); SpDefense(9999); Defense(9999); } } WHEN { WhenSingles(move, player, opponent, variation); } SCENE { - if (!(gMovesInfo[move].effect == EFFECT_RECYCLE - || gMovesInfo[move].effect == EFFECT_BELCH - || gMovesInfo[move].effect == EFFECT_SPIT_UP - || gMovesInfo[move].effect == EFFECT_SWALLOW - || gMovesInfo[move].effect == EFFECT_TOPSY_TURVY)) // require a move that boosts stats before using this move + if (!(GetMoveEffect(move) == EFFECT_RECYCLE + || GetMoveEffect(move) == EFFECT_BELCH + || GetMoveEffect(move) == EFFECT_SPIT_UP + || GetMoveEffect(move) == EFFECT_SWALLOW + || GetMoveEffect(move) == EFFECT_TOPSY_TURVY)) // require a move that boosts stats before using this move { NONE_OF { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); @@ -1602,9 +1609,10 @@ SINGLE_BATTLE_TEST("Move Animations occur before their stat change animations - SceneSingles(move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1670,9 +1678,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (player to opponent)" ANIMATION(ANIM_TYPE_MOVE, zmove, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1699,9 +1708,10 @@ SINGLE_BATTLE_TEST("Z-Moves don't leak when used - Singles (opponent to player)" ANIMATION(ANIM_TYPE_MOVE, zmove, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1730,9 +1740,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1761,9 +1772,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerLeft to oppone ANIMATION(ANIM_TYPE_MOVE, zmove, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1792,9 +1804,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1823,9 +1836,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (playerRight to oppon ANIMATION(ANIM_TYPE_MOVE, zmove, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1854,9 +1868,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1885,9 +1900,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentLeft to play ANIMATION(ANIM_TYPE_MOVE, zmove, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1916,9 +1932,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1947,9 +1964,10 @@ DOUBLE_BATTLE_TEST("Z-Moves don't leak when used - Doubles (opponentRight to pla ANIMATION(ANIM_TYPE_MOVE, zmove, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -1992,9 +2010,10 @@ SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (player to oppon ANIMATION(ANIM_TYPE_MOVE, move, player); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2014,9 +2033,10 @@ SINGLE_BATTLE_TEST("Tera Blast doesn't leak when used - Singles (opponent to pla ANIMATION(ANIM_TYPE_MOVE, move, opponent); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2038,9 +2058,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to o ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2062,9 +2083,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerLeft to o ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2086,9 +2108,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to ANIMATION(ANIM_TYPE_MOVE, move, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2110,9 +2133,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (playerRight to ANIMATION(ANIM_TYPE_MOVE, move, playerRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2134,9 +2158,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2158,9 +2183,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentLeft to ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2182,9 +2208,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight t ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } @@ -2206,9 +2233,10 @@ DOUBLE_BATTLE_TEST("Tera Blast doesn't leak when used - Doubles (opponentRight t ANIMATION(ANIM_TYPE_MOVE, move, opponentRight); } THEN { FORCE_MOVE_ANIM(FALSE); - if (gLoadFail) - DebugPrintf("Move failed: %S (%u)", gMovesInfo[move].name, move); + if (gLoadFail || gSpriteAllocs != 0) + DebugPrintf("Move failed: %S (%u)", GetMoveName(move), move); EXPECT_EQ(gLoadFail, FALSE); + EXPECT_EQ(gSpriteAllocs, 0); } } diff --git a/test/battle/move_effect/absorb.c b/test/battle/move_effect/absorb.c index d497bc3f0..922d16fa0 100644 --- a/test/battle/move_effect/absorb.c +++ b/test/battle/move_effect/absorb.c @@ -118,3 +118,17 @@ SINGLE_BATTLE_TEST("Absorb does not drain any HP if user does 0 damage") NOT MESSAGE("The opposing Wobbuffet had its energy drained!"); } } + +SINGLE_BATTLE_TEST("Absorb does not drain any HP if the move is blocked by Disguise") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_ABSORB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ABSORB, player); + } THEN { + EXPECT_EQ(player->hp, 1); + } +} diff --git a/test/battle/move_effect/acrobatics.c b/test/battle/move_effect/acrobatics.c index 1229d4e2c..916580d90 100644 --- a/test/battle/move_effect/acrobatics.c +++ b/test/battle/move_effect/acrobatics.c @@ -20,7 +20,7 @@ SINGLE_BATTLE_TEST("Acrobatics doubles in power if the user has no held item", s } SCENE { HP_BAR(player, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(2), results[1].damage); + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); } } diff --git a/test/battle/move_effect/after_you.c b/test/battle/move_effect/after_you.c index 9d0464f72..91742f459 100644 --- a/test/battle/move_effect/after_you.c +++ b/test/battle/move_effect/after_you.c @@ -89,7 +89,7 @@ DOUBLE_BATTLE_TEST("After You calculates correct turn order if only one Pokémon DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after After You (Gen5-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_AFTER_YOU_TURN_ORDER, GEN_7); + WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } @@ -114,7 +114,7 @@ DOUBLE_BATTLE_TEST("After You fails if the turn order remains the same after Aft DOUBLE_BATTLE_TEST("After You doesn't fail if the turn order remains the same after After You (Gen8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_AFTER_YOU_TURN_ORDER, GEN_8); + WITH_CONFIG(CONFIG_AFTER_YOU_TURN_ORDER, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WYNAUT) { Speed(1); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } diff --git a/test/battle/move_effect/ally_switch.c b/test/battle/move_effect/ally_switch.c index a7fddb247..f0736b738 100644 --- a/test/battle/move_effect/ally_switch.c +++ b/test/battle/move_effect/ally_switch.c @@ -42,7 +42,7 @@ DOUBLE_BATTLE_TEST("Ally Switch changes the position of battlers") { GIVEN { ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); - ASSUME(GetMoveTarget(MOVE_SCREECH) == MOVE_TARGET_SELECTED); + ASSUME(GetMoveTarget(MOVE_SCREECH) == TARGET_SELECTED); PLAYER(SPECIES_WOBBUFFET) { Speed(5); } // Wobb is playerLeft, but it'll be Wynaut after Ally Switch PLAYER(SPECIES_WYNAUT) { Speed(4); } OPPONENT(SPECIES_KADABRA) { Speed(3); } @@ -144,7 +144,7 @@ DOUBLE_BATTLE_TEST("Ally Switch has no effect on partner's chosen move") DOUBLE_BATTLE_TEST("Ally Switch - move fails if the target was ally which changed position") { - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_COACHING; } PARAMETRIZE { move = MOVE_AROMATIC_MIST; } @@ -170,7 +170,7 @@ DOUBLE_BATTLE_TEST("Ally Switch - move fails if the target was ally which change DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail") { GIVEN { - ASSUME(gMovesInfo[MOVE_HARDEN].target == MOVE_TARGET_USER); + ASSUME(GetMoveTarget(MOVE_HARDEN) == TARGET_USER); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -188,7 +188,7 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail") DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter (Gen5-8)") { GIVEN { - WITH_CONFIG(GEN_ALLY_SWITCH_FAIL_CHANCE, GEN_8); + WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_8); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -196,14 +196,14 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter } WHEN { TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); } } THEN { - EXPECT(gDisableStructs[B_POSITION_PLAYER_RIGHT].protectUses == 0); + EXPECT(gBattleMons[B_POSITION_PLAYER_RIGHT].volatiles.consecutiveMoveUses == 0); } } DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter (Gen9+)") { GIVEN { - WITH_CONFIG(GEN_ALLY_SWITCH_FAIL_CHANCE, GEN_9); + WITH_CONFIG(CONFIG_ALLY_SWITCH_FAIL_CHANCE, GEN_9); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -211,7 +211,7 @@ DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter (Gen9+) } WHEN { TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); } } THEN { - EXPECT(gDisableStructs[B_POSITION_PLAYER_RIGHT].protectUses == 1); + EXPECT(gBattleMons[B_POSITION_PLAYER_RIGHT].volatiles.consecutiveMoveUses == 1); } } @@ -358,7 +358,7 @@ DOUBLE_BATTLE_TEST("Ally Switch does not update leech seed battler") } WHEN { TURN { MOVE(opponentLeft, MOVE_LEECH_SEED, target: playerLeft); } TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } - TURN { ; } + TURN {} } SCENE { // turn 1 MESSAGE("The opposing Bulbasaur used Leech Seed!"); @@ -389,7 +389,7 @@ DOUBLE_BATTLE_TEST("Ally Switch updates attract battler") } WHEN { TURN { MOVE(playerLeft, MOVE_TACKLE, target: opponentLeft); } TURN { MOVE(opponentRight, MOVE_ALLY_SWITCH); } - TURN { ; } + TURN {} } SCENE { // turn 1 MESSAGE("Wobbuffet used Tackle!"); diff --git a/test/battle/move_effect/assist.c b/test/battle/move_effect/assist.c index 3a380ef12..bcf362e26 100644 --- a/test/battle/move_effect/assist.c +++ b/test/battle/move_effect/assist.c @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Assist fails if there are no valid moves to choose from") SINGLE_BATTLE_TEST("Assisted move triggers correct weakness berry") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_CHILAN_BERRY; } PARAMETRIZE { item = ITEM_PASSHO_BERRY; } GIVEN { diff --git a/test/battle/move_effect/assurance.c b/test/battle/move_effect/assurance.c index 6eccb48f3..488740ec8 100644 --- a/test/battle/move_effect/assurance.c +++ b/test/battle/move_effect/assurance.c @@ -1,11 +1,10 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Recoil"); -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Life Orb"); -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Crash"); -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Confusion"); -TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Rocky Helmet"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_ASSURANCE) == EFFECT_ASSURANCE); +} DOUBLE_BATTLE_TEST("Assurance doubles in power if False Swipe connected but didn't do any damage") { @@ -33,3 +32,31 @@ DOUBLE_BATTLE_TEST("Assurance doubles in power if False Swipe connected but didn EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); } } + +SINGLE_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Life Orb") +{ + s16 hits[2]; + + GIVEN { + ASSUME(gItemsInfo[ITEM_LIFE_ORB].holdEffect == HOLD_EFFECT_LIFE_ORB); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_ASSURANCE); } + TURN { MOVE(player, MOVE_POUND); MOVE(opponent, MOVE_ASSURANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ASSURANCE, opponent); + HP_BAR(player, captureDamage: &hits[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + HP_BAR(player, captureDamage: &hits[1]); + } THEN { + EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); + } +} + +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Recoil"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Crash"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Confusion"); +TO_DO_BATTLE_TEST("Assurance doubles in power if the target has been damaged in the same turn - Rocky Helmet"); + diff --git a/test/battle/move_effect/attack_spatk_up.c b/test/battle/move_effect/attack_spatk_up.c index bf8c5d4a2..4a21e30d3 100644 --- a/test/battle/move_effect/attack_spatk_up.c +++ b/test/battle/move_effect/attack_spatk_up.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Work Up raises Attack and Sp. Attack by 1 stage each", s16 damage) { bool32 raiseStats; - u32 move; + enum Move move; PARAMETRIZE { raiseStats = FALSE; move = MOVE_SCRATCH; } PARAMETRIZE { raiseStats = TRUE; move = MOVE_SCRATCH; } PARAMETRIZE { raiseStats = FALSE; move = MOVE_SWIFT; } diff --git a/test/battle/move_effect/attack_up_user_ally.c b/test/battle/move_effect/attack_up_user_ally.c index 767e9fdef..b322a674d 100644 --- a/test/battle/move_effect/attack_up_user_ally.c +++ b/test/battle/move_effect/attack_up_user_ally.c @@ -7,8 +7,7 @@ SINGLE_BATTLE_TEST("Howl raises user's Attack by 1 stage", s16 damage) PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP - || GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -34,7 +33,7 @@ DOUBLE_BATTLE_TEST("Howl raises user's and partner's Attack by 1 stage", s16 dam PARAMETRIZE { raiseAttack = FALSE; } PARAMETRIZE { raiseAttack = TRUE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveTarget(MOVE_HOWL) == TARGET_USER_AND_ALLY); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_WYNAUT) { Speed(10); } @@ -67,7 +66,7 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof") s16 damage[2]; GIVEN { - ASSUME(GetMoveEffect(MOVE_HOWL) == EFFECT_ATTACK_UP_USER_ALLY); + ASSUME(GetMoveTarget(MOVE_HOWL) == TARGET_USER_AND_ALLY); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(15); } PLAYER(SPECIES_VOLTORB) { Speed(10); Ability(ABILITY_SOUNDPROOF); } @@ -80,6 +79,8 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); HP_BAR(opponentLeft, captureDamage: &damage[0]); + ABILITY_POPUP(playerRight, ABILITY_SOUNDPROOF); + MESSAGE("Voltorb's Soundproof blocks Howl!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_HOWL, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Wobbuffet's Attack rose!"); @@ -87,8 +88,6 @@ DOUBLE_BATTLE_TEST("Howl does not work on partner if it has Soundproof") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); MESSAGE("Wynaut's Attack rose!"); } - ABILITY_POPUP(playerRight, ABILITY_SOUNDPROOF); - MESSAGE("Voltorb's Soundproof blocks Howl!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); HP_BAR(opponentLeft, captureDamage: &damage[1]); } THEN { diff --git a/test/battle/move_effect/aura_wheel.c b/test/battle/move_effect/aura_wheel.c index 3e26176ee..55af998c6 100644 --- a/test/battle/move_effect/aura_wheel.c +++ b/test/battle/move_effect/aura_wheel.c @@ -75,7 +75,7 @@ SINGLE_BATTLE_TEST("Aura Wheel can be turned into a Normal-type move after Morpe OPPONENT(SPECIES_DUSKULL); } WHEN { if (hangryMode) - TURN { } + TURN {} TURN { MOVE(opponent, MOVE_ENTRAINMENT); } TURN { MOVE(player, MOVE_AURA_WHEEL); SWITCH(opponent, 1); } } SCENE { diff --git a/test/battle/move_effect/aurora_veil.c b/test/battle/move_effect/aurora_veil.c index 1b480ad1e..1ce274e1b 100644 --- a/test/battle/move_effect/aurora_veil.c +++ b/test/battle/move_effect/aurora_veil.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Aurora Veil can only be used in Hail and Snow") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } diff --git a/test/battle/move_effect/baddy_bad.c b/test/battle/move_effect/baddy_bad.c deleted file mode 100644 index e2ee4a6d8..000000000 --- a/test/battle/move_effect/baddy_bad.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("Baddy Bad sets up Reflect, reducing physical damage"); -TO_DO_BATTLE_TEST("Baddy Bad's Reflect lasts for 5 turns"); -TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_effect/beak_blast.c b/test/battle/move_effect/beak_blast.c index b879a198c..507d6cfdd 100644 --- a/test/battle/move_effect/beak_blast.c +++ b/test/battle/move_effect/beak_blast.c @@ -73,7 +73,7 @@ DOUBLE_BATTLE_TEST("Beak Blast burns all who make contact with the Pokémon") SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") { - u32 move; + enum Move move; bool32 burn; PARAMETRIZE { move = MOVE_SCRATCH; burn = TRUE; } PARAMETRIZE { move = MOVE_WATER_GUN; burn = FALSE; } @@ -86,7 +86,7 @@ SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_BEAK_BLAST); MOVE(opponent, move); } + TURN { MOVE(opponent, move); MOVE(player, MOVE_BEAK_BLAST); } TURN {} } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_BEAK_BLAST_SETUP, player); @@ -115,11 +115,11 @@ SINGLE_BATTLE_TEST("Beak Blast burns only when contact moves are used") SINGLE_BATTLE_TEST("Beak Blast doesn't burn fire types") { GIVEN { - ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_ARCANINE].types[1]); + ASSUME(gSpeciesInfo[SPECIES_ARCANINE].types[0] == TYPE_FIRE || gSpeciesInfo[SPECIES_ARCANINE].types[1] == TYPE_FIRE); PLAYER(SPECIES_ARCANINE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_BEAK_BLAST); MOVE(player, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_BEAK_BLAST); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); NOT STATUS_ICON(player, burn: TRUE); @@ -127,6 +127,85 @@ SINGLE_BATTLE_TEST("Beak Blast doesn't burn fire types") } } +SINGLE_BATTLE_TEST("Beak Blast doesn't burn after being used") +{ + GIVEN { + ASSUME(GetMovePriority(MOVE_COUNTER) < GetMovePriority(MOVE_BEAK_BLAST)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_BEAK_BLAST); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAK_BLAST, opponent); + NOT STATUS_ICON(player, burn: TRUE); + } +} + +DOUBLE_BATTLE_TEST("Beak Blast doesn't burn if the target is protected") +{ + u32 move; + + PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } + PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } + PARAMETRIZE { move = MOVE_BURNING_BULWARK; } + PARAMETRIZE { move = MOVE_SILK_TRAP; } + + GIVEN { + ASSUME(GetMoveEffect(move) == EFFECT_PROTECT); + ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); + ASSUME(GetMovePriority(MOVE_BEAK_BLAST) > GetMovePriority(MOVE_TRICK_ROOM)); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WYNAUT) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, move); } + TURN { MOVE(opponentRight, MOVE_INSTRUCT, target: opponentLeft, WITH_RNG(RNG_PROTECT_FAIL, 0)); + MOVE(opponentLeft, MOVE_BEAK_BLAST, target: playerLeft); + MOVE(playerRight, MOVE_TRICK_ROOM); + MOVE(playerLeft, MOVE_POUND, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_BEAK_BLAST_SETUP, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + if (move == MOVE_SPIKY_SHIELD) { + HP_BAR(playerLeft); + } else if (move == MOVE_BANEFUL_BUNKER) { + STATUS_ICON(playerLeft, STATUS1_POISON); + } else if (move == MOVE_BURNING_BULWARK) { + STATUS_ICON(playerLeft, STATUS1_BURN); + } else if (move == MOVE_SILK_TRAP) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + } + NOT STATUS_ICON(playerLeft, STATUS1_BURN); + } +} + +DOUBLE_BATTLE_TEST("Beak Blast doesn't burn if the target is protected by Quick Guard") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_QUICK_GUARD) == EFFECT_PROTECT); + ASSUME(GetMoveProtectMethod(MOVE_QUICK_GUARD) == PROTECT_QUICK_GUARD); + ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) > 0); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WYNAUT) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_BEAK_BLAST, target: playerLeft); + MOVE(opponentRight, MOVE_QUICK_GUARD); + MOVE(playerLeft, MOVE_QUICK_ATTACK, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_BEAK_BLAST_SETUP, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_GUARD, opponentRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUICK_ATTACK, playerLeft); + STATUS_ICON(playerLeft, STATUS1_BURN); + } + } +} + TO_DO_BATTLE_TEST("Beak Blast's charging message is shown regardless if it would've missed"); TO_DO_BATTLE_TEST("Beak Blast fails if it's forced by Encore after choosing a different move"); TO_DO_BATTLE_TEST("Bulletproof is immune to Beak Blast but not to the burn it causes"); diff --git a/test/battle/move_effect/beat_up.c b/test/battle/move_effect/beat_up.c index e584ccc0f..7ddfd3eba 100644 --- a/test/battle/move_effect/beat_up.c +++ b/test/battle/move_effect/beat_up.c @@ -1,10 +1,18 @@ #include "global.h" #include "test/battle.h" -// General +// TODO: Beat Up's strikes have each an independent chance of a critical hit +// Unconfirmed by Bulbapedia +// - Technician interacion + SINGLE_BATTLE_TEST("Beat Up hits the target for each non-fainted, non-statused member in the party") { + u32 gen; + PARAMETRIZE { gen = GEN_3; } + PARAMETRIZE { gen = GEN_5; } + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, gen); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_PICHU) @@ -21,37 +29,367 @@ SINGLE_BATTLE_TEST("Beat Up hits the target for each non-fainted, non-statused m NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); MESSAGE("The Pokémon was hit 4 time(s)!"); } THEN { - EXPECT_EQ(gBattleStruct->beatUpSpecies[0], SPECIES_WOBBUFFET); - EXPECT_EQ(gBattleStruct->beatUpSpecies[1], SPECIES_WYNAUT); - EXPECT_EQ(gBattleStruct->beatUpSpecies[2], SPECIES_PICHU); - EXPECT_EQ(gBattleStruct->beatUpSpecies[3], SPECIES_RAICHU); + if (gen == GEN_5) { + EXPECT_EQ(gBattleStruct->beatUpSpecies[0], SPECIES_WOBBUFFET); + EXPECT_EQ(gBattleStruct->beatUpSpecies[1], SPECIES_WYNAUT); + EXPECT_EQ(gBattleStruct->beatUpSpecies[2], SPECIES_PICHU); + EXPECT_EQ(gBattleStruct->beatUpSpecies[3], SPECIES_RAICHU); + } + else { + EXPECT_EQ(gBattleStruct->beatUpSpecies[0], 0); + EXPECT_EQ(gBattleStruct->beatUpSpecies[1], 1); + EXPECT_EQ(gBattleStruct->beatUpSpecies[2], 2); + EXPECT_EQ(gBattleStruct->beatUpSpecies[3], 4); + } } } -TO_DO_BATTLE_TEST("Beat Up doesn't consider Comatose as a status") -TO_DO_BATTLE_TEST("Beat Up's strikes have each an independent chance of a critical hit"); +SINGLE_BATTLE_TEST("Beat Up doesn't consider Comatose as a status") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_SLEEP); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + MESSAGE("The Pokémon was hit 2 time(s)!"); + } +} -// B_BEAT_UP Gen2-4 -TO_DO_BATTLE_TEST("Beat Up lists each party member's name"); -TO_DO_BATTLE_TEST("Beat Up's damage is typeless"); -TO_DO_BATTLE_TEST("Beat Up's damage doesn't consider STAB"); -TO_DO_BATTLE_TEST("Beat Up's last strike-only can trigger King's Rock"); -TO_DO_BATTLE_TEST("Beat Up's base power is the same for each strike"); -TO_DO_BATTLE_TEST("Beat Up's damage is determined by each striking Pokémon's base attack and level and the target's defense"); -TO_DO_BATTLE_TEST("Beat Up ignores stat stage changes"); //eg. Swords Dance -TO_DO_BATTLE_TEST("Beat Up ignores Huge Power"); -TO_DO_BATTLE_TEST("Beat Up ignores Choice Band"); +SINGLE_BATTLE_TEST("Beat Up doesn't list party member's name (Gen5+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + NONE_OF { + MESSAGE("Wobbuffet's attack!"); + MESSAGE("Wynaut's attack!"); + } + MESSAGE("The Pokémon was hit 2 time(s)!"); + } +} -// B_BEAT_UP Gen5+ -TO_DO_BATTLE_TEST("Beat Up doesn't list party member's name"); -TO_DO_BATTLE_TEST("Beat Up's damage is Dark-typed"); -TO_DO_BATTLE_TEST("Beat Up's damage receives STAB"); -TO_DO_BATTLE_TEST("Beat Up's can trigger King's Rock on all strikes"); -TO_DO_BATTLE_TEST("Beat Up's base power is determined by each striking Pokémon"); -TO_DO_BATTLE_TEST("Beat Up's damage is determined by the user's attack and the target's defense"); -TO_DO_BATTLE_TEST("Beat Up's damage considers stat stage changes"); //eg. Swords Dance -TO_DO_BATTLE_TEST("Beat Up's damage considers Huge Power"); -TO_DO_BATTLE_TEST("Beat Up's damage considers Choice Band"); +SINGLE_BATTLE_TEST("Beat Up's damage is Dark-typed (Gen5+)", s16 damage) +{ + bool32 targetIsFairy; + PARAMETRIZE { targetIsFairy = FALSE; } + PARAMETRIZE { targetIsFairy = TRUE; } -// Unconfirmed by Bulbapedia -// - Technician interacion + ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(targetIsFairy ? SPECIES_SYLVEON : SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (targetIsFairy) + EXPECT_LT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up's base power is determined by each striking Pokémon (Gen5+)") +{ + s16 firstHit, secondHit; + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_SHUCKLE); + PLAYER(SPECIES_DEOXYS_ATTACK); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_BLISSEY); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &firstHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &secondHit); + } THEN { + EXPECT_LT(firstHit, secondHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage considers stat stage changes (Gen5+)", s16 damage) +{ + bool32 boosted; + PARAMETRIZE { boosted = FALSE; } + PARAMETRIZE { boosted = TRUE; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_UMBREON); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { if (boosted) { MOVE(player, MOVE_SWORDS_DANCE); } else { MOVE(player, MOVE_CELEBRATE); } } + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + if (boosted) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (boosted) + EXPECT_GT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage considers Huge Power and Choice Band (Gen5+)", s16 damage) +{ + u16 ability; + enum Item item; + + PARAMETRIZE { ability = ABILITY_THICK_FAT; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_HUGE_POWER; item = ITEM_NONE; } + PARAMETRIZE { ability = ABILITY_THICK_FAT; item = ITEM_CHOICE_BAND; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_5); + PLAYER(SPECIES_AZUMARILL) { Ability(ability); Item(item); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i == 1) + EXPECT_GT(results[i].damage, results[0].damage); + if (i == 2) + EXPECT_GT(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up lists each party member's name") +{ + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_PIKACHU); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + MESSAGE("Wobbuffet's attack!"); + MESSAGE("Wynaut's attack!"); + NOT MESSAGE("Wynaut's attack!"); + MESSAGE("Pikachu's attack!"); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage is typeless", s16 damage) +{ + u16 defender = SPECIES_WOBBUFFET; + u16 type1, type2; + + PARAMETRIZE { defender = SPECIES_BLISSEY; } // Normal + PARAMETRIZE { defender = SPECIES_MACHAMP; } // Fighting + PARAMETRIZE { defender = SPECIES_TORNADUS; } // Flying + PARAMETRIZE { defender = SPECIES_GRIMER; } // Poison + PARAMETRIZE { defender = SPECIES_SANDSHREW; } // Ground + PARAMETRIZE { defender = SPECIES_NOSEPASS; } // Rock + PARAMETRIZE { defender = SPECIES_CATERPIE; } // Bug + PARAMETRIZE { defender = SPECIES_DUSKULL; } // Ghost + PARAMETRIZE { defender = SPECIES_REGISTEEL; } // Steel + PARAMETRIZE { defender = SPECIES_CHIMCHAR; } // Fire + PARAMETRIZE { defender = SPECIES_WARTORTLE; } // Water + PARAMETRIZE { defender = SPECIES_TANGELA; } // Grass + PARAMETRIZE { defender = SPECIES_PIKACHU; } // Electric + PARAMETRIZE { defender = SPECIES_ABRA; } // Psychic + PARAMETRIZE { defender = SPECIES_SNORUNT; } // Ice + PARAMETRIZE { defender = SPECIES_BAGON; } // Dragon + PARAMETRIZE { defender = SPECIES_UMBREON; } // Dark + PARAMETRIZE { defender = SPECIES_SYLVEON; } // Fairy + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + type1 = GetSpeciesType(defender, 0); + type2 = GetSpeciesType(defender, 1); + ASSUME(type2 == type1 || type2 == TYPE_MYSTERY); // Ensure monotype targets + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(defender); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + NONE_OF { + MESSAGE("It's super effective!"); + MESSAGE("It's not very effective..."); + MESSAGE("It doesn't affect"); + } + } THEN { + EXPECT_GT(results[i].damage, 0); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage doesn't consider STAB") +{ + s16 damage; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + damage = 0; + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + HP_BAR(opponent, captureDamage: &damage); + } THEN { + // Raw damage: baseAtk 33 * basePower 1 * levelFactor ((100 * 2 / 5) + 2 = 42) = 1386 + // Divide by baseDef 58 -> 23 (floor); 23/50 + 2 = 2; + u16 expected = 2; + EXPECT_EQ(damage, expected); + } +} + +SINGLE_BATTLE_TEST("Beat Up's base power is the same for each strike") +{ + s16 firstHit, secondHit; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + firstHit = 0; + secondHit = 0; + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &firstHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &secondHit); + } THEN { + EXPECT_EQ(firstHit, secondHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up's damage is determined by each striking Pokémon's base attack and level and the target's defense") +{ + s16 shuckleHit, deoxysHit; + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + shuckleHit = 0; + deoxysHit = 0; + PLAYER(SPECIES_SHUCKLE); + PLAYER(SPECIES_DEOXYS_ATTACK); + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + PLAYER(SPECIES_WYNAUT) { HP(0); } + OPPONENT(SPECIES_BLISSEY); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &shuckleHit); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &deoxysHit); + } THEN { + // Shuckle: baseAtk 10 * basePower 1 * levelFactor 42 = 420; / baseDef 10 -> 42; 42/50 + 2 = 2 + u16 shuckleDmg = 2; + // Deoxys-A: baseAtk 180 * basePower 1 * levelFactor 42 = 7560; / baseDef 10 -> 756; 756/50 + 2 = 17 + u16 deoxysDmg = 17; + EXPECT_EQ(shuckleHit, shuckleDmg); + EXPECT_EQ(deoxysHit, deoxysDmg); + EXPECT_LT(shuckleHit, deoxysHit); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores stat stage changes", s16 damage) +{ + bool32 boosted; + PARAMETRIZE { boosted = FALSE; } + PARAMETRIZE { boosted = TRUE; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { if (boosted) { MOVE(player, MOVE_SWORDS_DANCE); } else { MOVE(player, MOVE_CELEBRATE); } } + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + if (boosted) + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (boosted) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores Huge Power", s16 damage) +{ + u16 ability; + + PARAMETRIZE { ability = ABILITY_THICK_FAT; } + PARAMETRIZE { ability = ABILITY_HUGE_POWER; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_AZUMARILL) { Ability(ability); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (ability == ABILITY_HUGE_POWER) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} + +SINGLE_BATTLE_TEST("Beat Up ignores Choice Band", s16 damage) +{ + enum Item item; + + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_CHOICE_BAND; } + + GIVEN { + WITH_CONFIG(CONFIG_BEAT_UP, GEN_3); + PLAYER(SPECIES_URSARING) { Item(item); Moves(MOVE_BEAT_UP); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BEAT_UP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BEAT_UP, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (item == ITEM_CHOICE_BAND) + EXPECT_EQ(results[i].damage, results[0].damage); + } +} diff --git a/test/battle/move_effect/belch.c b/test/battle/move_effect/belch.c index 38a41ae2c..3daa2a351 100644 --- a/test/battle/move_effect/belch.c +++ b/test/battle/move_effect/belch.c @@ -19,7 +19,7 @@ AI_SINGLE_BATTLE_TEST("AI: Belch has nonzero score after eating a berry") OPPONENT(SPECIES_PIKACHU) { Level(15); Item(ITEM_SHUCA_BERRY); Moves(MOVE_BELCH, MOVE_SCRATCH); } } WHEN { TURN { MOVE(player, MOVE_MUD_SHOT); EXPECT_MOVE(opponent, MOVE_SCRATCH); } - TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_BELCH);} + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_BELCH); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_BELCH, opponent); } @@ -27,7 +27,7 @@ AI_SINGLE_BATTLE_TEST("AI: Belch has nonzero score after eating a berry") SINGLE_BATTLE_TEST("Belch cannot be used if the user has not eaten a berry") { - u16 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_ORAN_BERRY; } GIVEN { diff --git a/test/battle/move_effect/belly_drum.c b/test/battle/move_effect/belly_drum.c index 194ee5b9d..8b2cdf1d1 100644 --- a/test/battle/move_effect/belly_drum.c +++ b/test/battle/move_effect/belly_drum.c @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Belly Drum maximizes the user's Attack stat", s16 damage) SINGLE_BATTLE_TEST("Belly Drum fails if user's current HP is half or less than half its maximum") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50);} + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BELLY_DRUM); } diff --git a/test/battle/move_effect/bestow.c b/test/battle/move_effect/bestow.c index 4ca86119b..7017ede80 100644 --- a/test/battle/move_effect/bestow.c +++ b/test/battle/move_effect/bestow.c @@ -92,6 +92,21 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item is a Z-Crystal") } } +SINGLE_BATTLE_TEST("Bestow doesn't fail if the user has Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_BESTOW); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BESTOW, player); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + SINGLE_BATTLE_TEST("Bestow fails if the target is behind a Substitute (Gen 6+)") { GIVEN { @@ -130,4 +145,3 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item changes its form") EXPECT(opponent->item == ITEM_NONE); } } - diff --git a/test/battle/move_effect/body_press.c b/test/battle/move_effect/body_press.c index d3aafa2d3..a7a9493be 100644 --- a/test/battle/move_effect/body_press.c +++ b/test/battle/move_effect/body_press.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Body Press uses physical defense stat of target", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_DRILL_PECK; } PARAMETRIZE { move = MOVE_BODY_PRESS; } @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Body Press's damage depends on the user's base Defense inste SINGLE_BATTLE_TEST("Body Press's damage depends on the user's Defense and not Attack stat stages", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_IRON_DEFENSE; } PARAMETRIZE { move = MOVE_SWORDS_DANCE; } @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Body Press's damage depends on the user's Defense and not At SINGLE_BATTLE_TEST("Body Press uses Defense Stat even in Wonder Room", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_WONDER_ROOM; } PARAMETRIZE { move = MOVE_CELEBRATE; } @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Body Press uses Defense Stat even in Wonder Room", s16 damag SINGLE_BATTLE_TEST("Body Press uses Special Defense stat Stages in Wonder Room", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_IRON_DEFENSE; } PARAMETRIZE { move = MOVE_AMNESIA; } diff --git a/test/battle/move_effect/brine.c b/test/battle/move_effect/brine.c index 916525785..5f1504437 100644 --- a/test/battle/move_effect/brine.c +++ b/test/battle/move_effect/brine.c @@ -1,4 +1,25 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Brine's power doubles if the target is at 50% or below max HP"); +SINGLE_BATTLE_TEST("Brine's power doubles if the target is at 50% or below max HP", s16 damage) +{ + bool32 halfHP; + PARAMETRIZE { halfHP = FALSE; } + PARAMETRIZE { halfHP = TRUE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_BRINE) == EFFECT_BRINE); + PLAYER(SPECIES_SQUIRTLE); + OPPONENT(SPECIES_BLISSEY){ + if (halfHP) { + HP((GetMonData(&OPPONENT_PARTY[0], MON_DATA_MAX_HP) / 2) - 1); + } + } + } WHEN { + TURN { MOVE(player, MOVE_BRINE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BRINE, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.0), results[1].damage); + } +} diff --git a/test/battle/move_effect/captivate.c b/test/battle/move_effect/captivate.c index 27790b846..ef8dd7b6a 100644 --- a/test/battle/move_effect/captivate.c +++ b/test/battle/move_effect/captivate.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Captivate decreases the target's Sp. Attack if they're oppos ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Nidoking's Sp. Atk harshly fell!"); } THEN { - EXPECT(opponent->statStages[STAT_SPATK] == 4); + EXPECT(opponent->statStages[STAT_SPATK] == DEFAULT_STAT_STAGE - 2); } } @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Captivate fails if the target and user share gender") } SCENE { MESSAGE("But it failed!"); } THEN { - EXPECT(opponent->statStages[STAT_SPATK] == 6); + EXPECT(opponent->statStages[STAT_SPATK] == DEFAULT_STAT_STAGE); } } @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Captivate fails if the target is genderless") } SCENE { MESSAGE("But it failed!"); } THEN { - EXPECT(opponent->statStages[STAT_SPATK] == 6); + EXPECT(opponent->statStages[STAT_SPATK] == DEFAULT_STAT_STAGE); } } diff --git a/test/battle/move_effect/celebrate.c b/test/battle/move_effect/celebrate.c new file mode 100644 index 000000000..f5719f571 --- /dev/null +++ b/test/battle/move_effect/celebrate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Celebrate (Move Effect) test titles") diff --git a/test/battle/move_effect/change_type_on_item.c b/test/battle/move_effect/change_type_on_item.c index f5c8f9237..a2e2cfa17 100644 --- a/test/battle/move_effect/change_type_on_item.c +++ b/test/battle/move_effect/change_type_on_item.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Techno Blast changes type depending on the drive the user holds") { u16 species; - u16 item; + enum Item item; PARAMETRIZE { species = SPECIES_CHARIZARD; item = ITEM_DOUSE_DRIVE; } PARAMETRIZE { species = SPECIES_BLASTOISE; item = ITEM_SHOCK_DRIVE; } diff --git a/test/battle/move_effect/charge.c b/test/battle/move_effect/charge.c index 888352922..610230de1 100644 --- a/test/battle/move_effect/charge.c +++ b/test/battle/move_effect/charge.c @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Charge's effect does not stack with Electromorphosis or Wind GIVEN { ASSUME(IsWindMove(MOVE_AIR_CUTTER)); - PLAYER(species) { Ability(ability); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_THUNDERBOLT); } @@ -131,7 +131,7 @@ SINGLE_BATTLE_TEST("Charge's effect is removed regardless if the next move is El } } -SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") +SINGLE_BATTLE_TEST("Charge will expire if user flinches while using an electric move") { s16 damage[2]; GIVEN { @@ -151,9 +151,6 @@ SINGLE_BATTLE_TEST("Charge will not expire if it flinches twice in a row") ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDERBOLT, player); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - if (B_CHARGE < GEN_9) - EXPECT_EQ(damage[0], damage[1]); - else - EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[1]); } } diff --git a/test/battle/move_effect/chilly_reception.c b/test/battle/move_effect/chilly_reception.c index 0361f9db4..3557e4247 100644 --- a/test/battle/move_effect/chilly_reception.c +++ b/test/battle/move_effect/chilly_reception.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_CHILLY_RECEPTION); + ASSUME(GetMoveEffect(MOVE_CHILLY_RECEPTION) == EFFECT_WEATHER_AND_SWITCH); } #if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL SINGLE_BATTLE_TEST("Chilly Reception sets up hail and switches the user out") @@ -47,8 +47,8 @@ SINGLE_BATTLE_TEST("Chilly Reception switches the user out, even if the weather TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } } SCENE { MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); MESSAGE("There is no relief from this heavy rain!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); MESSAGE("Slowking went back to 1!"); SEND_IN_MESSAGE("Slowpoke"); MESSAGE("Rain continues to fall."); @@ -105,4 +105,55 @@ SINGLE_BATTLE_TEST("Chilly Reception changes the weather, even if the user canno } } -TO_DO_BATTLE_TEST("Chilly Reception doesn't announce its move if it's called by a different move"); +SINGLE_BATTLE_TEST("Chilly Reception switches the user out even if it can't change the weather") +{ + GIVEN { + PLAYER(SPECIES_SLOWKING_GALAR); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("But it failed!"); // According to jpwiki, this is the correct message + MESSAGE("Slowking went back to 1!"); + SEND_IN_MESSAGE("Wobbuffet"); + } +} + +SINGLE_BATTLE_TEST("Chilly Reception fails if it can't switch the user out or change the weather") +{ + GIVEN { + PLAYER(SPECIES_SLOWKING_GALAR); + OPPONENT(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_SNOW_WARNING); } + } WHEN { + TURN { MOVE(player, MOVE_CHILLY_RECEPTION); } + } SCENE { + MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Chilly Reception doesn't announce its move if it's called by a different move") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); + PLAYER(SPECIES_SLOWKING_GALAR) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_CHILLY_RECEPTION); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK); SEND_OUT(player, 1); } + } SCENE { + NOT MESSAGE("Slowking is preparing to tell a chillingly bad joke!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CHILLY_RECEPTION, player); +#if B_PREFERRED_ICE_WEATHER == B_ICE_WEATHER_HAIL + MESSAGE("It started to hail!"); +#else + MESSAGE("It started to snow!"); +#endif + MESSAGE("Slowking went back to 1!"); + SEND_IN_MESSAGE("Wobbuffet"); + } +} diff --git a/test/battle/move_effect/chloroblast.c b/test/battle/move_effect/chloroblast.c index d60449324..cd8149693 100644 --- a/test/battle/move_effect/chloroblast.c +++ b/test/battle/move_effect/chloroblast.c @@ -134,7 +134,7 @@ SINGLE_BATTLE_TEST("Chloroblast does not cause the user to lose HP if there is n SINGLE_BATTLE_TEST("Chloroblast is not affected by Reckless", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CHLOROBLAST; } if (B_UPDATED_MOVE_DATA >= GEN_9) { diff --git a/test/battle/move_effect/clangorous_soul.c b/test/battle/move_effect/clangorous_soul.c index a1a7ffa42..b2914c18a 100644 --- a/test/battle/move_effect/clangorous_soul.c +++ b/test/battle/move_effect/clangorous_soul.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3") { s16 dmg; GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Clangorous Soul cuts the user's HP by 1/3") SINGLE_BATTLE_TEST("Clangorous Soul raises the user's Atk, Def, Sp. Atk. Sp. Def and Speed by 1 stage") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); }; + PLAYER(SPECIES_WOBBUFFET) { HP(300); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } @@ -40,7 +40,7 @@ SINGLE_BATTLE_TEST("Clangorous Soul raises the user's Atk, Def, Sp. Atk. Sp. Def SINGLE_BATTLE_TEST("Clangorous Soul fails if the user's HP is less or equal than 1/3") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); }; + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CLANGOROUS_SOUL); } diff --git a/test/battle/move_effect/coaching.c b/test/battle/move_effect/coaching.c index 642727de5..8b902c4ef 100644 --- a/test/battle/move_effect/coaching.c +++ b/test/battle/move_effect/coaching.c @@ -74,7 +74,7 @@ DOUBLE_BATTLE_TEST("Coaching fails if all allies are is semi-invulnerable") MESSAGE("Hawlucha's Attack rose!"); MESSAGE("Hawlucha's Defense rose!"); } - MESSAGE("But it failed!"); + MESSAGE("Hawlucha avoided the attack!"); } } @@ -99,7 +99,7 @@ DOUBLE_BATTLE_TEST("Coaching fails if there's no ally") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT) { HP(1); }; + PLAYER(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -120,7 +120,7 @@ DOUBLE_BATTLE_TEST("Coaching fails if there's no ally") AI_DOUBLE_BATTLE_TEST("AI uses Coaching") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HEADBUTT; } PARAMETRIZE { move = MOVE_DAZZLING_GLEAM; } @@ -132,7 +132,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Coaching") OPPONENT(SPECIES_WOBBUFFET) { Moves(move); } } WHEN { if (move == MOVE_HEADBUTT) - TURN { EXPECT_MOVE(opponentLeft, MOVE_COACHING); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_COACHING); } else TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_COACHING); } } diff --git a/test/battle/move_effect/coil.c b/test/battle/move_effect/coil.c index ce9e8629a..7d5670298 100644 --- a/test/battle/move_effect/coil.c +++ b/test/battle/move_effect/coil.c @@ -1,6 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Coil raises the user's Attack by 1 stage"); -TO_DO_BATTLE_TEST("Coil raises the user's Defense by 1 stage"); -TO_DO_BATTLE_TEST("Coil raises the user's Accuracy by 1 stage"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COIL) == EFFECT_COIL); +} + +SINGLE_BATTLE_TEST("Coil increases the user's Attack, Defense and Accuracy by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_COIL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COIL, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_ACC], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/collision_course.c b/test/battle/move_effect/collision_course.c index 9933df0dc..8c089b539 100644 --- a/test/battle/move_effect/collision_course.c +++ b/test/battle/move_effect/collision_course.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Collision Course damage is increased by 33 Percent if super effective", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAMMER_ARM; } PARAMETRIZE { move = MOVE_COLLISION_COURSE; } @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Collision Course damage is increased by 33 Percent if super SINGLE_BATTLE_TEST("Collision Course does normal damage if not super effective", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAMMER_ARM; } PARAMETRIZE { move = MOVE_COLLISION_COURSE; } diff --git a/test/battle/move_effect/conversion.c b/test/battle/move_effect/conversion.c index ac863cf2b..165d274a5 100644 --- a/test/battle/move_effect/conversion.c +++ b/test/battle/move_effect/conversion.c @@ -8,3 +8,16 @@ TO_DO_BATTLE_TEST("Conversion fails if all the user's moves share types with the TO_DO_BATTLE_TEST("Conversion changes the user's types to the one in the user's first slot (Gen 6+)"); TO_DO_BATTLE_TEST("Conversion can read the user's first move slot even if that move cannot be selected (Gen 6+)"); //Eg. Disable TO_DO_BATTLE_TEST("Conversion can change the user's types to Conversion's type"); + +SINGLE_BATTLE_TEST("(TERA) Conversion fails if used by a Terastallized Pokemon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CONVERSION, gimmick: GIMMICK_TERA); } + } SCENE { + MESSAGE("Wobbuffet used Conversion!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/conversion_2.c b/test/battle/move_effect/conversion_2.c index acd21125c..169243019 100644 --- a/test/battle/move_effect/conversion_2.c +++ b/test/battle/move_effect/conversion_2.c @@ -3,10 +3,10 @@ TO_DO_BATTLE_TEST("Conversion 2's type change considers Inverse Battles"); -#if B_UPDATED_CONVERSION_2 < GEN_5 -SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 3-4)") +SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last move that hit the user (Gen 1-4)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -16,15 +16,16 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type MESSAGE("Wobbuffet used Ominous Wind!"); // turn 1 ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); - MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); + MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); + MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); } } } -SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 3-4)") +SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal type (Gen 1-4)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -35,18 +36,17 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers Struggle to be Normal t MESSAGE("The opposing Wobbuffet used Struggle!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Steel type!"); - MESSAGE("Wobbuffet transformed into the Rock type!"); - MESSAGE("Wobbuffet transformed into the Ghost type!"); + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Rock type!"); + MESSAGE("Wobbuffet transformed into the Ghost type!"); } } } -#endif -#if B_UPDATED_CONVERSION_2 >= GEN_5 SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type that resists the last used target's move (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -56,8 +56,8 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type MESSAGE("Wobbuffet used Ominous Wind!"); // turn 1 ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); - MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); + MESSAGE("The opposing Wobbuffet transformed into the Normal type!"); + MESSAGE("The opposing Wobbuffet transformed into the Dark type!"); } } } @@ -65,6 +65,7 @@ SINGLE_BATTLE_TEST("Conversion 2 randomly changes the type of the user to a type SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -75,8 +76,8 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") MESSAGE("The opposing Wobbuffet used Curse!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Normal type!"); - MESSAGE("Wobbuffet transformed into the Dark type!"); + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); } } } @@ -84,6 +85,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers status moves (Gen 5+)") SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves called by other moves") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -94,8 +96,8 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves calle MESSAGE("The opposing Wobbuffet used Mirror Move!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Normal type!"); - MESSAGE("Wobbuffet transformed into the Dark type!"); + MESSAGE("Wobbuffet transformed into the Normal type!"); + MESSAGE("Wobbuffet transformed into the Dark type!"); } } } @@ -103,6 +105,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers the type of moves calle SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -113,10 +116,10 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") MESSAGE("The opposing Wobbuffet used Weather Ball!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Steel type!"); - MESSAGE("Wobbuffet transformed into the Fire type!"); - MESSAGE("Wobbuffet transformed into the Water type!"); - MESSAGE("Wobbuffet transformed into the Ice type!"); + MESSAGE("Wobbuffet transformed into the Steel type!"); + MESSAGE("Wobbuffet transformed into the Fire type!"); + MESSAGE("Wobbuffet transformed into the Water type!"); + MESSAGE("Wobbuffet transformed into the Ice type!"); } } } @@ -124,6 +127,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers dynamic type moves") SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by Normalize and Electrify") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NORMALIZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -136,17 +140,17 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by N MESSAGE("The opposing Wobbuffet used Pound!"); // turn 2 ONE_OF { - MESSAGE("Wobbuffet transformed into the Ground type!"); - MESSAGE("Wobbuffet transformed into the Dragon type!"); - MESSAGE("Wobbuffet transformed into the Grass type!"); - MESSAGE("Wobbuffet transformed into the Electric type!"); + MESSAGE("Wobbuffet transformed into the Ground type!"); + MESSAGE("Wobbuffet transformed into the Dragon type!"); + MESSAGE("Wobbuffet transformed into the Grass type!"); + MESSAGE("Wobbuffet transformed into the Electric type!"); } // turn 3 MESSAGE("Wobbuffet used Water Gun!"); ONE_OF { - MESSAGE("The opposing Wobbuffet transformed into the Steel type!"); - MESSAGE("The opposing Wobbuffet transformed into the Rock type!"); - MESSAGE("The opposing Wobbuffet transformed into the Ghost type!"); + MESSAGE("The opposing Wobbuffet transformed into the Steel type!"); + MESSAGE("The opposing Wobbuffet transformed into the Rock type!"); + MESSAGE("The opposing Wobbuffet transformed into the Ghost type!"); } } } @@ -154,6 +158,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change considers move types changed by N SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -171,6 +176,7 @@ SINGLE_BATTLE_TEST("Conversion 2's type change fails targeting Struggle (Gen 5+) SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (Gen 5+)") { GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ENTEI); } WHEN { @@ -187,7 +193,6 @@ SINGLE_BATTLE_TEST("Conversion 2 fails if the move used is of typeless damage (G MESSAGE("But it failed!"); } } -#endif SINGLE_BATTLE_TEST("Conversion 2 fails if the targeted move is Stellar Type") { @@ -205,3 +210,35 @@ SINGLE_BATTLE_TEST("Conversion 2 fails if the targeted move is Stellar Type") MESSAGE("But it failed!"); } } + +SINGLE_BATTLE_TEST("Conversion 2 fails if used by a Terastallized Pokemon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_PSYCHIC); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_CONVERSION_2, gimmick: GIMMICK_TERA); } + } SCENE { + MESSAGE("Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Conversion 2 fails if last hit by a Stellar-type move (Gen 1-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_UPDATED_CONVERSION_2, GEN_4); + PLAYER(SPECIES_WOBBUFFET) { TeraType(TYPE_STELLAR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TERA_BLAST, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CONVERSION_2); } + } SCENE { + // turn 1 + MESSAGE("Wobbuffet used Tera Blast!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TERA_BLAST, player); + // turn 2 + MESSAGE("The opposing Wobbuffet used Conversion 2!"); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c index 34f355167..d834564b1 100644 --- a/test/battle/move_effect/copycat.c +++ b/test/battle/move_effect/copycat.c @@ -45,7 +45,7 @@ SINGLE_BATTLE_TEST("Copycat deducts power points from itself, not the copied mov DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") { GIVEN { - WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks + WITH_CONFIG(CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/corrosive_gas.c b/test/battle/move_effect/corrosive_gas.c index 84b7c1c70..fd4c2bd42 100644 --- a/test/battle/move_effect/corrosive_gas.c +++ b/test/battle/move_effect/corrosive_gas.c @@ -8,14 +8,14 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Corrosive Gas destroys the target's item or fails if the target has no item") { - u16 item; + enum Item item; - PARAMETRIZE {item = ITEM_NONE; } - PARAMETRIZE {item = ITEM_POTION; } + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_POTION; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) {Item(item); } + OPPONENT(SPECIES_WOBBUFFET) { Item(item); } } WHEN { TURN { MOVE(player, MOVE_CORROSIVE_GAS); } } SCENE { @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Corrosive Gas doesn't destroy the item of a Pokemon with the { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_MUK) {Item(ITEM_POISON_BARB); Ability(ABILITY_STICKY_HOLD); } + OPPONENT(SPECIES_MUK) { Item(ITEM_POISON_BARB); Ability(ABILITY_STICKY_HOLD); } } WHEN { TURN { MOVE(player, MOVE_CORROSIVE_GAS); } } SCENE { @@ -54,8 +54,8 @@ SINGLE_BATTLE_TEST("Items lost to Corrosive Gas cannot be restored by Recycle") { GIVEN { ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); - PLAYER(SPECIES_WOBBUFFET) {Speed(15); } - OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_ORAN_BERRY); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(15); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); Speed(10); } } WHEN { TURN { MOVE(player, MOVE_CORROSIVE_GAS); MOVE(opponent, MOVE_RECYCLE); } } SCENE { @@ -73,12 +73,12 @@ DOUBLE_BATTLE_TEST("Corrosive Gas destroys foes and ally's items if they have on { // Check it affects all targets in all possible configurations. u32 j, k, l; - u16 itemOpponentLeft, itemOpponentRight, itemPlayerLeft; + enum Item itemOpponentLeft, itemOpponentRight, itemPlayerLeft; for (j = 0; j < 2; j++) { for (k = 0; k < 2; k++) { for (l = 0; l < 2; l++) { - PARAMETRIZE {itemOpponentLeft = (j & 1) ? ITEM_ORAN_BERRY : ITEM_NONE; + PARAMETRIZE { itemOpponentLeft = (j & 1) ? ITEM_ORAN_BERRY : ITEM_NONE; itemOpponentRight = (k & 1) ? ITEM_CHESTO_BERRY : ITEM_NONE; itemPlayerLeft = (l & 1) ? ITEM_CHERI_BERRY : ITEM_NONE; } } @@ -86,10 +86,10 @@ DOUBLE_BATTLE_TEST("Corrosive Gas destroys foes and ally's items if they have on } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Item(itemPlayerLeft);} - PLAYER(SPECIES_WYNAUT) {Item(ITEM_SITRUS_BERRY);} - OPPONENT(SPECIES_ABRA) {Item(itemOpponentLeft);} - OPPONENT(SPECIES_KADABRA) {Item(itemOpponentRight);} + PLAYER(SPECIES_WOBBUFFET) { Item(itemPlayerLeft); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_ABRA) { Item(itemOpponentLeft); } + OPPONENT(SPECIES_KADABRA) { Item(itemOpponentRight); } } WHEN { TURN { MOVE(playerRight, MOVE_CORROSIVE_GAS); } } SCENE { diff --git a/test/battle/move_effect/counter.c b/test/battle/move_effect/counter.c deleted file mode 100644 index ece0ea9a9..000000000 --- a/test/battle/move_effect/counter.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); - ASSUME(GetMoveCategory(MOVE_POUND) == DAMAGE_CATEGORY_PHYSICAL); -} - -SINGLE_BATTLE_TEST("Counter is not affected by Protect effects") -{ - u32 move; - - PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } - PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } - PARAMETRIZE { move = MOVE_BURNING_BULWARK; } - PARAMETRIZE { move = MOVE_KINGS_SHIELD; } - PARAMETRIZE { move = MOVE_SILK_TRAP; } - PARAMETRIZE { move = MOVE_OBSTRUCT; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); MOVE(player, MOVE_COUNTER); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); - if (move == MOVE_SPIKY_SHIELD) { - HP_BAR(player); - } else if (move == MOVE_BANEFUL_BUNKER) { - STATUS_ICON(player, STATUS1_POISON); - } else if (move == MOVE_BURNING_BULWARK) { - STATUS_ICON(player, STATUS1_BURN); - } else if (move == MOVE_KINGS_SHIELD) { - MESSAGE("Wobbuffet's Attack fell!"); - } else if (move == MOVE_SILK_TRAP) { - MESSAGE("Wobbuffet's Speed fell!"); - } else if (move == MOVE_OBSTRUCT) { - MESSAGE("Wobbuffet's Defense harshly fell!"); - } - } - } -} - -SINGLE_BATTLE_TEST("Counter will do twice as much damage received from the opponent") -{ - s16 normalDmg; - s16 counterDmg; - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COUNTER); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); - HP_BAR(player, captureDamage: &normalDmg); - ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); - HP_BAR(opponent, captureDamage: &counterDmg); - } THEN { - EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); - } -} - -DOUBLE_BATTLE_TEST("Counter cannot affect ally Pokémon") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { - MOVE(playerLeft, MOVE_POUND, target: playerRight); - MOVE(playerRight, MOVE_COUNTER, target: playerLeft); - } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerRight); - } -} - -DOUBLE_BATTLE_TEST("Counter hits the last opponent that hit the user") -{ - s16 normalDmg; - s16 counterDmg; - - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { - MOVE(opponentLeft, MOVE_POUND, target: playerLeft); - MOVE(opponentRight, MOVE_SLAM, target: playerLeft); - MOVE(playerLeft, MOVE_COUNTER); - } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SLAM, opponentRight); - HP_BAR(playerLeft, captureDamage: &normalDmg); - ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); - HP_BAR(opponentRight, captureDamage: &counterDmg); - } THEN { - EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); - } -} - -DOUBLE_BATTLE_TEST("Counter respects Follow me") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { - MOVE(opponentRight, MOVE_FOLLOW_ME); - MOVE(opponentLeft, MOVE_POUND, target: playerLeft); - MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); - } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); - ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); - HP_BAR(opponentRight); - } -} - -DOUBLE_BATTLE_TEST("Counter fails if mon that damaged counter user is no longer on the field") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; - OPPONENT(SPECIES_WYNAUT); - } WHEN { - TURN { - MOVE(opponentLeft, MOVE_POUND, target: playerLeft); - MOVE(playerRight, MOVE_POUND, target: opponentLeft); - MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); - } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); - ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); - } -} - -// Gen 1 -TO_DO_BATTLE_TEST("Counter can only counter Normal and Fighting-type moves (Gen 1)"); -TO_DO_BATTLE_TEST("Counter can hit ghost-type Pokémon (Gen 1)"); -TO_DO_BATTLE_TEST("Counter can return damage dealt to a substitute (Gen 1)"); - -// Gen 2-3 -TO_DO_BATTLE_TEST("Counter can counter Hidden Power regardless of type (Gen 2-3)"); - -// Gen 2+ -TO_DO_BATTLE_TEST("Counter can only counter physical moves (Gen 2+)"); -TO_DO_BATTLE_TEST("Counter cannot hit ghost-type Pokémon (Gen 2+)"); -TO_DO_BATTLE_TEST("Counter cannot return damage dealt to a substitute (Gen 2+)"); - -// Triple Battles required to test -//TO_DO_BATTLE_TEST("Counter can hit non-adjacent opponents if they were the last Pokémon to hit the user"); diff --git a/test/battle/move_effect/court_change.c b/test/battle/move_effect/court_change.c index 40a1fe4e8..1c0fd4f3d 100644 --- a/test/battle/move_effect/court_change.c +++ b/test/battle/move_effect/court_change.c @@ -81,6 +81,7 @@ DOUBLE_BATTLE_TEST("Court Change swaps entry hazards used by the player") DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { + WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WYNAUT); @@ -92,10 +93,10 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror TURN { MOVE(opponentLeft, MOVE_AURORA_VEIL); MOVE(opponentRight, MOVE_REFLECT); } TURN { MOVE(opponentLeft, MOVE_LIGHT_SCREEN); MOVE(opponentRight, MOVE_TAILWIND); } TURN { MOVE(playerLeft, MOVE_COURT_CHANGE); } - TURN { } - TURN { } - TURN { } - TURN { } + TURN {} + TURN {} + TURN {} + TURN {} } SCENE { MESSAGE("Wynaut used Snowscape!"); MESSAGE("The opposing Wobbuffet used Mist!"); @@ -119,6 +120,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps Mist, Safeguard, Auror DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aurora Veil, Reflect, Light Screen, Tailwind") { GIVEN { + WITH_CONFIG(CONFIG_TAILWIND_TURNS, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -130,10 +132,10 @@ DOUBLE_BATTLE_TEST("Court Change used by the opponent swaps Mist, Safeguard, Aur TURN { MOVE(playerLeft, MOVE_AURORA_VEIL); MOVE(playerRight, MOVE_REFLECT); } TURN { MOVE(playerLeft, MOVE_LIGHT_SCREEN); MOVE(playerRight, MOVE_TAILWIND); } TURN { MOVE(opponentLeft, MOVE_COURT_CHANGE); } - TURN { } - TURN { } - TURN { } - TURN { } + TURN {} + TURN {} + TURN {} + TURN {} } SCENE { MESSAGE("Wobbuffet used Mist!"); MESSAGE("Wobbuffet used Safeguard!"); @@ -171,9 +173,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Steelsurge") MESSAGE("Copperajah used G-Max Steelsurge!"); SEND_IN_MESSAGE("Wobbuffet"); MESSAGE("The sharp steel bit into Wobbuffet!"); - NONE_OF { - MESSAGE("The sharp steel bit into the opposing Wynaut!"); - } + NOT MESSAGE("The sharp steel bit into the opposing Wynaut!"); } } @@ -220,7 +220,7 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Vine Lash, G-Max AI_SINGLE_BATTLE_TEST("AI uses Court Change") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HEADBUTT; } PARAMETRIZE { move = MOVE_REFLECT; } @@ -248,4 +248,3 @@ AI_SINGLE_BATTLE_TEST("AI uses Court Change") TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); } } } - diff --git a/test/battle/move_effect/curse.c b/test/battle/move_effect/curse.c index bb1de42fb..355972e74 100644 --- a/test/battle/move_effect/curse.c +++ b/test/battle/move_effect/curse.c @@ -37,16 +37,19 @@ SINGLE_BATTLE_TEST("Curse cuts the user's HP in half when used by Ghost-types") } } -SINGLE_BATTLE_TEST("Curse applies to the user if used with Protean") +SINGLE_BATTLE_TEST("Curse applies to the user if used with Protean/Libero") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_KECLEON; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_CURSE, target: player); } } SCENE { s32 playerMaxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); - ABILITY_POPUP(player, ABILITY_PROTEAN); + ABILITY_POPUP(player, ability); ANIMATION(ANIM_TYPE_MOVE, MOVE_CURSE, player); HP_BAR(player, damage: playerMaxHP / 2); HP_BAR(player, damage: playerMaxHP / 4); diff --git a/test/battle/move_effect/decorate.c b/test/battle/move_effect/decorate.c index 5eef9dc30..ac2bb6105 100644 --- a/test/battle/move_effect/decorate.c +++ b/test/battle/move_effect/decorate.c @@ -1,5 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Decorate raises the target's Attack by 2 stages"); -TO_DO_BATTLE_TEST("Decorate raises the target's Sp. Attack by 2 stages"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_DECORATE) == EFFECT_DECORATE); +} + +SINGLE_BATTLE_TEST("Decorate raises the target's Attack and Sp. Attack by 2 stages each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DECORATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DECORATE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index 96b79438f..844a9364a 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -31,31 +31,145 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 stage") ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } -SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute") +SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change") { GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SIMPLE); } + } WHEN { + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); + } +} + +SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } } SCENE { MESSAGE("The opposing Wobbuffet used Substitute!"); - MESSAGE("But it failed!"); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); - MESSAGE("The opposing Wobbuffet's evasiveness fell!"); - } + NOT MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + } +} + +SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind Substitute (Gen4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Ability(ABILITY_SIMPLE); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + TURN { MOVE(player, MOVE_DEFOG); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Substitute!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); + MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); + } +} + +SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute (Gen5+)") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(opponent, move); } + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Substitute!"); + if (move == MOVE_CELEBRATE) + { + MESSAGE("But it failed!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } + } + else + { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } + } + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + enum Move move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_REFLECT); MOVE(playerRight, MOVE_LIGHT_SCREEN); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIGHT_SCREEN, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NONE_OF { + MESSAGE("Your team's Reflect wore off!"); + MESSAGE("Your team's Light Screen wore off!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); } } -TO_DO_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side"); DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", s16 damagePhysical, s16 damageSpecial) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } @@ -76,9 +190,9 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", MESSAGE("The opposing team's Reflect wore off!"); MESSAGE("The opposing team's Light Screen wore off!"); } - MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); HP_BAR(opponentLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("Wobbuffet used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, playerRight); HP_BAR(opponentRight, captureDamage: &results[i].damageSpecial); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); @@ -86,10 +200,41 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", } } -TO_DO_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side"); +DOUBLE_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCREECH, target: playerLeft); MOVE(opponentRight, MOVE_TOXIC, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NONE_OF { + MESSAGE("Your team's Mist wore off!"); + MESSAGE("Your team's Safeguard wore off!"); + } + MESSAGE("The opposing Wobbuffet used Screech!"); + MESSAGE("Wobbuffet is protected by the mist!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("The opposing Wobbuffet used Toxic!"); + MESSAGE("Wobbuffet is protected by Safeguard!"); + NOT STATUS_ICON(playerRight, badPoison: TRUE); + } +} + DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } @@ -114,8 +259,7 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by the mist!"); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); } @@ -123,23 +267,74 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, playerRight); STATUS_ICON(opponentRight, badPoison: TRUE); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by Safeguard!"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } } -TO_DO_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Stealth Rock or Sticky Web from user's side (Gen 4-5)"); +DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_STEALTH_ROCK); MOVE(opponentRight, MOVE_STICKY_WEB); } + TURN { MOVE(opponentLeft, move, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + if (move == MOVE_DEFOG) { + MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); + } + // Switch happens + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + if (move != MOVE_DEFOG) { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } else { + NONE_OF { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } + } + } THEN { + if (move != MOVE_DEFOG) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } + } +} + DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side (Gen 6+)") { - u16 move; + enum Move move; + u32 config; - PARAMETRIZE { move = MOVE_DEFOG; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } @@ -153,21 +348,20 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) { + if (move == MOVE_DEFOG && config >= GEN_6) { MESSAGE("The sticky web has disappeared from the ground around your team!"); MESSAGE("The pointed stones disappeared from around your team!"); } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); MESSAGE("Wobbuffet was caught in a sticky web!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Wobbuffet's Speed fell!"); - } - else { + } else { NONE_OF { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); @@ -176,18 +370,56 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( MESSAGE("Wobbuffet's Speed fell!"); } } + } THEN { + if (move != MOVE_DEFOG || config <= GEN_5) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } + } +} + +SINGLE_BATTLE_TEST("Defog removes Spikes from target's side") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_SPIKES); } + TURN { MOVE(player, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) { + MESSAGE("The spikes disappeared from the ground around the opposing team!"); + NONE_OF { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } + } else { + NOT MESSAGE("The spikes disappeared from the ground around the opposing team!"); + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } } } -TO_DO_BATTLE_TEST("Defog removes Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Spikes from user's side (Gen 4-5)"); SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") { - u16 move; + enum Move move; + u32 config; - PARAMETRIZE { move = MOVE_DEFOG; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(2); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -197,16 +429,15 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); ANIMATION(ANIM_TYPE_MOVE, move, player); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (move == MOVE_DEFOG && config >= GEN_6) MESSAGE("The spikes disappeared from the ground around your team!"); // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); - } - else { + } else { NONE_OF { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); @@ -215,16 +446,21 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove terrain (Gen 4-7)"); SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") { - u16 move; + enum Move move; + u32 config; - PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; } - PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } - PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } - PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_8; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -232,7 +468,7 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, move, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponent); - if (B_DEFOG_EFFECT_CLEARING >= GEN_8) { + if (config >= GEN_8) { if (move == MOVE_PSYCHIC_TERRAIN) { MESSAGE("The weirdness disappeared from the battlefield!"); } @@ -258,34 +494,32 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } } -TO_DO_BATTLE_TEST("Defog removes Toxic Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Toxic Spikes from user's side (Gen 4-5)"); -SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from target's side") { - u16 move; + enum Move move; - PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { - TURN { MOVE(player, MOVE_TOXIC_SPIKES); MOVE(opponent, move); } + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } + TURN { MOVE(player, move); } TURN { SWITCH(opponent, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); // Switch happens MESSAGE("2 sent out Wobbuffet!"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG) { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); STATUS_ICON(opponent, poison: TRUE); - } - else { + } else { NONE_OF { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); @@ -295,15 +529,94 @@ SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side"); -DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhysical, s16 damageSpecial) +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") { - u16 move; + enum Move move; + u32 config; + + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_SPIKES); MOVE(opponent, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_DEFOG && config >= GEN_6) + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + // Switch happens + MESSAGE("2 sent out Wobbuffet!"); + if (move != MOVE_DEFOG || config <= GEN_5) { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } else { + NONE_OF { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } + } + } +} + +DOUBLE_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + enum Move move; PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_GLALIE) { Speed(4); } + PLAYER(SPECIES_GLALIE) { Speed(3); } + OPPONENT(SPECIES_GLALIE) { Speed(2); } + OPPONENT(SPECIES_GLALIE) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HAIL); MOVE(playerRight, MOVE_AURORA_VEIL); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAIL, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURORA_VEIL, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + if (move == MOVE_DEFOG) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Glalie's evasiveness fell!"); + } + NOT MESSAGE("Your team's Aurora Veil wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); + } +} + +DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhysical, s16 damageSpecial) +{ + enum Move move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } @@ -322,10 +635,15 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy MESSAGE("Glalie's evasiveness fell!"); MESSAGE("Your team's Aurora Veil wore off!"); } - MESSAGE("The opposing Glalie used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("The opposing Glalie used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); EXPECT_MUL_EQ(results[1].damageSpecial, Q_4_12(1.5), results[0].damageSpecial); @@ -334,8 +652,13 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy DOUBLE_BATTLE_TEST("Defog removes everything it can") { + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_6; } GIVEN { - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_GLALIE) { Speed(4); } PLAYER(SPECIES_GLALIE) { Speed(3); } @@ -363,7 +686,7 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") MESSAGE("Your team's Aurora Veil wore off!"); MESSAGE("Your team's Safeguard wore off!"); - if (B_DEFOG_EFFECT_CLEARING >= GEN_6) { + if (config == GEN_6) { MESSAGE("The spikes disappeared from the ground around your team!"); MESSAGE("The sticky web has disappeared from the ground around your team!"); MESSAGE("The poison spikes disappeared from the ground around your team!"); @@ -376,25 +699,43 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") MESSAGE("The pointed stones disappeared from around the opposing team!"); } } THEN { - EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + if (config == GEN_6) { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE); + } else { + EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_STEALTH_ROCK); + EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_TOXIC_SPIKES); + } EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE); EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_NONE); - EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_NONE); + if (config == GEN_6) { + EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_NONE); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_NONE); + } else { + EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_STICKY_WEB); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_TOXIC_SPIKES); + EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_STEALTH_ROCK); + } EXPECT_EQ(gBattleStruct->hazardsQueue[1][4], HAZARDS_NONE); EXPECT_EQ(gBattleStruct->hazardsQueue[1][5], HAZARDS_NONE); } } -SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a substitute with Screen up") +SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a Substitute with Screen up") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -405,7 +746,11 @@ SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent); MESSAGE("Wobbuffet used Defog!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); - MESSAGE("The opposing Wobbuffet's evasiveness fell!"); MESSAGE("The opposing team's Light Screen wore off!"); + } THEN { + if (config >= GEN_5) + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + else + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c index 17cf65877..3be238400 100644 --- a/test/battle/move_effect/destiny_bond.c +++ b/test/battle/move_effect/destiny_bond.c @@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_6); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_6); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves (Gen7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by o SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing (Gen7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); + WITH_CONFIG(CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -106,7 +106,7 @@ SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing (Gen7+)") SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Destiny Bond") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_DESTINY_BOND); MOVE(player, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); } diff --git a/test/battle/move_effect/doodle.c b/test/battle/move_effect/doodle.c index 3484dac6a..b8db08bb8 100644 --- a/test/battle/move_effect/doodle.c +++ b/test/battle/move_effect/doodle.c @@ -14,7 +14,7 @@ DOUBLE_BATTLE_TEST("Doodle gives the target's ability to user and ally") OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerLeft); MESSAGE("Wynaut copied the opposing Torchic's Ability!"); @@ -33,7 +33,7 @@ DOUBLE_BATTLE_TEST("Doodle can't copy a banned ability") OPPONENT(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } } SCENE { NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerLeft); @@ -54,7 +54,7 @@ DOUBLE_BATTLE_TEST("Doodle fails if user has a banned Ability") OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerLeft); MESSAGE("But it failed!"); @@ -72,7 +72,7 @@ DOUBLE_BATTLE_TEST("Doodle fails if partner has a banned Ability") OPPONENT(SPECIES_TORCHIC) { Ability(ABILITY_BLAZE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } + TURN { MOVE(playerLeft, MOVE_DOODLE, target: opponentLeft); } } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DOODLE, playerLeft); MESSAGE("But it failed!"); diff --git a/test/battle/move_effect/dragon_cheer.c b/test/battle/move_effect/dragon_cheer.c index a7fff9e7d..e7b24f349 100644 --- a/test/battle/move_effect/dragon_cheer.c +++ b/test/battle/move_effect/dragon_cheer.c @@ -28,7 +28,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 1 on non-Dragon } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -62,7 +62,7 @@ DOUBLE_BATTLE_TEST("Dragon Cheer increases critical hit ratio by 2 on Dragon typ } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SCRATCH) == 0); ASSUME(GetSpeciesBaseSpeed(SPECIES_DRATINI) == 50); PLAYER(SPECIES_WOBBUFFET); @@ -121,7 +121,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Dragon Cheer") OPPONENT(species) { Moves(MOVE_DRAGON_CHEER, MOVE_POUND); } } WHEN { if (species == SPECIES_DRATINI) - TURN { EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } else TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_DRAGON_CHEER); } } diff --git a/test/battle/move_effect/dragon_dance.c b/test/battle/move_effect/dragon_dance.c index 52587cc09..0d0cb6a4b 100644 --- a/test/battle/move_effect/dragon_dance.c +++ b/test/battle/move_effect/dragon_dance.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Dragon Dance increases Attack and Speed by one stage each"); +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_DRAGON_DANCE) == EFFECT_DRAGON_DANCE); +} + +SINGLE_BATTLE_TEST("Dragon Dance increases the user's Attack and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_DRAGON_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/dragon_darts.c b/test/battle/move_effect/dragon_darts.c index 97694909f..f4d1d10be 100644 --- a/test/battle/move_effect/dragon_darts.c +++ b/test/battle/move_effect/dragon_darts.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_DRAGON_DARTS) == EFFECT_DRAGON_DARTS); + ASSUME(GetMoveTarget(MOVE_DRAGON_DARTS) == TARGET_SMART); } SINGLE_BATTLE_TEST("Dragon Darts strikes twice") @@ -106,8 +106,8 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_LANTURN) { Ability(abilityLeft); }; - OPPONENT(SPECIES_LANTURN) { Ability(abilityRight); }; + OPPONENT(SPECIES_LANTURN) { Ability(abilityLeft); } + OPPONENT(SPECIES_LANTURN) { Ability(abilityRight); } } WHEN { TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: chosenTarget); } } SCENE { @@ -132,8 +132,8 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes an opponent twice if electrified and th ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ELECTIVIRE) { Ability(abilityLeft); }; - OPPONENT(SPECIES_ELECTIVIRE) { Ability(abilityRight); }; + OPPONENT(SPECIES_ELECTIVIRE) { Ability(abilityLeft); } + OPPONENT(SPECIES_ELECTIVIRE) { Ability(abilityRight); } } WHEN { TURN { MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); MOVE(playerLeft, MOVE_DRAGON_DARTS, target: chosenTarget); } } SCENE { @@ -216,14 +216,14 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes left ally twice if one strike misses") { struct BattlePokemon *chosenTarget = NULL; struct BattlePokemon *finalTarget = NULL; - u32 itemLeft, itemRight; + enum Item itemLeft, itemRight; PARAMETRIZE { chosenTarget = opponentLeft; finalTarget = opponentRight; itemLeft = ITEM_BRIGHT_POWDER; itemRight = ITEM_NONE; } PARAMETRIZE { chosenTarget = opponentRight; finalTarget = opponentLeft; itemLeft = ITEM_NONE; itemRight = ITEM_BRIGHT_POWDER; } GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(itemLeft); }; - OPPONENT(SPECIES_WOBBUFFET) { Item(itemRight); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(itemLeft); } + OPPONENT(SPECIES_WOBBUFFET) { Item(itemRight); } } WHEN { TURN { MOVE(playerLeft, MOVE_DRAGON_DARTS, target: chosenTarget, hit: FALSE); } } SCENE { @@ -240,7 +240,7 @@ DOUBLE_BATTLE_TEST("Dragon Darts strikes right ally twice if one strike misses") GIVEN { PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BRIGHT_POWDER); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BRIGHT_POWDER); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentLeft, hit: FALSE); } @@ -308,3 +308,24 @@ DOUBLE_BATTLE_TEST("Dragon Darts fails to strike the second target if first targ } } } + +DOUBLE_BATTLE_TEST("Dragon Darts can be absorbed by both opponents and hit neither") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + OPPONENT(SPECIES_ELECTIVIRE) { Ability(ABILITY_MOTOR_DRIVE); }; + } WHEN { + TURN { + MOVE(opponentRight, MOVE_ELECTRIFY, target: playerLeft); + MOVE(playerLeft, MOVE_DRAGON_DARTS, target: opponentLeft); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_DARTS, playerLeft); + } THEN { + EXPECT_EQ(opponentLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + diff --git a/test/battle/move_effect/dream_eater.c b/test/battle/move_effect/dream_eater.c index baefd2e4f..d65064c92 100644 --- a/test/battle/move_effect/dream_eater.c +++ b/test/battle/move_effect/dream_eater.c @@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Dream Eater fails if the target is behind a Substitute (Gen OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_YAWN); MOVE(player, MOVE_SUBSTITUTE); } - TURN { } + TURN {} TURN { MOVE(opponent, MOVE_DREAM_EATER); } } SCENE { MESSAGE("The opposing Wobbuffet used Dream Eater!"); @@ -96,6 +96,7 @@ SINGLE_BATTLE_TEST("Dream Eater works if the target is behind a Substitute (Gen { s16 damage; s16 healed; + KNOWN_FAILING; // Dream Eater can hit and drain from a Substitute, but not bypass it. GIVEN { ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); ASSUME(GetMoveEffect(MOVE_SUBSTITUTE) == EFFECT_SUBSTITUTE); @@ -103,7 +104,7 @@ SINGLE_BATTLE_TEST("Dream Eater works if the target is behind a Substitute (Gen OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(opponent, MOVE_YAWN); MOVE(player, MOVE_SUBSTITUTE); } - TURN { } + TURN {} TURN { MOVE(opponent, MOVE_DREAM_EATER); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DREAM_EATER, opponent); diff --git a/test/battle/move_effect/earthquake.c b/test/battle/move_effect/earthquake.c index 2cbf3b32c..2214930ef 100644 --- a/test/battle/move_effect/earthquake.c +++ b/test/battle/move_effect/earthquake.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Earthquake's and Bulldoze's damage is halved when Grassy Terrain is in effect", s16 damage) { bool32 terrain; - u16 move; + enum Move move; PARAMETRIZE { terrain = FALSE; move = MOVE_EARTHQUAKE; } // 0 PARAMETRIZE { terrain = TRUE; move = MOVE_EARTHQUAKE; } // 1 PARAMETRIZE { terrain = FALSE; move = MOVE_BULLDOZE; } // 2 diff --git a/test/battle/move_effect/embargo.c b/test/battle/move_effect/embargo.c index 41c456d9a..c44d2905d 100644 --- a/test/battle/move_effect/embargo.c +++ b/test/battle/move_effect/embargo.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Embargo blocks the effect of an affected Pokémon's held ite GIVEN { ASSUME(gItemsInfo[ITEM_FOCUS_SASH].holdEffect == HOLD_EFFECT_FOCUS_SASH); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_FOCUS_SASH); } } WHEN { TURN { MOVE(player, MOVE_EMBARGO); } TURN { MOVE(player, MOVE_FISSURE); } @@ -47,7 +47,7 @@ SINGLE_BATTLE_TEST("Embargo blocks an affected Pokémon's trainer from using ite WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect experience gain", s32 exp) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_LUCKY_EGG; } PARAMETRIZE { item = ITEM_NONE; } @@ -126,7 +126,7 @@ SINGLE_BATTLE_TEST("Embargo negates a held item's Speed reduction") // KNOWN_FAILING; // Pokémon are currently not obtaining Friendship for using items in battle. // GIVEN { // ASSUME(gItemsInfo[ITEM_X_ACCURACY].battleUsage == EFFECT_ITEM_INCREASE_STAT); -// PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); }; +// PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SOOTHE_BELL); } // OPPONENT(SPECIES_WOBBUFFET); // } WHEN { // TURN { USE_ITEM(player, ITEM_X_ACCURACY); } @@ -149,7 +149,7 @@ SINGLE_BATTLE_TEST("Embargo doesn't block a held item's form-changing effect, bu PARAMETRIZE { heldItem = ITEM_MEADOW_PLATE; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_ARCEUS_GRASS) { Item(heldItem); }; + OPPONENT(SPECIES_ARCEUS_GRASS) { Item(heldItem); } ASSUME(gItemsInfo[ITEM_MEADOW_PLATE].holdEffect == HOLD_EFFECT_PLATE); ASSUME(gItemsInfo[ITEM_MEADOW_PLATE].holdEffectParam == 20); ASSUME(gItemsInfo[ITEM_MEADOW_PLATE].secondaryId == TYPE_GRASS); @@ -169,7 +169,7 @@ SINGLE_BATTLE_TEST("Embargo makes Fling and Natural Gift fail") PARAMETRIZE { heldItem = ITEM_LIGHT_BALL; moveId = MOVE_FLING; } PARAMETRIZE { heldItem = ITEM_CHERI_BERRY; moveId = MOVE_NATURAL_GIFT; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(heldItem); }; + PLAYER(SPECIES_WOBBUFFET) { Item(heldItem); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); } @@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Embargo makes Fling and Natural Gift fail") SINGLE_BATTLE_TEST("Embargo doesn't stop an item flung at an affected target from activating") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIGHT_BALL); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIGHT_BALL); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_EMBARGO); } @@ -211,7 +211,7 @@ SINGLE_BATTLE_TEST("Baton Pass passes Embargo's effect") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WYNAUT) { Item(ITEM_LIGHT_BALL); }; + PLAYER(SPECIES_WYNAUT) { Item(ITEM_LIGHT_BALL); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); } @@ -236,8 +236,8 @@ SINGLE_BATTLE_TEST("Embargo doesn't block the effects of berries obtained throug u32 hp = 10; GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); }; - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); }; + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ORAN_BERRY); } } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); } TURN { MOVE(player, MOVE_PLUCK); } @@ -260,7 +260,7 @@ SINGLE_BATTLE_TEST("Embargo disables the effect of the Plate items on the move J PARAMETRIZE { heldItem = ITEM_NONE; } PARAMETRIZE { heldItem = ITEM_PIXIE_PLATE; } GIVEN { - PLAYER(SPECIES_ARCEUS) { Item(heldItem); }; + PLAYER(SPECIES_ARCEUS) { Item(heldItem); } OPPONENT(SPECIES_DRAGONITE); } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); MOVE(player, MOVE_JUDGMENT); } @@ -281,7 +281,7 @@ SINGLE_BATTLE_TEST("Embargo disables the effect of the Drive items on the move T PARAMETRIZE { heldItem = ITEM_NONE; } PARAMETRIZE { heldItem = ITEM_SHOCK_DRIVE; } GIVEN { - PLAYER(SPECIES_GENESECT) { Item(heldItem); }; + PLAYER(SPECIES_GENESECT) { Item(heldItem); } OPPONENT(SPECIES_GYARADOS); } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); MOVE(player, MOVE_TECHNO_BLAST); } @@ -302,7 +302,7 @@ SINGLE_BATTLE_TEST("Embargo disables the effect of the Memory items on the move PARAMETRIZE { heldItem = ITEM_NONE; } PARAMETRIZE { heldItem = ITEM_FIRE_MEMORY; } GIVEN { - PLAYER(SPECIES_SILVALLY) { Item(heldItem); }; + PLAYER(SPECIES_SILVALLY) { Item(heldItem); } OPPONENT(SPECIES_VENUSAUR); } WHEN { TURN { MOVE(opponent, MOVE_EMBARGO); MOVE(player, MOVE_MULTI_ATTACK); } @@ -320,7 +320,7 @@ SINGLE_BATTLE_TEST("Embargo can be reflected by Magic Coat") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIGHT_BALL); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIGHT_BALL); } } WHEN { TURN { MOVE(player, MOVE_MAGIC_COAT); MOVE(opponent, MOVE_EMBARGO); } TURN { MOVE(opponent, MOVE_FLING); } @@ -342,7 +342,7 @@ SINGLE_BATTLE_TEST("Embargo doesn't prevent Mega Evolution") GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_CHARIZARD) { Item(ITEM_CHARIZARDITE_Y); }; + OPPONENT(SPECIES_CHARIZARD) { Item(ITEM_CHARIZARDITE_Y); } } WHEN { TURN { MOVE(player, MOVE_EMBARGO); } TURN { MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(opponent, 1); } @@ -367,7 +367,7 @@ SINGLE_BATTLE_TEST("Embargo doesn't prevent Primal Reversion") GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); }; + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } } WHEN { TURN { MOVE(player, MOVE_EMBARGO); } TURN { MOVE(opponent, MOVE_BATON_PASS); SEND_OUT(opponent, 1); } diff --git a/test/battle/move_effect/encore.c b/test/battle/move_effect/encore.c index 2c4ade2c8..e98f00df3 100644 --- a/test/battle/move_effect/encore.c +++ b/test/battle/move_effect/encore.c @@ -14,7 +14,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns: Encore used PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 10; speedOpponent = 20; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 20; speedOpponent = 10; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { @@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Encore forces consecutive move uses for 3 turns for player: PARAMETRIZE { encoreUser = opponent; encoreTarget = player; speedPlayer = 20; speedOpponent = 10; } PARAMETRIZE { encoreUser = player; encoreTarget = opponent; speedPlayer = 10; speedOpponent = 20; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); PLAYER(SPECIES_WOBBUFFET) { Speed(speedPlayer); } OPPONENT(SPECIES_WOBBUFFET) { Speed(speedOpponent); } } WHEN { @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be encored immediately after { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; // yes, this speed is necessary - OPPONENT(SPECIES_WOBBUFFET) { Speed(100); }; + OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(player, MOVE_ARM_THRUST, gimmick: GIMMICK_DYNAMAX); } TURN { MOVE(player, MOVE_ARM_THRUST); } @@ -126,6 +126,6 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be encored immediately after TO_DO_BATTLE_TEST("Encore's effect ends if the encored move runs out of PP"); TO_DO_BATTLE_TEST("Encore lasts for 2-6 turns (Gen 2-3)"); -TO_DO_BATTLE_TEST("Encore lasts for 4-8 turns (Gen 4)"); +TO_DO_BATTLE_TEST("Encore lasts for 3-7 turns (Gen 4)"); TO_DO_BATTLE_TEST("Encore lasts for 3 turns (Gen 5+)"); TO_DO_BATTLE_TEST("Encore randomly chooses an opponent target"); diff --git a/test/battle/move_effect/endeavor.c b/test/battle/move_effect/endeavor.c index 43786c29b..c6aaad143 100644 --- a/test/battle/move_effect/endeavor.c +++ b/test/battle/move_effect/endeavor.c @@ -19,5 +19,27 @@ SINGLE_BATTLE_TEST("Endeavor causes the target's HP to equal the user's current EXPECT_EQ(player->hp, opponent->hp); } } -TO_DO_BATTLE_TEST("Endeavor does not change HP if the target has less HP than the user, but still plays the animation") -TO_DO_BATTLE_TEST("Endeavor fails on Ghost-type Pokémon"); + +SINGLE_BATTLE_TEST("Endeavor fails on Ghost-type Pokémon") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_GASTLY); + } WHEN { + TURN { MOVE(player, MOVE_ENDEAVOR); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDEAVOR, player); + } +} + +SINGLE_BATTLE_TEST("Endeavor fails to change HP if the target has less HP than the user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(10); } + OPPONENT(SPECIES_WOBBUFFET) { HP(9); } + } WHEN { + TURN { MOVE(player, MOVE_ENDEAVOR); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDEAVOR, player); + } +} diff --git a/test/battle/move_effect/endure.c b/test/battle/move_effect/endure.c index 2d66bc41e..aca9f7dfd 100644 --- a/test/battle/move_effect/endure.c +++ b/test/battle/move_effect/endure.c @@ -11,7 +11,7 @@ TO_DO_BATTLE_TEST("Endure allows the user to survive any attack with 1 HP left") SINGLE_BATTLE_TEST("Endure does not prevent multiple hits and stat changes occur at the end of the turn") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { diff --git a/test/battle/move_effect/entrainment.c b/test/battle/move_effect/entrainment.c index ac6050bbe..ead4ff3b6 100644 --- a/test/battle/move_effect/entrainment.c +++ b/test/battle/move_effect/entrainment.c @@ -5,8 +5,8 @@ AI_DOUBLE_BATTLE_TEST("AI prefers Entrainment'ing good abilities onto partner wi { GIVEN { AI_FLAGS(AI_FLAG_SMART_TRAINER); - PLAYER(SPECIES_QUAXWELL) { Level(18); Ability(ABILITY_TORRENT); Moves(MOVE_WATER_GUN); }; - PLAYER(SPECIES_CORPHISH) { Level(18); Moves(MOVE_WATER_GUN); }; + PLAYER(SPECIES_QUAXWELL) { Level(18); Ability(ABILITY_TORRENT); Moves(MOVE_WATER_GUN); } + PLAYER(SPECIES_CORPHISH) { Level(18); Moves(MOVE_WATER_GUN); } OPPONENT(SPECIES_SMEARGLE) { Level(17); Ability(ABILITY_TECHNICIAN); Moves(MOVE_AERIAL_ACE, MOVE_ENTRAINMENT, MOVE_FLAME_WHEEL, MOVE_MAGICAL_LEAF); } OPPONENT(SPECIES_ARCHEN) { Level(17); Ability(ABILITY_DEFEATIST); Moves(MOVE_DUAL_WINGBEAT, MOVE_ROCK_TOMB); } } WHEN { diff --git a/test/battle/move_effect/expanding_force.c b/test/battle/move_effect/expanding_force.c deleted file mode 100644 index 7b0284390..000000000 --- a/test/battle/move_effect/expanding_force.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -SINGLE_BATTLE_TEST("Expanding Force's power increases by 50% if the user is affected by Psychic Terrain", s16 damage) -{ - bool32 terrain; - PARAMETRIZE { terrain = FALSE; } - PARAMETRIZE { terrain = TRUE; } - GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPANDING_FORCE) == EFFECT_EXPANDING_FORCE); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - if (terrain) - TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } - TURN { MOVE(player, MOVE_EXPANDING_FORCE); } - } SCENE { - MESSAGE("Wobbuffet used Expanding Force!"); - HP_BAR(opponent, captureDamage: &results[i].damage); - } FINALLY { - if (B_TERRAIN_TYPE_BOOST >= GEN_8) - // 1.3 Terrain boost x 1.5 effect boost = 1.95 boost - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.95), results[1].damage); - else - // 1.5 Terrain boost x 1.5 effect boost = 2.25 boost - EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.25), results[1].damage); - } -} diff --git a/test/battle/move_effect/fail_if_not_arg_type.c b/test/battle/move_effect/fail_if_not_arg_type.c index 4be65a567..9714c1575 100644 --- a/test/battle/move_effect/fail_if_not_arg_type.c +++ b/test/battle/move_effect/fail_if_not_arg_type.c @@ -43,7 +43,7 @@ TO_DO_BATTLE_TEST("Burn Up doesn't thaw the user if it fails due to the user not SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fire-type") { GIVEN { - WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_6); + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); PLAYER(SPECIES_REGIROCK); OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } OPPONENT(SPECIES_WOBBUFFET); @@ -51,7 +51,10 @@ SINGLE_BATTLE_TEST("Burn Up fails if the user has Protean/Libero and is not a Fi TURN { MOVE(opponent, MOVE_BURN_UP); } } SCENE { MESSAGE("The opposing Kecleon used Burn Up!"); - NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); } + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BURN_UP, player); + } MESSAGE("But it failed!"); } } diff --git a/test/battle/move_effect/fell_stinger.c b/test/battle/move_effect/fell_stinger.c index a5112fe89..8d395080f 100644 --- a/test/battle/move_effect/fell_stinger.c +++ b/test/battle/move_effect/fell_stinger.c @@ -9,7 +9,7 @@ SINGLE_BATTLE_TEST("Fell Stinger raises user's Attack by 2 stages (Gen6) or 3 st PARAMETRIZE { config = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_FELL_STINGER_STAT_RAISE, config); + WITH_CONFIG(CONFIG_FELL_STINGER_STAT_RAISE, config); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_FELL_STINGER); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/fillet_away.c b/test/battle/move_effect/fillet_away.c index 70f180a70..0cd53e684 100644 --- a/test/battle/move_effect/fillet_away.c +++ b/test/battle/move_effect/fillet_away.c @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Fillet Away sharply raises Attack, Sp. Atk, and Speed") SINGLE_BATTLE_TEST("Fillet Away fails if user's current HP is half or less than half its maximum") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50);} + PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(50); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_FILLET_AWAY); } diff --git a/test/battle/move_effect/final_gambit.c b/test/battle/move_effect/final_gambit.c index 020e415f0..eef20b2a2 100644 --- a/test/battle/move_effect/final_gambit.c +++ b/test/battle/move_effect/final_gambit.c @@ -6,6 +6,27 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_FINAL_GAMBIT) == EFFECT_FINAL_GAMBIT); } +SINGLE_BATTLE_TEST("Final Gambit faints the user, and the target receives damage equal to the user's HP") +{ + u32 hp; + PARAMETRIZE { hp = 32; } + PARAMETRIZE { hp = 40; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(hp); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(400); HP(400); } + } WHEN { + TURN { MOVE(player, MOVE_FINAL_GAMBIT); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FINAL_GAMBIT, player); + HP_BAR(opponent); + HP_BAR(player); + } THEN { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP), 0); + EXPECT_EQ(opponent->hp, 400 - hp); + } +} + SINGLE_BATTLE_TEST("Final Gambit faints user and target") { GIVEN { @@ -73,10 +94,38 @@ SINGLE_BATTLE_TEST("Final Gambit does not faint user if target is immune") } } -TO_DO_BATTLE_TEST("Final Gambit faints the user, and the target receives damage equal to the user's HP") // User should faint before the target +// Using CONFIG_UPDATED_MOVE_FLAGS doesn't work yet, commented out so they don't cause surprise failures + +// SINGLE_BATTLE_TEST("Final Gambit faints the user before abilities can activate (Gen 5)") +// { +// GIVEN { +// WITH_CONFIG(CONFIG_UPDATED_MOVE_FLAGS, GEN_5); +// PLAYER(SPECIES_WOBBUFFET); +// OPPONENT(SPECIES_PYUKUMUKU) { Ability(ABILITY_INNARDS_OUT); HP(1); } +// } WHEN { +// TURN { MOVE(player, MOVE_FINAL_GAMBIT); } +// } SCENE { +// NOT ABILITY_POPUP(opponent, ABILITY_INNARDS_OUT); +// MESSAGE("Wobbuffet fainted!"); +// NOT ABILITY_POPUP(opponent, ABILITY_INNARDS_OUT); +// } +// } + +// SINGLE_BATTLE_TEST("Final Gambit faints the user after abilities can activate (Gen 6+)") +// { +// GIVEN { +// WITH_CONFIG(CONFIG_UPDATED_MOVE_FLAGS, GEN_6); +// PLAYER(SPECIES_WOBBUFFET); +// OPPONENT(SPECIES_PYUKUMUKU) { Ability(ABILITY_INNARDS_OUT); HP(1); } +// } WHEN { +// TURN { MOVE(player, MOVE_FINAL_GAMBIT); } +// } SCENE { +// ABILITY_POPUP(opponent, ABILITY_INNARDS_OUT); +// MESSAGE("Wobbuffet fainted!"); +// } +// } + TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if it misses") -TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if the target is immune") -TO_DO_BATTLE_TEST("Final Gambit doesn't faint the user if the target is protected") TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Focus Band") TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Focus Sash") TO_DO_BATTLE_TEST("Final Gambit doesn't trigger the user's Sturdy") diff --git a/test/battle/move_effect/fixed_damage_arg.c b/test/battle/move_effect/fixed_hp_damage.c similarity index 100% rename from test/battle/move_effect/fixed_damage_arg.c rename to test/battle/move_effect/fixed_hp_damage.c diff --git a/test/battle/move_effect/fixed_percent_damage.c b/test/battle/move_effect/fixed_percent_damage.c new file mode 100644 index 000000000..408139b98 --- /dev/null +++ b/test/battle/move_effect/fixed_percent_damage.c @@ -0,0 +1,9 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Super Fang does 50% damage to the target's current HP") +TO_DO_BATTLE_TEST("Super Fang always deals at least 1 HP of damage") +TO_DO_BATTLE_TEST("Super Fang is unaffected by type immunities (Gen 1)") +TO_DO_BATTLE_TEST("Super Fang doesn't hit Ghost-type Pokémon (Gen 2+)") + +TO_DO_BATTLE_TEST("Guardian of Alola does 75% damage to the target's current HP") diff --git a/test/battle/move_effect/flatter.c b/test/battle/move_effect/flatter.c index d9d05a98f..ce798e555 100644 --- a/test/battle/move_effect/flatter.c +++ b/test/battle/move_effect/flatter.c @@ -1,7 +1,27 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk and confuses them") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FLATTER) == EFFECT_FLATTER); +} + +SINGLE_BATTLE_TEST("Flatter increases the target's Sp. Attack by 1 stage and confuses them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLATTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLATTER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT(opponent->volatiles.confusionTurns > 0); + } +} + TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even if they're already confused") TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even when protected by Safeguard") TO_DO_BATTLE_TEST("Flatter raises the target's Sp. Atk even when protected Own Tempo") diff --git a/test/battle/move_effect/fling.c b/test/battle/move_effect/fling.c index 05ccec70a..b9c82ab0b 100644 --- a/test/battle/move_effect/fling.c +++ b/test/battle/move_effect/fling.c @@ -8,16 +8,16 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Fling fails if Pokémon holds no item") { - u16 item; + enum Item item; - PARAMETRIZE {item = ITEM_NONE; } - PARAMETRIZE {item = ITEM_RAZOR_CLAW; } + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_RAZOR_CLAW; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_FLING);} + TURN { MOVE(player, MOVE_FLING); } } SCENE { MESSAGE("Wobbuffet used Fling!"); if (item != ITEM_NONE) { @@ -31,11 +31,11 @@ SINGLE_BATTLE_TEST("Fling fails if Pokémon holds no item") SINGLE_BATTLE_TEST("Fling fails if Pokémon is under the effects of Embargo or Magic Room") { - u16 move; + enum Move move; - PARAMETRIZE {move = MOVE_CELEBRATE; } - PARAMETRIZE {move = MOVE_EMBARGO; } - PARAMETRIZE {move = MOVE_MAGIC_ROOM; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_EMBARGO; } + PARAMETRIZE { move = MOVE_MAGIC_ROOM; } GIVEN { ASSUME(GetMoveEffect(MOVE_EMBARGO) == EFFECT_EMBARGO); @@ -56,22 +56,24 @@ SINGLE_BATTLE_TEST("Fling fails if Pokémon is under the effects of Embargo or M } } -SINGLE_BATTLE_TEST("Fling fails for Pokémon with Klutz ability") +SINGLE_BATTLE_TEST("Fling fails for Pokémon with Klutz ability (Gen5+)") { enum Ability ability; + u32 config; - PARAMETRIZE {ability = ABILITY_KLUTZ; } - PARAMETRIZE {ability = ABILITY_RUN_AWAY; } + PARAMETRIZE { ability = ABILITY_RUN_AWAY; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_KLUTZ; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_KLUTZ; config = GEN_5; } GIVEN { - ASSUME(B_KLUTZ_FLING_INTERACTION >= GEN_5); + WITH_CONFIG(CONFIG_KLUTZ_FLING_INTERACTION, config); PLAYER(SPECIES_BUNEARY) { Item(ITEM_RAZOR_CLAW); Ability(ability); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_FLING); } } SCENE { MESSAGE("Buneary used Fling!"); - if (ability != ABILITY_KLUTZ) { + if (ability != ABILITY_KLUTZ || config == GEN_4) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); HP_BAR(opponent); } else { @@ -80,19 +82,46 @@ SINGLE_BATTLE_TEST("Fling fails for Pokémon with Klutz ability") } } -TO_DO_BATTLE_TEST("Fling fails if the item changes the Pokémon's form") -TO_DO_BATTLE_TEST("Fling works if the item changes a Pokémon's form but not the one holding it") //Eg. non-matching Mega Stones +SINGLE_BATTLE_TEST("Fling fails if the item changes the Pokémon's form") +{ + GIVEN { + PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(ITEM_GRISEOUS_CORE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_GRISEOUS_CORE); + } +} + +SINGLE_BATTLE_TEST("Fling works if the item changes a Pokémon's form but not the one holding it") +{ + GIVEN { + PLAYER(SPECIES_VENUSAUR) { Item(ITEM_BLASTOISINITE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + NOT MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + } THEN { + EXPECT(player->item == ITEM_NONE); + } +} SINGLE_BATTLE_TEST("Fling's thrown item can be regained with Recycle") { GIVEN { ASSUME(GetMoveEffect(MOVE_RECYCLE) == EFFECT_RECYCLE); - PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RAZOR_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_FLING);} - TURN { MOVE(player, MOVE_RECYCLE);} - TURN { MOVE(player, MOVE_FLING);} + TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_RECYCLE); } + TURN { MOVE(player, MOVE_FLING); } } SCENE { MESSAGE("Wobbuffet used Fling!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); @@ -109,10 +138,10 @@ SINGLE_BATTLE_TEST("Fling's thrown item can be regained with Recycle") SINGLE_BATTLE_TEST("Fling - Item is lost even when there is no target") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SELF_DESTRUCT) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); Speed(2); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(5); } + ASSUME(IsExplosionMove(MOVE_SELF_DESTRUCT)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RAZOR_CLAW); Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { TURN { MOVE(opponent, MOVE_SELF_DESTRUCT); MOVE(player, MOVE_FLING); SEND_OUT(opponent, 1); } TURN { MOVE(player, MOVE_FLING); } @@ -135,10 +164,10 @@ SINGLE_BATTLE_TEST("Fling - Item is lost when target protects itself") { GIVEN { ASSUME(GetMoveEffect(MOVE_PROTECT) == EFFECT_PROTECT); - PLAYER(SPECIES_WOBBUFFET) {Item(ITEM_RAZOR_CLAW); } + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_RAZOR_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FLING);} + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_FLING); } TURN { MOVE(player, MOVE_FLING); } } SCENE { MESSAGE("The opposing Wobbuffet used Protect!"); @@ -173,17 +202,17 @@ SINGLE_BATTLE_TEST("Fling - Item does not get blocked by Unnerve if it isn't a b SINGLE_BATTLE_TEST("Fling doesn't consume the item if Pokémon is asleep/frozen/paralyzed") { u32 status; - u16 item; + enum Item item; - PARAMETRIZE {status = STATUS1_SLEEP_TURN(2); item = ITEM_RAZOR_CLAW; } - PARAMETRIZE {status = STATUS1_PARALYSIS; item = ITEM_RAZOR_CLAW; } - PARAMETRIZE {status = STATUS1_FREEZE; item = ITEM_RAZOR_CLAW; } - PARAMETRIZE {status = STATUS1_SLEEP_TURN(2); item = ITEM_NONE; } - PARAMETRIZE {status = STATUS1_PARALYSIS; item = ITEM_NONE; } - PARAMETRIZE {status = STATUS1_FREEZE; item = ITEM_NONE; } + PARAMETRIZE { status = STATUS1_SLEEP_TURN(2); item = ITEM_RAZOR_CLAW; } + PARAMETRIZE { status = STATUS1_PARALYSIS; item = ITEM_RAZOR_CLAW; } + PARAMETRIZE { status = STATUS1_FREEZE; item = ITEM_RAZOR_CLAW; } + PARAMETRIZE { status = STATUS1_SLEEP_TURN(2); item = ITEM_NONE; } + PARAMETRIZE { status = STATUS1_PARALYSIS; item = ITEM_NONE; } + PARAMETRIZE { status = STATUS1_FREEZE; item = ITEM_NONE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {Item(item); Status1(status); } + PLAYER(SPECIES_WOBBUFFET) { Item(item); Status1(status); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { if (status == STATUS1_FREEZE) { @@ -223,14 +252,14 @@ SINGLE_BATTLE_TEST("Fling doesn't consume the item if Pokémon is asleep/frozen/ SINGLE_BATTLE_TEST("Fling applies special effects when throwing specific Items") { - u16 item; + enum Item item; - PARAMETRIZE {item = ITEM_FLAME_ORB; } - PARAMETRIZE {item = ITEM_LIGHT_BALL; } - PARAMETRIZE {item = ITEM_POISON_BARB; } - PARAMETRIZE {item = ITEM_TOXIC_ORB; } - PARAMETRIZE {item = ITEM_RAZOR_FANG; } - PARAMETRIZE {item = ITEM_KINGS_ROCK; } + PARAMETRIZE { item = ITEM_FLAME_ORB; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; } + PARAMETRIZE { item = ITEM_POISON_BARB; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; } + PARAMETRIZE { item = ITEM_RAZOR_FANG; } + PARAMETRIZE { item = ITEM_KINGS_ROCK; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(item); } @@ -273,20 +302,22 @@ SINGLE_BATTLE_TEST("Fling applies special effects when throwing specific Items") MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); } break; + default: + break; } } } SINGLE_BATTLE_TEST("Fling's secondary effects are blocked by Shield Dust") { - u16 item; + enum Item item; - PARAMETRIZE {item = ITEM_FLAME_ORB; } - PARAMETRIZE {item = ITEM_LIGHT_BALL; } - PARAMETRIZE {item = ITEM_POISON_BARB; } - PARAMETRIZE {item = ITEM_TOXIC_ORB; } - PARAMETRIZE {item = ITEM_RAZOR_FANG; } - PARAMETRIZE {item = ITEM_KINGS_ROCK; } + PARAMETRIZE { item = ITEM_FLAME_ORB; } + PARAMETRIZE { item = ITEM_LIGHT_BALL; } + PARAMETRIZE { item = ITEM_POISON_BARB; } + PARAMETRIZE { item = ITEM_TOXIC_ORB; } + PARAMETRIZE { item = ITEM_RAZOR_FANG; } + PARAMETRIZE { item = ITEM_KINGS_ROCK; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(item); } @@ -349,17 +380,22 @@ SINGLE_BATTLE_TEST("Fling's secondary effects are blocked by Shield Dust") case ITEM_KINGS_ROCK: MESSAGE("The King's Rock was used up…"); break; + default: + break; } } break; + default: + break; } } } SINGLE_BATTLE_TEST("Fling - thrown berry's effect activates for the target even if the trigger conditions are not met") { - u16 item, effect; - u8 statId = 0; + enum Item item; + enum HoldEffect effect; + enum Stat statId = STAT_HP; u32 status1 = STATUS1_NONE; PARAMETRIZE { item = ITEM_ORAN_BERRY; effect = HOLD_EFFECT_RESTORE_HP; } @@ -478,25 +514,46 @@ SINGLE_BATTLE_TEST("Fling deals damage based on items fling power") } } -SINGLE_BATTLE_TEST("Flinging a Mental Herb does not trigger the item if the target doesn't have anything that's cured by Mental Herb") +SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") { + s16 damage[2]; + GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_MENTAL_HERB); } - OPPONENT(SPECIES_WOBBUFFET); + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB)); + ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); } + OPPONENT(SPECIES_HIPPOWDON); } WHEN { TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_EGG_BOMB); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); - MESSAGE("The opposing Wobbuffet got over its infatuation!"); - MESSAGE("The opposing Wobbuffet's Taunt wore off!"); - MESSAGE("The opposing Wobbuffet ended its encore!"); - MESSAGE("The opposing Wobbuffet is no longer tormented!"); - MESSAGE("The opposing Wobbuffet's move is no longer disabled!"); - MESSAGE("The opposing Wobbuffet is cured of its heal block!"); - } + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); } } -TO_DO_BATTLE_TEST("Fling deals damage based on a TM's move power") +SINGLE_BATTLE_TEST("Fling deals damage based on a TM's move power") +{ + s16 damage[2]; + + GIVEN { + ASSUME(GetMovePower(MOVE_EARTHQUAKE) == GetMovePower(MOVE_EGG_BOMB)); + ASSUME(!IsSpeciesOfType(SPECIES_WOBBUFFET, TYPE_DARK)); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_TM_EARTHQUAKE); } + OPPONENT(SPECIES_HIPPOWDON); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + TURN { MOVE(player, MOVE_EGG_BOMB); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EGG_BOMB, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/move_effect/flower_shield.c b/test/battle/move_effect/flower_shield.c index 4a7216385..3e6df3686 100644 --- a/test/battle/move_effect/flower_shield.c +++ b/test/battle/move_effect/flower_shield.c @@ -24,13 +24,10 @@ DOUBLE_BATTLE_TEST("Flower Shield raises the defense of all Grass-type Pokémon" ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Tangela's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Sunkern's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); MESSAGE("Tangrowth's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Sunflora's Defense rose!"); } @@ -84,6 +81,6 @@ AI_DOUBLE_BATTLE_TEST("AI uses Flower Shield") OPPONENT(SPECIES_TANGELA) { Moves(MOVE_FLOWER_SHIELD, MOVE_POUND); } OPPONENT(SPECIES_TANGELA); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_FLOWER_SHIELD); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_FLOWER_SHIELD); } } } diff --git a/test/battle/move_effect/focus_energy.c b/test/battle/move_effect/focus_energy.c index 17a08ba7f..ffc937057 100644 --- a/test/battle/move_effect/focus_energy.c +++ b/test/battle/move_effect/focus_energy.c @@ -23,8 +23,8 @@ SINGLE_BATTLE_TEST("Focus Energy increases the user's critical hit ratio by 1 st } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, (genConfig == GEN_1)? GEN_2 : genConfig); - WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, (genConfig == GEN_1)? GEN_2 : genConfig); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -45,13 +45,13 @@ SINGLE_BATTLE_TEST("Focus Energy multiplies crit chance by 4 with gen 1 crit cha bool32 useFocusEnergy = 0; u32 genConfig = 0, chance = 0; for (u32 j = GEN_1; j <= GEN_9; j++) { - PARAMETRIZE { genConfig = j; useFocusEnergy = FALSE; chance = 16;} - PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; chance = 4;} + PARAMETRIZE { genConfig = j; useFocusEnergy = FALSE; chance = 16; } + PARAMETRIZE { genConfig = j; useFocusEnergy = TRUE; chance = 4; } } PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, GEN_1); - WITH_CONFIG(GEN_CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, GEN_1); + WITH_CONFIG(CONFIG_FOCUS_ENERGY_CRIT_RATIO, genConfig); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/focus_punch.c b/test/battle/move_effect/focus_punch.c index 3f8f96d4c..72c73f4ef 100644 --- a/test/battle/move_effect/focus_punch.c +++ b/test/battle/move_effect/focus_punch.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Focus Punch activates only if not damaged") { - u32 move; + enum Move move; bool32 activate; PARAMETRIZE { move = MOVE_SCRATCH; activate = FALSE; } PARAMETRIZE { move = MOVE_WATER_GUN; activate = FALSE; } @@ -25,13 +25,11 @@ SINGLE_BATTLE_TEST("Focus Punch activates only if not damaged") ANIMATION(ANIM_TYPE_MOVE, move, opponent); if (activate) { - MESSAGE("Wobbuffet used Focus Punch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); HP_BAR(opponent); } else { MESSAGE("Wobbuffet lost its focus and couldn't move!"); NONE_OF { - MESSAGE("Wobbuffet used Focus Punch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); HP_BAR(opponent); } @@ -62,11 +60,9 @@ DOUBLE_BATTLE_TEST("Focus Punch activation is based on Speed") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, opponentLeft); MESSAGE("The opposing Wobbuffet is tightening its focus!"); - MESSAGE("The opposing Wynaut used Focus Punch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, opponentRight); HP_BAR(playerLeft); - MESSAGE("Wynaut used Focus Punch!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerRight); HP_BAR(opponentLeft); @@ -75,17 +71,325 @@ DOUBLE_BATTLE_TEST("Focus Punch activation is based on Speed") } } -TO_DO_BATTLE_TEST("Focus Punch activates when the user's Substitute is hit"); +SINGLE_BATTLE_TEST("Focus Punch activates when Focus Band/Focus Sash blocks OHKO move") +{ + enum Item item; + PARAMETRIZE { item = ITEM_NONE; } + PARAMETRIZE { item = ITEM_FOCUS_BAND; } + PARAMETRIZE { item = ITEM_FOCUS_SASH; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); + PLAYER(SPECIES_WOBBUFFET) { Item(item); }; + OPPONENT(SPECIES_WOBBUFFET) {}; + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, MOVE_FISSURE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, opponent); + + if (item) { + MESSAGE("Wobbuffet used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } else { + MESSAGE("Wobbuffet fainted!"); + NONE_OF { + MESSAGE("Wobbuffet used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } + } + } +} + +SINGLE_BATTLE_TEST("Focus Punch activates when Disguise block a OHKO move (Gen8+)") +{ + enum Move move; + bool32 activate; + PARAMETRIZE { move = MOVE_WATER_GUN; activate = FALSE; } + PARAMETRIZE { move = MOVE_FISSURE; activate = TRUE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET) {}; + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Mimikyu is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + + if (activate) { + MESSAGE("Mimikyu used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } else { + MESSAGE("Mimikyu lost its focus and couldn't move!"); + NONE_OF { + MESSAGE("Mimikyu used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } + } + } +} + +SINGLE_BATTLE_TEST("Focus Punch does not activate when Focus Band/Focus Sash/Sturdy prevent getting one-shot by an attack") +{ + enum Item item; + enum Ability ability; + PARAMETRIZE { item = ITEM_NONE; ability = ABILITY_STURDY; } + PARAMETRIZE { item = ITEM_FOCUS_BAND; ability = ABILITY_SHADOW_TAG; } + PARAMETRIZE { item = ITEM_FOCUS_SASH; ability = ABILITY_SHADOW_TAG; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SEISMIC_TOSS) == EFFECT_LEVEL_DAMAGE); + PLAYER(SPECIES_WOBBUFFET) { Item(item); Ability(ability); MaxHP(100); HP(100); }; + OPPONENT(SPECIES_WOBBUFFET) {}; + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, MOVE_SEISMIC_TOSS); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SEISMIC_TOSS, opponent); + MESSAGE("Wobbuffet lost its focus and couldn't move!"); + NONE_OF { + MESSAGE("Wobbuffet used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } + } THEN { + EXPECT_EQ(player->hp, 1); + } +} + +SINGLE_BATTLE_TEST("Focus Punch activates when the user's Substitute is hit") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); } + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet used Focus Punch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Focus Punch uses PP when losing focus (Gen 3-4)") +{ + enum Move move; + bool32 activate; + PARAMETRIZE { move = MOVE_SCRATCH; activate = FALSE; } + PARAMETRIZE { move = MOVE_LEER; activate = TRUE; } + GIVEN { + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_3); + PLAYER(SPECIES_WOBBUFFET) {MovesWithPP({MOVE_FOCUS_PUNCH, 1});}; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (activate) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + else + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + } THEN { + EXPECT_EQ(player->pp[0], 0); + } +} + +SINGLE_BATTLE_TEST("Focus Punch doesn't use PP when losing focus (Gen 5+)") +{ + enum Move move; + bool32 activate; + PARAMETRIZE { move = MOVE_SCRATCH; activate = FALSE; } + PARAMETRIZE { move = MOVE_LEER; activate = TRUE; } + GIVEN { + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_5); + PLAYER(SPECIES_WOBBUFFET) {MovesWithPP({MOVE_FOCUS_PUNCH, 1});}; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, move); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (activate) + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + else + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + } THEN { + if (activate) + EXPECT_EQ(player->pp[0], 0); + else + EXPECT_EQ(player->pp[0], 1); + } +} + +SINGLE_BATTLE_TEST("Focus Punch failing occurs after flinching (Gen 3-4)") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH) == TRUE); + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_3); + PLAYER(SPECIES_WOBBUFFET) {MovesWithPP({MOVE_FOCUS_PUNCH, 1});}; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, MOVE_FAKE_OUT); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponent); + MESSAGE("Wobbuffet flinched and couldn't move!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + } +} + +SINGLE_BATTLE_TEST("Focus Punch failing occurs before flinching (Gen 5+)") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_FAKE_OUT, MOVE_EFFECT_FLINCH) == TRUE); + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_5); + PLAYER(SPECIES_WOBBUFFET) {MovesWithPP({MOVE_FOCUS_PUNCH, 1});}; + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FOCUS_PUNCH); MOVE(opponent, MOVE_FAKE_OUT); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_OUT, opponent); + MESSAGE("Wobbuffet lost its focus and couldn't move!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + } +} + TO_DO_BATTLE_TEST("Focus Punch activates when the user is hit by a status move"); -TO_DO_BATTLE_TEST("Focus Punch uses PP when losing focus (Gen 3-4)"); -TO_DO_BATTLE_TEST("Focus Punch doesn't use PP when losing focus (Gen 5+)"); TO_DO_BATTLE_TEST("Focus Punch losing focus is considered as the last move used (Gen 3-4)"); //Eg. Encore TO_DO_BATTLE_TEST("Focus Punch losing focus is not considered as the last move used (Gen 5+)"); //Eg. Encore TO_DO_BATTLE_TEST("Focus Punch's initial message is not considered as using the move for Zoom Lens"); -TO_DO_BATTLE_TEST("Focus Punch's initial message is not shown if the user selected a different move and was Encored into using Focus Punch"); TO_DO_BATTLE_TEST("Focus Punch will use the selected move's priority when being Encored into Focus Punch"); -TO_DO_BATTLE_TEST("Focus Punch will lose focus if damaged when used by selecting a different move and being Encored (Gen 3-4)"); -TO_DO_BATTLE_TEST("Focus Punch will NOT lose focus if damaged when used by selecting a different move and being Encored (Gen 5+)"); + +SINGLE_BATTLE_TEST("Focus Punch's initial message is not shown if the user selected a different move and was Encored into using Focus Punch") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_FOCUS_PUNCH); } + TURN { MOVE(opponent, MOVE_ENCORE); MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, player); + HP_BAR(opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, player); + MESSAGE("Wobbuffet is tightening its focus!"); + } + } +} + +DOUBLE_BATTLE_TEST("Focus Punch will lose focus if damaged when used by selecting a different move and being Encored (Gen 3-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_3); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_FOCUS_PUNCH, target: opponentLeft); } + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + MOVE(opponentLeft, MOVE_ENCORE, target: playerLeft); + MOVE(playerLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerLeft); + HP_BAR(opponentLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponentLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } + MESSAGE("Wobbuffet lost its focus and couldn't move!"); + } +} + +DOUBLE_BATTLE_TEST("Focus Punch will NOT lose focus if damaged when used by selecting a different move and being Encored (Gen 5+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_7); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_FOCUS_PUNCH, target: opponentLeft); } + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + MOVE(opponentLeft, MOVE_ENCORE, target: playerLeft); + MOVE(playerLeft, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerLeft); + HP_BAR(opponentLeft); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + MESSAGE("Wobbuffet lost its focus and couldn't move!"); + } + } +} + +DOUBLE_BATTLE_TEST("Focus Punch will lose focus if damaged when encored into a different move and selected Focus Punch (Gen 5-6)") +{ + GIVEN { + WITH_CONFIG(CONFIG_FOCUS_PUNCH_FAILURE, GEN_5); + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + TURN { MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + MOVE(opponentLeft, MOVE_ENCORE, target: playerLeft); + MOVE(playerLeft, MOVE_FOCUS_PUNCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + HP_BAR(opponentLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FOCUS_PUNCH_SETUP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponentLeft); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOCUS_PUNCH, playerLeft); + } + MESSAGE("Wobbuffet lost its focus and couldn't move!"); + } +} AI_SINGLE_BATTLE_TEST("AI won't use Focus Punch if it predicts a damaging move") { @@ -118,9 +422,12 @@ AI_SINGLE_BATTLE_TEST("AI won't use status moves if the player's best attacking GIVEN { ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); ASSUME(GetMoveCategory(MOVE_SWORDS_DANCE) == DAMAGE_CATEGORY_STATUS); + // If Clefable is Normal-type, it will always use Play Rough. + ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 0) == TYPE_FAIRY); + ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 1) == TYPE_FAIRY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SNORLAX) { Moves(MOVE_FOCUS_PUNCH, MOVE_POUND); } - OPPONENT(SPECIES_CLEFABLE) { Moves(MOVE_PLAY_ROUGH, MOVE_SWORDS_DANCE); } + OPPONENT(SPECIES_CLEFABLE) { Moves(MOVE_PLAY_ROUGH, MOVE_SWORDS_DANCE); } } WHEN { TURN { MOVE(player, MOVE_FOCUS_PUNCH); EXPECT_MOVE(opponent, MOVE_PLAY_ROUGH); } } diff --git a/test/battle/move_effect/foul_play.c b/test/battle/move_effect/foul_play.c index 58af6bc4f..bc583f2e3 100644 --- a/test/battle/move_effect/foul_play.c +++ b/test/battle/move_effect/foul_play.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Foul Play uses the target's Attack stat and stat stages of target", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HIGH_HORSEPOWER; } PARAMETRIZE { move = MOVE_FOUL_PLAY; } diff --git a/test/battle/move_effect/fury_cutter.c b/test/battle/move_effect/fury_cutter.c index 74362c631..d02ee1e09 100644 --- a/test/battle/move_effect/fury_cutter.c +++ b/test/battle/move_effect/fury_cutter.c @@ -37,6 +37,51 @@ SINGLE_BATTLE_TEST("Fury Cutter's power doubles with each use, up to 160 power") } } +SINGLE_BATTLE_TEST("Fury Cutter's base power resets if the chain has been broken") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FURY_CUTTER); } + TURN { MOVE(opponent, MOVE_PROTECT); } + TURN { MOVE(player, MOVE_FURY_CUTTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Fury Cutter's base power resets if the it is used again but a different user switched in") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FURY_CUTTER); } + TURN { SWITCH(player, 1); } + TURN { MOVE(player, MOVE_FURY_CUTTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the user misses") TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the user is switched out") TO_DO_BATTLE_TEST("Fury Cutter's power is reset if the trainer uses an item") @@ -64,3 +109,23 @@ SINGLE_BATTLE_TEST("Fury Cutter counter is the same for both hits of Parental Bo EXPECT_NE(damage[0], damage[2]); } } + +SINGLE_BATTLE_TEST("Fury Cutter's base power resets if original user is forced to switch out") +{ + s16 damage[2]; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_FURY_CUTTER); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_FURY_CUTTER); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_FURY_CUTTER); } + TURN { MOVE(player, MOVE_FURY_CUTTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_CUTTER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} diff --git a/test/battle/move_effect/future_sight.c b/test/battle/move_effect/future_sight.c index ee424c9bd..d64d1ff95 100644 --- a/test/battle/move_effect/future_sight.c +++ b/test/battle/move_effect/future_sight.c @@ -19,7 +19,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without modifiers") { - u32 item; + enum Item item; s16 seedFlareDmg; s16 futureSightDmg; @@ -34,8 +34,8 @@ SINGLE_BATTLE_TEST("Future Sight uses Sp. Atk stat of the original user without TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); @@ -60,8 +60,8 @@ SINGLE_BATTLE_TEST("Future Sight is not boosted by Life Orb is original user if TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); @@ -88,8 +88,8 @@ SINGLE_BATTLE_TEST("Future Sight receives STAB from party mon (Gen 5+)") TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent, captureDamage: &seedFlareDmg); @@ -111,12 +111,11 @@ SINGLE_BATTLE_TEST("Future Sight is affected by type effectiveness (Gen 5+)") TURN { MOVE(player, FUTURE_SIGHT_EQUIVALENT, WITH_RNG(RNG_SECONDARY_EFFECT, FALSE)); } TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { SWITCH(player, 1); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, FUTURE_SIGHT_EQUIVALENT, player); HP_BAR(opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); MESSAGE("The opposing Houndoom took the Future Sight attack!"); MESSAGE("It doesn't affect the opposing Houndoom…"); NOT HP_BAR(opponent); @@ -136,7 +135,7 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints before it is TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { MOVE(player, MOVE_CELEBRATE); } TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_MEMENTO); SEND_OUT(opponent, 1); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); @@ -158,7 +157,7 @@ SINGLE_BATTLE_TEST("Future Sight will miss timing if target faints by residual d TURN { MOVE(player, MOVE_FUTURE_SIGHT); } TURN { MOVE(player, MOVE_CELEBRATE); } TURN { MOVE(player, MOVE_WRAP); SEND_OUT(opponent, 1); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); @@ -178,8 +177,8 @@ SINGLE_BATTLE_TEST("Future Sight breaks Focus Sash and doesn't make the holder e OPPONENT(SPECIES_PIDGEY) { Level(1); Item(ITEM_FOCUS_SASH); } } WHEN { TURN { MOVE(player, MOVE_FUTURE_SIGHT); } - TURN { } - TURN { } + TURN {} + TURN {} TURN { MOVE(player, MOVE_PSYCHIC); } } SCENE { MESSAGE("The opposing Pidgey hung on using its Focus Sash!"); diff --git a/test/battle/move_effect/gear_up.c b/test/battle/move_effect/gear_up.c index 051205a2b..9a9bdab79 100644 --- a/test/battle/move_effect/gear_up.c +++ b/test/battle/move_effect/gear_up.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Gear Up (Move Effect) test titles") +TO_DO_BATTLE_TEST("Gear Up increases the Attack and Sp. Attack of the user and allies if they have Plus or Minus") AI_DOUBLE_BATTLE_TEST("AI uses Gear Up") { @@ -12,6 +12,6 @@ AI_DOUBLE_BATTLE_TEST("AI uses Gear Up") OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } OPPONENT(SPECIES_KLINKLANG) { Ability(ABILITY_PLUS); Moves(MOVE_GEAR_UP, MOVE_WATER_GUN, MOVE_POUND); } } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_GEAR_UP); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_GEAR_UP); } } } diff --git a/test/battle/move_effect/geomancy.c b/test/battle/move_effect/geomancy.c index f5b113a45..934e5e2f0 100644 --- a/test/battle/move_effect/geomancy.c +++ b/test/battle/move_effect/geomancy.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Geomancy (Move Effect) test titles") +TO_DO_BATTLE_TEST("Geomancy takes 2 turns to increase Sp. Atk, Sp. Def and Speed by 2 stages"); +TO_DO_BATTLE_TEST("Geomancy only takes 1 turn when holding Power Herb") +TO_DO_BATTLE_TEST("Geomancy fails on the second turn if the user falls for Taunt while charging") diff --git a/test/battle/move_effect/glaive_rush.c b/test/battle/move_effect/glaive_rush.c index faf1f9666..5a4b70566 100644 --- a/test/battle/move_effect/glaive_rush.c +++ b/test/battle/move_effect/glaive_rush.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_GLAIVE_RUSH) == EFFECT_GLAIVE_RUSH); + ASSUME(MoveHasAdditionalEffectSelf(MOVE_GLAIVE_RUSH, MOVE_EFFECT_GLAIVE_RUSH)); } SINGLE_BATTLE_TEST("If Glaive Rush is successful moves targeted at the user do not check accuracy") @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("If Glaive Rush is successful, moves targeted at the user dea OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_GLAIVE_RUSH); } - TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); HP_BAR(player, captureDamage: &normalDmg); @@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked { u32 species; - PARAMETRIZE { species = SPECIES_CLEFAIRY; } - PARAMETRIZE { species = SPECIES_SHELLOS; } // Closest mon in both Defense and Sp. Defense + PARAMETRIZE { species = SPECIES_FIDOUGH; } + PARAMETRIZE { species = SPECIES_MAGNEMITE; } // Closest mon in both Defense and Sp. Defense GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked } WHEN { TURN { MOVE(player, MOVE_GLAIVE_RUSH); MOVE(opponent, MOVE_SCRATCH); } } SCENE { - if (species == SPECIES_CLEFAIRY) + if (species == SPECIES_FIDOUGH) NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player); else ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player); @@ -118,7 +118,7 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked SINGLE_BATTLE_TEST("Glaive Rush status last until the the user's next turn") { - s16 normalDmgFristHit; + s16 normalDmgFirstHit; s16 normalDmgSecondHit; GIVEN { @@ -133,11 +133,11 @@ SINGLE_BATTLE_TEST("Glaive Rush status last until the the user's next turn") ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); - HP_BAR(player, captureDamage: &normalDmgFristHit); + HP_BAR(player, captureDamage: &normalDmgFirstHit); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); HP_BAR(player, captureDamage: &normalDmgSecondHit); } THEN { - EXPECT_EQ(normalDmgFristHit, normalDmgSecondHit); + EXPECT_EQ(normalDmgFirstHit, normalDmgSecondHit); } } diff --git a/test/battle/move_effect/grassy_glide.c b/test/battle/move_effect/grassy_glide.c index 00219fb1d..64e330097 100644 --- a/test/battle/move_effect/grassy_glide.c +++ b/test/battle/move_effect/grassy_glide.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grassy Glide (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grassy Glide's priority increases by 1 when the user is affected by Grassy Terrain") +TO_DO_BATTLE_TEST("Dynamax: Grassy Glide's priority doesn't increase for the Max Move it becomes") diff --git a/test/battle/move_effect/grassy_terrain.c b/test/battle/move_effect/grassy_terrain.c index 2b5e166bf..063d5ae98 100644 --- a/test/battle/move_effect/grassy_terrain.c +++ b/test/battle/move_effect/grassy_terrain.c @@ -5,7 +5,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain recovers 1/16th HP at end of turn") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } - OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } } WHEN { TURN { MOVE(player, MOVE_GRASSY_TERRAIN); } TURN {} @@ -85,7 +85,7 @@ SINGLE_BATTLE_TEST("Grassy Terrain heals the Pokémon on the field for the durat { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { HP(1); }; + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } } WHEN { TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_GRASSY_TERRAIN); } TURN {} diff --git a/test/battle/move_effect/grav_apple.c b/test/battle/move_effect/grav_apple.c index 7ce2dd26c..f2c3099fd 100644 --- a/test/battle/move_effect/grav_apple.c +++ b/test/battle/move_effect/grav_apple.c @@ -1,4 +1,5 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grav Apple (Move Effect) test titles") +TO_DO_BATTLE_TEST("Grav Apple lowers the target's Defense by 1 stage") +TO_DO_BATTLE_TEST("Grav Apple's power increases by 50% under Gravity's effect") diff --git a/test/battle/move_effect/gravity.c b/test/battle/move_effect/gravity.c index ec24917f6..178745427 100644 --- a/test/battle/move_effect/gravity.c +++ b/test/battle/move_effect/gravity.c @@ -6,7 +6,11 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_GRAVITY) == EFFECT_GRAVITY); } -DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") +TO_DO_BATTLE_TEST("Gravity causes certain moves to fail") // Fly, Jump Kick, High Jump Kick, Splash, Bounce, Magnet Rise, Telekinesis, Sky Drop, Flying Press, Floaty Fall +TO_DO_BATTLE_TEST("Gravity increases accuracy of all moves by 5/3 (~1.67)") +TO_DO_BATTLE_TEST("Gravity causes all battlers to become grounded") + +DOUBLE_BATTLE_TEST("Gravity cancels Fly and Sky Drop if they are in the air") { u8 visibility; GIVEN { @@ -48,20 +52,21 @@ DOUBLE_BATTLE_TEST("Gravity cancels fly and sky drop if they are in the air") AI_DOUBLE_BATTLE_TEST("AI uses Gravity") { - u32 move, friendItem, foeItem; + enum Move move; + u32 friendItem, foeItem; u64 aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; PARAMETRIZE { move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } PARAMETRIZE { move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_THUNDER; friendItem = ITEM_NONE; foeItem = ITEM_NONE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_NONE; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_AIR_BALLOON; foeItem = ITEM_AIR_BALLOON; } - PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; + PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION; move = MOVE_HEADBUTT; friendItem = ITEM_NONE; foeItem = ITEM_AIR_BALLOON; } GIVEN { @@ -69,7 +74,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Gravity") PLAYER(SPECIES_WOBBUFFET) { Item(foeItem); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_GRAVITY, MOVE_HEADBUTT, MOVE_TAUNT); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_EARTH_POWER); Item(friendItem); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move, MOVE_EARTH_POWER); Item(friendItem); } } WHEN { if (move == MOVE_THUNDER || (foeItem == ITEM_AIR_BALLOON && friendItem != ITEM_AIR_BALLOON)) TURN { EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } @@ -77,4 +82,3 @@ AI_DOUBLE_BATTLE_TEST("AI uses Gravity") TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_GRAVITY); } } } - diff --git a/test/battle/move_effect/growth.c b/test/battle/move_effect/growth.c index 7b53f56cf..a9dda9cfd 100644 --- a/test/battle/move_effect/growth.c +++ b/test/battle/move_effect/growth.c @@ -1,4 +1,6 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Growth (Move Effect) test titles") +TO_DO_BATTLE_TEST("Growth increases Sp. Atk and Sp. Def by 1 stage (Gen 1)") // Equivalent to raising Special +TO_DO_BATTLE_TEST("Growth increases Sp. Atk by 1 stage (Gen 2-4)") +TO_DO_BATTLE_TEST("Growth increases Attack and Sp. Atk by 1 stage or 2 stages under Sun (Gen 5+)") diff --git a/test/battle/move_effect/grudge.c b/test/battle/move_effect/grudge.c index 870d39c20..9b3fdd0bb 100644 --- a/test/battle/move_effect/grudge.c +++ b/test/battle/move_effect/grudge.c @@ -1,14 +1,12 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") - -SINGLE_BATTLE_TEST("Grudge depletes all pp of the move that fainted the target") +SINGLE_BATTLE_TEST("Grudge depletes all PP of the move that fainted the target") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); } } WHEN { TURN { MOVE(player, MOVE_GRUDGE); @@ -27,12 +25,12 @@ SINGLE_BATTLE_TEST("Grudge depletes all pp of the move that fainted the target") } } -SINGLE_BATTLE_TEST("Grudge does not depletes pp of a z-move") +SINGLE_BATTLE_TEST("Grudge does not deplete PP of a Z-Move") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { HP(1); } PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); } } WHEN { TURN { MOVE(player, MOVE_GRUDGE); @@ -51,3 +49,260 @@ SINGLE_BATTLE_TEST("Grudge does not depletes pp of a z-move") EXPECT_GT(opponent->pp[3], 0); } } + +SINGLE_BATTLE_TEST("Grudge depletes all PP from a Max Move's base move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); Item(ITEM_LAGGING_TAIL); } + } WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet used Grudge!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + MESSAGE("The opposing Wobbuffet used Max Strike!"); + MESSAGE("Wobbuffet fainted!"); + MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_EQ(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge does not activate for Struggle") +{ + GIVEN { + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_STRUGGLE, MOVE_POUND, MOVE_SURF); }; + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_STRUGGLE); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Struggle lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Move") +{ + GIVEN { + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_SCRATCH); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Sleep") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(gMovesInfo[SanitizeMoveId(MOVE_SPORE)].argument.nonVolatileStatus == MOVE_EFFECT_SLEEP); + PLAYER (SPECIES_WOBBUFFET) { HP(1);} + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_VITAL_THROW, MOVE_SPORE, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SPORE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_VITAL_THROW); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + MESSAGE("Wobbuffet is fast asleep."); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VITAL_THROW, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Paralysis") +{ + PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(gMovesInfo[SanitizeMoveId(MOVE_STUN_SPORE)].argument.nonVolatileStatus == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMovePriority(MOVE_VITAL_THROW) == -1); + PLAYER (SPECIES_WOBBUFFET) { HP(1);} + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_VITAL_THROW, MOVE_STUN_SPORE, MOVE_SURF); };\ + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_STUN_SPORE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_VITAL_THROW); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, opponent); + MESSAGE("Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(player, paralysis: TRUE); + MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VITAL_THROW, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Flinching") +{ + PASSES_RANDOMLY(10, 100, RNG_HOLD_EFFECT_FLINCH); + GIVEN { + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_FALSE_SWIPE, MOVE_SURF); Item(ITEM_KINGS_ROCK); } + } + WHEN { + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_GRUDGE); } + TURN { MOVE(opponent, MOVE_FALSE_SWIPE); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); SEND_OUT(player, 1); } + } + SCENE { + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + MESSAGE("Wobbuffet flinched and couldn't move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Sandstorm") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_SANDSTORM, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SANDSTORM); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SANDSTORM, opponent); + MESSAGE("The sandstorm is raging."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES); + MESSAGE("Wobbuffet is buffeted by the sandstorm!"); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Sandstorm lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Leech Seed") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_LEECH_SEED, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_LEECH_SEED); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponent); + MESSAGE("Wobbuffet was seeded!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, player); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Leech Seed lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Future Sight") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_FUTURE_SIGHT, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_FUTURE_SIGHT); } + TURN {} + TURN { MOVE(player, MOVE_GRUDGE); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, opponent); + MESSAGE("The opposing Wobbuffet foresaw an attack!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + MESSAGE("Wobbuffet took the Future Sight attack!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FUTURE_SIGHT_HIT); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Future Sight lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + diff --git a/test/battle/move_effect/guard_split.c b/test/battle/move_effect/guard_split.c index d7572c143..15b14c59d 100644 --- a/test/battle/move_effect/guard_split.c +++ b/test/battle/move_effect/guard_split.c @@ -20,3 +20,7 @@ SINGLE_BATTLE_TEST("Guard Split averages users and targets Def and Sp. Def stats EXPECT_EQ(player->spDefense, opponent->spDefense); } } + +TO_DO_BATTLE_TEST("Stat stages use Guard Split's altered stats") +TO_DO_BATTLE_TEST("Assault Vest uses Guard Split's altered stats") +TO_DO_BATTLE_TEST("Eviolite uses Guard Split's altered stats") diff --git a/test/battle/move_effect/guard_swap.c b/test/battle/move_effect/guard_swap.c index f0e0e53b6..d4be4dbd9 100644 --- a/test/battle/move_effect/guard_swap.c +++ b/test/battle/move_effect/guard_swap.c @@ -1,4 +1,4 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") +TO_DO_BATTLE_TEST("Guard Swap switches the user's Defense and Sp. Def stat stages with the target") diff --git a/test/battle/move_effect/guardian_of_alola.c b/test/battle/move_effect/guardian_of_alola.c deleted file mode 100644 index fe3323636..000000000 --- a/test/battle/move_effect/guardian_of_alola.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Guardian of Alola (Move Effect) test titles") diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 5214d38b3..66a754df5 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); - ASSUME(gMovesInfo[MOVE_AROMATHERAPY].effect == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); } @@ -96,7 +96,7 @@ DOUBLE_BATTLE_TEST("Heal Bell does not cure Soundproof partners (Gen 4, Gen 6+)" GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -124,7 +124,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures inactive Soundproof Pokemon (Gen5+)") GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); @@ -152,7 +152,7 @@ SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") PARAMETRIZE { config = GEN_8; } GIVEN { ASSUME(IsSoundMove(MOVE_HEAL_BELL)); - WITH_CONFIG(GEN_CONFIG_HEAL_BELL_SOUNDPROOF, config); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); PLAYER(SPECIES_EXPLOUD) { Ability(ABILITY_SOUNDPROOF); Status1(STATUS1_POISON); } OPPONENT(SPECIES_WYNAUT); } WHEN { @@ -166,3 +166,53 @@ SINGLE_BATTLE_TEST("Heal Bell cures a Soundproof user (Gen5, Gen8+)") } } } + +DOUBLE_BATTLE_TEST("Aromatherapy cure Soundproof battlers regardless of config") +{ + u32 ability, config; + + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_4; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_5; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_6; } + PARAMETRIZE { ability = ABILITY_SOUNDPROOF; config = GEN_8; } + + GIVEN { + ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + PLAYER(SPECIES_WOBBUFFET) { Ability(ability); Status1(STATUS1_POISON); } + PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_AROMATHERAPY, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, playerLeft); + NONE_OF { + MESSAGE("Exploud was hurt by its poisoning!"); + MESSAGE("Wobbuffet was hurt by its poisoning!"); + } + } +} + +SINGLE_BATTLE_TEST("Aromatherapy cures inactive Soundproof Pokemon regardless of config") +{ + u32 config, ability; + + PARAMETRIZE { config = GEN_4, ability = ABILITY_SOUNDPROOF; } + PARAMETRIZE { config = GEN_5, ability = ABILITY_SOUNDPROOF; } + + GIVEN { + ASSUME(!IsSoundMove(MOVE_AROMATHERAPY)); + WITH_CONFIG(CONFIG_HEAL_BELL_SOUNDPROOF, config); + PLAYER(SPECIES_WOBBUFFET) { } + PLAYER(SPECIES_EXPLOUD) { Ability(ability); Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_AROMATHERAPY, target: player); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AROMATHERAPY, player); + SEND_IN_MESSAGE("Exploud"); + NOT MESSAGE("Exploud was hurt by its poisoning!"); + } +} diff --git a/test/battle/move_effect/heal_pulse.c b/test/battle/move_effect/heal_pulse.c index 7c46cbf34..c383b7268 100644 --- a/test/battle/move_effect/heal_pulse.c +++ b/test/battle/move_effect/heal_pulse.c @@ -86,6 +86,7 @@ SINGLE_BATTLE_TEST("Heal Pulse is blocked by Substitute") SINGLE_BATTLE_TEST("Floral Healing heals the target by 2/3rd of it's maxHP if Grassy Terrain is on the field") { GIVEN { + ASSUME(GetMoveEffect(MOVE_FLORAL_HEALING) == EFFECT_HEAL_PULSE); ASSUME(GetMoveEffectArg_MoveProperty(MOVE_FLORAL_HEALING) == MOVE_EFFECT_FLORAL_HEALING); ASSUME(GetMoveEffect(MOVE_GRASSY_TERRAIN) == EFFECT_GRASSY_TERRAIN); PLAYER(SPECIES_WOBBUFFET) { MaxHP(100); HP(1); } diff --git a/test/battle/move_effect/healing_wish.c b/test/battle/move_effect/healing_wish.c index 31dfebb34..ca78fd049 100644 --- a/test/battle/move_effect/healing_wish.c +++ b/test/battle/move_effect/healing_wish.c @@ -4,15 +4,19 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_HEALING_WISH) == EFFECT_HEALING_WISH); - ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_HEALING_WISH); } -SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and fully heals the replacement") +SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (singles)") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); PLAYER(SPECIES_GARDEVOIR); - PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } @@ -24,35 +28,56 @@ SINGLE_BATTLE_TEST("Healing Wish causes the user to faint and fully heals the re HP_BAR(player, hp: 100); STATUS_ICON(player, none: TRUE); MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(player->hp, 100); + EXPECT_EQ(player->status1, 0); + // PP not healed + EXPECT_EQ(player->pp[0], 5); + EXPECT_EQ(player->pp[1], 5); + EXPECT_EQ(player->pp[2], 5); + EXPECT_EQ(player->pp[3], 0); } } -DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and fully heals the replacement in a double battle") +DOUBLE_BATTLE_TEST("Healing Wish causes the user to faint and heals the replacement's HP and status (doubles)") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_WOBBUFFET) { Speed(50); } - PLAYER(SPECIES_WYNAUT) { HP(99); MaxHP(100); Status1(STATUS1_BURN); Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_BURN); Speed(50); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { - TURN { MOVE(playerLeft, MOVE_LUNAR_DANCE); SEND_OUT(playerLeft, 2); } + TURN { MOVE(playerLeft, MOVE_HEALING_WISH); SEND_OUT(playerLeft, 2); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, playerLeft); HP_BAR(playerLeft, hp: 0); MESSAGE("Gardevoir fainted!"); - MESSAGE("Wynaut became cloaked in mystical moonlight!"); + MESSAGE("The healing wish came true for Wynaut!"); HP_BAR(playerLeft, hp: 100); STATUS_ICON(playerLeft, none: TRUE); MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(playerLeft->hp, 100); + EXPECT_EQ(playerLeft->status1, 0); + // PP not healed + EXPECT_EQ(playerLeft->pp[0], 5); + EXPECT_EQ(playerLeft->pp[1], 5); + EXPECT_EQ(playerLeft->pp[2], 5); + EXPECT_EQ(playerLeft->pp[3], 0); } } SINGLE_BATTLE_TEST("Healing Wish effect activates even if the the switched Pokémon can't be healed (Gen4-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_HEALING_WISH_SWITCH, GEN_7); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } @@ -69,15 +94,21 @@ SINGLE_BATTLE_TEST("Healing Wish effect activates even if the the switched Poké SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon can be healed (Gen8+)") { + u32 switchTo; + PARAMETRIZE { switchTo = 2; } + PARAMETRIZE { switchTo = 3; } + PARAMETRIZE { switchTo = 4; } GIVEN { - WITH_CONFIG(GEN_CONFIG_HEALING_WISH_SWITCH, GEN_8); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); PLAYER(SPECIES_GARDEVOIR) { Speed(300); } PLAYER(SPECIES_NINJASK) { Speed(400); } - PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 5}); Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { TURN { MOVE(player, MOVE_HEALING_WISH); SEND_OUT(player, 1); } - TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 2); } + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, switchTo); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_HEALING_WISH, player); HP_BAR(player, hp: 0); @@ -87,9 +118,27 @@ SINGLE_BATTLE_TEST("Healing Wish effect activates only if the switched Pokémon MESSAGE("Ninjask regained health!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); - MESSAGE("The healing wish came true for Wynaut!"); - HP_BAR(player, hp: 100); - STATUS_ICON(player, none: TRUE); - MESSAGE("Wynaut regained health!"); + if (switchTo == 2) { + MESSAGE("The healing wish came true for Wynaut!"); + HP_BAR(player, hp: 100); + MESSAGE("Wynaut regained health!"); + } else if (switchTo == 3) { + MESSAGE("The healing wish came true for Wynaut!"); + STATUS_ICON(player, none: TRUE); + MESSAGE("Wynaut regained health!"); + } else { + NONE_OF { + MESSAGE("The healing wish came true for Wynaut!"); + MESSAGE("Wynaut regained health!"); + } + } + } THEN { + if (switchTo == 2) { + EXPECT_EQ(player->hp, 100); + } else if (switchTo == 3) { + EXPECT_EQ(player->status1, 0); + } else if (switchTo == 4) { + EXPECT_EQ(player->pp[0], 5); // Did NOT heal PP + } } } diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index 9ac88e687..fb89a0eb0 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -135,3 +135,46 @@ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") } TO_DO_BATTLE_TEST("Hidden Power's power is determined by IVs before Gen6"); + +SINGLE_BATTLE_TEST("Hidden Power always triggers Counter instead of Mirror Coat (Gen 1-3)") +{ + u8 hp, atk, def, spa, spd, spe; + + PARAMETRIZE { hp = 31; atk = 30; def = 30; spa = 30; spd = 30; spe = 30; } // TYPE_FIGHTING + PARAMETRIZE { hp = 31; atk = 30; def = 31; spa = 30; spd = 30; spe = 30; } // TYPE_FLYING + PARAMETRIZE { hp = 31; atk = 30; def = 30; spa = 30; spd = 30; spe = 31; } // TYPE_POISON + PARAMETRIZE { hp = 31; atk = 30; def = 31; spa = 30; spd = 30; spe = 31; } // TYPE_GROUND + PARAMETRIZE { hp = 31; atk = 30; def = 30; spa = 31; spd = 30; spe = 30; } // TYPE_ROCK + PARAMETRIZE { hp = 31; atk = 30; def = 31; spa = 31; spd = 30; spe = 30; } // TYPE_BUG + PARAMETRIZE { hp = 31; atk = 31; def = 30; spa = 31; spd = 30; spe = 31; } // TYPE_GHOST + PARAMETRIZE { hp = 31; atk = 31; def = 31; spa = 31; spd = 30; spe = 31; } // TYPE_STEEL + PARAMETRIZE { hp = 31; atk = 31; def = 30; spa = 30; spd = 31; spe = 30; } // TYPE_FIRE + PARAMETRIZE { hp = 31; atk = 31; def = 31; spa = 30; spd = 31; spe = 30; } // TYPE_WATER + PARAMETRIZE { hp = 31; atk = 31; def = 30; spa = 30; spd = 31; spe = 31; } // TYPE_GRASS + PARAMETRIZE { hp = 31; atk = 31; def = 31; spa = 30; spd = 31; spe = 31; } // TYPE_ELECTRIC + PARAMETRIZE { hp = 31; atk = 31; def = 30; spa = 31; spd = 31; spe = 30; } // TYPE_PSYCHIC + PARAMETRIZE { hp = 31; atk = 31; def = 31; spa = 31; spd = 31; spe = 30; } // TYPE_ICE + PARAMETRIZE { hp = 31; atk = 31; def = 30; spa = 31; spd = 31; spe = 31; } // TYPE_DRAGON + PARAMETRIZE { hp = 31; atk = 31; def = 31; spa = 31; spd = 31; spe = 31; } // TYPE_DARK + + GIVEN { + WITH_CONFIG(CONFIG_HIDDEN_POWER_COUNTER, GEN_3); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE ); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == 1u << DAMAGE_CATEGORY_PHYSICAL ); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == 1u << DAMAGE_CATEGORY_SPECIAL ); + PLAYER(SPECIES_WOBBUFFET) { HPIV(hp); AttackIV(atk); DefenseIV(def); SpAttackIV(spa); SpDefenseIV(spd); SpeedIV(spe); } + OPPONENT(SPECIES_WOBBUFFET); + } + WHEN { + TURN { MOVE(player, MOVE_HIDDEN_POWER); MOVE(opponent, MOVE_MIRROR_COAT); } + TURN { MOVE(player, MOVE_HIDDEN_POWER); MOVE(opponent, MOVE_COUNTER); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); + MESSAGE("The opposing Wobbuffet used Mirror Coat!"); + MESSAGE("But it failed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HIDDEN_POWER, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, opponent); + } +} diff --git a/test/battle/move_effect/hit_escape.c b/test/battle/move_effect/hit_escape.c index f587d078a..b4e3e2f4e 100644 --- a/test/battle/move_effect/hit_escape.c +++ b/test/battle/move_effect/hit_escape.c @@ -116,7 +116,7 @@ SINGLE_BATTLE_TEST("Hit Escape: U-turn switches the user out after Ice Face acti SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn: player side") { GIVEN { - PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ELECTRIC_SEED); } OPPONENT(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_WYNAUT); @@ -138,8 +138,8 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon switched in by U-turn: opposing side") { GIVEN { - PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; - PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } + PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_WYNAUT) { Item(ITEM_ELECTRIC_SEED); } } WHEN { @@ -160,7 +160,7 @@ SINGLE_BATTLE_TEST("Hit Escape: Held items are consumed immediately after a mon SINGLE_BATTLE_TEST("Hit Escape: Electric Seed boost is received by the right Pokémon after U-turn and Intimidate") { GIVEN { - PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); }; + PLAYER(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } PLAYER(SPECIES_EKANS) { Ability(ABILITY_INTIMIDATE); Item(ITEM_ELECTRIC_SEED); } OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_WYNAUT); @@ -181,9 +181,9 @@ SINGLE_BATTLE_TEST("Hit Escape: Electric Seed boost is received by the right Pok SINGLE_BATTLE_TEST("Hit Escape: U-turn triggers before Eject Pack") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); }; + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_PACK); } PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GOODRA_HISUI) { Ability(ABILITY_GOOEY); }; + OPPONENT(SPECIES_GOODRA_HISUI) { Ability(ABILITY_GOOEY); } } WHEN { TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } } SCENE { diff --git a/test/battle/move_effect/hit_set_remove_terrain.c b/test/battle/move_effect/hit_set_remove_terrain.c deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/battle/move_effect/hydro_steam.c b/test/battle/move_effect/hydro_steam.c index cb19cc6ec..1a603f20d 100644 --- a/test/battle/move_effect/hydro_steam.c +++ b/test/battle/move_effect/hydro_steam.c @@ -29,14 +29,15 @@ SINGLE_BATTLE_TEST("Hydro Steam deals 1.5x damage under both Sunlight and Rain", SINGLE_BATTLE_TEST("Hydro Steam is affected by Utility Umbrella", s16 damage) { - u32 itemPlayer; - u32 itemOpponent; + enum Item itemPlayer; + enum Item itemOpponent; PARAMETRIZE { itemPlayer = ITEM_UTILITY_UMBRELLA; itemOpponent = ITEM_NONE; } PARAMETRIZE { itemPlayer = ITEM_NONE; itemOpponent = ITEM_UTILITY_UMBRELLA; } PARAMETRIZE { itemPlayer = ITEM_UTILITY_UMBRELLA; itemOpponent = ITEM_UTILITY_UMBRELLA; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(itemPlayer); }; - OPPONENT(SPECIES_WOBBUFFET) {Item(itemOpponent); }; + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); + PLAYER(SPECIES_WOBBUFFET) { Item(itemPlayer); } + OPPONENT(SPECIES_WOBBUFFET) { Item(itemOpponent); } } WHEN { TURN { MOVE(player, MOVE_SUNNY_DAY); } TURN { MOVE(player, MOVE_HYDRO_STEAM); } diff --git a/test/battle/move_effect/ice_spinner.c b/test/battle/move_effect/ice_spinner.c index c04f16b88..82bf1c7d4 100644 --- a/test/battle/move_effect/ice_spinner.c +++ b/test/battle/move_effect/ice_spinner.c @@ -17,8 +17,8 @@ SINGLE_BATTLE_TEST("Ice Spinner and Steel Roller remove a terrain from field") MOVE_MISTY_TERRAIN, }; - u16 terrainMove = MOVE_NONE; - u16 removeTerrainMove = MOVE_NONE; + enum Move terrainMove = MOVE_NONE; + enum Move removeTerrainMove = MOVE_NONE; for (j = 0; j < ARRAY_COUNT(terrainMoves); j++) { @@ -53,6 +53,8 @@ SINGLE_BATTLE_TEST("Ice Spinner and Steel Roller remove a terrain from field") case MOVE_MISTY_TERRAIN: MESSAGE("The mist disappeared from the battlefield."); break; + default: + break; } } } @@ -105,7 +107,7 @@ SINGLE_BATTLE_TEST("Ice Spinner doesn't fail if there is no terrain on the field AI_SINGLE_BATTLE_TEST("Ice Spinner can be chosen by AI regardless if there is a terrain or not") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } PARAMETRIZE { move = MOVE_NONE; } diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index 070b6ba31..04f555815 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -6,6 +6,21 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_INSTRUCT) == EFFECT_INSTRUCT); } +SINGLE_BATTLE_TEST("Instruct causes the target to use its last used move again") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_POUND, MOVE_SCRATCH, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); MOVE(opponent, MOVE_INSTRUCT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_INSTRUCT, opponent); + MESSAGE("Wobbuffet followed the opposing Wynaut's instructions!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + } +} + DOUBLE_BATTLE_TEST("Instruct fails if target hasn't made a move") { GIVEN { @@ -224,6 +239,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected and absorbed by Lightning PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); } @@ -280,7 +296,7 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst PARAMETRIZE { moveTarget = opponentLeft; } PARAMETRIZE { moveTarget = opponentRight; } GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(GetMoveEffect(MOVE_RAGE_POWDER) == EFFECT_FOLLOW_ME); ASSUME(IsPowderMove(MOVE_RAGE_POWDER) == TRUE); ASSUME(GetMoveEffect(MOVE_SOAK) == EFFECT_SOAK); @@ -306,3 +322,28 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst HP_BAR(opponentLeft); } } + +DOUBLE_BATTLE_TEST("Instruct message references the correct battlers") +{ + GIVEN { + PLAYER(SPECIES_TREECKO); + PLAYER(SPECIES_SCEPTILE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); + MOVE(opponentLeft, MOVE_DRAGON_DARTS, target:playerLeft); + MOVE(opponentRight, MOVE_INSTRUCT, target: playerRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + MESSAGE("The opposing Wynaut used Instruct!"); + NONE_OF { + MESSAGE("Sceptile followed the opposing Wobbuffet's instructions!"); + } + MESSAGE("Sceptile followed the opposing Wynaut's instructions!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + } +} diff --git a/test/battle/move_effect/ivy_cudgel.c b/test/battle/move_effect/ivy_cudgel.c index 88d002ae3..7dd7f3344 100644 --- a/test/battle/move_effect/ivy_cudgel.c +++ b/test/battle/move_effect/ivy_cudgel.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Ivy Cudgel changes the move type depending on the form of Og { u16 species; u16 ogerpon; - u16 item; + enum Item item; PARAMETRIZE { species = SPECIES_BLASTOISE; ogerpon = SPECIES_OGERPON_TEAL; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_CHARIZARD; ogerpon = SPECIES_OGERPON_CORNERSTONE; item = ITEM_CORNERSTONE_MASK; } @@ -31,7 +31,7 @@ SINGLE_BATTLE_TEST("Ivy Cudgel changes the move type depending on the form of Og SINGLE_BATTLE_TEST("Ivy Cudgel does not change the move type if used by Pokémon other than Ogerpon") { - u16 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_CORNERSTONE_MASK; } diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index eb0874d7b..8e46ee315 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Knock Off knocks a healing berry before it has the chance to SINGLE_BATTLE_TEST("Knock Off activates after Rocky Helmet and Weakness Policy") { - u16 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_WEAKNESS_POLICY; } PARAMETRIZE { item = ITEM_ROCKY_HELMET; } @@ -85,14 +85,14 @@ SINGLE_BATTLE_TEST("Knock Off activates after Rocky Helmet and Weakness Policy") SINGLE_BATTLE_TEST("Knock Off deals additional damage to opponents holding an item in Gen 6+", s16 damage) { - u16 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_LEFTOVERS; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(item); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(item); } } WHEN { TURN { MOVE(player, MOVE_KNOCK_OFF); } } SCENE { @@ -115,7 +115,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); } } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { @@ -130,7 +130,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute even if i { GIVEN { PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_WOBBUFFET) { MaxHP(4); HP(4); Item(ITEM_LEFTOVERS); }; + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(4); HP(4); Item(ITEM_LEFTOVERS); } } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { @@ -146,7 +146,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Protect") { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); } } WHEN { TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { @@ -165,7 +165,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items if target is immune") ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); ASSUME(GetSpeciesType(SPECIES_DONPHAN, 0) == TYPE_GROUND || GetSpeciesType(SPECIES_DONPHAN, 1) == TYPE_GROUND); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); }; + OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); } } WHEN { TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { diff --git a/test/battle/move_effect/lash_out.c b/test/battle/move_effect/lash_out.c index ed9465e91..4cf02de02 100644 --- a/test/battle/move_effect/lash_out.c +++ b/test/battle/move_effect/lash_out.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Lash Out damage is boosted if the user's stats are dropped the turn it is used") { s16 damage[2]; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_GROWL; } @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Lash Out damage is boosted if the user's stats are dropped t SINGLE_BATTLE_TEST("Lash Out damage is only boosted on the turn that Intimidate switches in") { s16 damage[3] = {0}; - u32 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_LASH_OUT; } PARAMETRIZE { move = MOVE_SPLASH; } @@ -161,7 +161,7 @@ DOUBLE_BATTLE_TEST("Lash Out damage is not boosted by Treasure of Ruin ability a GIVEN { PLAYER(SPECIES_GRIMMSNARL) { Moves(MOVE_LASH_OUT); } - PLAYER(SPECIES_RATTATA); + PLAYER(SPECIES_RATTATA); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GOLEM); OPPONENT(species) { Ability(ability); } diff --git a/test/battle/move_effect/last_respects.c b/test/battle/move_effect/last_respects.c index 6ef4c73c2..1e0ddaed2 100644 --- a/test/battle/move_effect/last_respects.c +++ b/test/battle/move_effect/last_respects.c @@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m PARAMETRIZE { faintCount = 1; } PARAMETRIZE { faintCount = 2; } GIVEN { - PLAYER(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness + PLAYER(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness PLAYER(SPECIES_GEODUDE); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); } } WHEN { @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m PARAMETRIZE { faintCount = 2; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); } - OPPONENT(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness + OPPONENT(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness OPPONENT(SPECIES_GEODUDE); } WHEN { for (j = 0; j < faintCount; j++) diff --git a/test/battle/move_effect/lock_on.c b/test/battle/move_effect/lock_on.c index 9e7b93cff..750b27fc3 100644 --- a/test/battle/move_effect/lock_on.c +++ b/test/battle/move_effect/lock_on.c @@ -2,3 +2,19 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Lock-On/Mind Reader (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Lock-On volatile allows to hit through semi-invulnerability") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LOCK_ON); MOVE(opponent, MOVE_FLY); } + TURN { MOVE(player, MOVE_POUND); SKIP_TURN(opponent); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LOCK_ON, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLY, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + HP_BAR(opponent); // Pound hit + } +} diff --git a/test/battle/move_effect/lunar_dance.c b/test/battle/move_effect/lunar_dance.c new file mode 100644 index 000000000..4714516b1 --- /dev/null +++ b/test/battle/move_effect/lunar_dance.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_LUNAR_DANCE) == EFFECT_LUNAR_DANCE); +} + +SINGLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (singles)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); + PLAYER(SPECIES_GARDEVOIR); + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_POISON); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + HP_BAR(player, hp: 100); + STATUS_ICON(player, none: TRUE); + MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(player->hp, 100); + EXPECT_EQ(player->status1, 0); + // PP not healed + EXPECT_EQ(player->pp[0], 35); + EXPECT_EQ(player->pp[1], 25); + EXPECT_EQ(player->pp[2], 40); + EXPECT_EQ(player->pp[3], 25); + } +} + +DOUBLE_BATTLE_TEST("Lunar Dance causes the user to faint and heals the replacement's HP, PP and status (doubles)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + ASSUME(GetMovePP(MOVE_WATER_GUN) == 25); + ASSUME(GetMovePP(MOVE_LEAFAGE) == 40); + ASSUME(GetMovePP(MOVE_EMBER) == 25); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_WOBBUFFET) { Speed(50); } + PLAYER(SPECIES_WYNAUT) { HP(1); MaxHP(100); Status1(STATUS1_BURN); Speed(50); + MovesWithPP({MOVE_SCRATCH, 5}, {MOVE_WATER_GUN, 5}, {MOVE_LEAFAGE, 5}, {MOVE_EMBER, 0}); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LUNAR_DANCE); SEND_OUT(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, playerLeft); + HP_BAR(playerLeft, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + HP_BAR(playerLeft, hp: 100); + STATUS_ICON(playerLeft, none: TRUE); + MESSAGE("Wynaut regained health!"); + } THEN { + EXPECT_EQ(playerLeft->hp, 100); + EXPECT_EQ(playerLeft->status1, 0); + EXPECT_EQ(playerLeft->pp[0], 35); + EXPECT_EQ(playerLeft->pp[1], 25); + EXPECT_EQ(playerLeft->pp[2], 40); + EXPECT_EQ(playerLeft->pp[3], 25); + } +} + +SINGLE_BATTLE_TEST("Lunar Dance effect activates even if the the switched Pokémon can't be healed (Gen4-7)") +{ + GIVEN { + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_7); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_NINJASK) { Speed(400); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + MESSAGE("Ninjask became cloaked in mystical moonlight!"); + MESSAGE("Ninjask regained health!"); + } +} + +SINGLE_BATTLE_TEST("Lunar Dance effect activates only if the switched Pokémon can be healed (Gen8+)") +{ + u32 switchTo; + PARAMETRIZE { switchTo = 2; } + PARAMETRIZE { switchTo = 3; } + PARAMETRIZE { switchTo = 4; } + GIVEN { + ASSUME(GetMovePP(MOVE_SCRATCH) == 35); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_8); + PLAYER(SPECIES_GARDEVOIR) { Speed(300); } + PLAYER(SPECIES_NINJASK) { Speed(400); } + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); Speed(50); } + PLAYER(SPECIES_WYNAUT) { Status1(STATUS1_PARALYSIS); Speed(50); } + PLAYER(SPECIES_WYNAUT) { MovesWithPP({MOVE_SCRATCH, 5}); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_LUNAR_DANCE); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, switchTo); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LUNAR_DANCE, player); + HP_BAR(player, hp: 0); + MESSAGE("Gardevoir fainted!"); + NONE_OF { + MESSAGE("Ninjask became cloaked in mystical moonlight!"); + MESSAGE("Ninjask regained health!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); + MESSAGE("Wynaut became cloaked in mystical moonlight!"); + if (switchTo == 2) { + HP_BAR(player, hp: 100); + } else if (switchTo == 3) { + STATUS_ICON(player, none: TRUE); + } + MESSAGE("Wynaut regained health!"); + } THEN { + if (switchTo == 2) { + EXPECT_EQ(player->hp, 100); + } else if (switchTo == 3) { + EXPECT_EQ(player->status1, 0); + } else if (switchTo == 4) { + EXPECT_EQ(player->pp[0], 35); + } + } +} diff --git a/test/battle/move_effect/magic_coat.c b/test/battle/move_effect/magic_coat.c index 50ed79e19..05e53b5e1 100644 --- a/test/battle/move_effect/magic_coat.c +++ b/test/battle/move_effect/magic_coat.c @@ -32,3 +32,68 @@ SINGLE_BATTLE_TEST("Magic Coat prints the correct message when bouncing back a m STATUS_ICON(opponent, sleep: TRUE); } } + +SINGLE_BATTLE_TEST("Magic Coat fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_MAGIC_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, player); + } +} + +DOUBLE_BATTLE_TEST("Magic Coat fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_MAGIC_COAT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Magic Coat reflects hazards regardless of the user's position") +{ + struct BattlePokemon *coatUser = NULL; + PARAMETRIZE { coatUser = playerLeft; } + PARAMETRIZE { coatUser = playerRight; } + ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(coatUser, MOVE_MAGIC_COAT); MOVE(opponentRight, MOVE_STEALTH_ROCK); MOVE(opponentLeft, MOVE_SPIKES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGIC_COAT, coatUser); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponentLeft); + } + } THEN { + EXPECT(!IsHazardOnSide(B_SIDE_PLAYER, HAZARDS_STEALTH_ROCK)); + EXPECT(!IsHazardOnSide(B_SIDE_PLAYER, HAZARDS_SPIKES)); + EXPECT(IsHazardOnSide(B_SIDE_OPPONENT, HAZARDS_STEALTH_ROCK)); + EXPECT(IsHazardOnSide(B_SIDE_OPPONENT, HAZARDS_SPIKES)); + } +} diff --git a/test/battle/move_effect/magnetic_flux.c b/test/battle/move_effect/magnetic_flux.c index 6a23d2082..7bbcd5275 100644 --- a/test/battle/move_effect/magnetic_flux.c +++ b/test/battle/move_effect/magnetic_flux.c @@ -12,6 +12,6 @@ AI_DOUBLE_BATTLE_TEST("AI uses Magnetic Flux") OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } OPPONENT(SPECIES_KLINK) { Ability(ABILITY_PLUS); Moves(MOVE_MAGNETIC_FLUX, MOVE_POUND); } } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_MAGNETIC_FLUX); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_MAGNETIC_FLUX); } } } diff --git a/test/battle/move_effect/max_hp_50_recoil.c b/test/battle/move_effect/max_hp_50_recoil.c index 3e54e0553..566b6ced9 100644 --- a/test/battle/move_effect/max_hp_50_recoil.c +++ b/test/battle/move_effect/max_hp_50_recoil.c @@ -77,9 +77,9 @@ SINGLE_BATTLE_TEST("Steel Beam causes the user & the target to faint when below } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_STEEL_BEAM, player); HP_BAR(opponent, hp: 0); - MESSAGE("The opposing Wobbuffet fainted!"); HP_BAR(player, hp: 0); MESSAGE("Wobbuffet fainted!"); + MESSAGE("The opposing Wobbuffet fainted!"); } } diff --git a/test/battle/move_effect/max_move.c b/test/battle/move_effect/max_move.c deleted file mode 100644 index 41c2a4e32..000000000 --- a/test/battle/move_effect/max_move.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Max Moves (Move Effect) test titles") diff --git a/test/battle/move_effect/me_first.c b/test/battle/move_effect/me_first.c index 51f673ae5..2540270c3 100644 --- a/test/battle/move_effect/me_first.c +++ b/test/battle/move_effect/me_first.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Me First copies the move from the target and increases it's power by 1.5", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TACKLE; } PARAMETRIZE { move = MOVE_ME_FIRST; } @@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Me First can be selected if users holds Assault Vest") } } -SINGLE_BATTLE_TEST("Me Frist deducts power points from itself, not the copied move") +SINGLE_BATTLE_TEST("Me First deducts power points from itself, not the copied move") { ASSUME(GetMovePP(MOVE_ME_FIRST) == 20); ASSUME(GetMovePP(MOVE_POUND) == 35); diff --git a/test/battle/move_effect/metal_burst.c b/test/battle/move_effect/metal_burst.c deleted file mode 100644 index 4fec370e8..000000000 --- a/test/battle/move_effect/metal_burst.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Metal Burst (Move Effect) test titles") diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 2419ecb1e..52122fa1f 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -25,6 +25,7 @@ SINGLE_BATTLE_TEST("Metronome picks a random move") SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_POISON_POWDER)); ASSUME(GetSpeciesType(SPECIES_TANGELA, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); @@ -46,7 +47,7 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") SINGLE_BATTLE_TEST("Metronome's called multi-hit move hits multiple times") { GIVEN { - ASSUME(GetMoveEffect(MOVE_ROCK_BLAST) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_ROCK_BLAST)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mimic.c b/test/battle/move_effect/mimic.c index 4a51a4b79..6ea6e3f1f 100644 --- a/test/battle/move_effect/mimic.c +++ b/test/battle/move_effect/mimic.c @@ -1,4 +1,20 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Mimic doesn't error when the last move used by the target resolves to MOVE_UNAVAILABLE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN {MOVE(opponent, MOVE_TRANSFORM); MOVE(player, MOVE_MIMIC); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRANSFORM, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MIMIC, player); + } THEN { + EXPECT_EQ(gLastMoves[1], MOVE_UNAVAILABLE); // This test depends on the current implementation of Transform, if this changes, the test should be changed + } +} + TO_DO_BATTLE_TEST("TODO: Write Mimic (Move Effect) test titles") diff --git a/test/battle/move_effect/minimize.c b/test/battle/move_effect/minimize.c index f0196936a..b6730fca9 100644 --- a/test/battle/move_effect/minimize.c +++ b/test/battle/move_effect/minimize.c @@ -1,4 +1,29 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Minimize (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_MINIMIZE) == EFFECT_MINIMIZE); +} + +SINGLE_BATTLE_TEST("Minimize increases the user's Evasion by 2 stages (Gen5+) or 1 stage (Gen1-4)") +{ + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } + + GIVEN { + WITH_CONFIG(CONFIG_MINIMIZE_EVASION, config); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MINIMIZE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MINIMIZE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_EVASION], DEFAULT_STAT_STAGE + (config >= GEN_5 ? 2 : 1)); + } +} + +// Minimize's flag tests are handled in tests/battle/move_flags/minimize_double_damage.c diff --git a/test/battle/move_effect/mirror_coat.c b/test/battle/move_effect/mirror_coat.c deleted file mode 100644 index 2a3d6ef25..000000000 --- a/test/battle/move_effect/mirror_coat.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Mirror Coat (Move Effect) test titles") diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index c9e468a5e..1725c0e6b 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -41,6 +41,7 @@ SINGLE_BATTLE_TEST("Mirror Move fails if no move was used before") SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") { GIVEN { + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); @@ -63,7 +64,7 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") SINGLE_BATTLE_TEST("Mirror Move's called multi-hit move hits multiple times") { GIVEN { - ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_BULLET_SEED)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mist.c b/test/battle/move_effect/mist.c index dedf84ceb..fe37255eb 100644 --- a/test/battle/move_effect/mist.c +++ b/test/battle/move_effect/mist.c @@ -1,6 +1,42 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Mist (Move Effect) test titles") +SINGLE_BATTLE_TEST("Mist prevents stat reductions from opposing moves") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST); + ASSUME(GetMoveEffect(MOVE_GROWL) == EFFECT_ATTACK_DOWN); + PLAYER(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(player, MOVE_MIST); MOVE(opponent, MOVE_GROWL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, player); + MESSAGE("Your team became shrouded in mist!"); + MESSAGE("The opposing Wobbuffet used Growl!"); + MESSAGE("Wobbuffet is protected by the mist!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} -TO_DO_BATTLE_TEST("Mist's protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. +SINGLE_BATTLE_TEST("Mist's protection considers Contrary") // Eg. If a move would reduce stats due to Contrary, it will be protected by Mist. +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST); + ASSUME(GetMoveEffect(MOVE_SWAGGER) == EFFECT_SWAGGER); + PLAYER(SPECIES_SNIVY) { Ability(ABILITY_CONTRARY); Speed(20); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(player, MOVE_MIST); MOVE(opponent, MOVE_SWAGGER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, player); + MESSAGE("Your team became shrouded in mist!"); + MESSAGE("The opposing Wobbuffet used Swagger!"); + MESSAGE("Snivy is protected by the mist!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + MESSAGE("Snivy became confused!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} diff --git a/test/battle/move_effect/moonlight.c b/test/battle/move_effect/moonlight.c index 9804e4ba1..9cbf8c580 100644 --- a/test/battle/move_effect/moonlight.c +++ b/test/battle/move_effect/moonlight.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Moonlight recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -34,13 +34,13 @@ SINGLE_BATTLE_TEST("Moonlight recovers 2/3 of the user's max HP in Sunlight (Gen SINGLE_BATTLE_TEST("Moonlight recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_SANDSTORM; } PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/morning_sun.c b/test/battle/move_effect/morning_sun.c index eca9efd31..2e78ecfa9 100644 --- a/test/battle/move_effect/morning_sun.c +++ b/test/battle/move_effect/morning_sun.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -34,13 +34,13 @@ SINGLE_BATTLE_TEST("Morning Sun recovers 2/3 of the user's max HP in Sunlight (G SINGLE_BATTLE_TEST("Morning Sun recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_SANDSTORM; } PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/mud_sport.c b/test/battle/move_effect/mud_sport.c index ff483699b..31e0ea18f 100644 --- a/test/battle/move_effect/mud_sport.c +++ b/test/battle/move_effect/mud_sport.c @@ -3,11 +3,15 @@ TO_DO_BATTLE_TEST("TODO: Write Mud Sport (Move Effect) test titles") -SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 67% (Gen5+)") +SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 50% (Gen3-4) or 67% (Gen5+)") { + u32 config; s16 playerDmg[2]; s16 opponentDmg[2]; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_SPORT_DMG_REDUCTION, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -28,7 +32,13 @@ SINGLE_BATTLE_TEST("Mud Sport reduces the damage of Electric Type moves by 67% ( HP_BAR(player, captureDamage: &playerDmg[1]); } THEN { - EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); - EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + if (config >= GEN_5) { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } + else { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.5), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.5), playerDmg[1]); + } } } diff --git a/test/battle/move_effect/multi_hit.c b/test/battle/move_effect/multi_hit.c index 291c78efd..607afac62 100644 --- a/test/battle/move_effect/multi_hit.c +++ b/test/battle/move_effect/multi_hit.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_BULLET_SEED)); } SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit the maximum amount with Skill Link") PASSES_RANDOMLY(100, 100, RNG_HITS); GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SKILL_LINK); }; + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SKILL_LINK); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BULLET_SEED); } @@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit twice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -53,7 +53,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit thrice 37.5/35% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit four times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit five times 12.5/15% of the time") PASSES_RANDOMLY(passes, trials, RNG_HITS); GIVEN { - WITH_CONFIG(GEN_CONFIG_MULTI_HIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_MULTI_HIT_CHANCE, genConfig); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -153,7 +153,7 @@ SINGLE_BATTLE_TEST("Multi hit Moves hit five times 50 Percent of the time with L SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final hit") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -175,7 +175,7 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after final SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move correctly") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); ASSUME(GetMoveType(MOVE_SCALE_SHOT) == TYPE_DRAGON); ASSUME(GetSpeciesType(SPECIES_FIDOUGH, 0) == TYPE_FAIRY || GetSpeciesType(SPECIES_FIDOUGH, 1) == TYPE_FAIRY); PLAYER(SPECIES_WOBBUFFET); @@ -191,7 +191,7 @@ SINGLE_BATTLE_TEST("Scale Shot is immune to Fairy types and will end the move co DOUBLE_BATTLE_TEST("Scale Shot does not corrupt the next turn move used") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -216,7 +216,7 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after the 4 { PASSES_RANDOMLY(50, 100, RNG_LOADED_DICE); GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LOADED_DICE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -236,12 +236,12 @@ SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after the 4 SINGLE_BATTLE_TEST("Scale Shot decreases defense and increases speed after killing opposing with less then 4 hits") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_LOADED_DICE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_SCALE_SHOT) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_SCALE_SHOT)); PLAYER(SPECIES_BAGON) { Item(item); } OPPONENT(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/nature_power.c b/test/battle/move_effect/nature_power.c index 53aa68442..b695617a6 100644 --- a/test/battle/move_effect/nature_power.c +++ b/test/battle/move_effect/nature_power.c @@ -7,11 +7,12 @@ SINGLE_BATTLE_TEST("Nature power plays a move correctly in any background") { u32 environment = 0; - u32 move = MOVE_TRI_ATTACK; - for (u32 j = 0; j < BATTLE_ENVIRONMENT_COUNT; j++) - { - PARAMETRIZE {environment = i;} + enum Move move = MOVE_TRI_ATTACK; + + for (u32 j = 0; j < BATTLE_ENVIRONMENT_COUNT; j++) { + PARAMETRIZE { environment = i; } } + GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -25,3 +26,19 @@ SINGLE_BATTLE_TEST("Nature power plays a move correctly in any background") ANIMATION(ANIM_TYPE_MOVE, move, player); } } + +#if B_UPDATED_MOVE_FLAGS >= GEN_6 +DOUBLE_BATTLE_TEST("Nature Power can target ally (Gen6+)") +{ + GIVEN { + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_NATURE_POWER, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRI_ATTACK, playerLeft); + } +} +#endif diff --git a/test/battle/move_effect/nightmare.c b/test/battle/move_effect/nightmare.c index 4cf051ba7..43f4cb443 100644 --- a/test/battle/move_effect/nightmare.c +++ b/test/battle/move_effect/nightmare.c @@ -1,6 +1,40 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Nightmare (Move Effect) test titles") +SINGLE_BATTLE_TEST("Nightmare damages sleeping targets at end of turn") +{ + s16 damage; -TO_DO_BATTLE_TEST("Nightmare affects Pokémon with Comatose") + GIVEN { + ASSUME(GetMoveEffect(MOVE_NIGHTMARE) == EFFECT_NIGHTMARE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP_TURN(2)); MaxHP(160); HP(160); } + } WHEN { + TURN { MOVE(player, MOVE_NIGHTMARE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NIGHTMARE, player); + MESSAGE("The opposing Wobbuffet began having a nightmare!"); + HP_BAR(opponent, captureDamage: &damage); + } THEN { + EXPECT_EQ(damage, 40); + } +} + +SINGLE_BATTLE_TEST("Nightmare affects Pokémon with Comatose") +{ + s16 damage; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_NIGHTMARE) == EFFECT_NIGHTMARE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); MaxHP(160); HP(160); } + } WHEN { + TURN { MOVE(player, MOVE_NIGHTMARE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NIGHTMARE, player); + MESSAGE("The opposing Komala began having a nightmare!"); + HP_BAR(opponent, captureDamage: &damage); + } THEN { + EXPECT_EQ(damage, 40); + } +} diff --git a/test/battle/move_effect/noble_roar.c b/test/battle/move_effect/noble_roar.c index 4fd182b84..f683619b4 100644 --- a/test/battle/move_effect/noble_roar.c +++ b/test/battle/move_effect/noble_roar.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Noble Roar (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_NOBLE_ROAR) == EFFECT_NOBLE_ROAR); +} + +SINGLE_BATTLE_TEST("Noble Roar reduces the target's Attack and Sp. Attack by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NOBLE_ROAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NOBLE_ROAR, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/move_effect/ohko.c b/test/battle/move_effect/ohko.c index 81847a1ba..28c23d716 100644 --- a/test/battle/move_effect/ohko.c +++ b/test/battle/move_effect/ohko.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("OHKO moves can hit semi-invulnerable mons when the user has { GIVEN { ASSUME(GetItemHoldEffect(ITEM_FOCUS_SASH) == HOLD_EFFECT_FOCUS_SASH); - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_NO_GUARD); } + PLAYER(SPECIES_MACHAMP) { Ability(ABILITY_NO_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_FLY); } diff --git a/test/battle/move_effect/overwrite_ability.c b/test/battle/move_effect/overwrite_ability.c new file mode 100644 index 000000000..e4be2b066 --- /dev/null +++ b/test/battle/move_effect/overwrite_ability.c @@ -0,0 +1,150 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); + } +} + +DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); + } +} + +SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SIMPLE_BEAM); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); + MESSAGE("But it failed!"); + } +} + +SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + }WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ABILITY_POPUP(opponent, ABILITY_BLAZE); + } THEN { + EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); + } +} + +DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } + OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } + OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); + ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); + ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); + } + } THEN { + EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); + } +} + +SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); + ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WORRY_SEED); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + MESSAGE("But it failed!"); + } +} diff --git a/test/battle/move_effect/perish_song.c b/test/battle/move_effect/perish_song.c index bfbe7eedc..5e3001ff8 100644 --- a/test/battle/move_effect/perish_song.c +++ b/test/battle/move_effect/perish_song.c @@ -2,3 +2,96 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Perish Song (Move Effect) test titles") + +DOUBLE_BATTLE_TEST("Perish Song can be absorbed and will not affect those that absorbed it") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_LANTURN) { HP(1); Ability(ABILITY_VOLT_ABSORB); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ELECTRIFY, target: playerLeft); + MOVE(playerLeft, MOVE_PERISH_SONG); + } + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIFY, opponentLeft); + ABILITY_POPUP(playerRight, ABILITY_VOLT_ABSORB); + ABILITY_POPUP(opponentRight, ABILITY_SOUNDPROOF); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); + } THEN { + EXPECT_EQ(playerLeft->hp, 0); + EXPECT_EQ(opponentLeft->hp, 0); + EXPECT_GT(playerRight->hp, 0); + EXPECT_GT(opponentRight->hp, 0); + } +} + +DOUBLE_BATTLE_TEST("Perish Song ignores protect") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_PROTECT); + MOVE(opponentLeft, MOVE_PROTECT); + MOVE(playerRight, MOVE_PERISH_SONG); + } + TURN {} + TURN {} + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, playerRight); + HP_BAR(playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + HP_BAR(playerRight); + } +} + +DOUBLE_BATTLE_TEST("Perish Song will be blocked by users Soundproof in gen3") +{ + u32 config = GEN_3; + + PARAMETRIZE { config = GEN_3; } + PARAMETRIZE { config = GEN_5; } + + GIVEN { + WITH_CONFIG(CONFIG_CHECK_USER_FAILURE, config); + PLAYER(SPECIES_VOLTORB) { Ability(ABILITY_SOUNDPROOF); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_PERISH_SONG); } + TURN {} + TURN {} + TURN {} + } SCENE { + if (config == GEN_3) { + ABILITY_POPUP(playerLeft, ABILITY_SOUNDPROOF); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, playerLeft); + } else { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, playerLeft); + HP_BAR(playerLeft); + } + } THEN { + if (config == GEN_3) { + EXPECT_GT(playerLeft->hp, 0); + } else { + EXPECT_EQ(playerLeft->hp, 0); + } + EXPECT_EQ(opponentLeft->hp, 0); + EXPECT_EQ(playerRight->hp, 0); + EXPECT_EQ(opponentRight->hp, 0); + } +} diff --git a/test/battle/move_effect/pledge.c b/test/battle/move_effect/pledge.c index a7935450b..6a812ed19 100644 --- a/test/battle/move_effect/pledge.c +++ b/test/battle/move_effect/pledge.c @@ -217,7 +217,7 @@ DOUBLE_BATTLE_TEST("Pledge moves can not be redirected by absorbing abilities") OPPONENT(SPECIES_LILEEP) { Ability(ABILITY_STORM_DRAIN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentRight);} + TURN { MOVE(playerLeft, MOVE_WATER_PLEDGE, target: opponentRight); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_PLEDGE, playerLeft); HP_BAR(opponentRight); @@ -334,7 +334,8 @@ DOUBLE_BATTLE_TEST("Damage calculation: Combined pledge move") DOUBLE_BATTLE_TEST("Pledge move combo interactions with Powder are correct") { // Fire Pledge as the first move or Fire Pledge combo should fail - u32 moveLeft, moveRight, speedLeft, speedRight; + enum Move moveLeft, moveRight; + u32 speedLeft, speedRight; PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 4; speedRight = 3; } // FAIL 1 PARAMETRIZE { moveLeft = MOVE_FIRE_PLEDGE; moveRight = MOVE_WATER_PLEDGE; speedLeft = 3; speedRight = 4; } PARAMETRIZE { moveLeft = MOVE_WATER_PLEDGE; moveRight = MOVE_FIRE_PLEDGE; speedLeft = 4; speedRight = 3; } @@ -910,6 +911,7 @@ DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move DOUBLE_BATTLE_TEST("Pledge move combo doesn't trigger on opponent's Pledge move - Storm Drain") { GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_GASTRODON) { Ability(ABILITY_STORM_DRAIN); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index da8eba4ca..598b3180e 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -83,7 +83,7 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_RAIN, GEN_6); + WITH_CONFIG(CONFIG_POWDER_STATUS_HEAVY_RAIN, GEN_6); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -100,7 +100,7 @@ SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain (Gen 7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_RAIN, GEN_7); + WITH_CONFIG(CONFIG_POWDER_STATUS_HEAVY_RAIN, GEN_7); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -152,7 +152,7 @@ DOUBLE_BATTLE_TEST("Powder fails if target is already affected by Powder") SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(GetSpeciesType(SPECIES_VENUSAUR, 0) == TYPE_GRASS || GetSpeciesType(SPECIES_VENUSAUR, 1) == TYPE_GRASS); PLAYER(SPECIES_VENUSAUR); OPPONENT(SPECIES_VIVILLON); @@ -168,7 +168,7 @@ SINGLE_BATTLE_TEST("Powder fails if the target is Grass type (Gen6+)") SINGLE_BATTLE_TEST("Powder fails if the target has Overcoat (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(CONFIG_POWDER_OVERCOAT, GEN_6); PLAYER(SPECIES_FORRETRESS) { Ability(ABILITY_OVERCOAT); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -223,17 +223,20 @@ DOUBLE_BATTLE_TEST("Powder still blocks the target's Fire type moves even if it } } -SINGLE_BATTLE_TEST("Powder prevents Protean from changing its user to Fire type") +SINGLE_BATTLE_TEST("Powder prevents Protean/Libero from changing its user to Fire type") { + u32 ability, species; + PARAMETRIZE { ability = ABILITY_PROTEAN; species = SPECIES_GRENINJA; } + PARAMETRIZE { ability = ABILITY_LIBERO; species = SPECIES_RABOOT; } GIVEN { - PLAYER(SPECIES_GRENINJA) { Ability(ABILITY_PROTEAN); } + PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_VIVILLON); } WHEN { TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); NONE_OF { - ABILITY_POPUP(player, ABILITY_PROTEAN); + ABILITY_POPUP(player, ability); ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); HP_BAR(opponent); } @@ -281,10 +284,10 @@ SINGLE_BATTLE_TEST("Powder doesn't consume Berry from Fire type Natural Gift but DOUBLE_BATTLE_TEST("Powder damages a target using Shell Trap even if it wasn't hit by a Physical move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_EMBER; } - PARAMETRIZE { move = MOVE_TICKLE;} + PARAMETRIZE { move = MOVE_TICKLE; } GIVEN { ASSUME(GetMoveEffect(MOVE_SHELL_TRAP) == EFFECT_SHELL_TRAP); ASSUME(GetMoveType(MOVE_SHELL_TRAP) == TYPE_FIRE); diff --git a/test/battle/move_effect/protect.c b/test/battle/move_effect/protect.c index 97a09bd92..dea0a9eab 100644 --- a/test/battle/move_effect/protect.c +++ b/test/battle/move_effect/protect.c @@ -23,15 +23,15 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Protect: Protect, Detect, Spiky Shield, Baneful Bunker and Burning Bulwark protect from all moves") { u32 j; - static const u16 protectMoves[] = { + static const enum Move protectMoves[] = { MOVE_PROTECT, MOVE_DETECT, MOVE_SPIKY_SHIELD, MOVE_BANEFUL_BUNKER, MOVE_BURNING_BULWARK, }; - u16 protectMove = MOVE_NONE; - u16 usedMove = MOVE_NONE; + enum Move protectMove = MOVE_NONE; + enum Move usedMove = MOVE_NONE; for (j = 0; j < ARRAY_COUNT(protectMoves); j++) { @@ -62,14 +62,14 @@ SINGLE_BATTLE_TEST("Protect: Protect, Detect, Spiky Shield, Baneful Bunker and B SINGLE_BATTLE_TEST("Protect: King's Shield, Silk Trap and Obstruct protect from damaging moves and lower stats on contact") { u32 j; - static const u16 protectMoves[][3] = + static const enum Move protectMoves[][3] = { // Move Stat Stages {MOVE_KINGS_SHIELD, STAT_ATK, (B_KINGS_SHIELD_LOWER_ATK >= GEN_8) ? 1 : 2}, {MOVE_SILK_TRAP, STAT_SPEED, 1}, {MOVE_OBSTRUCT, STAT_DEF, 2}, }; - u16 protectMove = MOVE_NONE; - u16 usedMove = MOVE_NONE; + enum Move protectMove = MOVE_NONE; + enum Move usedMove = MOVE_NONE; u16 statId = 0, lowersBy = 0; for (j = 0; j < ARRAY_COUNT(protectMoves); j++) @@ -127,7 +127,7 @@ SINGLE_BATTLE_TEST("Protect: King's Shield, Silk Trap and Obstruct protect from SINGLE_BATTLE_TEST("Protect: Spiky Shield does 1/8 dmg of max hp of attackers making contact and may faint them") { - u16 usedMove = MOVE_NONE; + enum Move usedMove = MOVE_NONE; u16 hp = 400, maxHp = 400; PARAMETRIZE { usedMove = MOVE_SCRATCH; hp = 1; } @@ -164,11 +164,11 @@ SINGLE_BATTLE_TEST("Protect: Spiky Shield does 1/8 dmg of max hp of attackers ma SINGLE_BATTLE_TEST("Protect: Baneful Bunker poisons Pokémon for moves making contact") { - u16 usedMove = MOVE_NONE; + enum Move usedMove = MOVE_NONE; - PARAMETRIZE {usedMove = MOVE_SCRATCH; } - PARAMETRIZE {usedMove = MOVE_LEER; } - PARAMETRIZE {usedMove = MOVE_WATER_GUN; } + PARAMETRIZE { usedMove = MOVE_SCRATCH; } + PARAMETRIZE { usedMove = MOVE_LEER; } + PARAMETRIZE { usedMove = MOVE_WATER_GUN; } GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -216,11 +216,11 @@ SINGLE_BATTLE_TEST("Protect: Baneful Bunker can't poison Pokémon if they are al SINGLE_BATTLE_TEST("Protect: Burning Bulwark burns Pokémon for moves making contact") { - u16 usedMove = MOVE_NONE; + enum Move usedMove = MOVE_NONE; - PARAMETRIZE {usedMove = MOVE_SCRATCH; } - PARAMETRIZE {usedMove = MOVE_LEER; } - PARAMETRIZE {usedMove = MOVE_WATER_GUN; } + PARAMETRIZE { usedMove = MOVE_SCRATCH; } + PARAMETRIZE { usedMove = MOVE_LEER; } + PARAMETRIZE { usedMove = MOVE_WATER_GUN; } GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -269,10 +269,10 @@ SINGLE_BATTLE_TEST("Protect: Burning Bulwark can't burn Pokémon if they are alr SINGLE_BATTLE_TEST("Protect: Recoil damage is not applied if target was protected") { u32 j, k; - static const u16 protectMoves[] = { MOVE_PROTECT, MOVE_DETECT, MOVE_KINGS_SHIELD, MOVE_BANEFUL_BUNKER, MOVE_SILK_TRAP, MOVE_OBSTRUCT, MOVE_SPIKY_SHIELD }; - static const u16 recoilMoves[] = { MOVE_VOLT_TACKLE, MOVE_HEAD_SMASH, MOVE_TAKE_DOWN, MOVE_DOUBLE_EDGE }; - u16 protectMove = MOVE_NONE; - u16 recoilMove = MOVE_NONE; + static const u16 protectMoves[] = {MOVE_PROTECT, MOVE_DETECT, MOVE_KINGS_SHIELD, MOVE_BANEFUL_BUNKER, MOVE_SILK_TRAP, MOVE_OBSTRUCT, MOVE_SPIKY_SHIELD}; + static const u16 recoilMoves[] = {MOVE_VOLT_TACKLE, MOVE_HEAD_SMASH, MOVE_TAKE_DOWN, MOVE_DOUBLE_EDGE}; + enum Move protectMove = MOVE_NONE; + enum Move recoilMove = MOVE_NONE; for (j = 0; j < ARRAY_COUNT(protectMoves); j++) { @@ -311,7 +311,7 @@ SINGLE_BATTLE_TEST("Protect: Recoil damage is not applied if target was protecte SINGLE_BATTLE_TEST("Protect: Multi-hit moves don't hit a protected target and fail only once") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_PROTECT; } PARAMETRIZE { move = MOVE_DETECT; } @@ -322,7 +322,7 @@ SINGLE_BATTLE_TEST("Protect: Multi-hit moves don't hit a protected target and fa PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } GIVEN { - ASSUME(GetMoveEffect(MOVE_ARM_THRUST) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_ARM_THRUST)); PLAYER(SPECIES_RAPIDASH); OPPONENT(SPECIES_BEAUTIFLY); } WHEN { @@ -356,18 +356,54 @@ SINGLE_BATTLE_TEST("Protect: Multi-hit moves don't hit a protected target and fa } } +SINGLE_BATTLE_TEST("Protect fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_PROTECT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, player); + } +} + +DOUBLE_BATTLE_TEST("Protect fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_PROTECT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, playerLeft); + } +} + DOUBLE_BATTLE_TEST("Protect: Wide Guard protects self and ally from multi-target moves") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; PARAMETRIZE { move = MOVE_SCRATCH; } // Single target PARAMETRIZE { move = MOVE_SURF; } // All targets PARAMETRIZE { move = MOVE_HYPER_VOICE; } // 2 foes GIVEN { - ASSUME(GetMoveTarget(MOVE_SCRATCH) == MOVE_TARGET_SELECTED); - ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SCRATCH) == TARGET_SELECTED); + ASSUME(GetMoveTarget(MOVE_SURF) == TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -385,26 +421,31 @@ DOUBLE_BATTLE_TEST("Protect: Wide Guard protects self and ally from multi-target } else if (move == MOVE_HYPER_VOICE) { NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HYPER_VOICE, playerLeft); MESSAGE("The opposing Wobbuffet protected itself!"); - NOT HP_BAR(opponentLeft); MESSAGE("The opposing Wobbuffet protected itself!"); - NOT HP_BAR(opponentRight); + NONE_OF { + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } } else { // Surf + MESSAGE("The opposing Wobbuffet protected itself!"); MESSAGE("The opposing Wobbuffet protected itself!"); NOT HP_BAR(opponentLeft); HP_BAR(playerRight); - MESSAGE("The opposing Wobbuffet protected itself!"); NOT HP_BAR(opponentRight); } } } -DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns") +DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns (Gen6+)") { - u8 turns; + u32 turns, config, passes; - PASSES_RANDOMLY(2, 2); + PARAMETRIZE { config = GEN_5; passes = 0; } + PARAMETRIZE { config = GEN_6; passes = 2; } + PASSES_RANDOMLY(passes, 2); GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + WITH_CONFIG(CONFIG_WIDE_GUARD, config); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -428,11 +469,11 @@ DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns") DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority moves") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; struct BattlePokemon *targetOpponent = NULL; - PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; } - PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; } + PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; } + PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; } PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentLeft; } PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentRight; } @@ -461,12 +502,15 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority mo } } -DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns") +DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns (Gen6+)") { - u8 turns; + u32 turns, config, passes; - PASSES_RANDOMLY(2, 2); + PARAMETRIZE { config = GEN_5; passes = 0; } + PARAMETRIZE { config = GEN_6; passes = 2; } + PASSES_RANDOMLY(passes, 2); GIVEN { + WITH_CONFIG(CONFIG_QUICK_GUARD, config); ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -488,7 +532,7 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns") DOUBLE_BATTLE_TEST("Protect: Crafty Shield protects self and ally from status moves") { - u16 move = MOVE_NONE; + enum Move move = MOVE_NONE; struct BattlePokemon *targetOpponent = NULL; PARAMETRIZE { move = MOVE_HYPER_VOICE; } @@ -497,8 +541,8 @@ DOUBLE_BATTLE_TEST("Protect: Crafty Shield protects self and ally from status mo PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; } GIVEN { - ASSUME(GetMoveTarget(MOVE_LEER) == MOVE_TARGET_BOTH); - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_LEER) == TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); ASSUME(GetMoveCategory(MOVE_HYPER_VOICE) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -529,7 +573,7 @@ DOUBLE_BATTLE_TEST("Protect: Crafty Shield protects self and ally from status mo SINGLE_BATTLE_TEST("Protect: Protect does not block Confide or Decorate") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CONFIDE; } PARAMETRIZE { move = MOVE_DECORATE; } @@ -551,7 +595,7 @@ SINGLE_BATTLE_TEST("Protect: Protect does not block Confide or Decorate") DOUBLE_BATTLE_TEST("Crafty Shield protects self and ally from Confide and Decorate") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CONFIDE; } PARAMETRIZE { move = MOVE_DECORATE; } @@ -592,13 +636,10 @@ DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Tangela's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); MESSAGE("The opposing Sunkern's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); MESSAGE("Tangrowth's Defense rose!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_FLOWER_SHIELD, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); MESSAGE("The opposing Sunflora's Defense rose!"); } @@ -607,7 +648,7 @@ DOUBLE_BATTLE_TEST("Crafty Shield does not protect against moves that target all SINGLE_BATTLE_TEST("Protect: Quick Guard, Wide Guard and Crafty Shield don't reduce Max Move demage", s16 damage) { s16 dmg[2]; - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_WIDE_GUARD; } PARAMETRIZE { move = MOVE_QUICK_GUARD; } @@ -630,7 +671,7 @@ SINGLE_BATTLE_TEST("Protect: Quick Guard, Wide Guard and Crafty Shield don't red SINGLE_BATTLE_TEST("Protect: Quick Guard, Wide Guard and Crafty Shield don't reduce Z-Move demage", s16 damage) { bool32 protected; - u32 move; + enum Move move; PARAMETRIZE { protected = TRUE; move = MOVE_WIDE_GUARD; } PARAMETRIZE { protected = FALSE; move = MOVE_WIDE_GUARD; } @@ -679,7 +720,7 @@ SINGLE_BATTLE_TEST("Protect: Protective Pads protects from secondary effects") DOUBLE_BATTLE_TEST("Protect is not transferred to a mon that is switched in due to Eject Button") { GIVEN { - PLAYER(SPECIES_URSHIFU) { Ability(ABILITY_UNSEEN_FIST); }; + PLAYER(SPECIES_URSHIFU) { Ability(ABILITY_UNSEEN_FIST); } PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT) { Item(ITEM_EJECT_BUTTON); } diff --git a/test/battle/move_effect/psyblade.c b/test/battle/move_effect/psyblade.c deleted file mode 100644 index 3a5778d1f..000000000 --- a/test/battle/move_effect/psyblade.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Psyblade (Move Effect) test titles") diff --git a/test/battle/move_effect/psychic_terrain.c b/test/battle/move_effect/psychic_terrain.c index e17964464..9dcbd15df 100644 --- a/test/battle/move_effect/psychic_terrain.c +++ b/test/battle/move_effect/psychic_terrain.c @@ -116,15 +116,18 @@ SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority field moves") SINGLE_BATTLE_TEST("Psychic Terrain doesn't block priority moves against semi-invulnerable targets") { - u32 move = 0, shouldWork = 0; - PARAMETRIZE { move = MOVE_SOLAR_BEAM; shouldWork = FALSE;} - PARAMETRIZE { move = MOVE_FLY; shouldWork = TRUE;} + enum Move move = MOVE_NONE; + bool32 shouldWork = FALSE; + PARAMETRIZE { move = MOVE_SOLAR_BEAM; shouldWork = FALSE; } + PARAMETRIZE { move = MOVE_FLY; shouldWork = TRUE; } GIVEN { + WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, GEN_6); + ASSUME(IsSpeciesOfType(SPECIES_SHROODLE, TYPE_POISON)); PLAYER(SPECIES_SHROODLE) { Ability(ABILITY_PRANKSTER); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); MOVE(opponent,move);} - TURN { MOVE(player, MOVE_TOXIC); SKIP_TURN(opponent);} + TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); MOVE(opponent,move); } + TURN { MOVE(player, MOVE_TOXIC); SKIP_TURN(opponent); } } SCENE { if (shouldWork) { diff --git a/test/battle/move_effect/purify.c b/test/battle/move_effect/purify.c index 425d0a99a..13d1a6e74 100644 --- a/test/battle/move_effect/purify.c +++ b/test/battle/move_effect/purify.c @@ -62,5 +62,37 @@ AI_DOUBLE_BATTLE_TEST("AI does not use Purify to heal an ally with Guts") } } -TO_DO_BATTLE_TEST("TODO: Write Purify (Move Effect) test titles") -TO_DO_BATTLE_TEST("Purify doesn't heal HP if the target has Comatose") +SINGLE_BATTLE_TEST("Purify cures the target's status and heals the user") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PURIFY) == EFFECT_PURIFY); + PLAYER(SPECIES_WOBBUFFET) { HP(50); MaxHP(100); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + } WHEN { + TURN { MOVE(player, MOVE_PURIFY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PURIFY, player); + STATUS_ICON(opponent, none: TRUE); + HP_BAR(player); + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + EXPECT_EQ(opponent->status1, STATUS1_NONE); + } +} + +SINGLE_BATTLE_TEST("Purify doesn't heal HP if the target has Comatose") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_PURIFY) == EFFECT_PURIFY); + PLAYER(SPECIES_WOBBUFFET) { HP(50); MaxHP(100); } + OPPONENT(SPECIES_KOMALA) { Ability(ABILITY_COMATOSE); } + } WHEN { + TURN { MOVE(player, MOVE_PURIFY); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_PURIFY, player); + MESSAGE("But it failed!"); + NOT HP_BAR(player); + } THEN { + EXPECT_EQ(player->hp, 50); + } +} diff --git a/test/battle/move_effect/pursuit.c b/test/battle/move_effect/pursuit.c index 27303d95c..aa5f5ebc7 100644 --- a/test/battle/move_effect/pursuit.c +++ b/test/battle/move_effect/pursuit.c @@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Pursuit attacks a switching foe") SINGLE_BATTLE_TEST("Pursuit attacks a foe using Volt Switch / U-Turn / Parting Shot to switch out") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_VOLT_SWITCH; } PARAMETRIZE { move = MOVE_U_TURN; } PARAMETRIZE { move = MOVE_PARTING_SHOT; } @@ -47,11 +47,11 @@ SINGLE_BATTLE_TEST("Pursuit attacks a foe using Volt Switch / U-Turn / Parting S DOUBLE_BATTLE_TEST("Pursuit doesn't attack a foe using Teleport / Baton Pass to switch out") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_TELEPORT; } PARAMETRIZE { move = MOVE_BATON_PASS; } GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); ASSUME(GetMoveEffect(MOVE_QUASH) == EFFECT_QUASH); ASSUME(GetMoveEffect(MOVE_TELEPORT) == EFFECT_TELEPORT); ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS); @@ -117,7 +117,8 @@ SINGLE_BATTLE_TEST("Pursuit ignores accuracy checks when attacking a switching t PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); PLAYER(SPECIES_GLACEON) { Ability(ABILITY_SNOW_CLOAK); } PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/quash.c b/test/battle/move_effect/quash.c index a6032b43c..0fc2fbd25 100644 --- a/test/battle/move_effect/quash.c +++ b/test/battle/move_effect/quash.c @@ -26,7 +26,7 @@ DOUBLE_BATTLE_TEST("Quash-affected target will move last in the priority bracket DOUBLE_BATTLE_TEST("Quash is not affected by dynamic speed") { GIVEN { - WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); PLAYER(SPECIES_VOLBEAT) { Speed(10); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(30); } @@ -112,7 +112,7 @@ DOUBLE_BATTLE_TEST("Quash-affected targets move from fastest to slowest (Gen 8+) DOUBLE_BATTLE_TEST("Quash-affected mon that acted early via After You is not affected by dynamic speed") { GIVEN { - WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } diff --git a/test/battle/move_effect/quiver_dance.c b/test/battle/move_effect/quiver_dance.c index 5a7ff5b94..b317d3987 100644 --- a/test/battle/move_effect/quiver_dance.c +++ b/test/battle/move_effect/quiver_dance.c @@ -1,4 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Quiver Dance (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_QUIVER_DANCE) == EFFECT_QUIVER_DANCE); +} + +SINGLE_BATTLE_TEST("Quiver Dance increases the user's Sp. Attack, Sp. Defense and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_QUIVER_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_QUIVER_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/rage.c b/test/battle/move_effect/rage.c index 33025a6b0..0d43bb5da 100644 --- a/test/battle/move_effect/rage.c +++ b/test/battle/move_effect/rage.c @@ -1,4 +1,168 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Rage (Move Effect) test titles") +SINGLE_BATTLE_TEST("Rage sets the Rage volatile status on the user") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + } +} + +SINGLE_BATTLE_TEST("Rage's volatile causes Attack to rise by 1 when hit by a damaging move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage volatile is cleared when using a different move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_TACKLE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + NOT MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage does not build Attack from status moves") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_GROWL); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GROWL, opponent); + NOT MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage builds Attack multiple times when hit multiple times") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage volatile persists when using Rage again") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage does not build Attack when user's Attack is at max stage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_BELLY_DRUM); } + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BELLY_DRUM, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + NOT MESSAGE("Wobbuffet's rage is building!"); + } +} + +SINGLE_BATTLE_TEST("Rage volatile behavior on Protect depends on generation") +{ + u32 config; + PARAMETRIZE { config = GEN_3; } + PARAMETRIZE { config = GEN_4; } + GIVEN { + WITH_CONFIG(CONFIG_RAGE_BUILDS, config); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_RAGE); } + TURN { MOVE(opponent, MOVE_TACKLE); MOVE(player, MOVE_RAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + MESSAGE("The opposing Wobbuffet protected itself!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + if (config == GEN_3) { + MESSAGE("Wobbuffet's rage is building!"); + } else { + NOT MESSAGE("Wobbuffet's rage is building!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + } +} + +SINGLE_BATTLE_TEST("Rage volatile behavior on miss depends on generation") +{ + u32 config; + // PARAMETRIZE { config = GEN_3; } + PARAMETRIZE { config = GEN_4; } + GIVEN { + WITH_CONFIG(CONFIG_RAGE_BUILDS, config); + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Item(ITEM_BRIGHTPOWDER); } + } WHEN { + TURN { MOVE(player, MOVE_RAGE); MOVE(opponent, MOVE_TACKLE); } + TURN { MOVE(player, MOVE_RAGE, hit: FALSE); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RAGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + MESSAGE("Wobbuffet's rage is building!"); + MESSAGE("Wobbuffet's attack missed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + if (config == GEN_3) { + MESSAGE("Wobbuffet's rage is building!"); + } else { + NOT MESSAGE("Wobbuffet's rage is building!"); + } + } +} diff --git a/test/battle/move_effect/rage_fist.c b/test/battle/move_effect/rage_fist.c index a750893d1..1d774b5e3 100644 --- a/test/battle/move_effect/rage_fist.c +++ b/test/battle/move_effect/rage_fist.c @@ -37,7 +37,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased by each multi hit") s16 timesGotHit[2]; GIVEN { - ASSUME(GetMoveEffect(MOVE_BULLET_SEED) == EFFECT_MULTI_HIT); + ASSUME(IsMultiHitMove(MOVE_BULLET_SEED)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_REGIROCK); } WHEN { @@ -258,7 +258,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen7)" PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { - WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_7); + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_7); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_REGIROCK); } WHEN { @@ -285,7 +285,7 @@ SINGLE_BATTLE_TEST("Rage Fist base power is increased if Disguise breaks (Gen8+) PARAMETRIZE { species = SPECIES_MIMIKYU_TOTEM_DISGUISED; } GIVEN { - WITH_CONFIG(GEN_CONFIG_DISGUISE_HP_LOSS, GEN_8); + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); PLAYER(species) { Ability(ABILITY_DISGUISE); } OPPONENT(SPECIES_REGIROCK); } WHEN { diff --git a/test/battle/move_effect/raging_bull.c b/test/battle/move_effect/raging_bull.c index 056a5093a..d4f23ac0d 100644 --- a/test/battle/move_effect/raging_bull.c +++ b/test/battle/move_effect/raging_bull.c @@ -4,7 +4,8 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_RAGING_BULL) == EFFECT_RAGING_BULL); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); @@ -12,7 +13,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Raging Bull removes Light Screen, Reflect and Aurora Veil from the target's side of the field") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } PARAMETRIZE { move = MOVE_REFLECT; } @@ -35,7 +36,7 @@ SINGLE_BATTLE_TEST("Raging Bull removes Light Screen, Reflect and Aurora Veil fr SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora Veil if the target is immune") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } PARAMETRIZE { move = MOVE_REFLECT; } @@ -60,7 +61,7 @@ SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora Veil if the target Protected") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } PARAMETRIZE { move = MOVE_REFLECT; } @@ -86,7 +87,7 @@ SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora Veil if it misses") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } PARAMETRIZE { move = MOVE_REFLECT; } @@ -111,7 +112,7 @@ SINGLE_BATTLE_TEST("Raging Bull doesn't remove Light Screen, Reflect and Aurora DOUBLE_BATTLE_TEST("Raging Bull can remove Light Screen, Reflect and Aurora Veil on users side") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; } PARAMETRIZE { move = MOVE_REFLECT; } diff --git a/test/battle/move_effect/rain_always_hit.c b/test/battle/move_effect/rain_always_hit.c deleted file mode 100644 index 3bed952a3..000000000 --- a/test/battle/move_effect/rain_always_hit.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Bleakwind/Wildbolt/Sandsear Storm (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil.c b/test/battle/move_effect/recoil.c new file mode 100644 index 000000000..60bf17435 --- /dev/null +++ b/test/battle/move_effect/recoil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Take Down (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_hp_25.c b/test/battle/move_effect/recoil_hp_25.c deleted file mode 100644 index 9abb1bcfd..000000000 --- a/test/battle/move_effect/recoil_hp_25.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Struggle (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_if_miss.c b/test/battle/move_effect/recoil_if_miss.c index 0fc09a7fc..335120a5e 100644 --- a/test/battle/move_effect/recoil_if_miss.c +++ b/test/battle/move_effect/recoil_if_miss.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has 50% recoil on protect") SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick has no recoil if no target") { GIVEN { - ASSUME(B_HEALING_WISH_SWITCH >= GEN_5); + WITH_CONFIG(CONFIG_HEALING_WISH_SWITCH, GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -74,7 +74,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Jump Kick's recoil happens after Spiky Shiel } else { TURN { MOVE(opponent, MOVE_SPIKY_SHIELD); MOVE(player, MOVE_JUMP_KICK, hit: FALSE); SEND_OUT(player, 1); } } - TURN { ; } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKY_SHIELD, opponent); MESSAGE("Wobbuffet used Jump Kick!"); @@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Recoil if miss: Disguise doesn't prevent crash damage from J PARAMETRIZE { ability = ABILITY_SCRAPPY; } GIVEN { - PLAYER(SPECIES_KANGASKHAN) { Ability(ability); }; + PLAYER(SPECIES_KANGASKHAN) { Ability(ability); } OPPONENT(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); } } WHEN { TURN { MOVE(player, MOVE_JUMP_KICK); } @@ -154,4 +154,3 @@ SINGLE_BATTLE_TEST("Recoil if miss: Disguise doesn't prevent crash damage from J } } } - diff --git a/test/battle/move_effect/reflect.c b/test/battle/move_effect/reflect.c index a41de04fb..7e6ca413e 100644 --- a/test/battle/move_effect/reflect.c +++ b/test/battle/move_effect/reflect.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Reflect reduces physical damage", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_REFLECT; } GIVEN { diff --git a/test/battle/move_effect/reflect_damage.c b/test/battle/move_effect/reflect_damage.c new file mode 100644 index 000000000..849261ce4 --- /dev/null +++ b/test/battle/move_effect/reflect_damage.c @@ -0,0 +1,635 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamagePercent(MOVE_COUNTER) == 200); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == (1u << DAMAGE_CATEGORY_PHYSICAL)); + + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamagePercent(MOVE_MIRROR_COAT) == 200); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == (1u << DAMAGE_CATEGORY_SPECIAL)); + + ASSUME(GetMoveEffect(MOVE_METAL_BURST) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamagePercent(MOVE_METAL_BURST) == 150); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_METAL_BURST) == (1u << DAMAGE_CATEGORY_PHYSICAL | 1u << DAMAGE_CATEGORY_SPECIAL)); + + ASSUME(GetMoveCategory(MOVE_POUND) == DAMAGE_CATEGORY_PHYSICAL); + ASSUME(GetMoveCategory(MOVE_ROUND) == DAMAGE_CATEGORY_SPECIAL); +} + +SINGLE_BATTLE_TEST("Reflect Damage: Counter is not affected by Protect effects if it doesn't damage") +{ + enum Move move; + + PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } + PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } + PARAMETRIZE { move = MOVE_BURNING_BULWARK; } + PARAMETRIZE { move = MOVE_KINGS_SHIELD; } + PARAMETRIZE { move = MOVE_SILK_TRAP; } + PARAMETRIZE { move = MOVE_OBSTRUCT; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + if (move == MOVE_SPIKY_SHIELD) { + HP_BAR(player); + } else if (move == MOVE_BANEFUL_BUNKER) { + STATUS_ICON(player, STATUS1_POISON); + } else if (move == MOVE_BURNING_BULWARK) { + STATUS_ICON(player, STATUS1_BURN); + } else { // all others cause a stat drop + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } + } + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Counter is affected by Protect effects if it was damaged by that battler") +{ + // Commented moves are instructBanned. + enum Move move; + + PARAMETRIZE { move = MOVE_SPIKY_SHIELD; } + PARAMETRIZE { move = MOVE_BANEFUL_BUNKER; } + PARAMETRIZE { move = MOVE_BURNING_BULWARK; } + // PARAMETRIZE { move = MOVE_KINGS_SHIELD; } + PARAMETRIZE { move = MOVE_SILK_TRAP; } + // PARAMETRIZE { move = MOVE_OBSTRUCT; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + PLAYER(SPECIES_WYNAUT) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, move); MOVE(playerLeft, MOVE_COUNTER); } + TURN { MOVE(opponentRight, MOVE_INSTRUCT, target: opponentLeft, WITH_RNG(RNG_PROTECT_FAIL, 0)); MOVE(opponentLeft, MOVE_POUND, target: playerLeft); MOVE(playerLeft, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + if (move == MOVE_SPIKY_SHIELD) { + HP_BAR(playerLeft); + } else if (move == MOVE_BANEFUL_BUNKER) { + STATUS_ICON(playerLeft, STATUS1_POISON); + } else if (move == MOVE_BURNING_BULWARK) { + STATUS_ICON(playerLeft, STATUS1_BURN); + } else if (move == MOVE_SILK_TRAP) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + } + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Counter will do twice as much damage received from the opponent") +{ + s16 normalDmg; + s16 counterDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_POUND); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Counter ignores ally Pokémon's attack from Gen 5 onwards") +{ + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_4; } + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_MIRROR_COAT_ALLY, config); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerRight); + MOVE(playerLeft, MOVE_POUND, target: playerRight); + MOVE(playerRight, MOVE_COUNTER); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + if (config >= GEN_5) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerRight); + HP_BAR(opponentLeft); + } else { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerRight); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); + } + } + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Counter hits the last opponent that hit the user") +{ + s16 normalDmg; + s16 counterDmg; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(opponentRight, MOVE_SLAM, target: playerLeft); + MOVE(playerLeft, MOVE_COUNTER); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLAM, opponentRight); + HP_BAR(playerLeft, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + HP_BAR(opponentRight, captureDamage: &counterDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Counter respects Follow me") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_FOLLOW_ME); + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Counter fails if mon that damaged Counter user is no longer on the field (Gen 1-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_TRY_HIT_PARTNER, GEN_4); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(playerRight, MOVE_POUND, target: opponentLeft); + MOVE(playerLeft, MOVE_COUNTER, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Counter deals 1 damage when the attack received is blocked by Disguise") +{ + s16 counterDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_SHADOW_SNEAK) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SHADOW_SNEAK); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHADOW_SNEAK, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_EQ(counterDmg, 1); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Counter works when surviving OHKO move") +{ + s16 normalDmg; + s16 counterDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_FISSURE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET) {MaxHP(100); HP(100); Item(ITEM_FOCUS_SASH);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_FISSURE); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), counterDmg); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Counter works when surviving OHKO move with Disguise") +{ + s16 counterDmg; + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + ASSUME(GetMoveCategory(MOVE_FISSURE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); MaxHP(64); HP(64);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_FISSURE); MOVE(player, MOVE_COUNTER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COUNTER, player); + HP_BAR(opponent, captureDamage: &counterDmg); + } THEN { + EXPECT_EQ(counterDmg, 1); + } +} + +// Gen 1 +TO_DO_BATTLE_TEST("Reflect Damage: Counter can only counter Normal and Fighting-type moves (Gen 1)"); +TO_DO_BATTLE_TEST("Reflect Damage: Counter can hit ghost-type Pokémon (Gen 1)"); +TO_DO_BATTLE_TEST("Reflect Damage: Counter can return damage dealt to a substitute (Gen 1)"); + +// Gen 2-3 +TO_DO_BATTLE_TEST("Reflect Damage: Counter can counter Hidden Power regardless of type (Gen 2-3)"); + +// Gen 2+ +TO_DO_BATTLE_TEST("Reflect Damage: Counter can only counter physical moves (Gen 2+)"); +TO_DO_BATTLE_TEST("Reflect Damage: Counter cannot hit ghost-type Pokémon (Gen 2+)"); +TO_DO_BATTLE_TEST("Reflect Damage: Counter cannot return damage dealt to a substitute (Gen 2+)"); + +// Triple Battles required to test +//TO_DO_BATTLE_TEST("Reflect Damage: Counter can hit non-adjacent opponents if they were the last Pokémon to hit the user"); + +SINGLE_BATTLE_TEST("Reflect Damage: Mirror Coat will do twice as much damage received from the opponent") +{ + s16 normalDmg; + s16 mirrorCoatDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_ROUND); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), mirrorCoatDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Mirror Coat ignores ally Pokémon's attack from Gen 5 onwards") +{ + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_4; } + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_MIRROR_COAT_ALLY, config); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerRight); + MOVE(playerLeft, MOVE_ROUND, target: playerRight); + MOVE(playerRight, MOVE_MIRROR_COAT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerLeft); + if (config >= GEN_5) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerRight); + HP_BAR(opponentLeft); + } else { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerRight); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); + } + } + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Mirror Coat hits the last opponent that hit the user") +{ + s16 normalDmg; + s16 mirrorCoatDmg; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + HP_BAR(playerLeft, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + HP_BAR(opponentRight, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), mirrorCoatDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Mirror Coat respects Follow Me") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_FOLLOW_ME); + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Mirror Coat fails if mon that damaged Mirror Coat user is no longer on the field (Gen 1-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_TRY_HIT_PARTNER, GEN_4); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerRight, MOVE_ROUND, target: opponentLeft); + MOVE(playerLeft, MOVE_MIRROR_COAT, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Mirror Coat deals 1 damage when the attack received is blocked by Disguise") +{ + s16 mirrorCoatDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_HEX) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEX); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEX, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_EQ(mirrorCoatDmg, 1); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Mirror Coat works when surviving OHKO move") +{ + s16 normalDmg; + s16 mirrorCoatDmg; + GIVEN { + ASSUME(GetMoveCategory(MOVE_SHEER_COLD) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_WOBBUFFET) {MaxHP(100); HP(100); Item(ITEM_FOCUS_SASH);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_SHEER_COLD); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(2.0), mirrorCoatDmg); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Mirror Coat works when surviving OHKO move with Disguise") +{ + s16 mirrorCoatDmg; + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + ASSUME(GetMoveCategory(MOVE_SHEER_COLD) == DAMAGE_CATEGORY_SPECIAL); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); MaxHP(64); HP(64);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_SHEER_COLD); MOVE(player, MOVE_MIRROR_COAT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIRROR_COAT, player); + HP_BAR(opponent, captureDamage: &mirrorCoatDmg); + } THEN { + EXPECT_EQ(mirrorCoatDmg, 1); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Metal Burst will do 150% of the damage received from the opponent") +{ + s16 normalDmg; + s16 metalBurstDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_ROUND); MOVE(player, MOVE_METAL_BURST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, player); + HP_BAR(opponent, captureDamage: &metalBurstDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(1.5), metalBurstDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Metal Burst ignores ally Pokémon's attack from Gen 5 onwards") +{ + u32 config; + PARAMETRIZE { config = GEN_5; } + PARAMETRIZE { config = GEN_4; } + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_MIRROR_COAT_ALLY, config); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerRight); + MOVE(playerLeft, MOVE_POUND, target: playerRight); + MOVE(playerRight, MOVE_METAL_BURST); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + if (config >= GEN_5) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, playerRight); + HP_BAR(opponentLeft); + } else { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, playerRight); + HP_BAR(opponentLeft); + HP_BAR(playerLeft); + } + } + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Metal Burst hits the last opponent that hit the user") +{ + s16 normalDmg; + s16 metalBurstDmg; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_POUND, target: playerLeft); + MOVE(opponentRight, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_METAL_BURST); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentRight); + HP_BAR(playerLeft, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, playerLeft); + HP_BAR(opponentRight, captureDamage: &metalBurstDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(1.5), metalBurstDmg); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Metal Burst respects Follow Me") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentRight, MOVE_FOLLOW_ME); + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerLeft, MOVE_METAL_BURST, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FOLLOW_ME, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, playerLeft); + HP_BAR(opponentRight); + } +} + +DOUBLE_BATTLE_TEST("Reflect Damage: Metal Burst fails if mon that damaged Metal Burst user is no longer on the field (Gen 1-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_COUNTER_TRY_HIT_PARTNER, GEN_4); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_ROUND, target: playerLeft); + MOVE(playerRight, MOVE_ROUND, target: opponentLeft); + MOVE(playerLeft, MOVE_METAL_BURST, target: opponentLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROUND, playerRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, playerLeft); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Metal Burst deals 1 damage when the attack received is blocked by Disguise") +{ + s16 metalBurstDmg; + GIVEN { + PLAYER(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_HEX); MOVE(player, MOVE_METAL_BURST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEX, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, player); + HP_BAR(opponent, captureDamage: &metalBurstDmg); + } THEN { + EXPECT_EQ(metalBurstDmg, 1); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Metal Burst works when surviving OHKO move") +{ + s16 normalDmg; + s16 metalBurstDmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) {MaxHP(100); HP(100); Item(ITEM_FOCUS_SASH);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_FISSURE); MOVE(player, MOVE_METAL_BURST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, opponent); + HP_BAR(player, captureDamage: &normalDmg); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, player); + HP_BAR(opponent, captureDamage: &metalBurstDmg); + } THEN { + EXPECT_MUL_EQ(normalDmg, Q_4_12(1.5), metalBurstDmg); + } +} + +SINGLE_BATTLE_TEST("Reflect Damage: Metal Burst works when surviving OHKO move with Disguise") +{ + s16 metalBurstDmg; + GIVEN { + WITH_CONFIG(CONFIG_DISGUISE_HP_LOSS, GEN_8); + PLAYER(SPECIES_MIMIKYU_DISGUISED) { Ability(ABILITY_DISGUISE); MaxHP(64); HP(64);}; + OPPONENT(SPECIES_WOBBUFFET) {MaxHP(500); HP(500);}; + } WHEN { + TURN { MOVE(opponent, MOVE_FISSURE); MOVE(player, MOVE_METAL_BURST); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FISSURE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_METAL_BURST, player); + HP_BAR(opponent, captureDamage: &metalBurstDmg); + } THEN { + EXPECT_EQ(metalBurstDmg, 1); + } +} diff --git a/test/battle/move_effect/refresh.c b/test/battle/move_effect/refresh.c index f11a8dfca..727bd7c86 100644 --- a/test/battle/move_effect/refresh.c +++ b/test/battle/move_effect/refresh.c @@ -15,7 +15,7 @@ SINGLE_BATTLE_TEST("Refresh cures the user of burn, frostbite, poison, and paral PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } PARAMETRIZE { status1 = STATUS1_FROSTBITE; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Status1(status1); }; + PLAYER(SPECIES_WOBBUFFET) { Status1(status1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_REFRESH); } @@ -35,9 +35,10 @@ SINGLE_BATTLE_TEST("Refresh does not cure the user of Freeze") TURN { MOVE(player, MOVE_REFRESH); } } SCENE { MESSAGE("Wobbuffet used Refresh!"); - NONE_OF { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_REFRESH, player); - STATUS_ICON(player, none: TRUE); } + STATUS_ICON(player, none: TRUE); + } MESSAGE("But it failed!"); } } @@ -61,9 +62,10 @@ SINGLE_BATTLE_TEST("Refresh does not cure sleep when used by Sleep Talk") MESSAGE("The opposing Wobbuffet used Sleep Talk!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, opponent); MESSAGE("The opposing Wobbuffet used Refresh!"); - NONE_OF { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_REFRESH, player); - STATUS_ICON(player, none: TRUE); } + STATUS_ICON(player, none: TRUE); + } MESSAGE("But it failed!"); } } diff --git a/test/battle/move_effect/rest.c b/test/battle/move_effect/rest.c index fcf2b1556..8eb4d34c8 100644 --- a/test/battle/move_effect/rest.c +++ b/test/battle/move_effect/rest.c @@ -38,7 +38,8 @@ SINGLE_BATTLE_TEST("Rest fails if the user is at full HP") SINGLE_BATTLE_TEST("Rest fails if the user is protected by Leaf Guard") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_SUNNY_DAY); + ASSUME(GetMoveEffect(MOVE_SUNNY_DAY) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SUNNY_DAY) == BATTLE_WEATHER_SUN); ASSUME(B_LEAF_GUARD_PREVENTS_REST >= GEN_5); PLAYER(SPECIES_CHIKORITA) { Ability(ABILITY_LEAF_GUARD); HP(1); } OPPONENT(SPECIES_WOBBUFFET); @@ -67,7 +68,7 @@ SINGLE_BATTLE_TEST("Rest fails if the user is protected by Shields Down") SINGLE_BATTLE_TEST("Rest fails if the user is protected by Electric/Misty Terrain") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } GIVEN { diff --git a/test/battle/move_effect/retaliate.c b/test/battle/move_effect/retaliate.c index 47b1c3325..0cadf22d6 100644 --- a/test/battle/move_effect/retaliate.c +++ b/test/battle/move_effect/retaliate.c @@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faint HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -40,15 +40,15 @@ SINGLE_BATTLE_TEST("Retaliate doubles in base power the turn after an ally faint HP_BAR(player, captureDamage: &damage[0]); HP_BAR(player, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } DOUBLE_BATTLE_TEST("Retaliate works with passive damage") { s16 damage[2]; - u32 move; - u32 move2 = MOVE_CELEBRATE; + enum Move move; + enum Move move2 = MOVE_CELEBRATE; struct BattlePokemon *moveTarget = playerLeft; PARAMETRIZE { move = MOVE_TOXIC; moveTarget = playerLeft; } PARAMETRIZE { move = MOVE_POISON_POWDER; moveTarget = playerLeft; } @@ -72,8 +72,11 @@ DOUBLE_BATTLE_TEST("Retaliate works with passive damage") #if B_USE_FROSTBITE == TRUE ASSUME(GetMoveAdditionalEffectById(MOVE_ICE_BEAM, 0)->moveEffect == MOVE_EFFECT_FREEZE_OR_FROSTBITE); #endif - ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM); - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); ASSUME(GetMoveAdditionalEffectById(MOVE_MAGMA_STORM, 0)->moveEffect == MOVE_EFFECT_WRAP); ASSUME(GetMoveAdditionalEffectById(MOVE_FLAME_BURST, 0)->moveEffect == MOVE_EFFECT_FLAME_BURST); @@ -92,7 +95,7 @@ DOUBLE_BATTLE_TEST("Retaliate works with passive damage") HP_BAR(opponentRight, captureDamage: &damage[0]); HP_BAR(opponentRight, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } @@ -100,6 +103,36 @@ SINGLE_BATTLE_TEST("Retaliate works with Perish Song") { s16 damage[2]; GIVEN { + ASSUME(GetMoveEffect(MOVE_PERISH_SONG) == EFFECT_PERISH_SONG); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_PERISH_SONG); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); SEND_OUT(opponent, 1); SEND_OUT(player, 1); } + TURN { MOVE(player, MOVE_RETALIATE); } + TURN { MOVE(player, MOVE_RETALIATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PERISH_SONG, opponent); + HP_BAR(opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETALIATE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETALIATE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); + } +} + +SINGLE_BATTLE_TEST("Retaliate works with Perish Song (Gen3 Perish Song)") +{ + s16 damage[2]; + GIVEN { + WITH_CONFIG(CONFIG_CHECK_USER_FAILURE, GEN_3); ASSUME(GetMoveEffect(MOVE_PERISH_SONG) == EFFECT_PERISH_SONG); PLAYER(SPECIES_WYNAUT); PLAYER(SPECIES_WOBBUFFET); @@ -115,10 +148,9 @@ SINGLE_BATTLE_TEST("Retaliate works with Perish Song") HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } - SINGLE_BATTLE_TEST("Retaliate works with self-inflicted fainting") { s16 damage[2]; @@ -135,6 +167,7 @@ SINGLE_BATTLE_TEST("Retaliate works with self-inflicted fainting") HP_BAR(opponent, captureDamage: &damage[0]); HP_BAR(opponent, captureDamage: &damage[1]); } THEN { - EXPECT_MUL_EQ(damage[1], Q_4_12(2), damage[0]); + EXPECT_MUL_EQ(damage[1], Q_4_12(2.0), damage[0]); } } + diff --git a/test/battle/move_effect/return.c b/test/battle/move_effect/return.c index 2a2614200..2727b1b46 100644 --- a/test/battle/move_effect/return.c +++ b/test/battle/move_effect/return.c @@ -1,6 +1,46 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Return's power increases the higher friendship of the user is") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_RETURN) == EFFECT_RETURN); +} + +SINGLE_BATTLE_TEST("Return's power increases the higher friendship of the user is", s16 damage) +{ + u32 friendship; + PARAMETRIZE { friendship = 0; } + PARAMETRIZE { friendship = 100; } + PARAMETRIZE { friendship = 200; } + PARAMETRIZE { friendship = 255; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(friendship); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RETURN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETURN, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } THEN { + if (i > 0) + EXPECT_GT(results[i].damage, results[i-1].damage); + } +} + TO_DO_BATTLE_TEST("Return does 0 damage at min Friendship (Gen2)") -TO_DO_BATTLE_TEST("Return does 1 damage at min Friendship (Gen3+)") + +SINGLE_BATTLE_TEST("Return does 1 damage at min Friendship (Gen3+)") +{ + s16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Friendship(0); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RETURN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RETURN, player); + HP_BAR(opponent, captureDamage: &damage); + } THEN { + EXPECT_EQ(damage, 1); + } +} diff --git a/test/battle/move_effect/revenge.c b/test/battle/move_effect/revenge.c index 980bca9e3..1b5c79d00 100644 --- a/test/battle/move_effect/revenge.c +++ b/test/battle/move_effect/revenge.c @@ -1,4 +1,69 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Revenge (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_REVENGE) == EFFECT_REVENGE); +} + +SINGLE_BATTLE_TEST("Revenge doubles in power if False Swipe connected but didn't do any damage") +{ + s16 hits[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_REVENGE); } + TURN { MOVE(opponent, MOVE_FALSE_SWIPE); MOVE(player, MOVE_REVENGE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_REVENGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, player); + HP_BAR(opponent, captureDamage: &hits[2]); + } THEN { + EXPECT_MUL_EQ(hits[0], Q_4_12(2.0), hits[1]); + EXPECT_EQ(hits[0], hits[2]); + } +} + +DOUBLE_BATTLE_TEST("Revenge doesn't double in power if user was not hit by target in doubles") +{ + s16 hits[3]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); } + TURN { + MOVE(playerRight, MOVE_POUND, target: opponentRight); + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); + } + TURN { + MOVE(playerRight, MOVE_POUND, target: opponentLeft); + MOVE(opponentLeft, MOVE_REVENGE, target: playerRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[0]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_REVENGE, opponentLeft); + HP_BAR(playerRight, captureDamage: &hits[2]); + } THEN { + EXPECT_EQ(hits[0], hits[1]); + EXPECT_MUL_EQ(hits[1], Q_4_12(2.0), hits[2]); + } +} diff --git a/test/battle/move_effect/revival_blessing.c b/test/battle/move_effect/revival_blessing.c index eeb90d202..e3cfc5405 100644 --- a/test/battle/move_effect/revival_blessing.c +++ b/test/battle/move_effect/revival_blessing.c @@ -49,11 +49,10 @@ SINGLE_BATTLE_TEST("Revival Blessing fails if no party members are fainted") } } -// Can only be tested through AI test, else test fails due to trying to force illegal action -AI_MULTI_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") +AI_MULTI_BATTLE_TEST("AI will not revive a partner's party member with Revival Blessing") { struct BattlePokemon *user = NULL; - u32 move1, move2, move3; + enum Move move1, move2, move3; PARAMETRIZE { user = opponentLeft, move1 = MOVE_REVIVAL_BLESSING, move2 = MOVE_CELEBRATE, move3 = MOVE_CELEBRATE; } PARAMETRIZE { user = playerRight, move1 = MOVE_CELEBRATE, move2 = MOVE_REVIVAL_BLESSING, move3 = MOVE_CELEBRATE; } PARAMETRIZE { user = opponentRight, move1 = MOVE_CELEBRATE, move2 = MOVE_CELEBRATE, move3 = MOVE_REVIVAL_BLESSING; } @@ -61,13 +60,13 @@ AI_MULTI_BATTLE_TEST("Revival Blessing cannot revive a partner's party member") MULTI_PLAYER(SPECIES_CLEFABLE); MULTI_PLAYER(SPECIES_CLEFABLE) { HP(0); } MULTI_PLAYER(SPECIES_CLEFABLE); - MULTI_PARTNER(SPECIES_CLEFAIRY) { Moves(move2); } + MULTI_PARTNER(SPECIES_CLEFAIRY) { Moves(move2); } MULTI_PARTNER(SPECIES_CLEFAIRY); MULTI_PARTNER(SPECIES_CLEFAIRY); - MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(move1); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(move1); } MULTI_OPPONENT_A(SPECIES_WOBBUFFET); MULTI_OPPONENT_A(SPECIES_WOBBUFFET); - MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(move3); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Moves(move3); } MULTI_OPPONENT_B(SPECIES_WYNAUT) { HP(0); } MULTI_OPPONENT_B(SPECIES_WYNAUT); } WHEN { diff --git a/test/battle/move_effect/roar.c b/test/battle/move_effect/roar.c index 5b1230f25..5c46e0cdf 100644 --- a/test/battle/move_effect/roar.c +++ b/test/battle/move_effect/roar.c @@ -20,6 +20,8 @@ SINGLE_BATTLE_TEST("Roar switches the target with a random non-fainted replaceme } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, player); MESSAGE("The opposing Bulbasaur was dragged out!"); + } THEN { + EXPECT_EQ(gLastUsedMove, MOVE_ROAR); } } diff --git a/test/battle/move_effect/rollout.c b/test/battle/move_effect/rollout.c index c137ca4fc..f56c58007 100644 --- a/test/battle/move_effect/rollout.c +++ b/test/battle/move_effect/rollout.c @@ -2,3 +2,71 @@ #include "test/battle.h" TO_DO_BATTLE_TEST("TODO: Write Rollout (Move Effect) test titles") + +SINGLE_BATTLE_TEST("Rollout's power doubles after each hit and resest after the 5th hit") +{ + s16 damage[6]; + int turn; + int maxTurns = 6; + + GIVEN { + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_STEELIX); + } WHEN { + TURN { MOVE(player, MOVE_ROLLOUT); } + TURN { SKIP_TURN(player); } + TURN { SKIP_TURN(player); } + TURN { SKIP_TURN(player); } + TURN { SKIP_TURN(player); } + TURN { MOVE(player, MOVE_ROLLOUT); } + } SCENE { + for (turn = 0; turn < maxTurns; turn++) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, player); + HP_BAR(opponent, captureDamage: &damage[turn]); + } + } THEN { + for (turn = 1; turn < maxTurns - 1; turn++) + EXPECT_MUL_EQ(damage[turn - 1], UQ_4_12(2.0), damage[turn]); + EXPECT_EQ(damage[0], damage[maxTurns - 1]); + } +} + +SINGLE_BATTLE_TEST("Rollout's base power resets if the chain has been broken") +{ + s16 damage[2]; + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_ROLLOUT, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_ROLLOUT); } + TURN { MOVE(opponent, MOVE_PROTECT); SKIP_TURN(player); } + TURN { MOVE(player, MOVE_ROLLOUT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, player); + HP_BAR(opponent, captureDamage: &damage[0]); + + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, player); + HP_BAR(opponent, captureDamage: &damage[1]); + } THEN { + EXPECT_EQ(damage[0], damage[1]); + } +} + +SINGLE_BATTLE_TEST("Rollout resets if original user is forced to switch out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_ROLLOUT, MOVE_CELEBRATE); } + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_ROLLOUT, MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_RED_CARD); } + } WHEN { + TURN { MOVE(player, MOVE_ROLLOUT); } + TURN { MOVE(player, MOVE_CELEBRATE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ROLLOUT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} diff --git a/test/battle/move_effect/rototiller.c b/test/battle/move_effect/rototiller.c index b86228a3f..bc4b3173d 100644 --- a/test/battle/move_effect/rototiller.c +++ b/test/battle/move_effect/rototiller.c @@ -62,9 +62,9 @@ SINGLE_BATTLE_TEST("Rototiller doesn't affect Pokémon that are semi-invulnerabl TURN { MOVE(opponent, MOVE_DIG); MOVE(player, MOVE_ROTOTILLER); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DIG, opponent); + MESSAGE("The opposing Tangela avoided the attack!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_ROTOTILLER, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); - MESSAGE("It won't have any effect on the opposing Tangela!"); } THEN { EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); @@ -88,7 +88,7 @@ SINGLE_BATTLE_TEST("Rototiller fails if the only valid target is semi-invulnerab ANIMATION(ANIM_TYPE_MOVE, MOVE_DIG, opponent); MESSAGE("Wobbuffet used Rototiller!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_ROTOTILLER, player); - MESSAGE("But it failed!"); + MESSAGE("The opposing Tangela avoided the attack!"); } THEN { EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE); EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE); @@ -109,6 +109,6 @@ AI_DOUBLE_BATTLE_TEST("AI uses Rototiller") OPPONENT(SPECIES_TANGELA) { Moves(MOVE_ROTOTILLER, MOVE_POUND); } OPPONENT(SPECIES_TANGELA); } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_ROTOTILLER); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_ROTOTILLER); } } } diff --git a/test/battle/move_effect/semi_invulnerable.c b/test/battle/move_effect/semi_invulnerable.c index 66086ca45..a36e1cae4 100644 --- a/test/battle/move_effect/semi_invulnerable.c +++ b/test/battle/move_effect/semi_invulnerable.c @@ -19,7 +19,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn 1, then strike turn 2") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_FLY; } PARAMETRIZE { move = MOVE_DIG; } @@ -64,6 +64,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn NOT MESSAGE("Wobbuffet vanished instantly!"); MESSAGE("Wobbuffet used Shadow Force!"); break; + default: + break; } } else { ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -88,6 +90,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn case MOVE_SHADOW_FORCE: MESSAGE("Wobbuffet vanished instantly!"); break; + default: + break; } } else @@ -95,7 +99,7 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn // Aerial Ace cannot miss unless the target is semi-invulnerable MESSAGE("The opposing Wobbuffet used Aerial Ace!"); - MESSAGE("The opposing Wobbuffet's attack missed!"); + MESSAGE("Wobbuffet avoided the attack!"); // Attack turn switch (move) { @@ -117,6 +121,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn case MOVE_SHADOW_FORCE: MESSAGE("Wobbuffet used Shadow Force!"); break; + default: + break; } ANIMATION(ANIM_TYPE_MOVE, move, player); HP_BAR(opponent); @@ -125,7 +131,7 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_FLY; } PARAMETRIZE { move = MOVE_DIG; } @@ -169,6 +175,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb NOT MESSAGE("Wobbuffet vanished instantly!"); MESSAGE("Wobbuffet used Shadow Force!"); break; + default: + break; } } else { ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -193,6 +201,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb case MOVE_SHADOW_FORCE: MESSAGE("Wobbuffet vanished instantly!"); break; + default: + break; } } else @@ -220,6 +230,8 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb case MOVE_SHADOW_FORCE: MESSAGE("Wobbuffet used Shadow Force!"); break; + default: + break; } } ANIMATION(ANIM_TYPE_MOVE, move, player); @@ -230,7 +242,7 @@ SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb // No way to apply this test with Shadow Force/Phantom Force SINGLE_BATTLE_TEST("Semi-invulnerable moves apply a status that won't block certain moves") { - u16 move, opMove; + enum Move move, opMove; PARAMETRIZE { move = MOVE_FLY; opMove = MOVE_SKY_UPPERCUT; } PARAMETRIZE { move = MOVE_DIG; opMove = MOVE_EARTHQUAKE; } diff --git a/test/battle/move_effect/sheer_cold.c b/test/battle/move_effect/sheer_cold.c index 77ecb55bf..c0b076f44 100644 --- a/test/battle/move_effect/sheer_cold.c +++ b/test/battle/move_effect/sheer_cold.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen3-6)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_6); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_6); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen3-6)") SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen7+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/move_effect/shell_side_arm.c b/test/battle/move_effect/shell_side_arm.c index 4a6be08f1..f372b347f 100644 --- a/test/battle/move_effect/shell_side_arm.c +++ b/test/battle/move_effect/shell_side_arm.c @@ -3,8 +3,11 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); - ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); + ASSUME(GetMoveEffect(MOVE_SHELL_SIDE_ARM) == EFFECT_SHELL_SIDE_ARM); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == (1u << DAMAGE_CATEGORY_PHYSICAL)); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == (1u << DAMAGE_CATEGORY_SPECIAL)); } SINGLE_BATTLE_TEST("Shell Side Arm can be countered if it is physical") diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index 435c79a65..3d8c457ab 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -11,7 +11,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Shell Trap activates only if hit by a physical move") { - u32 move; + enum Move move; bool32 activate; PARAMETRIZE { move = MOVE_SCRATCH; activate = TRUE; } PARAMETRIZE { move = MOVE_WATER_GUN; activate = FALSE; } @@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Shell Trap activates only if hit by a physical move") SINGLE_BATTLE_TEST("Shell Trap does not activate if attacker's Sheer Force applied") { - u32 move; + enum Move move; bool32 activate; PARAMETRIZE { move = MOVE_SCRATCH; activate = TRUE; } PARAMETRIZE { move = MOVE_STOMP; activate = FALSE; } @@ -98,7 +98,7 @@ SINGLE_BATTLE_TEST("Shell Trap does not activate if battler faints before being DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 1 and attacks both opponents") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -122,7 +122,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 1 a DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 2 and attacks both opponents") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -146,7 +146,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 2 a DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 and attacks both opponents") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(1); } PLAYER(SPECIES_WOBBUFFET) { Speed(7); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -170,7 +170,7 @@ DOUBLE_BATTLE_TEST("Shell Trap activates immediately after being hit on turn 3 a DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fainted") { GIVEN { - ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_SHELL_TRAP) == TARGET_BOTH); PLAYER(SPECIES_GRENINJA) { Speed(60); } PLAYER(SPECIES_TURTONATOR) { Speed(10); } OPPONENT(SPECIES_BLASTOISE) { Speed(120); } @@ -198,3 +198,107 @@ DOUBLE_BATTLE_TEST("Shell Trap targets correctly if one of the opponents has fai ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); } } + +SINGLE_BATTLE_TEST("Shell Trap activates if user is hit with a physical move but does no damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHELL_TRAP); MOVE(opponent, MOVE_FALSE_SWIPE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SHELL_TRAP_SETUP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + HP_BAR(opponent); + } +} + +SINGLE_BATTLE_TEST("Encore fails if target has active Shell Trap waiting") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_SHELL_TRAP); MOVE(opponent, MOVE_ENCORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Wobbuffet set a shell trap!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } + } +} + +SINGLE_BATTLE_TEST("Shell Trap fails if an other -3 or lower priority Move is used") +{ + GIVEN { + ASSUME(GetMovePriority(MOVE_DRAGON_TAIL) <= -3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_SHELL_TRAP); + MOVE(opponent, MOVE_DRAGON_TAIL); + } + } SCENE { + MESSAGE("Wobbuffet set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } +} + +DOUBLE_BATTLE_TEST("Shell Trap does not trigger when hit into Substitute") +{ + GIVEN { + ASSUME(GetMoveCategory(MOVE_DOUBLE_EDGE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNORLAX); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUBSTITUTE); } + TURN { + MOVE(playerLeft, MOVE_SHELL_TRAP); + MOVE(opponentLeft, MOVE_DOUBLE_EDGE, target: playerLeft); + MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, playerLeft); + MESSAGE("Wynaut set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, opponentLeft); + MESSAGE("Wynaut's substitute faded!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + } +} + +DOUBLE_BATTLE_TEST("Shell Trap activates on both opposing Targets") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SHELL_TRAP); + MOVE(playerRight, MOVE_SHELL_TRAP); + MOVE(opponentLeft, MOVE_EARTHQUAKE); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, opponentLeft); + // Order might be incorrect compared to vanilla + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerRight); + } +} + diff --git a/test/battle/move_effect/shift_gear.c b/test/battle/move_effect/shift_gear.c index 990e815cb..a480eaa94 100644 --- a/test/battle/move_effect/shift_gear.c +++ b/test/battle/move_effect/shift_gear.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Shift Gear (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SHIFT_GEAR) == EFFECT_SHIFT_GEAR); +} + +SINGLE_BATTLE_TEST("Shift Gear increases the user's Speed by 2 stages and Attack by 1 stage") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SHIFT_GEAR); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHIFT_GEAR, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/simple_beam.c b/test/battle/move_effect/simple_beam.c deleted file mode 100644 index 66d2a59fc..000000000 --- a/test/battle/move_effect/simple_beam.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_SIMPLE_BEAM) == EFFECT_OVERWRITE_ABILITY); - ASSUME(GetMoveOverwriteAbility(MOVE_SIMPLE_BEAM) == ABILITY_SIMPLE); -} - -SINGLE_BATTLE_TEST("Simple Beam replaces target's ability with Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_SIMPLE); - } -} - -DOUBLE_BATTLE_TEST("Simple Beam fails if the target already has Simple") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_SIMPLE_BEAM, target: opponentLeft); MOVE(playerRight, MOVE_SIMPLE_BEAM, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_SIMPLE); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_SIMPLE); - } -} - -SINGLE_BATTLE_TEST("Simple Beam fails if target has an ability that can't be overwritten") -{ - u32 species; - enum Ability ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_SIMPLE_BEAM); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SIMPLE_BEAM, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect/sketch.c b/test/battle/move_effect/sketch.c new file mode 100644 index 000000000..e78aaa93a --- /dev/null +++ b/test/battle/move_effect/sketch.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sketch (Move Effect) test titles") diff --git a/test/battle/move_effect/sleep_talk.c b/test/battle/move_effect/sleep_talk.c index 2a2443c7e..76440f160 100644 --- a/test/battle/move_effect/sleep_talk.c +++ b/test/battle/move_effect/sleep_talk.c @@ -113,6 +113,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Lig { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_SPARK) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SPARK, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); @@ -132,6 +133,7 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto { PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_WATER_GUN, MOVE_FLY, MOVE_DIG); } PLAYER(SPECIES_WOBBUFFET); @@ -147,6 +149,27 @@ DOUBLE_BATTLE_TEST("Sleep Talk calls move and that move may be redirected by Sto } } +SINGLE_BATTLE_TEST("Sleep Talk calls move and that move correctly ignores ability if it should") +{ + u32 species; + enum Ability ability; + + PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; } + PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; } + + GIVEN { + ASSUME(MoveIgnoresTargetAbility(MOVE_SUNSTEEL_STRIKE)); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_SUNSTEEL_STRIKE); } + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_SLEEP_TALK, criticalHit: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNSTEEL_STRIKE, player); + MESSAGE("A critical hit!"); + } +} + SINGLE_BATTLE_TEST("Sleep Talk deducts power points from itself, not the called move") { ASSUME(GetMovePP(MOVE_SLEEP_TALK) == 10); @@ -164,3 +187,20 @@ SINGLE_BATTLE_TEST("Sleep Talk deducts power points from itself, not the called EXPECT_EQ(player->pp[1], 35); } } + +DOUBLE_BATTLE_TEST("Sleep Talk called move target will be random") +{ + PASSES_RANDOMLY(1, 2, RNG_RANDOM_TARGET); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); Moves(MOVE_SLEEP_TALK, MOVE_POUND, MOVE_FLY, MOVE_DIG); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SLEEP_TALK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SLEEP_TALK, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, playerLeft); + HP_BAR(opponentRight); + } +} diff --git a/test/battle/move_effect/snatch.c b/test/battle/move_effect/snatch.c index f8e289183..47c2c9cd5 100644 --- a/test/battle/move_effect/snatch.c +++ b/test/battle/move_effect/snatch.c @@ -1,4 +1,152 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Snatch (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SNATCH) == EFFECT_SNATCH); + ASSUME(MoveCanBeSnatched(MOVE_SWORDS_DANCE)); + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + ASSUME(MoveCanBeSnatched(MOVE_CELEBRATE) == FALSE); +} + +SINGLE_BATTLE_TEST("Snatch steals stat-boosting moves from the opponent") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WYNAUT) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_SNATCH); MOVE(opponent, MOVE_SWORDS_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, player); + MESSAGE("Wobbuffet waits for a target to make a move!"); + MESSAGE("Wobbuffet snatched the opposing Wynaut's move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + MESSAGE("Wobbuffet's Attack sharply rose!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Snatch does not steal non-snatchable moves") +{ + GIVEN { + ASSUME(MoveCanBeSnatched(MOVE_TACKLE) == FALSE); + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WYNAUT) { Speed(50); } + } WHEN { + TURN { MOVE(player, MOVE_SNATCH); MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, player); + MESSAGE("Wobbuffet waits for a target to make a move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + } +} + +DOUBLE_BATTLE_TEST("Snatch does not steal a move that was already snatched this turn (Gen 5+)") +{ + GIVEN { + ASSUME(B_SNATCH >= GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + PLAYER(SPECIES_WYNAUT) { Speed(90); } + OPPONENT(SPECIES_ABRA) { Speed(80); } + OPPONENT(SPECIES_KADABRA) { Speed(10); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SNATCH); + MOVE(playerRight, MOVE_SNATCH); + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_SWORDS_DANCE); + } + } SCENE { + // Both players use Snatch in turn order + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerLeft); + MESSAGE("Wobbuffet waits for a target to make a move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerRight); + MESSAGE("Wynaut waits for a target to make a move!"); + // Opponent uses Celebrate (not snatchable) + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + // Slowest opponent uses Swords Dance - only the first Snatch user should steal it + MESSAGE("Wobbuffet snatched the opposing Kadabra's move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + MESSAGE("Wobbuffet's Attack sharply rose!"); + // The second Snatch user should NOT steal the already-snatched move + NOT MESSAGE("Wynaut snatched the opposing Kadabra's move!"); + } THEN { + // Only playerLeft got the Attack boost + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(playerRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + EXPECT_EQ(opponentRight->statStages[STAT_ATK], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Snatch steals from the correct target when multiple snatchable moves are used") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + PLAYER(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_ABRA) { Speed(80); } + OPPONENT(SPECIES_KADABRA) { Speed(50); } + } WHEN { + TURN { + MOVE(playerLeft, MOVE_SNATCH); + MOVE(playerRight, MOVE_CELEBRATE); + MOVE(opponentLeft, MOVE_SWORDS_DANCE); + MOVE(opponentRight, MOVE_AGILITY); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerLeft); + MESSAGE("Wobbuffet waits for a target to make a move!"); + // First snatchable move is Swords Dance from opponentLeft + MESSAGE("Wobbuffet snatched the opposing Abra's move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, playerLeft); + MESSAGE("Wobbuffet's Attack sharply rose!"); + // Agility should NOT be snatched (Snatch was already used) + ANIMATION(ANIM_TYPE_MOVE, MOVE_AGILITY, opponentRight); + MESSAGE("The opposing Kadabra's Speed sharply rose!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); + } THEN { + EXPECT_EQ(playerLeft->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(opponentRight->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Snatch fails if user moves last") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SNATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, player); + } +} + +DOUBLE_BATTLE_TEST("Snatch fails when the only slower battler is a fainted ally") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WYNAUT) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(20); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerRight); } + TURN { + MOVE(opponentLeft, MOVE_CELEBRATE); + MOVE(opponentRight, MOVE_CELEBRATE); + MOVE(playerLeft, MOVE_SNATCH); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + MESSAGE("Wynaut fainted!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponentRight); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SNATCH, playerLeft); + } +} + +TO_DO_BATTLE_TEST("Snatch does not steal moves that cannot be snatched"); +TO_DO_BATTLE_TEST("Snatch can steal healing moves"); diff --git a/test/battle/move_effect/soak.c b/test/battle/move_effect/soak.c index 307b4802d..a9ea9cf01 100644 --- a/test/battle/move_effect/soak.c +++ b/test/battle/move_effect/soak.c @@ -11,7 +11,7 @@ TO_DO_BATTLE_TEST("Soak/Magic Powder changes the target's type to pure Water/Psy SINGLE_BATTLE_TEST("Soak/Magic Powder's type change is overwitten if the target changes form") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SOAK; } PARAMETRIZE { move = MOVE_MAGIC_POWDER; } GIVEN { @@ -28,6 +28,7 @@ SINGLE_BATTLE_TEST("Soak/Magic Powder's type change is overwitten if the target switch (move) { case MOVE_SOAK: MESSAGE("Mimikyu transformed into the Water type!"); break; case MOVE_MAGIC_POWDER: MESSAGE("Mimikyu transformed into the Psychic type!"); break; + default: break; } // Turn 2 ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); diff --git a/test/battle/move_effect/solar_beam.c b/test/battle/move_effect/solar_beam.c index 6113b5c4a..29f4df0fd 100644 --- a/test/battle/move_effect/solar_beam.c +++ b/test/battle/move_effect/solar_beam.c @@ -4,7 +4,7 @@ ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_SOLAR_BEAM) == EFFECT_SOLAR_BEAM); - ASSUME(GetMoveTwoTurnAttackWeather(MOVE_SOLAR_BLADE) == B_WEATHER_SUN); + ASSUME(GetMoveTwoTurnAttackWeather(MOVE_SOLAR_BEAM) == B_WEATHER_SUN); } SINGLE_BATTLE_TEST("Solar Beam does not need a charging turn if Sun is up") @@ -32,3 +32,32 @@ SINGLE_BATTLE_TEST("Solar Beam does not need a charging turn if Sun is up") ANIMATION(ANIM_TYPE_MOVE, MOVE_SOLAR_BEAM, player); } } + +SINGLE_BATTLE_TEST("Solar Beam does half damage if Sandstorm is up (Gen3+)", s16 damage) +{ + enum Ability ability; + u32 config; + + PARAMETRIZE { ability = ABILITY_SAND_FORCE; config = GEN_2; } + PARAMETRIZE { ability = ABILITY_SAND_STREAM; config = GEN_2; } + PARAMETRIZE { ability = ABILITY_SAND_STREAM; config = GEN_3; } + + GIVEN { + WITH_CONFIG(CONFIG_SANDSTORM_SOLAR_BEAM, config); + PLAYER(SPECIES_HIPPOWDON) { Ability(ability); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SOLAR_BEAM); } + TURN { SKIP_TURN(player); } + } SCENE { + MESSAGE("Hippowdon used Solar Beam!"); + MESSAGE("Hippowdon absorbed light!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Hippowdon used Solar Beam!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SOLAR_BEAM, player); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + EXPECT_MUL_EQ(results[0].damage, Q_4_12(0.5), results[2].damage); + EXPECT_MUL_EQ(results[1].damage, Q_4_12(0.5), results[2].damage); + } +} diff --git a/test/battle/move_effect/special_attack_down_2.c b/test/battle/move_effect/special_attack_down_2.c index b62d4b52a..7ea520443 100644 --- a/test/battle/move_effect/special_attack_down_2.c +++ b/test/battle/move_effect/special_attack_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Eerie Impulse (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_EERIE_IMPULSE) == EFFECT_SPECIAL_ATTACK_DOWN_2); +} + +SINGLE_BATTLE_TEST("Eerie Impulse reduces the target's Sp. Attack by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_EERIE_IMPULSE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EERIE_IMPULSE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPATK], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/special_attack_up_2.c b/test/battle/move_effect/special_attack_up_2.c index c4bf38d6a..c87b3fea0 100644 --- a/test/battle/move_effect/special_attack_up_2.c +++ b/test/battle/move_effect/special_attack_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Nasty Plot (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_NASTY_PLOT) == EFFECT_SPECIAL_ATTACK_UP_2); +} + +SINGLE_BATTLE_TEST("Nasty Plot increases the user's Sp. Attack by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_NASTY_PLOT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_NASTY_PLOT, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/special_defense_down_2.c b/test/battle/move_effect/special_defense_down_2.c index 5fff5bdd7..4740d3e5e 100644 --- a/test/battle/move_effect/special_defense_down_2.c +++ b/test/battle/move_effect/special_defense_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Fake Tears/Metal Sound (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_FAKE_TEARS) == EFFECT_SPECIAL_DEFENSE_DOWN_2); +} + +SINGLE_BATTLE_TEST("Fake Tears reduces the target's Sp. Defense by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_FAKE_TEARS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FAKE_TEARS, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/special_defense_up_2.c b/test/battle/move_effect/special_defense_up_2.c index 168566345..9da91d8d0 100644 --- a/test/battle/move_effect/special_defense_up_2.c +++ b/test/battle/move_effect/special_defense_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Amnesia (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_AMNESIA) == EFFECT_SPECIAL_DEFENSE_UP_2); +} + +SINGLE_BATTLE_TEST("Amnesia increases the user's Sp. Defense by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AMNESIA); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AMNESIA, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/speed_down.c b/test/battle/move_effect/speed_down.c index d0d2625d9..b20e34658 100644 --- a/test/battle/move_effect/speed_down.c +++ b/test/battle/move_effect/speed_down.c @@ -10,6 +10,7 @@ DOUBLE_BATTLE_TEST("Speed Down: Cotton Spore does not fail if it is blocked by o GIVEN { ASSUME(GetMoveEffect(MOVE_COTTON_SPORE) == EFFECT_SPEED_DOWN_2); + ASSUME(GetMoveTarget(MOVE_COTTON_SPORE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SHELLDER) { Ability(abilityOne); } @@ -23,9 +24,9 @@ DOUBLE_BATTLE_TEST("Speed Down: Cotton Spore does not fail if it is blocked by o ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentRight); } else if (abilityTwo == ABILITY_OVERCOAT) { + ABILITY_POPUP(opponentRight, ABILITY_OVERCOAT); ANIMATION(ANIM_TYPE_MOVE, MOVE_COTTON_SPORE, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); - ABILITY_POPUP(opponentRight, ABILITY_OVERCOAT); } } } diff --git a/test/battle/move_effect/speed_down_2.c b/test/battle/move_effect/speed_down_2.c index e3b95e3fe..2b350b625 100644 --- a/test/battle/move_effect/speed_down_2.c +++ b/test/battle/move_effect/speed_down_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Scary Face/Cotton Spore (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SCARY_FACE) == EFFECT_SPEED_DOWN_2); +} + +SINGLE_BATTLE_TEST("Scary Face reduces the target's Speed by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCARY_FACE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCARY_FACE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 2); + } +} diff --git a/test/battle/move_effect/speed_swap.c b/test/battle/move_effect/speed_swap.c index 3405d510c..70dee298d 100644 --- a/test/battle/move_effect/speed_swap.c +++ b/test/battle/move_effect/speed_swap.c @@ -35,7 +35,8 @@ SINGLE_BATTLE_TEST("Speed Swap doesn't swap user and target's speed modifiers") PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_SWIFT_SWIM; move = MOVE_RAIN_DANCE; } // x2.0 GIVEN { ASSUME(GetMoveEffect(MOVE_ROCK_POLISH) == EFFECT_SPEED_UP_2); - ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); PLAYER(SPECIES_WOBBUFFET) { Speed(8); } OPPONENT(species) { Speed(10); Ability(ability); } }WHEN { diff --git a/test/battle/move_effect/speed_up_2.c b/test/battle/move_effect/speed_up_2.c index 720255549..bba7fb88b 100644 --- a/test/battle/move_effect/speed_up_2.c +++ b/test/battle/move_effect/speed_up_2.c @@ -1,4 +1,22 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Agility/Rock Polish (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_AGILITY) == EFFECT_SPEED_UP_2); +} + +SINGLE_BATTLE_TEST("Agility increases the user's Speed by 2 stages") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AGILITY); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AGILITY, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} diff --git a/test/battle/move_effect/spicy_extract.c b/test/battle/move_effect/spicy_extract.c index 6dc2a7742..e272d764f 100644 --- a/test/battle/move_effect/spicy_extract.c +++ b/test/battle/move_effect/spicy_extract.c @@ -114,7 +114,7 @@ SINGLE_BATTLE_TEST("Spicy Extract will fail if target is in a semi-invulnerabili ANIMATION(ANIM_TYPE_MOVE, MOVE_DIVE, opponent); MESSAGE("Wobbuffet used Spicy Extract!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SPICY_EXTRACT, player); - MESSAGE("Wobbuffet's attack missed!"); + MESSAGE("The opposing Wobbuffet avoided the attack!"); } } @@ -165,10 +165,10 @@ SINGLE_BATTLE_TEST("Spicy Extract against Clear Amulet and Contrary raises Defen AI_DOUBLE_BATTLE_TEST("Spicy Extract user will use it if partner holds Clear Amulet and a physical move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_SWIFT;} + PARAMETRIZE { move = MOVE_SWIFT; } GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); diff --git a/test/battle/move_effect/spikes.c b/test/battle/move_effect/spikes.c index 4b458f5c6..cd454eb73 100644 --- a/test/battle/move_effect/spikes.c +++ b/test/battle/move_effect/spikes.c @@ -89,9 +89,9 @@ SINGLE_BATTLE_TEST("Spikes damage on subsequent switch ins") SINGLE_BATTLE_TEST("Spikes do not damage airborne Pokemon") { u32 species = SPECIES_WOBBUFFET; - u32 item = ITEM_NONE; - u32 move1 = MOVE_CELEBRATE; - u32 move2 = MOVE_CELEBRATE; + enum Item item = ITEM_NONE; + enum Move move1 = MOVE_CELEBRATE; + enum Move move2 = MOVE_CELEBRATE; bool32 airborne; ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); diff --git a/test/battle/move_effect_secondary/steal_item.c b/test/battle/move_effect/steal_item.c similarity index 93% rename from test/battle/move_effect_secondary/steal_item.c rename to test/battle/move_effect/steal_item.c index e83d5c5cb..c600c426b 100644 --- a/test/battle/move_effect_secondary/steal_item.c +++ b/test/battle/move_effect/steal_item.c @@ -3,13 +3,13 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_THIEF == EFFECT_STEAL_ITEM)); - ASSUME(GetMoveEffect(MOVE_COVET == EFFECT_STEAL_ITEM)); + ASSUME(GetMoveEffect(MOVE_THIEF) == EFFECT_STEAL_ITEM); + ASSUME(GetMoveEffect(MOVE_COVET) == EFFECT_STEAL_ITEM); } SINGLE_BATTLE_TEST("Thief and Covet steal target's held item") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Thief and Covet steal target's held item") SINGLE_BATTLE_TEST("Thief and Covet steal player's held item if opponent is a trainer") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Thief and Covet steal player's held item if opponent is a tr WILD_BATTLE_TEST("Thief and Covet don't steal player's held item if opponent is a wild mon") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { @@ -71,7 +71,7 @@ WILD_BATTLE_TEST("Thief and Covet don't steal player's held item if opponent is SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if user is holding an item") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { @@ -91,7 +91,7 @@ SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if user is ho SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if target has no item") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { @@ -109,11 +109,11 @@ SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if target has // Test can't currently verify if the item is sent to Bag WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag in wild battles (Gen 9+)") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { - WITH_CONFIG(GEN_STEAL_WILD_ITEMS, GEN_9); + WITH_CONFIG(CONFIG_STEAL_WILD_ITEMS, GEN_9); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); } } WHEN { @@ -130,11 +130,11 @@ WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag SINGLE_BATTLE_TEST("Thief and Covet can't steal target's held item if user faints before") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_ROCKY_HELMET); } } WHEN { TURN { MOVE(player, move); } @@ -150,7 +150,7 @@ SINGLE_BATTLE_TEST("Thief and Covet can't steal target's held item if user faint SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on HP thresholds are stolen before they can activate") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } @@ -169,7 +169,7 @@ SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on HP thresholds are SINGLE_BATTLE_TEST("Thief and Covet: Berries that activate on a Status activate before the item can be stolen") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_THIEF; } PARAMETRIZE { move = MOVE_COVET; } diff --git a/test/battle/move_effect/steel_roller.c b/test/battle/move_effect/steel_roller.c index 4b658a612..3ca334480 100644 --- a/test/battle/move_effect/steel_roller.c +++ b/test/battle/move_effect/steel_roller.c @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Steel Roller will fail if there is no Terrain") AI_SINGLE_BATTLE_TEST("Steel Roller wont be chosen by AI if there is no terrain on the field") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } PARAMETRIZE { move = MOVE_NONE; } diff --git a/test/battle/move_effect/sticky_web.c b/test/battle/move_effect/sticky_web.c index ed0f6e5d9..939f4787f 100644 --- a/test/battle/move_effect/sticky_web.c +++ b/test/battle/move_effect/sticky_web.c @@ -49,14 +49,14 @@ SINGLE_BATTLE_TEST("Sticky Web can only be set up 1 time") DOUBLE_BATTLE_TEST("Sticky Web lowers Speed by 1 in a double battle after Explosion fainting both mons") { GIVEN { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - PLAYER(SPECIES_WOBBUFFET) {Speed(5);} - PLAYER(SPECIES_WOBBUFFET) {HP(1500); Speed(10);} - PLAYER(SPECIES_WOBBUFFET) {Speed(10);} - OPPONENT(SPECIES_WOBBUFFET) {HP(1); Speed(1);} - OPPONENT(SPECIES_WOBBUFFET) {HP(1); Speed(1);} - OPPONENT(SPECIES_WYNAUT) {Speed(10);} - OPPONENT(SPECIES_ALAKAZAM) {Speed(100);} + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + PLAYER(SPECIES_WOBBUFFET) { HP(1500); Speed(10); } + PLAYER(SPECIES_WOBBUFFET) { Speed(10); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + OPPONENT(SPECIES_WYNAUT) { Speed(10); } + OPPONENT(SPECIES_ALAKAZAM) { Speed(100); } } WHEN { TURN { MOVE(playerRight, MOVE_STICKY_WEB); MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 2); SEND_OUT(opponentRight, 3); } TURN {} @@ -102,10 +102,10 @@ DOUBLE_BATTLE_TEST("Sticky Web has correct interactions with Mirror Armor - the { u8 playerSetUpper, opponentSetUpper; // 0 left, 1 right - PARAMETRIZE {playerSetUpper = 0; opponentSetUpper = 0; } - PARAMETRIZE {playerSetUpper = 0; opponentSetUpper = 1; } - PARAMETRIZE {playerSetUpper = 1; opponentSetUpper = 0; } - PARAMETRIZE {playerSetUpper = 1; opponentSetUpper = 1; } + PARAMETRIZE { playerSetUpper = 0; opponentSetUpper = 0; } + PARAMETRIZE { playerSetUpper = 0; opponentSetUpper = 1; } + PARAMETRIZE { playerSetUpper = 1; opponentSetUpper = 0; } + PARAMETRIZE { playerSetUpper = 1; opponentSetUpper = 1; } GIVEN { PLAYER(SPECIES_SQUIRTLE); @@ -193,18 +193,18 @@ DOUBLE_BATTLE_TEST("Sticky Web has correct interactions with Mirror Armor - no o bool8 hasReplacement; // We need to make sure Sticky Web user saves for both sides, so it doesn't matter who sets it first. - PARAMETRIZE {hasReplacement = TRUE;} - PARAMETRIZE {hasReplacement = FALSE;} + PARAMETRIZE { hasReplacement = TRUE; } + PARAMETRIZE { hasReplacement = FALSE; } GIVEN { ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); - PLAYER(SPECIES_SQUIRTLE) {Speed(5); } - PLAYER(SPECIES_CHARMANDER) {Speed(5); } - PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); Speed(5); } // Iron Ball, so that flying type Corviknight is affected by Sticky Web. - OPPONENT(SPECIES_CATERPIE) {Speed(7); } - OPPONENT(SPECIES_WEEDLE) {Speed(7); } + PLAYER(SPECIES_SQUIRTLE) { Speed(5); } + PLAYER(SPECIES_CHARMANDER) { Speed(5); } + PLAYER(SPECIES_CORVIKNIGHT) { Ability(ABILITY_MIRROR_ARMOR); Item(ITEM_IRON_BALL); Speed(5); } // Iron Ball, so that flying type Corviknight is affected by Sticky Web. + OPPONENT(SPECIES_CATERPIE) { Speed(7); } + OPPONENT(SPECIES_WEEDLE) { Speed(7); } if (hasReplacement) { - OPPONENT(SPECIES_PIDGEY) {Speed(7); } + OPPONENT(SPECIES_PIDGEY) { Speed(7); } } } WHEN { @@ -212,7 +212,7 @@ DOUBLE_BATTLE_TEST("Sticky Web has correct interactions with Mirror Armor - no o if (hasReplacement) { TURN { MOVE(opponentLeft, MOVE_MEMENTO, target:playerLeft); SEND_OUT(opponentLeft, 2); } } else { - TURN { MOVE(opponentLeft, MOVE_MEMENTO, target:playerLeft);} + TURN { MOVE(opponentLeft, MOVE_MEMENTO, target:playerLeft); } } TURN { SWITCH(playerRight, 2); } } SCENE { @@ -245,7 +245,7 @@ SINGLE_BATTLE_TEST("Sticky Web is placed on the correct side after Explosion") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_EXPLOSION); MOVE(opponent, MOVE_STICKY_WEB); SEND_OUT(player, 1);} + TURN { MOVE(player, MOVE_EXPLOSION); MOVE(opponent, MOVE_STICKY_WEB); SEND_OUT(player, 1); } } SCENE { HP_BAR(player, hp: 0); ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player); diff --git a/test/battle/move_effect/stockpile.c b/test/battle/move_effect/stockpile.c index e18c97fc5..108ac915c 100644 --- a/test/battle/move_effect/stockpile.c +++ b/test/battle/move_effect/stockpile.c @@ -34,9 +34,31 @@ SINGLE_BATTLE_TEST("Stockpile's count can go up only to 3") } } +SINGLE_BATTLE_TEST("Stockpile's def and spDef stat increases aren't incremented by other stat stage changes") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_STOCKPILE); } + TURN { MOVE(player, MOVE_COSMIC_POWER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STOCKPILE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_COSMIC_POWER, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPDEF], DEFAULT_STAT_STAGE + 2); + + u32 stockpileDef = gBattleMons[0].volatiles.stockpileDef; + u32 stockpileSpDef = gBattleMons[0].volatiles.stockpileSpDef; + EXPECT_EQ(stockpileDef, 1); + EXPECT_EQ(stockpileSpDef, 1); + } +} + SINGLE_BATTLE_TEST("Spit Up and Swallow don't work if used without Stockpile") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SWALLOW; } PARAMETRIZE { move = MOVE_SPIT_UP; } GIVEN { @@ -143,7 +165,7 @@ SINGLE_BATTLE_TEST("Swallow heals HP depending on Stockpile's count", s16 hpHeal SINGLE_BATTLE_TEST("Stockpile temporarily raises Def and Sp. Def", s16 dmgPyhsical, s16 dmgSpecial) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_STOCKPILE; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { @@ -178,7 +200,7 @@ SINGLE_BATTLE_TEST("Stockpile temporarily raises Def and Sp. Def", s16 dmgPyhsic DOUBLE_BATTLE_TEST("Stockpile's Def and Sp. Def boost is lost after using Spit Up or Swallow", s16 dmgPyhsicalBefore, s16 dmgPhysicalAfter, s16 dmgSpecialBefore, s16 dmgSpecialAfter) { u8 count; - u16 move; + enum Move move; PARAMETRIZE { count = 1; move = MOVE_SPIT_UP; } PARAMETRIZE { count = 2; move = MOVE_SWALLOW; } PARAMETRIZE { count = 3; move = MOVE_SPIT_UP; } diff --git a/test/battle/move_effect/stomping_tantrum.c b/test/battle/move_effect/stomping_tantrum.c index 06b29334d..43580f685 100644 --- a/test/battle/move_effect/stomping_tantrum.c +++ b/test/battle/move_effect/stomping_tantrum.c @@ -41,11 +41,11 @@ SINGLE_BATTLE_TEST("Stomping Tantrum will deal double damage if user failed to a s16 damage[3]; PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_POTION); }; - OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_LUM_BERRY); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(100); Item(ITEM_POTION); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_LUM_BERRY); } } WHEN { TURN { MOVE(player, MOVE_STOMPING_TANTRUM); MOVE(opponent, MOVE_THUNDER_WAVE); } - TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TRICK); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_TRICK); } TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } } SCENE { @@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Stomping Tantrum will not deal double if it missed") s16 damage[2]; GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BRIGHTPOWDER); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_BRIGHTPOWDER); } } WHEN { TURN { MOVE(player, MOVE_STOMPING_TANTRUM); } TURN { MOVE(player, MOVE_STOMPING_TANTRUM, hit: FALSE); } diff --git a/test/battle/move_effect/strength_sap.c b/test/battle/move_effect/strength_sap.c index 675d5090e..3c2aa4d7c 100644 --- a/test/battle/move_effect/strength_sap.c +++ b/test/battle/move_effect/strength_sap.c @@ -145,7 +145,7 @@ TO_DO_BATTLE_TEST("Strength Sap doesn't fail if target has Contrary and is at +6 SINGLE_BATTLE_TEST("Strength Sap restores more HP if Big Root is held", s16 hp) { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BIG_ROOT; } diff --git a/test/battle/move_effect/stuff_cheeks.c b/test/battle/move_effect/stuff_cheeks.c index b8dda1d8b..b729acf80 100644 --- a/test/battle/move_effect/stuff_cheeks.c +++ b/test/battle/move_effect/stuff_cheeks.c @@ -10,7 +10,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Stuff Cheeks cannot be used if the user doesn't hold a berry") { - u16 item = 0; + enum Item item = ITEM_NONE; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_LIECHI_BERRY; } GIVEN { diff --git a/test/battle/move_effect/super_fang.c b/test/battle/move_effect/super_fang.c deleted file mode 100644 index 33e162395..000000000 --- a/test/battle/move_effect/super_fang.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -TO_DO_BATTLE_TEST("TODO: Write Super Fang (Move Effect) test titles") diff --git a/test/battle/move_effect/swagger.c b/test/battle/move_effect/swagger.c index 3217e4890..fad4a39c5 100644 --- a/test/battle/move_effect/swagger.c +++ b/test/battle/move_effect/swagger.c @@ -1,7 +1,27 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("Swagger raises the target's Attack and confuses them") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SWAGGER) == EFFECT_SWAGGER); +} + +SINGLE_BATTLE_TEST("Swagger increases the target's Attack by 2 stages and confuses them") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWAGGER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWAGGER, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 2); + EXPECT(opponent->volatiles.confusionTurns > 0); + } +} + TO_DO_BATTLE_TEST("Swagger raises the target's Attack even if they're already confused") TO_DO_BATTLE_TEST("Swagger raises the target's Attack even when protected by Safeguard") TO_DO_BATTLE_TEST("Swagger raises the target's Attack even when protected Own Tempo") diff --git a/test/battle/move_effect/synchronoise.c b/test/battle/move_effect/synchronoise.c index 45b4f125e..a9db897ce 100644 --- a/test/battle/move_effect/synchronoise.c +++ b/test/battle/move_effect/synchronoise.c @@ -67,6 +67,8 @@ DOUBLE_BATTLE_TEST("Synchronoise will fail if the corresponding typing mon prote } WHEN { TURN { MOVE(opponentLeft, MOVE_PROTECT); MOVE(playerLeft, MOVE_SYNCHRONOISE); } } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponentLeft); + MESSAGE("The opposing Wobbuffet protected itself!"); NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SYNCHRONOISE, playerLeft); } } diff --git a/test/battle/move_effect/synthesis.c b/test/battle/move_effect/synthesis.c index 7afbb7f87..3d0592bbf 100644 --- a/test/battle/move_effect/synthesis.c +++ b/test/battle/move_effect/synthesis.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(200); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/2 of the user's max HP (Gen3+)") SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight (Gen3+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(300); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -34,13 +34,13 @@ SINGLE_BATTLE_TEST("Synthesis recovers 2/3 of the user's max HP in Sunlight (Gen SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandstorm, Hail, and Snow (Gen3+)") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_RAIN_DANCE; } PARAMETRIZE { move = MOVE_SANDSTORM; } PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); + WITH_CONFIG(CONFIG_TIME_OF_DAY_HEALING_MOVES, GEN_3); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -52,10 +52,11 @@ SINGLE_BATTLE_TEST("Synthesis recovers 1/4 of the user's max HP in Rain, Sandsto SINGLE_BATTLE_TEST("Synthesis recovers regular amount in sandstorm if holding utility umbrella") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_LIFE_ORB; } PARAMETRIZE { item = ITEM_UTILITY_UMBRELLA; } GIVEN { + ASSUME(gItemsInfo[ITEM_UTILITY_UMBRELLA].holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA); PLAYER(SPECIES_WOBBUFFET) { HP(1); MaxHP(400); Item(item); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/tailwind.c b/test/battle/move_effect/tailwind.c index 7968bc25e..d22f36d28 100644 --- a/test/battle/move_effect/tailwind.c +++ b/test/battle/move_effect/tailwind.c @@ -6,10 +6,13 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_TAILWIND) == EFFECT_TAILWIND); } -SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") +SINGLE_BATTLE_TEST("Tailwind applies for 3 turns (Gen4) or 4 turns (Gen5+)") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { - ASSUME(B_TAILWIND_TURNS >= GEN_5); + WITH_CONFIG(CONFIG_TAILWIND_TURNS, config); PLAYER(SPECIES_WOBBUFFET) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } } WHEN { @@ -28,8 +31,10 @@ SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") MESSAGE("Wobbuffet used Celebrate!"); MESSAGE("The opposing Wobbuffet used Celebrate!"); - MESSAGE("Wobbuffet used Celebrate!"); - MESSAGE("The opposing Wobbuffet used Celebrate!"); + if (config >= GEN_5) { + MESSAGE("Wobbuffet used Celebrate!"); + MESSAGE("The opposing Wobbuffet used Celebrate!"); + } MESSAGE("The opposing Wobbuffet used Celebrate!"); MESSAGE("Wobbuffet used Celebrate!"); @@ -39,7 +44,7 @@ SINGLE_BATTLE_TEST("Tailwind applies for 4 turns") DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's used (Gen4-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_7); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_7); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } @@ -57,7 +62,7 @@ DOUBLE_BATTLE_TEST("Tailwind doesn't affect the partner on the same turn it's us DOUBLE_BATTLE_TEST("Tailwind affects the partner on the same turn it's used (Gen8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); + WITH_CONFIG(CONFIG_RECALC_TURN_AFTER_ACTIONS, GEN_8); PLAYER(SPECIES_WOBBUFFET) { Speed(20); } PLAYER(SPECIES_WYNAUT) { Speed(10); } OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } diff --git a/test/battle/move_effect/take_heart.c b/test/battle/move_effect/take_heart.c index 69560de74..2377624b7 100644 --- a/test/battle/move_effect/take_heart.c +++ b/test/battle/move_effect/take_heart.c @@ -28,7 +28,7 @@ SINGLE_BATTLE_TEST("Take Heart cures the user of all status conditions") PARAMETRIZE { status1 = STATUS1_PARALYSIS; } PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Status1(status1); }; + PLAYER(SPECIES_WOBBUFFET) { Status1(status1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_TAKE_HEART); } diff --git a/test/battle/move_effect/tar_shot.c b/test/battle/move_effect/tar_shot.c index 01fd72018..e4c269e46 100644 --- a/test/battle/move_effect/tar_shot.c +++ b/test/battle/move_effect/tar_shot.c @@ -85,3 +85,4 @@ SINGLE_BATTLE_TEST("Tar Shot does affect Pokemon that Terastallized after Tar Sh EXPECT_MUL_EQ(damage[0], Q_4_12(2.0), damage[1]); } } + diff --git a/test/battle/move_effect/teatime.c b/test/battle/move_effect/teatime.c index fc4ad2219..6f2d394d2 100644 --- a/test/battle/move_effect/teatime.c +++ b/test/battle/move_effect/teatime.c @@ -103,23 +103,43 @@ DOUBLE_BATTLE_TEST("Teatime causes all Pokémon to consume their berry") PARAMETRIZE { user = opponentRight; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } + PLAYER(SPECIES_WYNAUT) { Item(ITEM_LIECHI_BERRY); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_LIECHI_BERRY); } } WHEN { TURN { MOVE(user, MOVE_TEATIME); } } SCENE { - if (user == playerLeft || user == playerRight) - { + if (user == playerLeft) { MESSAGE("Wobbuffet used Teatime!"); - } else { + } else if (user == playerRight) { + MESSAGE("Wynaut used Teatime!"); + } else if (user == opponentLeft) { MESSAGE("The opposing Wobbuffet used Teatime!"); + } else { + MESSAGE("The opposing Wynaut used Teatime!"); } ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, user); - MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); - MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); - MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); - MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + if (user == playerLeft) { + MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wynaut rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wynaut rose!"); + } else if (user == playerRight) { + MESSAGE("Using Liechi Berry, the Attack of Wynaut rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wynaut rose!"); + } else if (user == opponentLeft) { + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wynaut rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wynaut rose!"); + } else if (user == opponentRight) { + MESSAGE("Using Liechi Berry, the Attack of the opposing Wynaut rose!"); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wobbuffet rose!"); + MESSAGE("Using Liechi Berry, the Attack of Wynaut rose!"); + } } } @@ -158,9 +178,9 @@ SINGLE_BATTLE_TEST("Teatime does not affect Pokémon in the semi-invulnerable tu SINGLE_BATTLE_TEST("Teatime triggers Volt Absorb if it has been affected by Electrify or Plasma Fists, even when not holding a Berry") { - u32 move; - u32 item = ITEM_LIECHI_BERRY; - bool8 shouldTriggerAbility = TRUE; + enum Move move; + enum Item item = ITEM_LIECHI_BERRY; + bool32 shouldTriggerAbility = TRUE; PARAMETRIZE { move = MOVE_CELEBRATE; shouldTriggerAbility = FALSE; } PARAMETRIZE { move = MOVE_ELECTRIFY; } @@ -178,25 +198,27 @@ SINGLE_BATTLE_TEST("Teatime triggers Volt Absorb if it has been affected by Elec } } SCENE { MESSAGE("The opposing Wobbuffet used Teatime!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); - if (shouldTriggerAbility) - { + if (shouldTriggerAbility) { ABILITY_POPUP(player, ABILITY_VOLT_ABSORB); HP_BAR(player, damage: -25); - NOT MESSAGE("Using Liechi Berry, the Attack of Jolteon rose!"); } else { NOT ABILITY_POPUP(player, ABILITY_VOLT_ABSORB); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + if (shouldTriggerAbility) { + NOT MESSAGE("Using Liechi Berry, the Attack of Jolteon rose!"); + } else { MESSAGE("Using Liechi Berry, the Attack of Jolteon rose!"); } - MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); } } SINGLE_BATTLE_TEST("Teatime triggers Lightning Rod if it has been affected by Electrify or Plasma Fists, even when not holding a Berry") { - u32 move; - u32 item = ITEM_LIECHI_BERRY; - bool8 shouldTriggerAbility = TRUE; + enum Move move; + enum Item item = ITEM_LIECHI_BERRY; + bool32 shouldTriggerAbility = TRUE; PARAMETRIZE { move = MOVE_CELEBRATE; shouldTriggerAbility = FALSE; } PARAMETRIZE { move = MOVE_ELECTRIFY; } @@ -205,6 +227,7 @@ SINGLE_BATTLE_TEST("Teatime triggers Lightning Rod if it has been affected by El PARAMETRIZE { move = MOVE_PLASMA_FISTS; item = ITEM_NONE; } GIVEN { + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_LIGHTNING_ROD); Item(item); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LIECHI_BERRY); } } WHEN { @@ -214,28 +237,30 @@ SINGLE_BATTLE_TEST("Teatime triggers Lightning Rod if it has been affected by El } } SCENE { MESSAGE("The opposing Wobbuffet used Teatime!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); - if (shouldTriggerAbility) - { + if (shouldTriggerAbility) { ABILITY_POPUP(player, ABILITY_LIGHTNING_ROD); MESSAGE("Pikachu's Sp. Atk rose!"); - NOT MESSAGE("Using Liechi Berry, the Attack of Pikachu rose!"); } else { NONE_OF { ABILITY_POPUP(player, ABILITY_LIGHTNING_ROD); MESSAGE("Pikachu's Sp. Atk rose!"); } + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + if (shouldTriggerAbility) { + NOT MESSAGE("Using Liechi Berry, the Attack of Pikachu rose!"); + } else { MESSAGE("Using Liechi Berry, the Attack of Pikachu rose!"); } - MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); } } SINGLE_BATTLE_TEST("Teatime triggers Motor Drive if it has been affected by Electrify or Plasma Fists, even when not holding a Berry") { - u32 move; - u32 item= ITEM_LIECHI_BERRY; - bool8 shouldTriggerAbility = TRUE; + enum Move move; + enum Item item = ITEM_LIECHI_BERRY; + bool32 shouldTriggerAbility = TRUE; PARAMETRIZE { move = MOVE_CELEBRATE; shouldTriggerAbility = FALSE; } PARAMETRIZE { move = MOVE_ELECTRIFY; } @@ -253,19 +278,21 @@ SINGLE_BATTLE_TEST("Teatime triggers Motor Drive if it has been affected by Elec } } SCENE { MESSAGE("The opposing Wobbuffet used Teatime!"); - ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); - if (shouldTriggerAbility) - { + if (shouldTriggerAbility) { ABILITY_POPUP(player, ABILITY_MOTOR_DRIVE); MESSAGE("Electivire's Speed rose!"); - NOT MESSAGE("Using Liechi Berry, the Attack of Electivire rose!"); } else { NONE_OF { ABILITY_POPUP(player, ABILITY_MOTOR_DRIVE); MESSAGE("Electivire's Speed rose!"); } + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_TEATIME, opponent); + MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); + if (shouldTriggerAbility) { + NOT MESSAGE("Using Liechi Berry, the Attack of Electivire rose!"); + } else { MESSAGE("Using Liechi Berry, the Attack of Electivire rose!"); } - MESSAGE("Using Liechi Berry, the Attack of the opposing Wobbuffet rose!"); } } diff --git a/test/battle/move_effect/telekinesis.c b/test/battle/move_effect/telekinesis.c index 31390d973..da3ee611f 100644 --- a/test/battle/move_effect/telekinesis.c +++ b/test/battle/move_effect/telekinesis.c @@ -33,8 +33,8 @@ SINGLE_BATTLE_TEST("Telekinesis ends after 3 turns") OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(player, MOVE_TELEKINESIS); } - TURN { } - TURN { } + TURN {} + TURN {} } SCENE { MESSAGE("Wobbuffet used Telekinesis!"); MESSAGE("The opposing Wynaut was hurled into the air!"); diff --git a/test/battle/move_effect/teleport.c b/test/battle/move_effect/teleport.c index 83d2142e6..c3b5b5351 100644 --- a/test/battle/move_effect/teleport.c +++ b/test/battle/move_effect/teleport.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no Pokémon to switch in (Gen 8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Teleport fails to switch out when there is no Pokémon to sw SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive Pokémon left (Gen 8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT) { HP(0); } @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Teleport fails to switch out the user when there no alive Po SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_7); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_7); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Teleport fails in Trainer Battles (Gen 1-7)") SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out in Trainer Battles (Gen 8+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Teleport forces the Pokémon to switch out in Trainer Battle SINGLE_BATTLE_TEST("Teleport does not fail if the user is trapped") { GIVEN { - WITH_CONFIG(GEN_CONFIG_TELEPORT_BEHAVIOR, GEN_8); + WITH_CONFIG(CONFIG_TELEPORT_BEHAVIOR, GEN_8); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WYNAUT); diff --git a/test/battle/move_effect/tera_starstorm.c b/test/battle/move_effect/tera_starstorm.c index c3d2d7ef3..e6b0df2f9 100644 --- a/test/battle/move_effect/tera_starstorm.c +++ b/test/battle/move_effect/tera_starstorm.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Tera Starstorm changes from Normal-type to Stellar-type if u DOUBLE_BATTLE_TEST("Tera Starstorm targets both opponents in a double battle if used by Terapagos-Stellar") { GIVEN { - ASSUME(GetMoveTarget(MOVE_TERA_STARSTORM) == MOVE_TARGET_SELECTED); + ASSUME(GetMoveTarget(MOVE_TERA_STARSTORM) == TARGET_SELECTED); PLAYER(SPECIES_TERAPAGOS_STELLAR); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -43,8 +43,10 @@ DOUBLE_BATTLE_TEST("Tera Starstorm targets both opponents in a double battle if SINGLE_BATTLE_TEST("Tera Starstorm becomes a physical move if the user is Terapagos-Stellar, is Terastallized, and has a higher Attack stat") { GIVEN { - ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_COUNTER); - ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT); + ASSUME(GetMoveEffect(MOVE_COUNTER) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_COUNTER) == (1u << DAMAGE_CATEGORY_PHYSICAL)); + ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_REFLECT_DAMAGE); + ASSUME(GetMoveReflectDamage_DamageCategories(MOVE_MIRROR_COAT) == (1u << DAMAGE_CATEGORY_SPECIAL)); ASSUME(GetMoveCategory(MOVE_TERA_STARSTORM) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_TERAPAGOS_STELLAR) { Attack(100); SpAttack(50); } OPPONENT(SPECIES_WOBBUFFET) { Defense(200); SpDefense(200); } diff --git a/test/battle/move_effect/terrain_boost.c b/test/battle/move_effect/terrain_boost.c new file mode 100644 index 000000000..d24a37185 --- /dev/null +++ b/test/battle/move_effect/terrain_boost.c @@ -0,0 +1,151 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Terrain Boost: Expanding Force's power increases by 50% if the user is affected by Psychic Terrain", s16 damage) +{ + bool32 terrain; + PARAMETRIZE { terrain = FALSE; } + PARAMETRIZE { terrain = TRUE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_EXPANDING_FORCE) == EFFECT_TERRAIN_BOOST); + ASSUME(GetMoveTerrainBoost_Percent(MOVE_EXPANDING_FORCE) == 50); + ASSUME(GetMoveTerrainBoost_GroundCheck(MOVE_EXPANDING_FORCE) == GROUND_CHECK_USER); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (terrain) + TURN { MOVE(player, MOVE_PSYCHIC_TERRAIN); } + TURN { MOVE(player, MOVE_EXPANDING_FORCE); } + } SCENE { + MESSAGE("Wobbuffet used Expanding Force!"); + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + if (B_TERRAIN_TYPE_BOOST >= GEN_8) + // 1.3 Terrain boost x 1.5 effect boost = 1.95 boost + EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.95), results[1].damage); + else + // 1.5 Terrain boost x 1.5 effect boost = 2.25 boost + EXPECT_MUL_EQ(results[0].damage, Q_4_12(2.25), results[1].damage); + } +} + +DOUBLE_BATTLE_TEST("Terrain Boost: Expanding Force hits both foes in Psychic Terrain") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_EXPANDING_FORCE) == EFFECT_TERRAIN_BOOST); + ASSUME(GetMoveTerrainBoost_HitsBothFoes(MOVE_EXPANDING_FORCE)); + ASSUME(GetMoveTerrainBoost_GroundCheck(MOVE_EXPANDING_FORCE) == GROUND_CHECK_USER); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_EXPANDING_FORCE, target: opponentLeft); MOVE(playerRight, MOVE_PSYCHIC_TERRAIN); } + TURN { MOVE(playerLeft, MOVE_EXPANDING_FORCE, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPANDING_FORCE, playerLeft); + HP_BAR(opponentLeft); + NOT HP_BAR(opponentRight); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPANDING_FORCE, playerLeft); + HP_BAR(opponentLeft); + HP_BAR(opponentRight); + } +} + +SINGLE_BATTLE_TEST("Terrain Boost: Rising Voltage doubles in power if target is grounded") +{ + s16 damage[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_RISING_VOLTAGE) == EFFECT_TERRAIN_BOOST); + ASSUME(GetMoveTerrainBoost_Percent(MOVE_RISING_VOLTAGE) == 100); + ASSUME(GetMoveTerrainBoost_GroundCheck(MOVE_RISING_VOLTAGE) == GROUND_CHECK_TARGET); + PLAYER(SPECIES_PIDGEY); // User flying type so there is no 30% electric terrain boost + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_RISING_VOLTAGE); MOVE(opponent, MOVE_ELECTRIC_TERRAIN); } + TURN { MOVE(player, MOVE_RISING_VOLTAGE); MOVE(opponent, MOVE_MAGNET_RISE); } + TURN { MOVE(player, MOVE_RISING_VOLTAGE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_RISING_VOLTAGE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_RISING_VOLTAGE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_RISING_VOLTAGE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(2.0), damage[1]); + EXPECT_EQ(damage[0], damage[2]); + } +} + +SINGLE_BATTLE_TEST("Terrain Boost: Misty Explosion increases in power by 50% when affected by Misty Terrain") +{ + s16 damage[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_MISTY_EXPLOSION) == EFFECT_TERRAIN_BOOST); + ASSUME(GetMoveTerrainBoost_Percent(MOVE_MISTY_EXPLOSION) == 50); + ASSUME(GetMoveTerrainBoost_GroundCheck(MOVE_MISTY_EXPLOSION) == GROUND_CHECK_USER); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); SEND_OUT(player, 1); MOVE(opponent, MOVE_MISTY_TERRAIN); } + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); SEND_OUT(player, 2); } + TURN { MOVE(player, MOVE_MAGNET_RISE); } + TURN { MOVE(player, MOVE_MISTY_EXPLOSION); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_TERRAIN, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + HP_BAR(opponent, captureDamage: &damage[1]); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, player); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_MISTY_EXPLOSION, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.5), damage[1]); + EXPECT_EQ(damage[0], damage[2]); + } +} + +SINGLE_BATTLE_TEST("Terrain Boost: Psyblade power increases by 50% regardless if user is grounded or not") +{ + s16 damage[3]; + + GIVEN { + ASSUME(GetMoveEffect(MOVE_PSYBLADE) == EFFECT_TERRAIN_BOOST); + ASSUME(GetMoveTerrainBoost_Percent(MOVE_PSYBLADE) == 50); + ASSUME(GetMoveTerrainBoost_GroundCheck(MOVE_PSYBLADE) == GROUND_CHECK_NONE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_PSYBLADE); MOVE(opponent, MOVE_ELECTRIC_TERRAIN); } + TURN { MOVE(player, MOVE_PSYBLADE); MOVE(opponent, MOVE_MAGNET_RISE); } + TURN { MOVE(player, MOVE_PSYBLADE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYBLADE, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYBLADE, player); + HP_BAR(opponent, captureDamage: &damage[1]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_MAGNET_RISE, opponent); + + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYBLADE, player); + HP_BAR(opponent, captureDamage: &damage[2]); + } THEN { + EXPECT_MUL_EQ(damage[0], UQ_4_12(1.5), damage[1]); + EXPECT_EQ(damage[1], damage[2]); + } +} diff --git a/test/battle/move_effect/tickle.c b/test/battle/move_effect/tickle.c index b5f5a56d6..3a878868f 100644 --- a/test/battle/move_effect/tickle.c +++ b/test/battle/move_effect/tickle.c @@ -1,4 +1,23 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Tickle (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_TICKLE) == EFFECT_TICKLE); +} + +SINGLE_BATTLE_TEST("Tickle reduces the target's Attack and Defense by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TICKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TICKLE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + } +} diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index 045772db2..55e09b24e 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Toxic cannot miss if used by a Poison-type (Gen6+)") PARAMETRIZE { species = SPECIES_WOBBUFFET; hit = FALSE; gen = GEN_6; } PARAMETRIZE { species = SPECIES_NIDORAN_M; hit = TRUE; gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_TOXIC_NEVER_MISS, gen); + WITH_CONFIG(CONFIG_TOXIC_NEVER_MISS, gen); ASSUME(GetSpeciesType(SPECIES_NIDORAN_M, 0) == TYPE_POISON); PLAYER(species); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/toxic_spikes.c b/test/battle/move_effect/toxic_spikes.c index 3d21c0693..21f58df47 100644 --- a/test/battle/move_effect/toxic_spikes.c +++ b/test/battle/move_effect/toxic_spikes.c @@ -92,9 +92,9 @@ SINGLE_BATTLE_TEST("Toxic Spikes inflicts poison on subsequent switch ins") SINGLE_BATTLE_TEST("Toxic Spikes do not poison airborne Pokemon") { u32 species = SPECIES_WOBBUFFET; - u32 item = ITEM_NONE; - u32 move1 = MOVE_CELEBRATE; - u32 move2 = MOVE_CELEBRATE; + enum Item item = ITEM_NONE; + enum Move move1 = MOVE_CELEBRATE; + enum Move move2 = MOVE_CELEBRATE; bool32 airborne; ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); @@ -154,8 +154,8 @@ SINGLE_BATTLE_TEST("Toxic Spikes do not affect Steel-types") SINGLE_BATTLE_TEST("Toxic Spikes are removed by grounded Poison-type Pokémon on switch in") { u32 species; - u32 item = ITEM_NONE; - u32 move = MOVE_CELEBRATE; + enum Item item = ITEM_NONE; + enum Move move = MOVE_CELEBRATE; bool32 grounded; PARAMETRIZE { species = SPECIES_EKANS; grounded = TRUE; } PARAMETRIZE { species = SPECIES_ZUBAT; grounded = FALSE; } @@ -208,10 +208,10 @@ SINGLE_BATTLE_TEST("Toxic Spikes inflicts poison on switch in after Primal Rever { GIVEN { ASSUME(GetMoveEffect(MOVE_MEMENTO) == EFFECT_MEMENTO); // Faints the user. - PLAYER(SPECIES_WOBBUFFET) {Speed(5); } + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Speed(1); } - PLAYER(SPECIES_WYNAUT) {Speed(5); } - OPPONENT(SPECIES_WOBBUFFET) {Speed(15); } + PLAYER(SPECIES_WYNAUT) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(15); } } WHEN { TURN { MOVE(opponent, MOVE_TOXIC_SPIKES); } TURN { SWITCH(player, 1); } diff --git a/test/battle/move_effect/trick.c b/test/battle/move_effect/trick.c index 3aa26af67..2110c8504 100644 --- a/test/battle/move_effect/trick.c +++ b/test/battle/move_effect/trick.c @@ -1,4 +1,220 @@ #include "global.h" #include "test/battle.h" +#include "mail.h" + +SINGLE_BATTLE_TEST("Trick swaps held items") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_LUM_BERRY); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick succeeds if only the user has an item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick succeeds if only the target has an item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } THEN { + EXPECT(player->item == ITEM_LUM_BERRY); + EXPECT(opponent->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Trick fails if both battlers have no held item") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_NONE); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either item is Mail") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + ASSUME(ItemIsMail(ITEM_ORANGE_MAIL)); + PARAMETRIZE { atkItem = ITEM_ORANGE_MAIL; defItem = ITEM_NONE; } + PARAMETRIZE { atkItem = ITEM_ORAN_BERRY; defItem = ITEM_ORANGE_MAIL; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either item is a Z-Crystal") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + ASSUME(GetItemHoldEffect(ITEM_FIGHTINIUM_Z) == HOLD_EFFECT_Z_CRYSTAL); + PARAMETRIZE { atkItem = ITEM_FIGHTINIUM_Z; defItem = ITEM_NONE; } + PARAMETRIZE { atkItem = ITEM_SITRUS_BERRY; defItem = ITEM_FIGHTINIUM_Z; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if either battler holds a Mega Stone") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + u16 atkSpecies = SPECIES_WOBBUFFET, defSpecies = SPECIES_WOBBUFFET; + + PARAMETRIZE { atkSpecies = SPECIES_BLAZIKEN; atkItem = ITEM_BLAZIKENITE; defSpecies = SPECIES_WOBBUFFET; defItem = ITEM_SITRUS_BERRY; } + PARAMETRIZE { atkSpecies = SPECIES_WOBBUFFET; atkItem = ITEM_SITRUS_BERRY; defSpecies = SPECIES_BLAZIKEN; defItem = ITEM_BLAZIKENITE; } + + GIVEN { + PLAYER(atkSpecies) { Item(atkItem); } + OPPONENT(defSpecies) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick fails if an item changes the holder's form") +{ + u16 atkItem = ITEM_NONE, defItem = ITEM_NONE; + + PARAMETRIZE { atkItem = ITEM_GRISEOUS_CORE; defItem = ITEM_SITRUS_BERRY; } + PARAMETRIZE { atkItem = ITEM_SITRUS_BERRY; defItem = ITEM_GRISEOUS_CORE; } + + GIVEN { + PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(atkItem); } + OPPONENT(SPECIES_WOBBUFFET) { Item(defItem); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == atkItem); + EXPECT(opponent->item == defItem); + } +} + +SINGLE_BATTLE_TEST("Trick doesn't fail if the user has Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + } THEN { + EXPECT(player->item == ITEM_LUM_BERRY); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick fails against Sticky Hold") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_STICKY_HOLD); Item(ITEM_LUM_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("The opposing Wobbuffet's Sticky Hold made Trick ineffective!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_LUM_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick fails if the target is behind a Substitute") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); Speed(50); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); Speed(100); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_TRICK); } + } SCENE { + MESSAGE("But it failed!"); + } THEN { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_LUM_BERRY); + } +} + +SINGLE_BATTLE_TEST("Trick does not remove the user's choice lock if both the target and use are holding choice items before Gen 5") +{ + GIVEN { + WITH_CONFIG(CONFIG_MODERN_TRICK_CHOICE_LOCK, GEN_4); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); MovesWithPP({MOVE_TRICK, 1}, {MOVE_CELEBRATE, 10}); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); } + } + WHEN { + TURN { MOVE(player, MOVE_TRICK); } + TURN { FORCED_MOVE(player); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, player); + } +} + +SINGLE_BATTLE_TEST("Trick removes the user's choice lock if both the target and use are holding choice items from Gen 5 onwards") +{ + GIVEN { + WITH_CONFIG(CONFIG_MODERN_TRICK_CHOICE_LOCK, GEN_5); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); MovesWithPP({MOVE_TRICK, 1}, {MOVE_CELEBRATE, 10}); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); } + } + WHEN { + TURN { MOVE(player, MOVE_TRICK); } + TURN { MOVE(player, MOVE_CELEBRATE); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TRICK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} -TO_DO_BATTLE_TEST("TODO: Write Trick (Move Effect) test titles") diff --git a/test/battle/move_effect/two_turns_attack.c b/test/battle/move_effect/two_turns_attack.c index 661a45c11..73d1ef57a 100644 --- a/test/battle/move_effect/two_turns_attack.c +++ b/test/battle/move_effect/two_turns_attack.c @@ -217,7 +217,7 @@ SINGLE_BATTLE_TEST("Sky Attack doesn't need to charge with Power Herb") SINGLE_BATTLE_TEST("Solar Beam and Solar Blade can be used instantly in Sunlight") { - u32 move1, move2; + enum Move move1, move2; PARAMETRIZE { move1 = MOVE_SPLASH; move2 = MOVE_SOLAR_BEAM; } PARAMETRIZE { move1 = MOVE_SUNNY_DAY; move2 = MOVE_SOLAR_BEAM; } PARAMETRIZE { move1 = MOVE_SPLASH; move2 = MOVE_SOLAR_BLADE; } @@ -229,42 +229,33 @@ SINGLE_BATTLE_TEST("Solar Beam and Solar Blade can be used instantly in Sunlight TURN { MOVE(opponent, move1); MOVE(player, move2); } TURN { SKIP_TURN(player); } } SCENE { - if (move1 == MOVE_SUNNY_DAY) { - NOT MESSAGE("Wobbuffet absorbed light!"); + // Potential visual bug. + // The script has the B_WAIT_TIME_LONG waitmessage but it does not wait + if (move2 == MOVE_SOLAR_BEAM) { + MESSAGE("Wobbuffet used Solar Beam!"); } else { - if (move2 == MOVE_SOLAR_BEAM) { - if (B_UPDATED_MOVE_DATA >= GEN_5) - { - MESSAGE("Wobbuffet used Solar Beam!"); - MESSAGE("Wobbuffet absorbed light!"); - ANIMATION(ANIM_TYPE_MOVE, move2, player); - } else { - NOT MESSAGE("Wobbuffet used Solar Beam!"); - ANIMATION(ANIM_TYPE_MOVE, move2, player); - MESSAGE("Wobbuffet absorbed light!"); - } + MESSAGE("Wobbuffet used Solar Blade!"); + } + MESSAGE("Wobbuffet absorbed light!"); + + if (move2 == MOVE_SOLAR_BEAM) { + if (move1 == MOVE_SPLASH) { MESSAGE("Wobbuffet used Solar Beam!"); - } else { - if (B_UPDATED_MOVE_DATA >= GEN_5) { - MESSAGE("Wobbuffet used Solar Blade!"); - MESSAGE("Wobbuffet absorbed light!"); - ANIMATION(ANIM_TYPE_MOVE, move2, player); - } else { - NOT MESSAGE("Wobbuffet used Solar Blade!"); - ANIMATION(ANIM_TYPE_MOVE, move2, player); - MESSAGE("Wobbuffet absorbed light!"); - } + } + ANIMATION(ANIM_TYPE_MOVE, move2, player); + } else { + if (move1 == MOVE_SPLASH) { MESSAGE("Wobbuffet used Solar Blade!"); } ANIMATION(ANIM_TYPE_MOVE, move2, player); - HP_BAR(opponent); } + HP_BAR(opponent); } } SINGLE_BATTLE_TEST("Solar Beam's power is halved in Rain", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } GIVEN { @@ -282,7 +273,7 @@ SINGLE_BATTLE_TEST("Solar Beam's power is halved in Rain", s16 damage) SINGLE_BATTLE_TEST("Solar Blade's power is halved in Rain", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } GIVEN { @@ -300,12 +291,12 @@ SINGLE_BATTLE_TEST("Solar Blade's power is halved in Rain", s16 damage) SINGLE_BATTLE_TEST("Solar Beam's power is halved in a Sandstorm", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SANDSTORM; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_SOLAR_BEAM); } TURN { SKIP_TURN(player); } @@ -318,12 +309,12 @@ SINGLE_BATTLE_TEST("Solar Beam's power is halved in a Sandstorm", s16 damage) SINGLE_BATTLE_TEST("Solar Blade's power is halved in a Sandstorm", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SANDSTORM; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_SOLAR_BLADE); } TURN { SKIP_TURN(player); } @@ -336,12 +327,12 @@ SINGLE_BATTLE_TEST("Solar Blade's power is halved in a Sandstorm", s16 damage) SINGLE_BATTLE_TEST("Solar Beam's power is halved in Hail", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_SOLAR_BEAM); } TURN { SKIP_TURN(player); } @@ -354,12 +345,12 @@ SINGLE_BATTLE_TEST("Solar Beam's power is halved in Hail", s16 damage) SINGLE_BATTLE_TEST("Solar Blade's power is halved in Hail", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HAIL; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(opponent, move); MOVE(player, MOVE_SOLAR_BLADE); } TURN { SKIP_TURN(player); } @@ -372,7 +363,7 @@ SINGLE_BATTLE_TEST("Solar Blade's power is halved in Hail", s16 damage) SINGLE_BATTLE_TEST("Solar Beam's power is halved in Snow", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { @@ -390,7 +381,7 @@ SINGLE_BATTLE_TEST("Solar Beam's power is halved in Snow", s16 damage) SINGLE_BATTLE_TEST("Solar Blade's power is halved in Snow", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { @@ -424,6 +415,8 @@ SINGLE_BATTLE_TEST("Electro Shot needs a charging Turn") // Attack turn MESSAGE("Wobbuffet used Electro Shot!"); HP_BAR(opponent); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); } } diff --git a/test/battle/move_effect/two_typed_move.c b/test/battle/move_effect/two_typed_move.c index 43c351573..7372222e8 100644 --- a/test/battle/move_effect/two_typed_move.c +++ b/test/battle/move_effect/two_typed_move.c @@ -1,4 +1,12 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Flying Press (Move Effect) test titles") +TO_DO_BATTLE_TEST("Flying Press does both Fighting and Flying-type for type effectiveness") +TO_DO_BATTLE_TEST("Flying-type Pokémon don't receive STAB on Flying Press") +TO_DO_BATTLE_TEST("Sky Plate doesn't boost Flying Press' power") // Check Fist Plate for comparison +TO_DO_BATTLE_TEST("Sharp Beak doesn't boost Flying Press' power") // Check Black Belt for comparison +TO_DO_BATTLE_TEST("Flying Gem doesn't trigger when using Flying Press") // Check Fighting Gem for comparison +TO_DO_BATTLE_TEST("Coba Berry doesn't trigger when the user is attacked by Flying Press") +TO_DO_BATTLE_TEST("Flying Press triggers Chople Berry, even when it wouldn't be super effective with regular Fighting-type moves") +TO_DO_BATTLE_TEST("Flying Press under Electrify does both Electric and Flying-type for type effectiveness") // Check Electric 1/4 effectiveness +TO_DO_BATTLE_TEST("Flying Press under Normalize does both Normal and Flying-type for type effectiveness") // Check Rock/Steel 1/4 effectiveness diff --git a/test/battle/move_effect/upper_hand.c b/test/battle/move_effect/upper_hand.c index 36b35781e..917dd929e 100644 --- a/test/battle/move_effect/upper_hand.c +++ b/test/battle/move_effect/upper_hand.c @@ -68,6 +68,7 @@ SINGLE_BATTLE_TEST("Upper Hand succeeds if the target's move is boosted in prior GIVEN { ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 PLAYER(SPECIES_MIENSHAO) { Speed(10); } OPPONENT(SPECIES_COMFEY) { Speed(5); Ability(ABILITY_TRIAGE); } } WHEN { @@ -85,6 +86,7 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first") GIVEN { ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0); + ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5 PLAYER(SPECIES_MIENSHAO) { Speed(5); } OPPONENT(SPECIES_COMFEY) { Speed(10); Ability(ABILITY_TRIAGE); } } WHEN { @@ -119,13 +121,13 @@ SINGLE_BATTLE_TEST("Upper Hand is boosted by Sheer Force") AI_SINGLE_BATTLE_TEST("AI won't use Upper Hand unless it has seen a priority move") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SCRATCH; } PARAMETRIZE { move = MOVE_QUICK_ATTACK; } GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1); - PLAYER(SPECIES_WOBBUFFET) {Moves(move); } + PLAYER(SPECIES_WOBBUFFET) { Moves(move); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_UPPER_HAND, MOVE_KARATE_CHOP); } } WHEN { TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_KARATE_CHOP); } @@ -154,3 +156,20 @@ DOUBLE_BATTLE_TEST("Upper Hand fails if the target has attempted to act even if NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, playerLeft); } } + +SINGLE_BATTLE_TEST("Upper Hand failing will prevent Protean activation") +{ + GIVEN { + WITH_CONFIG(CONFIG_PROTEAN_LIBERO, GEN_6); + PLAYER(SPECIES_REGIROCK); + OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_UPPER_HAND); } + } SCENE { + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_PROTEAN); + ANIMATION(ANIM_TYPE_MOVE, MOVE_UPPER_HAND, player); + } + } +} diff --git a/test/battle/move_effect/victory_dance.c b/test/battle/move_effect/victory_dance.c index cd1d89242..83fff322e 100644 --- a/test/battle/move_effect/victory_dance.c +++ b/test/battle/move_effect/victory_dance.c @@ -1,4 +1,24 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Victory Dance (Move Effect) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_VICTORY_DANCE) == EFFECT_VICTORY_DANCE); +} + +SINGLE_BATTLE_TEST("Victory Dance increases the user's Attack, Defense and Speed by 1 stage each") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_VICTORY_DANCE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_VICTORY_DANCE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/move_effect/water_sport.c b/test/battle/move_effect/water_sport.c index cf4ec929c..5cf52ed1c 100644 --- a/test/battle/move_effect/water_sport.c +++ b/test/battle/move_effect/water_sport.c @@ -3,11 +3,15 @@ TO_DO_BATTLE_TEST("TODO: Write Water Sport (Move Effect) test titles") -SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 67% (Gen5+)") +SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 50% (Gen3-4) or 67% (Gen5+)") { + u32 config; s16 playerDmg[2]; s16 opponentDmg[2]; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_SPORT_DMG_REDUCTION, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -28,7 +32,13 @@ SINGLE_BATTLE_TEST("Water Sport reduces the damage of Fire Type moves by 67% (Ge HP_BAR(player, captureDamage: &playerDmg[1]); } THEN { - EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); - EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + if (config >= GEN_5) { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.33), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.33), playerDmg[1]); + } + else { + EXPECT_MUL_EQ(opponentDmg[0], Q_4_12(0.5), opponentDmg[1]); + EXPECT_MUL_EQ(playerDmg[0], Q_4_12(0.5), playerDmg[1]); + } } } diff --git a/test/battle/move_effect/weather_ball.c b/test/battle/move_effect/weather_ball.c index 047438348..91c881681 100644 --- a/test/battle/move_effect/weather_ball.c +++ b/test/battle/move_effect/weather_ball.c @@ -8,7 +8,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Fire-type move in Sunlight", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SUNNY_DAY; } GIVEN { @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Fire-type move SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Water-type move in Rain", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_RAIN_DANCE; } GIVEN { @@ -44,12 +44,12 @@ SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Water-type mov SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Rock-type move in a Sandstorm", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SANDSTORM; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_MAGMAR) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_MAGMAR) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(player, move); } TURN { MOVE(player, MOVE_WEATHER_BALL); } @@ -62,13 +62,13 @@ SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to a Rock-type move SINGLE_BATTLE_TEST("Weather Ball doubles its power and turns to an Ice-type move in Hail and Snow", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_DRAGONAIR) { Item(ITEM_SAFETY_GOGGLES); }; + OPPONENT(SPECIES_DRAGONAIR) { Item(ITEM_SAFETY_GOGGLES); } } WHEN { TURN { MOVE(player, move); } TURN { MOVE(player, MOVE_WEATHER_BALL); } diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c index 8fa384212..6e9114bc0 100644 --- a/test/battle/move_effect/wish.c +++ b/test/battle/move_effect/wish.c @@ -6,23 +6,67 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_WISH) == EFFECT_WISH); } -SINGLE_BATTLE_TEST("Wish restores 50% of max player HP") +SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when not switching") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, config); PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_WISH); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); MESSAGE("Wynaut's wish came true!"); - HP_BAR(player, hp: 100); + HP_BAR(player, damage: -50); MESSAGE("Wynaut's HP was restored."); } } +SINGLE_BATTLE_TEST("Wish restores 50% of the user's HP when switching (Gen5+)") +{ + GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_5); + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + SWITCH_OUT_MESSAGE("Wynaut"); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("Wynaut's wish came true!"); + HP_BAR(player, damage: -50); + MESSAGE("Wobbuffet's HP was restored."); + } +} + +SINGLE_BATTLE_TEST("Wish restores 50% of the recipient's HP when switching (Gen3-4)") +{ + GIVEN { + WITH_CONFIG(CONFIG_WISH_HP_SOURCE, GEN_4); + PLAYER(SPECIES_WYNAUT) { HP(50); MaxHP(100); } + PLAYER(SPECIES_WOBBUFFET) { HP(100); MaxHP(200); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); } + TURN { SWITCH(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + SWITCH_OUT_MESSAGE("Wynaut"); + SEND_IN_MESSAGE("Wobbuffet"); + MESSAGE("Wynaut's wish came true!"); + HP_BAR(player, damage: -100); + MESSAGE("Wobbuffet's HP was restored."); + } +} + SINGLE_BATTLE_TEST("Wish heals the user at the end of the next turn") { GIVEN { @@ -30,7 +74,7 @@ SINGLE_BATTLE_TEST("Wish heals the user at the end of the next turn") OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_WISH); MOVE(opponent, MOVE_POUND); } - TURN { } + TURN {} } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); @@ -60,5 +104,3 @@ SINGLE_BATTLE_TEST("Wish is blocked by Heal Block") NOT HP_BAR(player); } } - -TO_DO_BATTLE_TEST("TODO: Write Wish (Move Effect) test titles") diff --git a/test/battle/move_effect/worry_seed.c b/test/battle/move_effect/worry_seed.c deleted file mode 100644 index a53680208..000000000 --- a/test/battle/move_effect/worry_seed.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); - ASSUME(GetMoveOverwriteAbility(MOVE_WORRY_SEED) == ABILITY_INSOMNIA); -} - -SINGLE_BATTLE_TEST("Worry Seed replaces target's ability with Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - }WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - ABILITY_POPUP(opponent, ABILITY_BLAZE); - } THEN { - EXPECT_EQ(opponent->ability, ABILITY_INSOMNIA); - } -} - -DOUBLE_BATTLE_TEST("Worry Seed fails if the target already has Insomnia") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - PLAYER(SPECIES_CHARMANDER) { Ability(ABILITY_BLAZE); } - OPPONENT(SPECIES_BULBASAUR) { Ability(ABILITY_OVERGROW); } - OPPONENT(SPECIES_SQUIRTLE) { Ability(ABILITY_TORRENT); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_WORRY_SEED, target: opponentLeft); MOVE(playerRight, MOVE_WORRY_SEED, target: opponentLeft); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerLeft); - ABILITY_POPUP(opponentLeft, ABILITY_OVERGROW); - NONE_OF { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, playerRight); - ABILITY_POPUP(opponentLeft, ABILITY_INSOMNIA); - } - } THEN { - EXPECT_EQ(opponentLeft->ability, ABILITY_INSOMNIA); - } -} - -SINGLE_BATTLE_TEST("Worry Seed fails if target has an ability that can't be overwritten") -{ - u32 species; - enum Ability ability; - - PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } - PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } - PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } - PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } - PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } - PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } - PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } - PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } - PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } - PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } - PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; } - PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; } - PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } - PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } - - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_TELEPATHY); } - OPPONENT(species) { Ability(ability); } - } WHEN { - TURN { MOVE(player, MOVE_WORRY_SEED); } - } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); - MESSAGE("But it failed!"); - } -} diff --git a/test/battle/move_effect/brick_break.c b/test/battle/move_effect_secondary/break_screens.c similarity index 93% rename from test/battle/move_effect/brick_break.c rename to test/battle/move_effect_secondary/break_screens.c index 05e22f42d..3035002a0 100644 --- a/test/battle/move_effect/brick_break.c +++ b/test/battle/move_effect_secondary/break_screens.c @@ -3,9 +3,10 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_BRICK_BREAK) == EFFECT_BRICK_BREAK); - ASSUME(GetMoveEffect(MOVE_PSYCHIC_FANGS) == EFFECT_BRICK_BREAK); - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(MoveHasAdditionalEffect(MOVE_BRICK_BREAK, MOVE_EFFECT_BREAK_SCREEN)); + ASSUME(MoveHasAdditionalEffect(MOVE_PSYCHIC_FANGS, MOVE_EFFECT_BREAK_SCREEN)); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN); ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT); ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL); @@ -13,7 +14,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs remove Light Screen, Reflect and Aurora Veil from the target's side of the field") { - u32 move; + enum Move move; u32 breakingMove; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; breakingMove = MOVE_BRICK_BREAK; } @@ -40,7 +41,7 @@ SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs remove Light Screen, Reflect a SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Reflect and Aurora Veil if the target is immune") { - u32 move; + enum Move move; u32 breakingMove; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; breakingMove = MOVE_BRICK_BREAK; } @@ -69,7 +70,7 @@ SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Ref SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Reflect and Aurora Veil if the target Protected") { - u32 move; + enum Move move; u32 breakingMove; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; breakingMove = MOVE_BRICK_BREAK; } @@ -99,7 +100,7 @@ SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Ref SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Reflect and Aurora Veil if it misses") { - u32 move; + enum Move move; u32 breakingMove; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; breakingMove = MOVE_BRICK_BREAK; } @@ -128,7 +129,7 @@ SINGLE_BATTLE_TEST("Brick Break and Psychic Fangs don't remove Light Screen, Ref DOUBLE_BATTLE_TEST("Brick Break and Psychic Fangs can remove Light Screen, Reflect and Aurora Veil on users side") { - u32 move; + enum Move move; u32 breakingMove; PARAMETRIZE { move = MOVE_LIGHT_SCREEN; breakingMove = MOVE_BRICK_BREAK; } @@ -157,3 +158,4 @@ DOUBLE_BATTLE_TEST("Brick Break and Psychic Fangs can remove Light Screen, Refle HP_BAR(playerLeft); } } + diff --git a/test/battle/move_effect_secondary/bug_bite.c b/test/battle/move_effect_secondary/bug_bite.c index e6df81dc7..03573f703 100644 --- a/test/battle/move_effect_secondary/bug_bite.c +++ b/test/battle/move_effect_secondary/bug_bite.c @@ -10,8 +10,10 @@ ASSUMPTIONS // Pretty much copy/paste of the Berry Fling Test. SINGLE_BATTLE_TEST("Bug Bite eats the target's berry and immediately gains its effect") { - u16 item = ITEM_NONE; - u32 status1 = STATUS1_NONE, effect = HOLD_EFFECT_NONE, statId = 0; + enum Item item = ITEM_NONE; + u32 status1 = STATUS1_NONE; + enum HoldEffect effect = HOLD_EFFECT_NONE; + enum Stat statId = STAT_HP; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_ORAN_BERRY; effect = HOLD_EFFECT_RESTORE_HP; } @@ -120,7 +122,7 @@ SINGLE_BATTLE_TEST("Tanga Berry activates before Bug Bite") ASSUME(gItemsInfo[ITEM_TANGA_BERRY].holdEffect == HOLD_EFFECT_RESIST_BERRY); ASSUME(gItemsInfo[ITEM_TANGA_BERRY].holdEffectParam == TYPE_BUG); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) {Item(ITEM_TANGA_BERRY); } + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_TANGA_BERRY); } } WHEN { TURN { MOVE(player, MOVE_BUG_BITE); } } SCENE { diff --git a/test/battle/move_effect_secondary/burn.c b/test/battle/move_effect_secondary/burn.c index ee2586338..05b98d3ab 100644 --- a/test/battle/move_effect_secondary/burn.c +++ b/test/battle/move_effect_secondary/burn.c @@ -43,7 +43,7 @@ DOUBLE_BATTLE_TEST("Lava Plume inflicts burn to all adjacent battlers") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_LAVA_PLUME, MOVE_EFFECT_BURN) == TRUE); - ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect_secondary/confusion.c b/test/battle/move_effect_secondary/confusion.c index 72a963935..4cec7a4aa 100644 --- a/test/battle/move_effect_secondary/confusion.c +++ b/test/battle/move_effect_secondary/confusion.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Alluring Voice confuses the target if the target raised a stat this turn") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SWORDS_DANCE; } diff --git a/test/battle/move_effect_secondary/dire_claw.c b/test/battle/move_effect_secondary/dire_claw.c index 17352fa70..e45b8e394 100644 --- a/test/battle/move_effect_secondary/dire_claw.c +++ b/test/battle/move_effect_secondary/dire_claw.c @@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ARBOK; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { @@ -67,13 +67,10 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep Pokém u16 species; enum Ability ability; u32 rng; - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5) - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_RAICHU; ability = ABILITY_LIGHTNING_ROD; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_JOLTEON; ability = ABILITY_VOLT_ABSORB; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_ELECTIVIRE; ability = ABILITY_MOTOR_DRIVE; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ZANGOOSE; ability = ABILITY_IMMUNITY; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_VIGOROTH; ability = ABILITY_VITAL_SPIRIT; } - PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_HYPNO; ability = ABILITY_INSOMNIA; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PRZ; rng = MOVE_EFFECT_PARALYSIS; species = SPECIES_PERSIAN; ability = ABILITY_LIMBER; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_PSN; rng = MOVE_EFFECT_POISON; species = SPECIES_ZANGOOSE; ability = ABILITY_IMMUNITY; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_VIGOROTH; ability = ABILITY_VITAL_SPIRIT; } + PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_HYPNO; ability = ABILITY_INSOMNIA; } GIVEN { PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect_secondary/flinch.c b/test/battle/move_effect_secondary/flinch.c index 517c87cba..41c1910b4 100644 --- a/test/battle/move_effect_secondary/flinch.c +++ b/test/battle/move_effect_secondary/flinch.c @@ -69,3 +69,17 @@ SINGLE_BATTLE_TEST("Protect always works when used after flinching") NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, opponent); } } + +SINGLE_BATTLE_TEST("Headbutt flinches 30% of the time") +{ + PASSES_RANDOMLY(30, 100, RNG_SECONDARY_EFFECT); + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_HEADBUTT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEADBUTT, player); + MESSAGE("The opposing Wobbuffet flinched and couldn't move!"); + } +} diff --git a/test/battle/move_effect_secondary/ion_deluge.c b/test/battle/move_effect_secondary/ion_deluge.c index 21d37de40..003bfc825 100644 --- a/test/battle/move_effect_secondary/ion_deluge.c +++ b/test/battle/move_effect_secondary/ion_deluge.c @@ -70,7 +70,7 @@ SINGLE_BATTLE_TEST("Plasma Fists does not set up Ion Deluge if it does not conne SINGLE_BATTLE_TEST("Plasma Fists type-changing effect does not override Pixilate") { GIVEN { - PLAYER(SPECIES_KRABBY) { Speed(300); }; + PLAYER(SPECIES_KRABBY) { Speed(300); } OPPONENT(SPECIES_SYLVEON) { Speed(1); Ability(ABILITY_PIXILATE); } } WHEN { TURN { MOVE(player, MOVE_PLASMA_FISTS); MOVE(opponent, MOVE_SCRATCH); } diff --git a/test/battle/move_effect_secondary/order_up.c b/test/battle/move_effect_secondary/order_up.c index bfabd6e3e..31397478e 100644 --- a/test/battle/move_effect_secondary/order_up.c +++ b/test/battle/move_effect_secondary/order_up.c @@ -17,7 +17,7 @@ DOUBLE_BATTLE_TEST("Order Up increases a stat based on Tatsugiri's form") PLAYER(species) { Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); }; + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { TURN { MOVE(opponentRight, MOVE_HAZE); MOVE(playerRight, MOVE_ORDER_UP, target: opponentLeft); } } SCENE { @@ -65,9 +65,9 @@ DOUBLE_BATTLE_TEST("Order Up increases a stat based on Tatsugiri's form even if PLAYER(species) { HP(1); Status1(STATUS1_POISON); Ability(ABILITY_COMMANDER); } PLAYER(SPECIES_DONDOZO); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); }; + OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { - TURN { } + TURN {} TURN { MOVE(opponentRight, MOVE_HAZE); MOVE(playerRight, MOVE_ORDER_UP, target: opponentLeft); } } SCENE { ABILITY_POPUP(playerLeft, ABILITY_COMMANDER); @@ -139,7 +139,7 @@ DOUBLE_BATTLE_TEST("Order Up is boosted by Sheer Force without removing the stat } DOUBLE_BATTLE_TEST("Order Up is always boosted by Sheer Force", s16 damage) { - u32 move; + enum Move move; enum Ability ability; PARAMETRIZE(move = MOVE_CELEBRATE, ability = ABILITY_STORM_DRAIN); PARAMETRIZE(move = MOVE_ENTRAINMENT, ability = ABILITY_STORM_DRAIN); diff --git a/test/battle/move_effect_secondary/paralysis.c b/test/battle/move_effect_secondary/paralysis.c index 723309f01..121d7ac6e 100644 --- a/test/battle/move_effect_secondary/paralysis.c +++ b/test/battle/move_effect_secondary/paralysis.c @@ -27,7 +27,7 @@ SINGLE_BATTLE_TEST("Thunder Shock cannot paralyze an Electric-type (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, gen); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); diff --git a/test/battle/move_effect_secondary/recharge.c b/test/battle/move_effect_secondary/recharge.c index 914608367..07d98867a 100644 --- a/test/battle/move_effect_secondary/recharge.c +++ b/test/battle/move_effect_secondary/recharge.c @@ -12,9 +12,9 @@ SINGLE_BATTLE_TEST("Recharge moves make the user unable to attack for exactly on PLAYER(SPECIES_WOBBUFFET) { } OPPONENT(SPECIES_WOBBUFFET) { } } WHEN { - TURN { MOVE(player, MOVE_METEOR_ASSAULT);} - TURN { SKIP_TURN(player);} - TURN { MOVE(player, MOVE_TACKLE);} + TURN { MOVE(player, MOVE_METEOR_ASSAULT); } + TURN { SKIP_TURN(player); } + TURN { MOVE(player, MOVE_TACKLE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_METEOR_ASSAULT, player); MESSAGE("Wobbuffet must recharge!"); @@ -24,12 +24,11 @@ SINGLE_BATTLE_TEST("Recharge moves make the user unable to attack for exactly on SINGLE_BATTLE_TEST("Recharge moves don't timeout when all battlers are recharging") { - GIVEN { PLAYER(SPECIES_WOBBUFFET) { } OPPONENT(SPECIES_WOBBUFFET) { } } WHEN { - TURN { MOVE(player, MOVE_METEOR_ASSAULT); MOVE(opponent, MOVE_METEOR_ASSAULT);} + TURN { MOVE(player, MOVE_METEOR_ASSAULT); MOVE(opponent, MOVE_METEOR_ASSAULT); } } } diff --git a/test/battle/move_effect_secondary/recoil_hp_25.c b/test/battle/move_effect_secondary/recoil_hp_25.c new file mode 100644 index 000000000..834b55aac --- /dev/null +++ b/test/battle/move_effect_secondary/recoil_hp_25.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Struggle (Secondary Move Effect) test titles") diff --git a/test/battle/move_effect_secondary/reflect.c b/test/battle/move_effect_secondary/reflect.c index 0b1dbf7fd..d0ada0792 100644 --- a/test/battle/move_effect_secondary/reflect.c +++ b/test/battle/move_effect_secondary/reflect.c @@ -21,8 +21,7 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") MOVE(player, MOVE_BADDY_BAD, hit: moveSuccess); } } SCENE { - if (moveSuccess == TRUE) - { + if (moveSuccess == TRUE) { ANIMATION(ANIM_TYPE_MOVE, MOVE_BADDY_BAD, player); MESSAGE("Reflect made your team stronger against physical moves!"); } else { @@ -33,3 +32,5 @@ SINGLE_BATTLE_TEST("Baddy Bad sets up Reflect when it was succesful") } } } + +TO_DO_BATTLE_TEST("Baddy Bad can still damage the target when Reflect is already set up"); diff --git a/test/battle/move_effect_secondary/remove_status.c b/test/battle/move_effect_secondary/remove_status.c index aef768423..02389a50e 100644 --- a/test/battle/move_effect_secondary/remove_status.c +++ b/test/battle/move_effect_secondary/remove_status.c @@ -19,8 +19,7 @@ SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind subst if (ability == ABILITY_INNER_FOCUS) { MESSAGE("The substitute took damage for the opposing Seismitoad!"); - NONE_OF - { + NONE_OF { MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. MESSAGE("The opposing Seismitoad was cured of paralysis!"); STATUS_ICON(opponent, none: TRUE); @@ -75,15 +74,17 @@ SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substit TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_WAKE_UP_SLAP); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); - if (ability == ABILITY_INNER_FOCUS) { + if (ability == ABILITY_INNER_FOCUS) + { MESSAGE("The substitute took damage for the opposing Seismitoad!"); - NONE_OF - { + NONE_OF { MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. MESSAGE("The opposing Seismitoad woke up!"); STATUS_ICON(opponent, none: TRUE); } - } else { + } + else + { MESSAGE("The opposing Seismitoad woke up!"); STATUS_ICON(opponent, none: TRUE); } @@ -104,9 +105,12 @@ SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") TURN { MOVE(player, MOVE_WAKE_UP_SLAP); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); - if (status1 == STATUS1_SLEEP) { + if (status1 == STATUS1_SLEEP) + { MESSAGE("The opposing Lotad fainted!"); - } else { + } + else + { NOT MESSAGE("The opposing Lotad fainted!"); MESSAGE("The opposing Lotad used Celebrate!"); } @@ -118,6 +122,7 @@ TO_DO_BATTLE_TEST("Wake-Up Slap gets increased power against Pokémon with Comat DOUBLE_BATTLE_TEST("Sparkling Aria cures burns from all Pokemon on the field and behind substitutes") { GIVEN { + ASSUME(MoveIgnoresSubstitute(MOVE_SPARKLING_ARIA)); ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLING_ARIA, MOVE_EFFECT_REMOVE_STATUS) == TRUE); ASSUME(GetMoveEffectArg_Status(MOVE_SPARKLING_ARIA) == STATUS1_BURN); PLAYER(SPECIES_PRIMARINA); diff --git a/test/battle/move_effect_secondary/salt_cure.c b/test/battle/move_effect_secondary/salt_cure.c index e304d2d44..70ba855b9 100644 --- a/test/battle/move_effect_secondary/salt_cure.c +++ b/test/battle/move_effect_secondary/salt_cure.c @@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Salt Cure inflicts 1/4 to Water/Steel types of their maximum { u32 species; - PARAMETRIZE { species = SPECIES_LAPRAS; }; - PARAMETRIZE { species = SPECIES_JIRACHI; }; + PARAMETRIZE { species = SPECIES_LAPRAS; } + PARAMETRIZE { species = SPECIES_JIRACHI; } GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -104,7 +104,7 @@ SINGLE_BATTLE_TEST("Salt Cure residual damage does not inflict any damage agains { GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); }; + OPPONENT(SPECIES_CLEFABLE) { Ability(ABILITY_MAGIC_GUARD); } } WHEN { TURN { MOVE(player, MOVE_SALT_CURE); } } SCENE { diff --git a/test/battle/move_effect/spectral_thief.c b/test/battle/move_effect_secondary/steal_stats.c similarity index 91% rename from test/battle/move_effect/spectral_thief.c rename to test/battle/move_effect_secondary/steal_stats.c index 885df9f5e..e407827d1 100644 --- a/test/battle/move_effect/spectral_thief.c +++ b/test/battle/move_effect_secondary/steal_stats.c @@ -1,15 +1,19 @@ #include "global.h" #include "test/battle.h" +ASSUMPTIONS +{ + ASSUME(MoveHasAdditionalEffect(MOVE_SPECTRAL_THIEF, MOVE_EFFECT_STEAL_STATS)); +} + SINGLE_BATTLE_TEST("Spectral Thief steals opponents boost before attacking", s16 damage) { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_CELEBRATE; } PARAMETRIZE { move = MOVE_SWORDS_DANCE; } GIVEN { ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_REGIROCK); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -33,7 +37,6 @@ SINGLE_BATTLE_TEST("Spectral Thief can't steal opponent's boost if target is imm { GIVEN { ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); - ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF); PLAYER(SPECIES_MEOWTH); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect_secondary/throat_chop.c b/test/battle/move_effect_secondary/throat_chop.c index c2724a0f3..3d6438a4b 100644 --- a/test/battle/move_effect_secondary/throat_chop.c +++ b/test/battle/move_effect_secondary/throat_chop.c @@ -9,8 +9,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Throat Chop prevents the usage of sound moves") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Speed(100); }; - OPPONENT(SPECIES_WOBBUFFET) { Speed(50); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(100); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { TURN { MOVE(player, MOVE_THROAT_CHOP); MOVE(opponent, MOVE_HYPER_VOICE); } TURN {} diff --git a/test/battle/move_effect_secondary/tri_attack.c b/test/battle/move_effect_secondary/tri_attack.c index 4ac69915e..308e3914f 100644 --- a/test/battle/move_effect_secondary/tri_attack.c +++ b/test/battle/move_effect_secondary/tri_attack.c @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Tri Attack cannot paralyze/burn/freeze electric/fire/ice typ PARAMETRIZE { statusAnim = B_ANIM_STATUS_BRN; rng = MOVE_EFFECT_BURN; species = SPECIES_ARCANINE; } PARAMETRIZE { statusAnim = B_ANIM_STATUS_FRZ; rng = MOVE_EFFECT_FREEZE_OR_FROSTBITE; species = SPECIES_GLALIE; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); } WHEN { diff --git a/test/battle/move_effect_secondary/wrap.c b/test/battle/move_effect_secondary/wrap.c index dc05bbe28..2e430871f 100644 --- a/test/battle/move_effect_secondary/wrap.c +++ b/test/battle/move_effect_secondary/wrap.c @@ -6,10 +6,14 @@ ASSUMPTIONS ASSUME(MoveHasAdditionalEffect(MOVE_WRAP, MOVE_EFFECT_WRAP)); } -SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 5 turns 50% of the time") +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 5 turns 25% (Gen3-4) or 50% (Gen5+) of the time") { - PASSES_RANDOMLY(50, 100, RNG_WRAP); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_4; passes = 25; trials = 100; } + PARAMETRIZE { config = GEN_5; passes = 50; trials = 100; } + PASSES_RANDOMLY(passes, trials, RNG_WRAP); GIVEN { + WITH_CONFIG(CONFIG_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -32,10 +36,14 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 5 turns 50% of the time" } } -SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 4 turns 50% of the time") +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 4 turns 25% (Gen3-4) or 50% (Gen5+) of the time") { - PASSES_RANDOMLY(50, 100, RNG_WRAP); + u32 config, passes, trials; + PARAMETRIZE { config = GEN_4; passes = 25; trials = 100; } + PARAMETRIZE { config = GEN_5; passes = 50; trials = 100; } + PASSES_RANDOMLY(passes, trials, RNG_WRAP); GIVEN { + WITH_CONFIG(CONFIG_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -56,9 +64,13 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon for 4 turns 50% of the time" } } -SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon 7 turns while holding a Grip Claw") +SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon 5 turns (Gen4) or 7 turns (Gen5+) while holding a Grip Claw") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_BINDING_TURNS, config); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_GRIP_CLAW); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -79,8 +91,10 @@ SINGLE_BATTLE_TEST("Wrap can damage the wrapped mon 7 turns while holding a Grip HP_BAR(opponent); // Residual Damage HP_BAR(opponent); // Residual Damage HP_BAR(opponent); // Residual Damage - HP_BAR(opponent); // Residual Damage - HP_BAR(opponent); // Residual Damage + if (config >= GEN_5) { + HP_BAR(opponent); // Residual Damage + HP_BAR(opponent); // Residual Damage + } NOT HP_BAR(opponent); // Residual Damage } } diff --git a/test/battle/move_effects_combined/flinch_status.c b/test/battle/move_effects_combined/flinch_status.c index 0d3717072..56b64e167 100644 --- a/test/battle/move_effects_combined/flinch_status.c +++ b/test/battle/move_effects_combined/flinch_status.c @@ -13,7 +13,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang inflict status 10% of the time") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_THUNDER_FANG; } PARAMETRIZE { move = MOVE_ICE_FANG; } @@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang inflict status 10% of the time") SINGLE_BATTLE_TEST("Thunder, Ice and Fire Fang cause the opponent to flinch 10% of the time") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_THUNDER_FANG; } PARAMETRIZE { move = MOVE_ICE_FANG; } diff --git a/test/battle/move_effects_combined/hurricane.c b/test/battle/move_effects_combined/hurricane.c index 96773ce58..0a1add9a4 100644 --- a/test/battle/move_effects_combined/hurricane.c +++ b/test/battle/move_effects_combined/hurricane.c @@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Hurricane bypasses accuracy checks in Rain") SINGLE_BATTLE_TEST("Hurricane can hit airborne targets (Fly, Bounce)") { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_FLY; } PARAMETRIZE { move = MOVE_BOUNCE; } GIVEN { diff --git a/test/battle/move_effects_combined/infernal_parade.c b/test/battle/move_effects_combined/infernal_parade.c index 266718d2e..4310dc887 100644 --- a/test/battle/move_effects_combined/infernal_parade.c +++ b/test/battle/move_effects_combined/infernal_parade.c @@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Infernal Parade's power doubles if the target has a status c PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } GIVEN { PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); }; + OPPONENT(SPECIES_WOBBUFFET) { Status1(status1); } } WHEN { TURN { MOVE(player, MOVE_INFERNAL_PARADE); } } SCENE { diff --git a/test/battle/move_effects_combined/make_it_rain.c b/test/battle/move_effects_combined/make_it_rain.c index 655a34f8b..ad59c35ef 100644 --- a/test/battle/move_effects_combined/make_it_rain.c +++ b/test/battle/move_effects_combined/make_it_rain.c @@ -82,6 +82,7 @@ DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if it hits b MESSAGE("Wobbuffet's Sp. Atk fell!"); } } + DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if second target Protects") { GIVEN { @@ -94,8 +95,8 @@ DOUBLE_BATTLE_TEST("Make It Rain lowers special attack by one stage if second ta } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_PROTECT, opponentRight); ANIMATION(ANIM_TYPE_MOVE, MOVE_MAKE_IT_RAIN, playerLeft); - HP_BAR(opponentLeft); NOT HP_BAR(opponentRight); + HP_BAR(opponentLeft); MESSAGE("Coins were scattered everywhere!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Wobbuffet's Sp. Atk fell!"); diff --git a/test/battle/move_effects_combined/mind_blown.c b/test/battle/move_effects_combined/mind_blown.c index 79ce35d12..9d9f0bdea 100644 --- a/test/battle/move_effects_combined/mind_blown.c +++ b/test/battle/move_effects_combined/mind_blown.c @@ -70,7 +70,7 @@ DOUBLE_BATTLE_TEST("Mind Blown causes the user to faint when below 1/2 of its Ma SINGLE_BATTLE_TEST("Mind Blown causes the user & the target to faint when below 1/2 of its Max HP") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(200) ; MaxHP(400); } + PLAYER(SPECIES_WOBBUFFET) { HP(200); MaxHP(400); } OPPONENT(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -78,9 +78,9 @@ SINGLE_BATTLE_TEST("Mind Blown causes the user & the target to faint when below } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, player); HP_BAR(opponent, hp: 0); - MESSAGE("The opposing Wobbuffet fainted!"); HP_BAR(player, hp: 0); MESSAGE("Wobbuffet fainted!"); + MESSAGE("The opposing Wobbuffet fainted!"); } } @@ -91,7 +91,8 @@ DOUBLE_BATTLE_TEST("Mind Blown causes everyone to faint in a double battle") PLAYER(SPECIES_WYNAUT) { HP(1); } OPPONENT(SPECIES_ABRA) { HP(1); } OPPONENT(SPECIES_KADABRA) { HP(1); } - OPPONENT(SPECIES_KADABRA); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); } WHEN { TURN { MOVE(playerLeft, MOVE_MIND_BLOWN); } } SCENE { @@ -99,11 +100,11 @@ DOUBLE_BATTLE_TEST("Mind Blown causes everyone to faint in a double battle") HP_BAR(opponentLeft, hp: 0); HP_BAR(playerRight, hp: 0); HP_BAR(opponentRight, hp: 0); + HP_BAR(playerLeft, hp: 0); + MESSAGE("Wobbuffet fainted!"); MESSAGE("The opposing Abra fainted!"); MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Kadabra fainted!"); - HP_BAR(playerLeft, hp: 0); - MESSAGE("Wobbuffet fainted!"); } } @@ -121,6 +122,29 @@ SINGLE_BATTLE_TEST("Mind Blown hp loss is prevented by Magic Guard") } } +DOUBLE_BATTLE_TEST("Mind Blown's recoil only happens once, regardless of number of affected targets") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(399); MaxHP(400); } + PLAYER(SPECIES_WYNAUT) { HP(1); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_ABRA) { HP(1); } + OPPONENT(SPECIES_KADABRA) { HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_MIND_BLOWN); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIND_BLOWN, playerLeft); + HP_BAR(opponentLeft, hp: 0); + HP_BAR(playerRight, hp: 0); + HP_BAR(opponentRight, hp: 0); + MESSAGE("The opposing Abra fainted!"); + MESSAGE("Wynaut fainted!"); + MESSAGE("The opposing Kadabra fainted!"); + } THEN { + EXPECT_GT(playerLeft->hp, 0); + } +} + SINGLE_BATTLE_TEST("Mind Blown is blocked by Damp") { GIVEN { diff --git a/test/battle/move_effects_combined/triple_arrows.c b/test/battle/move_effects_combined/triple_arrows.c index 80318e823..f9e0e550b 100644 --- a/test/battle/move_effects_combined/triple_arrows.c +++ b/test/battle/move_effects_combined/triple_arrows.c @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Triple Arrows has an increased critical hit ratio") } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_TRIPLE_ARROWS) == 1); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_flags/always_hits_in_hail_snow.c b/test/battle/move_flags/always_hits_in_hail_snow.c index 788186e7b..a44413390 100644 --- a/test/battle/move_flags/always_hits_in_hail_snow.c +++ b/test/battle/move_flags/always_hits_in_hail_snow.c @@ -3,7 +3,7 @@ SINGLE_BATTLE_TEST("Blizzard bypasses accuracy checks in Hail and Snow") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_HAIL; } PARAMETRIZE { move = MOVE_SNOWSCAPE; } PASSES_RANDOMLY(100, 100, RNG_ACCURACY); diff --git a/test/battle/move_flags/always_hits_in_rain.c b/test/battle/move_flags/always_hits_in_rain.c index c4c5b5138..6ee0d306d 100644 --- a/test/battle/move_flags/always_hits_in_rain.c +++ b/test/battle/move_flags/always_hits_in_rain.c @@ -1,15 +1,21 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Thunder bypasses accuracy checks in Rain") +SINGLE_BATTLE_TEST("Thunder and Bleakwind/Wildbolt/Sandsear Storm bypass accuracy checks in Rain") { + enum Move move; + PARAMETRIZE { move = MOVE_THUNDER; } + PARAMETRIZE { move = MOVE_BLEAKWIND_STORM; } + PARAMETRIZE { move = MOVE_WILDBOLT_STORM; } + PARAMETRIZE { move = MOVE_SANDSEAR_STORM; } PASSES_RANDOMLY(100, 100, RNG_ACCURACY); GIVEN { - ASSUME(MoveAlwaysHitsInRain(MOVE_THUNDER) == TRUE); + ASSUME(GetMoveAccuracy(move) < 100 && GetMoveAccuracy(move) > 0); + ASSUME(MoveAlwaysHitsInRain(move) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, MOVE_THUNDER); } + TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, move); } } SCENE { NONE_OF { MESSAGE("Wobbuffet's attack missed!"); } } diff --git a/test/battle/move_flags/cant_use_twice.c b/test/battle/move_flags/cant_use_twice.c index 3ed751b95..d5bcba21f 100644 --- a/test/battle/move_flags/cant_use_twice.c +++ b/test/battle/move_flags/cant_use_twice.c @@ -9,7 +9,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Struggle will be used if slow Encore is used on moves with the cantUseTwice flag") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { @@ -28,11 +28,11 @@ SINGLE_BATTLE_TEST("Struggle will be used if slow Encore is used on moves with t SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore is used") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { - WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -52,7 +52,7 @@ SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag strike again if fast encore SINGLE_BATTLE_TEST("Moves with the cantUseTwice flag alternate with Struggle if it is the only usable move left") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_GIGATON_HAMMER; } PARAMETRIZE { move = MOVE_BLOOD_MOON; } GIVEN { diff --git a/test/battle/move_flags/critical_hit_stage.c b/test/battle/move_flags/critical_hit_stage.c index d82b4334f..0712d49ac 100644 --- a/test/battle/move_flags/critical_hit_stage.c +++ b/test/battle/move_flags/critical_hit_stage.c @@ -11,7 +11,7 @@ SINGLE_BATTLE_TEST("criticalHitStage set to 1 increases critical hits occur at a } PASSES_RANDOMLY(passes, trials, RNG_CRITICAL_HIT); GIVEN { - WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CRIT_CHANCE, genConfig); ASSUME(GetMoveCriticalHitStage(MOVE_SLASH) == 1); ASSUME(GetSpeciesBaseSpeed(SPECIES_WOBBUFFET) == 33); PLAYER(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/explosion.c b/test/battle/move_flags/explosion.c similarity index 96% rename from test/battle/move_effect/explosion.c rename to test/battle/move_flags/explosion.c index 818517179..fa199330e 100644 --- a/test/battle/move_effect/explosion.c +++ b/test/battle/move_flags/explosion.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + ASSUME(IsExplosionMove(MOVE_EXPLOSION)); } SINGLE_BATTLE_TEST("Explosion causes the user to faint") @@ -32,8 +32,8 @@ SINGLE_BATTLE_TEST("Explosion causes the user & the target to faint") HP_BAR(player, hp: 0); ANIMATION(ANIM_TYPE_MOVE, MOVE_EXPLOSION, player); HP_BAR(opponent, hp: 0); - MESSAGE("The opposing Wobbuffet fainted!"); MESSAGE("Wobbuffet fainted!"); + MESSAGE("The opposing Wobbuffet fainted!"); } } @@ -84,10 +84,10 @@ DOUBLE_BATTLE_TEST("Explosion causes everyone to faint in a double battle") HP_BAR(opponentLeft, hp: 0); HP_BAR(playerRight, hp: 0); HP_BAR(opponentRight, hp: 0); + MESSAGE("Wobbuffet fainted!"); MESSAGE("The opposing Abra fainted!"); MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Kadabra fainted!"); - MESSAGE("Wobbuffet fainted!"); } } @@ -111,10 +111,10 @@ SINGLE_BATTLE_TEST("Explosion is blocked by Ability Damp") SINGLE_BATTLE_TEST("Explosion does not trigger Destiny Bond") { GIVEN { - PLAYER(SPECIES_WOBBUFFET) { HP(1); }; + PLAYER(SPECIES_WOBBUFFET) { HP(1); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_EXPLOSION);} + TURN { MOVE(player, MOVE_DESTINY_BOND); MOVE(opponent, MOVE_EXPLOSION); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); HP_BAR(opponent); @@ -134,14 +134,13 @@ DOUBLE_BATTLE_TEST("Explosion boosted by Galvanize is correctly blocked by Volt } WHEN { TURN { MOVE(playerLeft, MOVE_EXPLOSION); } } SCENE { - MESSAGE("Geodude used Explosion!"); HP_BAR(playerLeft, hp: 0); ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); NOT HP_BAR(opponentLeft, hp: 0); HP_BAR(playerRight, hp: 0); HP_BAR(opponentRight, hp: 0); + MESSAGE("Geodude fainted!"); MESSAGE("Wynaut fainted!"); MESSAGE("The opposing Wobbuffet fainted!"); - MESSAGE("Geodude fainted!"); } } diff --git a/test/battle/move_flags/ignores_target_ability.c b/test/battle/move_flags/ignores_target_ability.c index 4a533e7a0..799690460 100644 --- a/test/battle/move_flags/ignores_target_ability.c +++ b/test/battle/move_flags/ignores_target_ability.c @@ -11,7 +11,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own ability", s16 damage) { enum Ability ability; - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MAGIC_GUARD; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_UNAWARE; } @@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("ignoresTargetAbility moves do not ignore the attacker's own SINGLE_BATTLE_TEST("ignoresTargetAbility moves do ignore target's abilities", s16 damage) { enum Ability ability; - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_INNER_FOCUS; } PARAMETRIZE { move = MOVE_SUNSTEEL_STRIKE; ability = ABILITY_MULTISCALE; } diff --git a/test/battle/move_flags/powder.c b/test/battle/move_flags/powder.c index 989cfb642..bb109a252 100644 --- a/test/battle/move_flags/powder.c +++ b/test/battle/move_flags/powder.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Powder moves are blocked by Grass-type Pokémon (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, gen); + WITH_CONFIG(CONFIG_POWDER_GRASS, gen); ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(GetSpeciesType(SPECIES_ODDISH, 0) == TYPE_GRASS); PLAYER(SPECIES_WYNAUT); diff --git a/test/battle/move_flags/recoil.c b/test/battle/move_flags/recoil.c index c2b2e21b8..2593a0e1f 100644 --- a/test/battle/move_flags/recoil.c +++ b/test/battle/move_flags/recoil.c @@ -89,7 +89,7 @@ SINGLE_BATTLE_TEST("Recoil: Flare Blitz is absorbed by Flash Fire and no recoil GIVEN { ASSUME(GetMoveRecoil(MOVE_FLARE_BLITZ) > 0); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_VULPIX) { Ability(ABILITY_FLASH_FIRE); }; + OPPONENT(SPECIES_VULPIX) { Ability(ABILITY_FLASH_FIRE); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_FLARE_BLITZ); } } SCENE { @@ -111,7 +111,7 @@ SINGLE_BATTLE_TEST("Recoil: The correct amount of recoil damage is dealt after t GIVEN { ASSUME(GetMoveRecoil(MOVE_TAKE_DOWN) == 25); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }; + OPPONENT(SPECIES_WOBBUFFET) { MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); } } WHEN { TURN { MOVE(player, MOVE_TAKE_DOWN); } } SCENE { @@ -122,3 +122,18 @@ SINGLE_BATTLE_TEST("Recoil: The correct amount of recoil damage is dealt after t EXPECT_MUL_EQ(directDamage, UQ_4_12(0.25), recoilDamage); } } + +SINGLE_BATTLE_TEST("Recoil: No recoil is taken if the move is blocked by Disguise") +{ + GIVEN { + ASSUME(GetMoveRecoil(MOVE_FLARE_BLITZ) > 0); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_MIMIKYU) { Ability(ABILITY_DISGUISE); } + } WHEN { + TURN { MOVE(player, MOVE_FLARE_BLITZ); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLARE_BLITZ, player); + } THEN { + EXPECT_EQ(player->hp, player->maxHP); + } +} diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index e45945a29..96ba350b8 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -286,7 +286,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Yawn will fail when sleep clause is active") OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_YAWN); } - TURN { } + TURN {} TURN { SWITCH(player, 1); MOVE(opponent, MOVE_YAWN); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_YAWN, opponent); @@ -302,12 +302,12 @@ SINGLE_BATTLE_TEST("Sleep Clause: Yawn will fail when sleep clause is active") } } -SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with sleep clause active") +SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% (Gen5+) of the time with sleep clause active") { PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -318,7 +318,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with TURN { MOVE(opponent, MOVE_SPORE); } TURN { SWITCH(player, 1); } TURN { MOVE(player, MOVE_SCRATCH); } - TURN { } + TURN {} } SCENE { ABILITY_POPUP(opponent, ABILITY_EFFECT_SPORE); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); @@ -327,12 +327,12 @@ SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with } } -DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with sleep clause active (Doubles)") +DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% (Gen5+) of the time with sleep clause active (Doubles)") { PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -341,7 +341,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } } WHEN { - TURN { MOVE(opponentLeft, MOVE_SPORE, target:playerRight); MOVE(playerLeft, MOVE_SCRATCH, target:opponentLeft);} + TURN { MOVE(opponentLeft, MOVE_SPORE, target:playerRight); MOVE(playerLeft, MOVE_SCRATCH, target:opponentLeft); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponentLeft); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, playerRight); @@ -360,7 +360,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -388,7 +388,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -572,7 +572,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up with Aromatherapy / Heal Bell / Sparkly Swirl") { - u32 move = MOVE_NONE, switchIndex = 0; + enum Move move = MOVE_NONE; + u32 switchIndex = 0; struct BattlePokemon *healingSlot = opponentRight; struct BattlePokemon *sporedSlot = opponentLeft; PARAMETRIZE { move = MOVE_AROMATHERAPY; healingSlot = opponentRight; sporedSlot = opponentLeft; switchIndex = 0; } @@ -719,7 +720,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by using Sleep Talk into a status curing move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_PSYCHO_SHIFT; } PARAMETRIZE { move = MOVE_JUNGLE_HEALING; } PARAMETRIZE { move = MOVE_LUNAR_BLESSING; } @@ -834,11 +835,14 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mon is woken up by Shed Skin") { - if (B_ABILITY_TRIGGER_CHANCE == GEN_4) - PASSES_RANDOMLY(30, 100, RNG_SHED_SKIN); - else - PASSES_RANDOMLY(33, 100, RNG_SHED_SKIN); + u32 config, passes; + PARAMETRIZE { config = GEN_3; passes = 33; } + PARAMETRIZE { config = GEN_4; passes = 30; } + PARAMETRIZE { config = GEN_5; passes = 33; } + + PASSES_RANDOMLY(passes, 100, RNG_SHED_SKIN); GIVEN { + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, config); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); @@ -1019,7 +1023,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo OPPONENT(SPECIES_ZIGZAGOON); } WHEN { TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentLeft); MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); } - TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentRight);} + TURN { MOVE(playerLeft, MOVE_SPORE, target: opponentRight); } } SCENE { MESSAGE("Zigzagoon used Spore!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, playerLeft); @@ -1216,7 +1220,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep caused by Effect Spore does not prevent PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); @@ -1253,7 +1257,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(MoveMakesContact(MOVE_SCRATCH)); @@ -1265,6 +1269,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat TURN {} TURN {} TURN {} + TURN {} + TURN {} TURN { MOVE(opponent, MOVE_SPORE); } TURN { SWITCH(player, 1); MOVE(opponent, MOVE_SPORE); } } SCENE { @@ -1291,7 +1297,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); @@ -1468,6 +1474,7 @@ SINGLE_BATTLE_TEST("Sleep Clause: Yawn'd Pokémon slept due to Effect Spore befo PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); + WITH_CONFIG(CONFIG_ABILITY_TRIGGER_CHANCE, GEN_5); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); @@ -1533,7 +1540,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: If both Pokémon on one side are Yawn'd at the OPPONENT(SPECIES_ZIGZAGOON) { Speed(2); } } WHEN { TURN { MOVE(playerLeft, MOVE_YAWN, target: opponentLeft); MOVE(playerRight, MOVE_YAWN, target: opponentRight); } - TURN { } + TURN {} } SCENE { MESSAGE("The opposing Zigzagoon grew drowsy!"); MESSAGE("The opposing Zigzagoon grew drowsy!"); @@ -1772,7 +1779,7 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your pa DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prevented when sleep clause is active") { GIVEN { - WITH_CONFIG(GEN_CONFIG_ENCORE_TARGET, GEN_3); + WITH_CONFIG(CONFIG_ENCORE_TARGET, GEN_3); FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c index d5e6b5c26..3be1ad6e0 100644 --- a/test/battle/spread_moves.c +++ b/test/battle/spread_moves.c @@ -6,7 +6,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Ability and Item effects activate correctly af GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); } - OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(260); HP(131); }; + OPPONENT(SPECIES_GOLISOPOD) { Ability(ABILITY_EMERGENCY_EXIT); MaxHP(260); HP(131); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } OPPONENT(SPECIES_WYNAUT); OPPONENT(SPECIES_PIKACHU); @@ -36,8 +36,8 @@ DOUBLE_BATTLE_TEST("Spread Moves: No damage will be dealt to a mon in an invulne PARAMETRIZE { attackingMove = MOVE_HYPER_VOICE; invulMove = MOVE_DIVE; } PARAMETRIZE { attackingMove = MOVE_LAVA_PLUME; invulMove = MOVE_DIVE; } GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); - ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ZAPDOS); @@ -172,7 +172,8 @@ DOUBLE_BATTLE_TEST("Spread Moves: A spread move attack will be weakened by stron DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and Lightning Rod (left)") { GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MIMIKYU); @@ -182,16 +183,17 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (right) and TURN { MOVE(playerLeft, MOVE_DISCHARGE); } } SCENE { ABILITY_POPUP(opponentLeft, ABILITY_LIGHTNING_ROD); + ABILITY_POPUP(opponentRight, ABILITY_VOLT_ABSORB); ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); ABILITY_POPUP(playerRight, ABILITY_DISGUISE); - ABILITY_POPUP(opponentRight, ABILITY_VOLT_ABSORB); } } DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and Lightning Rod (right)") { GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + WITH_CONFIG(CONFIG_REDIRECT_ABILITY_IMMUNITY, GEN_5); + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_MIMIKYU); @@ -200,8 +202,8 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and L } WHEN { TURN { MOVE(playerLeft, MOVE_DISCHARGE); } } SCENE { - ABILITY_POPUP(opponentRight, ABILITY_LIGHTNING_ROD); ABILITY_POPUP(opponentLeft, ABILITY_VOLT_ABSORB); + ABILITY_POPUP(opponentRight, ABILITY_LIGHTNING_ROD); ANIMATION(ANIM_TYPE_MOVE, MOVE_DISCHARGE, playerLeft); ABILITY_POPUP(playerRight, ABILITY_DISGUISE); } @@ -210,7 +212,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Disguise, Volt Absorb (left) and L DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Eiscue and Mimikyu (Based on vanilla games)") { GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_EISCUE); @@ -229,7 +231,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: AOE move vs Eiscue and Mimikyu (Based on vanil DOUBLE_BATTLE_TEST("Spread Moves: Spread move, Gem Boosted, vs Resist Berries") { GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); } PLAYER(SPECIES_WYNAUT) { Speed(30); } OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); } @@ -249,7 +251,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Spread move, Gem Boosted, vs Resist Berries") DOUBLE_BATTLE_TEST("Spread Moves: Explosion, Gem Boosted, vs Resist Berries") { GIVEN { - ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == TARGET_FOES_AND_ALLY); PLAYER(SPECIES_WOBBUFFET) { Speed(40); Item(ITEM_NORMAL_GEM); } PLAYER(SPECIES_MISDREAVUS) { Speed(30); } OPPONENT(SPECIES_WOBBUFFET) { Speed(20); Item(ITEM_CHILAN_BERRY); } @@ -270,7 +272,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Explosion, Gem Boosted, vs Resist Berries") DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Eiscue and Mimikyu with 1 Eject Button") { GIVEN { - ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_RAZOR_LEAF) == TARGET_BOTH); ASSUME(GetMoveCategory(MOVE_RAZOR_LEAF) == DAMAGE_CATEGORY_PHYSICAL); PLAYER(SPECIES_WOBBUFFET) { Speed(40); } PLAYER(SPECIES_WYNAUT) { Speed(30); } @@ -290,7 +292,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Eiscue and Mimikyu with 1 Eject DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Wide Guard") { GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET) { Speed(40); } PLAYER(SPECIES_WYNAUT) { Speed(20); } OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } @@ -310,7 +312,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs Wide Guard") DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs one protecting mon") { GIVEN { - ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); @@ -327,7 +329,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Spread move vs one protecting mon") DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both opposing mons") { GIVEN { - ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GOLEM); @@ -345,7 +347,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both opposing mons" DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both player mons") { GIVEN { - ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == TARGET_BOTH); PLAYER(SPECIES_GOLEM); PLAYER(SPECIES_ONIX); OPPONENT(SPECIES_WOBBUFFET); @@ -363,7 +365,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Super Effective Message on both player mons") DOUBLE_BATTLE_TEST("Spread Moves: Not very effective Message on both opposing mons") { GIVEN { - ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_CHIKORITA); @@ -381,7 +383,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Not very effective Message on both opposing mo DOUBLE_BATTLE_TEST("Spread Moves: Not very effective message on both player mons") { GIVEN { - ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == TARGET_BOTH); PLAYER(SPECIES_CHIKORITA); PLAYER(SPECIES_TREECKO); OPPONENT(SPECIES_WOBBUFFET); @@ -399,7 +401,7 @@ DOUBLE_BATTLE_TEST("Spread Moves: Not very effective message on both player mons DOUBLE_BATTLE_TEST("Spread Moves: Doesn't affect message on both opposing mons") { GIVEN { - ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == MOVE_TARGET_BOTH); + ASSUME(GetMoveTarget(MOVE_PRECIPICE_BLADES) == TARGET_BOTH); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_PIDGEY); @@ -453,3 +455,22 @@ DOUBLE_BATTLE_TEST("Spread Moves: Focus Sash activates correctly") MESSAGE("The opposing Wynaut fainted!"); } } + +DOUBLE_BATTLE_TEST("Spread Moves: AOE ground type move vs Levitate and Air Balloon") +{ + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == TARGET_FOES_AND_ALLY); + ASSUME(GetMoveCategory(MOVE_EARTHQUAKE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_FLYGON) { Ability(ABILITY_LEVITATE); } + OPPONENT(SPECIES_WYNAUT) { Item(ITEM_AIR_BALLOON); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_LEVITATE); + MESSAGE("It doesn't affect the opposing Wynaut…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + HP_BAR(playerRight); + } +} diff --git a/test/battle/starting_status/hazards.c b/test/battle/starting_status/hazards.c new file mode 100644 index 000000000..63c2e3ec9 --- /dev/null +++ b/test/battle/starting_status/hazards.c @@ -0,0 +1,261 @@ +#include "global.h" +#include "event_data.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("SetStartingStatus can start Spikes on the opposing side", s16 damage) +{ + u16 startingHazard; + u32 divisor; + + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_OPPONENT_L1; divisor = 8; } + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_OPPONENT_L2; divisor = 6; } + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_OPPONENT_L3; divisor = 4; } + + SetStartingStatus(startingHazard); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Wynaut!"); + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(opponent, damage: maxHP / divisor); + MESSAGE("The opposing Wynaut was hurt by the spikes!"); + } FINALLY { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Toxic Spikes poison the opposing switch-in") +{ + SetStartingStatus(STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L1); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Wynaut!"); + MESSAGE("The opposing Wynaut was poisoned!"); + STATUS_ICON(opponent, poison: TRUE); + NOT STATUS_ICON(opponent, badPoison: TRUE); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Toxic Spikes badly poison the opposing switch-in") +{ + SetStartingStatus(STARTING_STATUS_TOXIC_SPIKES_OPPONENT_L2); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Wynaut!"); + MESSAGE("The opposing Wynaut was badly poisoned!"); + STATUS_ICON(opponent, badPoison: TRUE); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Sticky Web lowers Speed on entry") +{ + SetStartingStatus(STARTING_STATUS_STICKY_WEB_OPPONENT); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_RATICATE); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Wynaut!"); + MESSAGE("The opposing Wynaut was caught in a sticky web!"); + MESSAGE("The opposing Wynaut's Speed fell!"); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Stealth Rock damages the opposing switch-in") +{ + SetStartingStatus(STARTING_STATUS_STEALTH_ROCK_OPPONENT); + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_CHARIZARD].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_CHARIZARD].types[1] == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_CHARIZARD); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Charizard!"); + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(opponent, damage: maxHP / 2); + MESSAGE("Pointed stones dug into the opposing Charizard!"); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting sharp steel damages the opposing switch-in") +{ + SetStartingStatus(STARTING_STATUS_SHARP_STEEL_OPPONENT); + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SYLVEON].types[0] == TYPE_FAIRY); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SYLVEON); + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + MESSAGE("2 sent out Sylveon!"); + s32 maxHP = GetMonData(&OPPONENT_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(opponent, damage: maxHP / 4); + MESSAGE("The sharp steel bit into the opposing Sylveon!"); + } THEN { + ResetStartingStatuses(); + } +} + +// Player-side hazard tests + +SINGLE_BATTLE_TEST("SetStartingStatus can start Spikes on the player side", s16 damage) +{ + u16 startingHazard; + u32 divisor; + + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_PLAYER_L1; divisor = 8; } + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_PLAYER_L2; divisor = 6; } + PARAMETRIZE { startingHazard = STARTING_STATUS_SPIKES_PLAYER_L3; divisor = 4; } + + SetStartingStatus(startingHazard); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Wynaut!"); + s32 maxHP = GetMonData(&PLAYER_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / divisor); + MESSAGE("Wynaut was hurt by the spikes!"); + } FINALLY { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Toxic Spikes poison the player's switch-in") +{ + SetStartingStatus(STARTING_STATUS_TOXIC_SPIKES_PLAYER_L1); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Wynaut!"); + MESSAGE("Wynaut was poisoned!"); + STATUS_ICON(player, poison: TRUE); + NOT STATUS_ICON(player, badPoison: TRUE); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Toxic Spikes badly poison the player's switch-in") +{ + SetStartingStatus(STARTING_STATUS_TOXIC_SPIKES_PLAYER_L2); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Wynaut!"); + MESSAGE("Wynaut was badly poisoned!"); + STATUS_ICON(player, badPoison: TRUE); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Sticky Web lowers Speed on player's entry") +{ + SetStartingStatus(STARTING_STATUS_STICKY_WEB_PLAYER); + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Wynaut!"); + MESSAGE("Wynaut was caught in a sticky web!"); + MESSAGE("Wynaut's Speed fell!"); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting Stealth Rock damages the player's switch-in") +{ + SetStartingStatus(STARTING_STATUS_STEALTH_ROCK_PLAYER); + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_CHARIZARD].types[0] == TYPE_FIRE); + ASSUME(gSpeciesInfo[SPECIES_CHARIZARD].types[1] == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CHARIZARD); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Charizard!"); + s32 maxHP = GetMonData(&PLAYER_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / 2); + MESSAGE("Pointed stones dug into Charizard!"); + } THEN { + ResetStartingStatuses(); + } +} + +SINGLE_BATTLE_TEST("Starting sharp steel damages the player's switch-in") +{ + SetStartingStatus(STARTING_STATUS_SHARP_STEEL_PLAYER); + + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SYLVEON].types[0] == TYPE_FAIRY); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_SYLVEON); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { SWITCH(player, 1); } + } SCENE { + MESSAGE("Go! Sylveon!"); + s32 maxHP = GetMonData(&PLAYER_PARTY[1], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / 4); + MESSAGE("The sharp steel bit into Sylveon!"); + } THEN { + ResetStartingStatuses(); + } +} diff --git a/test/battle/starting_status/terrain.c b/test/battle/starting_status/terrain.c index 3d84dba00..db4560f69 100644 --- a/test/battle/starting_status/terrain.c +++ b/test/battle/starting_status/terrain.c @@ -2,9 +2,7 @@ #include "event_data.h" #include "test/battle.h" -#if B_VAR_STARTING_STATUS != 0 - -SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS starts a chosen terrain at the beginning of battle and lasts infinitely long") +SINGLE_BATTLE_TEST("SetStartingStatus starts a chosen terrain at the beginning of battle and lasts infinitely long if it's defined as such") { u16 terrain; @@ -12,22 +10,22 @@ SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS starts a chosen terrain at the beginni PARAMETRIZE { terrain = STARTING_STATUS_PSYCHIC_TERRAIN; } PARAMETRIZE { terrain = STARTING_STATUS_MISTY_TERRAIN; } PARAMETRIZE { terrain = STARTING_STATUS_ELECTRIC_TERRAIN; } + PARAMETRIZE { terrain = STARTING_STATUS_ELECTRIC_TERRAIN_TEMPORARY; } - VarSet(B_VAR_STARTING_STATUS, terrain); - VarSet(B_VAR_STARTING_STATUS_TIMER, 0); + SetStartingStatus(terrain); GIVEN { PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { // More than 5 turns - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} } SCENE { switch (terrain) { @@ -45,15 +43,20 @@ SINGLE_BATTLE_TEST("B_VAR_STARTING_STATUS starts a chosen terrain at the beginni break; } ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); - MESSAGE("The weirdness disappeared from the battlefield!"); + if (terrain != STARTING_STATUS_ELECTRIC_TERRAIN_TEMPORARY) { + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); + MESSAGE("The weirdness disappeared from the battlefield!"); + MESSAGE("The electricity disappeared from the battlefield."); + MESSAGE("The mist disappeared from the battlefield."); + MESSAGE("The grass disappeared from the battlefield."); + } + } else { MESSAGE("The electricity disappeared from the battlefield."); - MESSAGE("The mist disappeared from the battlefield."); - MESSAGE("The grass disappeared from the battlefield."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); } } THEN { - VarSet(B_VAR_STARTING_STATUS, 0); + ResetStartingStatuses(); } } @@ -64,8 +67,7 @@ SINGLE_BATTLE_TEST("Terrain started after the one which started the battle lasts PARAMETRIZE { viaMove = TRUE; } PARAMETRIZE { viaMove = FALSE; } - VarSet(B_VAR_STARTING_STATUS, STARTING_STATUS_ELECTRIC_TERRAIN); - VarSet(B_VAR_STARTING_STATUS_TIMER, 0); + SetStartingStatus(STARTING_STATUS_ELECTRIC_TERRAIN); GIVEN { PLAYER(SPECIES_TAPU_BULU) { Ability(viaMove == TRUE ? ABILITY_TELEPATHY : ABILITY_GRASSY_SURGE); } @@ -73,12 +75,12 @@ SINGLE_BATTLE_TEST("Terrain started after the one which started the battle lasts } WHEN { // More than 5 turns TURN { MOVE(player, viaMove == TRUE ? MOVE_GRASSY_TERRAIN : MOVE_CELEBRATE); } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } - TURN { ; } + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} + TURN {} } SCENE { // Electric Terrain at battle's start MESSAGE("An electric current is running across the battlefield!"); @@ -107,8 +109,6 @@ SINGLE_BATTLE_TEST("Terrain started after the one which started the battle lasts MESSAGE("The grass disappeared from the battlefield."); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG); } THEN { - VarSet(B_VAR_STARTING_STATUS, 0); + ResetStartingStatuses(); } } - -#endif // B_VAR_STARTING_STATUS diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index 8ec9d0583..d28330759 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -7,10 +7,13 @@ ASSUMPTIONS ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); } -SINGLE_BATTLE_TEST("Burn deals 1/16th (Gen7+) or 1/8th damage per turn") +SINGLE_BATTLE_TEST("Burn deals 1/8th damage (Gen2-6) or 1/16th (Gen1 and Gen7+) per turn") { - u32 j; + u32 j, config, value; + PARAMETRIZE { config = GEN_7; value = 16; } + PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -19,7 +22,7 @@ SINGLE_BATTLE_TEST("Burn deals 1/16th (Gen7+) or 1/8th damage per turn") } SCENE { s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); for (j = 0; j < 4; j++) - HP_BAR(player, damage: maxHP / ((B_BURN_DAMAGE >= GEN_7) ? 16 : 8)); + HP_BAR(player, damage: maxHP / value); } } diff --git a/test/battle/status1/freeze.c b/test/battle/status1/freeze.c index 12104438a..89f0b9110 100644 --- a/test/battle/status1/freeze.c +++ b/test/battle/status1/freeze.c @@ -50,7 +50,7 @@ SINGLE_BATTLE_TEST("Freeze isn't thawed if opponent is asleep during thawing att GIVEN { ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } - OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); }; + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_SLEEP); } } WHEN { TURN { MOVE(opponent, MOVE_EMBER); MOVE(player, MOVE_CELEBRATE); } } SCENE { diff --git a/test/battle/status1/frostbite.c b/test/battle/status1/frostbite.c index e221a0eae..dc28ba93d 100644 --- a/test/battle/status1/frostbite.c +++ b/test/battle/status1/frostbite.c @@ -23,11 +23,14 @@ SINGLE_BATTLE_TEST("Frostbite reduces the special attack by 50 percent") } THEN { EXPECT_EQ(reducedDamage * 2, normaleDamage); } } -SINGLE_BATTLE_TEST("Frostbite deals 1/16th (Gen7+) or 1/8th damage to affected Pokémon") +SINGLE_BATTLE_TEST("Frostbite deals 1/8th damage (Gen1-6) or 1/16th (Gen7+) per turn") { s16 frostbiteDamage; - + u32 config, value; + PARAMETRIZE { config = GEN_7; value = 16; } + PARAMETRIZE { config = GEN_6; value = 8; } GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FROSTBITE); } } WHEN { @@ -36,12 +39,14 @@ SINGLE_BATTLE_TEST("Frostbite deals 1/16th (Gen7+) or 1/8th damage to affected P MESSAGE("The opposing Wobbuffet was hurt by its frostbite!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_FRB, opponent); HP_BAR(opponent, captureDamage: &frostbiteDamage); - } THEN { EXPECT_EQ(frostbiteDamage, opponent->maxHP / ((B_BURN_DAMAGE >= GEN_7) ? 16 : 8)); } + } THEN { + EXPECT_EQ(frostbiteDamage, opponent->maxHP / value); + } } SINGLE_BATTLE_TEST("Frostbite is healed if hit with a thawing move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_FLAME_WHEEL; } PARAMETRIZE { move = MOVE_SACRED_FIRE; } @@ -68,7 +73,7 @@ SINGLE_BATTLE_TEST("Frostbite is healed if hit with a thawing move") SINGLE_BATTLE_TEST("Frostbite is healed when the user uses a thawing move") { - u32 move; + enum Move move; PARAMETRIZE { move = MOVE_FLAME_WHEEL; } PARAMETRIZE { move = MOVE_SACRED_FIRE; } diff --git a/test/battle/status1/paralysis.c b/test/battle/status1/paralysis.c index 0be8cf1ef..fa78387af 100644 --- a/test/battle/status1/paralysis.c +++ b/test/battle/status1/paralysis.c @@ -10,7 +10,7 @@ SINGLE_BATTLE_TEST("Paralysis reduces Speed by 50% (Gen 7+) or 75% (Gen 1-6)") PARAMETRIZE { playerSpeed = 98; playerFirst = FALSE; genConfig = GEN_7; } PARAMETRIZE { playerSpeed = 102; playerFirst = TRUE; genConfig = GEN_7; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYSIS_SPEED, genConfig); + WITH_CONFIG(CONFIG_PARALYSIS_SPEED, genConfig); PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_PARALYSIS); Speed(playerSpeed); } OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } } WHEN { @@ -56,7 +56,7 @@ AI_SINGLE_BATTLE_TEST("AI avoids Thunder Wave when it can not paralyse target") PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_STATIC; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, GEN_6); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(species) { Ability(ability); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_THUNDER_WAVE); } @@ -71,7 +71,7 @@ SINGLE_BATTLE_TEST("Thunder Wave doesn't affect Electric types (Gen6+)") PARAMETRIZE { gen = GEN_5; } PARAMETRIZE { gen = GEN_6; } GIVEN { - WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, gen); + WITH_CONFIG(CONFIG_PARALYZE_ELECTRIC, gen); ASSUME(GetSpeciesType(SPECIES_PIKACHU, 0) == TYPE_ELECTRIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_PIKACHU); diff --git a/test/battle/status1/sleep.c b/test/battle/status1/sleep.c index a43daf8d6..5cb60668b 100644 --- a/test/battle/status1/sleep.c +++ b/test/battle/status1/sleep.c @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sleep prevents the battler from using a move") SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_5); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_5); ASSUME(IsPowderMove(MOVE_SPORE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHIKORITA); @@ -39,7 +39,7 @@ SINGLE_BATTLE_TEST("Sleep: Spore affects grass types (Gen1-5)") SINGLE_BATTLE_TEST("Sleep: Spore doesn't affect grass types (Gen6+)") { GIVEN { - WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6); + WITH_CONFIG(CONFIG_POWDER_GRASS, GEN_6); ASSUME(IsPowderMove(MOVE_SPORE)); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_CHIKORITA); diff --git a/test/battle/switch_in_abilities.c b/test/battle/switch_in_abilities.c index 4d125ddce..4dd4f1bcb 100644 --- a/test/battle/switch_in_abilities.c +++ b/test/battle/switch_in_abilities.c @@ -12,7 +12,7 @@ SINGLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order at the battle's s PLAYER(SPECIES_EKANS) { Speed(spdPlayer); Ability(ABILITY_INTIMIDATE); } OPPONENT(SPECIES_NINETALES) { Speed(spdOpponent); Ability(ABILITY_DROUGHT); } } WHEN { - TURN { ; } + TURN {} } SCENE { if (spdPlayer > spdOpponent) { ABILITY_POPUP(player, ABILITY_INTIMIDATE); @@ -38,7 +38,7 @@ DOUBLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order at the battle's s OPPONENT(SPECIES_PORYGON2) { Speed(spdOpponent1); Ability(ABILITY_DOWNLOAD); } OPPONENT(SPECIES_PINSIR) { Speed(spdOpponent2); Ability(ABILITY_MOLD_BREAKER); } } WHEN { - TURN { ; } + TURN {} } SCENE { if (spdPlayer1 == 5) { ABILITY_POPUP(playerLeft, ABILITY_DRIZZLE); @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swi OPPONENT(SPECIES_PORYGON2) { Speed(spdOpponent); Ability(ABILITY_DOWNLOAD); } } WHEN { TURN { MOVE(player, MOVE_EXPLOSION); SEND_OUT(player, 1); SEND_OUT(opponent, 1); } - TURN { ; } + TURN {} } SCENE { MESSAGE("Wobbuffet used Explosion!"); if (spdPlayer > spdOpponent) { @@ -105,7 +105,7 @@ DOUBLE_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swi OPPONENT(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } } WHEN { TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 2); SEND_OUT(opponentLeft, 2); SEND_OUT(playerRight, 3); SEND_OUT(opponentRight, 3); } - TURN { ; } + TURN {} } SCENE { MESSAGE("Wobbuffet used Explosion!"); if (spdPlayer1 == 5) { @@ -146,7 +146,7 @@ MULTI_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO swit MULTI_OPPONENT_B(SPECIES_VULPIX_ALOLA) { Speed(spdOpponent2); Ability(ABILITY_SNOW_WARNING); } } WHEN { TURN { MOVE(playerLeft, MOVE_EXPLOSION); SEND_OUT(playerLeft, 1); SEND_OUT(opponentLeft, 1); SEND_OUT(playerRight, 4); SEND_OUT(opponentRight, 4); } - TURN { ; } + TURN {} } SCENE { MESSAGE("Wobbuffet used Explosion!"); if (spdPlayer1 == 5) { @@ -247,3 +247,23 @@ ONE_VS_TWO_BATTLE_TEST("Switch-in abilities trigger in Speed Order after post-KO } } } + +DOUBLE_BATTLE_TEST("Status setting abilities don't re-activate when a new mon switches in") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); } + TURN {} + TURN {} + TURN {} + TURN {} + TURN { SWITCH(opponentLeft, 2); NOT ABILITY_POPUP(opponentRight, ABILITY_ELECTRIC_SURGE); } + } THEN { + EXPECT(!(gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN)); + } +} diff --git a/test/battle/test_runner_features.c b/test/battle/test_runner_features.c index 2c6d73abc..d76740a08 100644 --- a/test/battle/test_runner_features.c +++ b/test/battle/test_runner_features.c @@ -13,11 +13,11 @@ SINGLE_BATTLE_TEST("Forced abilities activate on switch-in") { GIVEN { PLAYER(SPECIES_ALAKAZAM); - PLAYER(SPECIES_KADABRA) { Ability(ABILITY_QUARK_DRIVE); SpAttack(400);} + PLAYER(SPECIES_KADABRA) { Ability(ABILITY_QUARK_DRIVE); SpAttack(400); } OPPONENT(SPECIES_ARON); - OPPONENT(SPECIES_ALAKAZAM) { Ability(ABILITY_ELECTRIC_SURGE); }; + OPPONENT(SPECIES_ALAKAZAM) { Ability(ABILITY_ELECTRIC_SURGE); } } WHEN { - TURN { SWITCH(player, 1); SWITCH(opponent, 1);} + TURN { SWITCH(player, 1); SWITCH(opponent, 1); } } SCENE { ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); @@ -30,15 +30,15 @@ SINGLE_BATTLE_TEST("Setting level doesn't overwrite set stats") { u32 level = 0; - PARAMETRIZE{level = 1;} - PARAMETRIZE{level = 10;} - PARAMETRIZE{level = 50;} - PARAMETRIZE{level = 99;} + PARAMETRIZE { level = 1; } + PARAMETRIZE { level = 10; } + PARAMETRIZE { level = 50; } + PARAMETRIZE { level = 99; } GIVEN { - PLAYER(SPECIES_WOBBUFFET) {HP(5); MaxHP(10); Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Level(level); }; - OPPONENT(SPECIES_WOBBUFFET) {Speed(1);} + PLAYER(SPECIES_WOBBUFFET) { HP(5); MaxHP(10); Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Level(level); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } } WHEN { - TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE);} + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } } THEN { EXPECT_EQ(player->hp, 5); EXPECT_EQ(player->maxHP, 10); @@ -53,8 +53,8 @@ SINGLE_BATTLE_TEST("Setting level doesn't overwrite set stats") SINGLE_BATTLE_TEST("Changing forms doesn't overwrite set stats (not HP)") { GIVEN { - PLAYER(SPECIES_DIANCIE) {Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Item(ITEM_DIANCITE);} - OPPONENT(SPECIES_WOBBUFFET) {Speed(1);} + PLAYER(SPECIES_DIANCIE) { Attack(10); Defense(10); Speed(10); SpAttack(10); SpDefense(10); Item(ITEM_DIANCITE); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } } WHEN { TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } } SCENE { @@ -71,12 +71,26 @@ SINGLE_BATTLE_TEST("Changing forms doesn't overwrite set stats (not HP)") SINGLE_BATTLE_TEST("Changing forms doesn't overwrite set stats (HP)") { GIVEN { - PLAYER(SPECIES_TERAPAGOS) {HP(5); MaxHP(10); TeraType(TYPE_STELLAR);} - OPPONENT(SPECIES_WOBBUFFET) {} + PLAYER(SPECIES_TERAPAGOS) { HP(5); MaxHP(10); TeraType(TYPE_STELLAR); } + OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CELEBRATE);} + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_TERA); MOVE(opponent, MOVE_CELEBRATE); } } THEN { EXPECT_EQ(player->hp, 5); EXPECT_EQ(player->maxHP, 10); } } + +MULTI_BATTLE_TEST("Multi Battle Tests register partner's status1") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_B(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(playerLeft, MOVE_WILL_O_WISP, target: playerRight); } + } SCENE { + STATUS_ICON(playerRight, STATUS1_BURN); + } +} diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index 1821cebcb..66bc33323 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -295,3 +295,12 @@ TEST("trainerproc supports both Double Battle: Yes and Battle Type: Doubles") const struct Trainer trainer = sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer]; EXPECT(trainer.battleType == TRAINER_BATTLE_TYPE_DOUBLES); } + +TEST("CreateNPCTrainerPartyForTrainer generates default moves if no moves are specified") +{ + ASSUME(sTestTrainers[GetTrainerDifficultyLevelTest(1)][1].party[0].moves[0] == MOVE_NONE); + struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); + CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainers[GetTrainerDifficultyLevelTest(1)][1], TRUE, BATTLE_TYPE_TRAINER); + EXPECT(GetMonData(&testParty[0], MON_DATA_MOVE1) != MOVE_NONE); + Free(testParty); +} diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index 012ae6e7e..5896ccbb9 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -2,28 +2,29 @@ #include "test/battle.h" #include "battle_setup.h" -SINGLE_BATTLE_TEST("Trainer Slide: Before First Turn") +// SINGLES TESTS START +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Before First Turn") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_BEFORE_FIRST_TURN; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_BEFORE_FIRST_TURN); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN { } + TURN {} } SCENE { - MESSAGE("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Player Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT); ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_LASER_FOCUS); } TURN { MOVE(player, MOVE_SCRATCH); } @@ -31,184 +32,820 @@ SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Critical Hit") ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); MESSAGE("A critical hit!"); - MESSAGE("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Enemy Lands First Critical Hit") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Enemy Lands First Critical Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT; - GIVEN { - ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(opponent, MOVE_LASER_FOCUS); } - TURN { MOVE(opponent, MOVE_SCRATCH); } + TURN { EXPECT_MOVE(opponent, MOVE_SURGING_STRIKES); } } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, opponent); - ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponent); MESSAGE("A critical hit!"); - MESSAGE("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First STAB Hit") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Player Lands First STAB Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE); ASSUME((GetMoveType(MOVE_VINE_WHIP)) == GetSpeciesType(SPECIES_BULBASAUR, 0)); PLAYER(SPECIES_BULBASAUR); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_VINE_WHIP); } } SCENE { MESSAGE("Bulbasaur used Vine Whip!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_VINE_WHIP, player); - MESSAGE("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Super Effective Hit") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Player Lands First Super Effective Hit") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT); ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_BITE); } } SCENE { MESSAGE("It's super effective!"); - MESSAGE("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Player Lands First Down") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Player Lands First Down") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN { MOVE(opponent, MOVE_HEALING_WISH); SEND_OUT(opponent,1); } + TURN { EXPECT_MOVE(opponent, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponent,1); } } SCENE { MESSAGE("The opposing Wobbuffet fainted!"); - MESSAGE("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Enemy Mon Unaffected") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { - WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_MON_UNAFFECTED); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); - OPPONENT(SPECIES_GLALIE); + OPPONENT(SPECIES_GLALIE) { Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_SHEER_COLD); } } SCENE { NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); MESSAGE("It doesn't affect the opposing Glalie…"); - MESSAGE("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Last Switchin") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Last Switchin") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_SWITCHIN; GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_SWITCHIN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN { MOVE(opponent, MOVE_HEALING_WISH); SEND_OUT(opponent,1); } + TURN { EXPECT_MOVE(opponent, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponent,1); } } SCENE { MESSAGE("The opposing Wobbuffet fainted!"); - MESSAGE("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Last Half Hp") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Last Half Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_HALF_HP; GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_HALF_HP); ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_SUPER_FANG); } } SCENE { - MESSAGE("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Last Low Hp") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Last Low Hp") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_LAST_LOW_HP; GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_LOW_HP); ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); - PLAYER(SPECIES_WOBBUFFET) { Attack(999);} - OPPONENT(SPECIES_WOBBUFFET) { Defense(1);} + PLAYER(SPECIES_WOBBUFFET) { Attack(999); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Defense(1); Speed(2); Moves(MOVE_CELEBRATE); } } WHEN { TURN { MOVE(player, MOVE_FALSE_SWIPE); } } SCENE { - MESSAGE("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Mega Evolution") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Mega Evolution") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_MEGA_EVOLUTION; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_MEGA_EVOLUTION); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_LOPUNNY) {Item(ITEM_LOPUNNITE); }; + OPPONENT(SPECIES_LOPUNNY) { Item(ITEM_LOPUNNITE); Moves(MOVE_CELEBRATE); } } WHEN { - TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + TURN { EXPECT_MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } } SCENE { - MESSAGE("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); MESSAGE("The opposing Lopunny has Mega Evolved into Mega Lopunny!"); } } -SINGLE_BATTLE_TEST("Trainer Slide: Z Move") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Z Move") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_Z_MOVE; GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_Z_MOVE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } } WHEN { - TURN { MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + TURN { EXPECT_MOVE(opponent, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } } SCENE { - MESSAGE("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); MESSAGE("The opposing Wobbuffet surrounded itself with its Z-Power!"); MESSAGE("The opposing Wobbuffet unleashes its full-force Z-Move!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponent); } } -SINGLE_BATTLE_TEST("Trainer Slide: Dynamax") +AI_SINGLE_BATTLE_TEST("Trainer Slide: Singles: Dynamax") { - gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_DYNAMAX; - GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_DYNAMAX); PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } } WHEN { - TURN { MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); } + TURN { EXPECT_MOVE(opponent, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); } } SCENE { - MESSAGE("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer A: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponent); } } +// SINGLES TESTS END + +// DOUBLES TESTS START - Tests message activation & message not activating twice +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Before First Turn") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_BEFORE_FIRST_TURN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { } + } SCENE { + MESSAGE("Trainer A: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + NONE_OF { + MESSAGE("Trainer A: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Player Lands First Critical Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT); + ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LASER_FOCUS); } + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); + MESSAGE("A critical hit!"); + MESSAGE("Trainer A: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Enemy Lands First Critical Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SURGING_STRIKES, target: playerLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponentLeft); + MESSAGE("A critical hit!"); + MESSAGE("Trainer A: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Player Lands First STAB Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE); + ASSUME((GetMoveType(MOVE_VINE_WHIP)) == GetSpeciesType(SPECIES_BULBASAUR, 0)); + PLAYER(SPECIES_BULBASAUR); + PLAYER(SPECIES_BULBASAUR); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_VINE_WHIP, target: opponentLeft); } + } SCENE { + MESSAGE("Bulbasaur used Vine Whip!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VINE_WHIP, playerLeft); + MESSAGE("Trainer A: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Player Lands First Super Effective Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT); + ASSUME(GetMoveType(MOVE_BITE) == TYPE_DARK); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) == TYPE_PSYCHIC); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BITE, target: opponentLeft); } + } SCENE { + MESSAGE("It's super effective!"); + MESSAGE("Trainer A: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Player Lands First Down") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponentLeft,2); } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Trainer A: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Enemy Mon Unaffected") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_MON_UNAFFECTED); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_GLALIE) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SHEER_COLD); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, playerLeft); + MESSAGE("It doesn't affect the opposing Glalie…"); + MESSAGE("Trainer A: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Last Switchin") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_SWITCHIN); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponentLeft,2); } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Trainer A: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Last Half Hp") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_HALF_HP); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(4); Moves(MOVE_MEMENTO); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(3); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUPER_FANG, target: opponentRight); } + } SCENE { + MESSAGE("Trainer A: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Last Low Hp") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_LOW_HP); + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER(SPECIES_WOBBUFFET) { Attack(999); Speed(2); } + PLAYER(SPECIES_WOBBUFFET) { Attack(999); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Defense(1); Speed(4); Moves(MOVE_MEMENTO);} + OPPONENT(SPECIES_WOBBUFFET) { Defense(1); Speed(3); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_FALSE_SWIPE, target: opponentRight); } + } SCENE { + MESSAGE("Trainer A: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + } + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Mega Evolution") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_MEGA_EVOLUTION); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_LOPUNNY) { Item(ITEM_LOPUNNITE); }; + OPPONENT(SPECIES_LOPUNNY) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + MESSAGE("Trainer A: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponentLeft); + MESSAGE("The opposing Lopunny has Mega Evolved into Mega Lopunny!"); + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Z Move") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_Z_MOVE); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } + } SCENE { + MESSAGE("Trainer A: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + } + MESSAGE("The opposing Wobbuffet surrounded itself with its Z-Power!"); + MESSAGE("The opposing Wobbuffet unleashes its full-force Z-Move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponentLeft); + } +} + +AI_DOUBLE_BATTLE_TEST("Trainer Slide: Doubles: Dynamax") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_DYNAMAX); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); } + } SCENE { + MESSAGE("Trainer A: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + NONE_OF { + MESSAGE("Trainer A: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + } + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponentLeft); + } +} +// DOUBLES TESTS END + +// MULTI TESTS START +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Before First Turn") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_BEFORE_FIRST_TURN); + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { } + } SCENE { + MESSAGE("Trainer A: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer Partner: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Player Lands First Critical Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT); + ASSUME(GetMoveEffect(MOVE_LASER_FOCUS) == EFFECT_LASER_FOCUS); + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_LASER_FOCUS); } + TURN { MOVE(playerLeft, MOVE_SURF, target: opponentLeft); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_LASER_FOCUS, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURF, playerLeft); + MESSAGE("A critical hit!"); + MESSAGE("Trainer A: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + // Note: Planned PR for additional slides will change slides from using "Player/Opponent" side to "Attacker/Target" side + // MESSAGE("Trainer Partner: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Enemy Lands First Critical Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT); + TIE_BREAK_TARGET(TARGET_TIE_LO, 0); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(2); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(3); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_ENDURE); + EXPECT_MOVE(opponentLeft, MOVE_SURGING_STRIKES, target: playerLeft); + EXPECT_MOVE(opponentRight, MOVE_SURGING_STRIKES, target: playerLeft); + MOVE(playerRight, MOVE_SURGING_STRIKES, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENDURE, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponentLeft); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, opponentRight); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SURGING_STRIKES, playerRight); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + MESSAGE("A critical hit!"); + MESSAGE("Trainer A: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer Partner: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Player Lands First STAB Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE); + ASSUME((GetMoveType(MOVE_EARTHQUAKE)) == GetSpeciesType(SPECIES_SANDSHREW, 0)); + MULTI_PLAYER(SPECIES_SANDSHREW); + MULTI_PARTNER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); } + } SCENE { + MESSAGE("Sandshrew used Earthquake!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + MESSAGE("Trainer A: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + // Note: Planned PR for additional slides will change slides from using "Player/Opponent" side to "Attacker/Target" side + // MESSAGE("Trainer Partner: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Player Lands First Super Effective Hit") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT); + ASSUME((GetMoveType(MOVE_EARTHQUAKE)) == GetSpeciesType(SPECIES_SANDSHREW, 0)); + ASSUME(GetSpeciesType(SPECIES_GOLEM, 0) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_GOLEM, 1) == TYPE_GROUND); + MULTI_PLAYER(SPECIES_SANDSHREW); + MULTI_PARTNER(SPECIES_GOLEM) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_GOLEM) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_GOLEM) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_EARTHQUAKE); } + } SCENE { + MESSAGE("Sandshrew used Earthquake!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EARTHQUAKE, playerLeft); + MESSAGE("Trainer A: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + // Note: Planned PR for additional slides will change slides from using "Player/Opponent" side to "Attacker/Target" side + // MESSAGE("Trainer Partner: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Player Lands First Down") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + MULTI_PARTNER(SPECIES_RATICATE) { Speed(2); } + MULTI_PARTNER(SPECIES_RATTATA) { Speed(2); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { Speed(4); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Speed(3); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(3); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { + EXPECT_MOVE(playerRight, MOVE_HEALING_WISH); EXPECT_SEND_OUT(playerRight,4); + EXPECT_MOVE(opponentLeft, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponentLeft,1); + EXPECT_MOVE(opponentRight, MOVE_HEALING_WISH); EXPECT_SEND_OUT(opponentRight,4); + } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Trainer A: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("The opposing Wynaut fainted!"); + MESSAGE("Trainer B: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Raticate fainted!"); + // Note: Planned PR for additional slides will change slides from using "Player/Opponent" side to "Attacker/Target" side + // MESSAGE("Trainer Partner: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Enemy Mon Unaffected") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_ENEMY_MON_UNAFFECTED); + WITH_CONFIG(CONFIG_SHEER_COLD_IMMUNITY, GEN_7); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + MULTI_PLAYER(SPECIES_WYNAUT); + MULTI_PARTNER(SPECIES_GASTLY) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_A(SPECIES_GENGAR) { Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_HAUNTER) { Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_BOOMBURST); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_BOOMBURST, playerLeft); + MESSAGE("It doesn't affect the opposing Gengar and Haunter…"); + MESSAGE("It doesn't affect Gastly…"); + MESSAGE("Trainer A: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + // Note: Planned PR for additional slides will change slides from using "Player/Opponent" side to "Attacker/Target" side + // MESSAGE("Trainer Partner: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Last Switchin") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_SWITCHIN); + TIE_BREAK_TARGET(TARGET_TIE_HI, 0); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + MULTI_PARTNER(SPECIES_RATICATE) { Speed(3); } + MULTI_PARTNER(SPECIES_RATTATA) { Speed(3); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_OPPONENT_A(SPECIES_WYNAUT) { Speed(4); Moves(MOVE_CELEBRATE); } + MULTI_OPPONENT_B(SPECIES_WYNAUT) { Speed(2); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { + EXPECT_MOVE(opponentLeft, MOVE_MEMENTO, target: opponentRight); EXPECT_SEND_OUT(opponentLeft,1); + MOVE(playerRight, MOVE_MEMENTO, target: opponentRight); SEND_OUT(playerRight,4); + EXPECT_MOVE(opponentRight, MOVE_MEMENTO, target: playerRight); EXPECT_SEND_OUT(opponentRight,4); + } + } SCENE { + MESSAGE("The opposing Wobbuffet fainted!"); + MESSAGE("Raticate fainted!"); + MESSAGE("The opposing Wynaut fainted!"); + MESSAGE("Trainer A: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer Partner: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Last Half Hp") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_HALF_HP); + ASSUME(GetMoveEffect(MOVE_SUPER_FANG) == EFFECT_FIXED_PERCENT_DAMAGE); + ASSUME(GetSpeciesBaseHP(SPECIES_WOBBUFFET) == 190); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); HP(1); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(3); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(2); Moves(MOVE_SURF); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_SUPER_FANG); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUPER_FANG, target: opponentLeft); SEND_OUT(playerLeft, 1); + MOVE(playerRight, MOVE_SUPER_FANG, target: opponentRight); } + } SCENE { + MESSAGE("Trainer A: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer Partner: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Last Low Hp") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_LAST_LOW_HP); + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); HP(1); } + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(3); MaxHP(400); HP(200); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(2); MaxHP(400); HP(200); Moves(MOVE_SURF); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); MaxHP(400); HP(200); Moves(MOVE_SUPER_FANG); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUPER_FANG, target: opponentLeft); SEND_OUT(playerLeft, 1); + MOVE(playerRight, MOVE_SUPER_FANG, target: opponentRight); } + } SCENE { + MESSAGE("Trainer A: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer B: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Trainer Partner: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Mega Evolution") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_MEGA_EVOLUTION); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_PARTNER(SPECIES_AERODACTYL) { Speed(2); Item(ITEM_AERODACTYLITE); } + MULTI_OPPONENT_A(SPECIES_LOPUNNY) { Speed(3); Item(ITEM_LOPUNNITE); } + MULTI_OPPONENT_B(SPECIES_MEDICHAM) { Speed(1); Item(ITEM_MEDICHAMITE); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); + MOVE(playerRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + MESSAGE("Trainer A: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponentLeft); + MESSAGE("The opposing Lopunny has Mega Evolved into Mega Lopunny!"); + MESSAGE("Trainer Partner: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, playerRight); + MESSAGE("Aerodactyl has Mega Evolved into Mega Aerodactyl!"); + MESSAGE("Trainer B: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponentRight); + MESSAGE("The opposing Medicham has Mega Evolved into Mega Medicham!"); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Z Move") +{ + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_Z_MOVE); + TIE_BREAK_TARGET(TARGET_TIE_LO, 0); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(2); Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(3); Item(ITEM_NORMALIUM_Z); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); Item(ITEM_NORMALIUM_Z); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE, target: playerLeft); + MOVE(playerRight, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE, target: opponentLeft); + EXPECT_MOVE(opponentRight, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE, target: playerLeft); } + } SCENE { + MESSAGE("Trainer A: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("The opposing Wobbuffet surrounded itself with its Z-Power!"); + MESSAGE("The opposing Wobbuffet unleashes its full-force Z-Move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponentLeft); + MESSAGE("Trainer Partner: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("Wobbuffet surrounded itself with its Z-Power!"); + MESSAGE("Wobbuffet unleashes its full-force Z-Move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, playerRight); + MESSAGE("Trainer B: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"); + MESSAGE("The opposing Wobbuffet surrounded itself with its Z-Power!"); + MESSAGE("The opposing Wobbuffet unleashes its full-force Z-Move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_BREAKNECK_BLITZ, opponentRight); + } +} + +AI_MULTI_BATTLE_TEST("Trainer Slide: Multi: Dynamax") +{ + s32 dynamaxLevelA = 0, dynamaxLevelB = 0; + + PARAMETRIZE { dynamaxLevelA = 10; dynamaxLevelB = -1; } + PARAMETRIZE { dynamaxLevelA = -1; dynamaxLevelB = 10; } + + GIVEN { + FLAG_SET(TESTING_FLAG_TRAINER_SLIDES); + VAR_SET(TESTING_VAR_TRAINER_SLIDES, TRAINER_SLIDE_DYNAMAX); + MULTI_PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + MULTI_PARTNER(SPECIES_WOBBUFFET) { Speed(2); DynamaxLevel(10); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET) { Speed(3); Moves(MOVE_CELEBRATE); DynamaxLevel(dynamaxLevelA); } + MULTI_OPPONENT_B(SPECIES_WOBBUFFET) { Speed(1); Moves(MOVE_CELEBRATE); DynamaxLevel(dynamaxLevelB); } + } WHEN { + TURN { + if (dynamaxLevelA == 10) + EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); + else + EXPECT_MOVE(opponentLeft, MOVE_CELEBRATE, gimmick: GIMMICK_NONE); + + MOVE(playerRight, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); + + if (dynamaxLevelB == 10) + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_DYNAMAX); + else + EXPECT_MOVE(opponentRight, MOVE_CELEBRATE, gimmick: GIMMICK_NONE); + } + } SCENE { + if (dynamaxLevelA == 10) + { + MESSAGE("Trainer A: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponentLeft); + } + MESSAGE("Trainer Partner: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, playerRight); + if (dynamaxLevelB == 10) + { + MESSAGE("Trainer B: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, opponentRight); + } + } +} +// MULTI TESTS END diff --git a/test/battle/trainer_slides.h b/test/battle/trainer_slides.h index cb62a0080..f624623fd 100644 --- a/test/battle/trainer_slides.h +++ b/test/battle/trainer_slides.h @@ -1,56 +1,52 @@ [DIFFICULTY_NORMAL] = { - [TRAINER_SLIDE_BEFORE_FIRST_TURN] = + [TRAINER_PLAYER_LEAF] = { - [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("Trainer A: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer A: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer A: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("Trainer A: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("Trainer A: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Trainer A: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Trainer A: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("Trainer A: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Trainer A: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Trainer A: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("Trainer A: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("Trainer A: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("Trainer A: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = + [TRAINER_PLAYER_RED] = { - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("Trainer B: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer B: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer B: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("Trainer B: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("Trainer B: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Trainer B: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Trainer B: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("Trainer B: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Trainer B: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Trainer B: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("Trainer B: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("Trainer B: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("Trainer B: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), }, - [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = + [TRAINER_PARTNER(PARTNER_STEVEN)] = { - [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = - { - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = - { - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = - { - [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = - { - [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_LAST_SWITCHIN] = - { - [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_LAST_HALF_HP] = - { - [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_LAST_LOW_HP] = - { - [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_MEGA_EVOLUTION] = - { - [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_Z_MOVE] = - { - [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), - }, - [TRAINER_SLIDE_DYNAMAX] = - { - [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_BEFORE_FIRST_TURN] = COMPOUND_STRING("Trainer Partner: This message plays before the first turn.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer Partner: This message plays after the player lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_LANDS_FIRST_CRITICAL_HIT] = COMPOUND_STRING("Trainer Partner: This message plays after the enemy lands their first critical hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_SUPER_EFFECTIVE_HIT] = COMPOUND_STRING("Trainer Partner: This message plays after the player lands their first super effective hit.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_DOWN] = COMPOUND_STRING("Trainer Partner: This message plays after the player KOs one enemy mon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_ENEMY_MON_UNAFFECTED] = COMPOUND_STRING("Trainer Partner: Player attacked enemy with ineffective move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_PLAYER_LANDS_FIRST_STAB_MOVE] = COMPOUND_STRING("Trainer Partner: Player lands their first STAB move.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_SWITCHIN] = COMPOUND_STRING("Trainer Partner: This message plays after the enemy switches in their last Pokemon.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_HALF_HP] = COMPOUND_STRING("Trainer Partner: Enemy last Mon has < 51% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_LAST_LOW_HP] = COMPOUND_STRING("Trainer Partner: Enemy last Mon has < 26% HP.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_MEGA_EVOLUTION] = COMPOUND_STRING("Trainer Partner: This message plays before the enemy activates the Mega Evolution gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_Z_MOVE] = COMPOUND_STRING("Trainer Partner: This message plays before the enemy activates the Z-Move gimmick.{PAUSE_UNTIL_PRESS}"), + [TRAINER_SLIDE_DYNAMAX] = COMPOUND_STRING("Trainer Partner: This message plays before the enemy activates the Dynamax gimmick.{PAUSE_UNTIL_PRESS}"), }, }, diff --git a/test/battle/volatiles/confusion.c b/test/battle/volatiles/confusion.c index 66ab92484..b9a123795 100644 --- a/test/battle/volatiles/confusion.c +++ b/test/battle/volatiles/confusion.c @@ -10,10 +10,10 @@ SINGLE_BATTLE_TEST("Confusion adds a 50/33% chance to hit self with 40 power") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); ASSUME(GetMovePower(MOVE_SCRATCH) == 40); - PLAYER(SPECIES_WOBBUFFET) { Speed(1); }; - OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }; + PLAYER(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH, WITH_RNG(RNG_DAMAGE_MODIFIER, 0)); MOVE(player, MOVE_CONFUSE_RAY); } TURN; @@ -38,8 +38,8 @@ SINGLE_BATTLE_TEST("Confusion self hit does not consume Gems") PARAMETRIZE { genConfig = GEN_7; pctChance = 33; } PASSES_RANDOMLY(pctChance, 100, RNG_CONFUSION); GIVEN { - WITH_CONFIG(GEN_CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); }; + WITH_CONFIG(CONFIG_CONFUSION_SELF_DMG_CHANCE, genConfig); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMAL_GEM); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(opponent, MOVE_CONFUSE_RAY); MOVE(player, MOVE_SCRATCH); } diff --git a/test/battle/weather/hail.c b/test/battle/weather/hail.c index 3a0dd5302..f1dd97d58 100644 --- a/test/battle/weather/hail.c +++ b/test/battle/weather/hail.c @@ -4,7 +4,8 @@ // Please add Hail interactions with move, item and ability effects on their respective files. ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); ASSUME(GetSpeciesType(SPECIES_WYNAUT, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WYNAUT, 1) != TYPE_ICE); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); @@ -18,7 +19,7 @@ SINGLE_BATTLE_TEST("Hail deals 1/16 damage per turn") PLAYER(SPECIES_GLALIE); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {MOVE(player, MOVE_HAIL);} + TURN { MOVE(player, MOVE_HAIL); } } SCENE { MESSAGE("The opposing Wobbuffet is buffeted by the hail!"); HP_BAR(opponent, captureDamage: &hailDamage); @@ -32,7 +33,7 @@ SINGLE_BATTLE_TEST("Hail damage does not affect Ice-type Pokémon") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_GLALIE); } WHEN { - TURN {MOVE(player, MOVE_HAIL);} + TURN { MOVE(player, MOVE_HAIL); } } SCENE { NOT MESSAGE("The opposing Glalie is buffeted by the hail!"); } @@ -41,7 +42,7 @@ SINGLE_BATTLE_TEST("Hail damage does not affect Ice-type Pokémon") SINGLE_BATTLE_TEST("Hail fails if Desolate Land or Primordial Sea are active") { u32 species; - u32 item; + enum Item item; PARAMETRIZE { species = SPECIES_WOBBUFFET; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_GROUDON; item = ITEM_RED_ORB; } diff --git a/test/battle/weather/rain.c b/test/battle/weather/rain.c index 0620aae10..cdb4e97de 100644 --- a/test/battle/weather/rain.c +++ b/test/battle/weather/rain.c @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Rain multiplies the power of Water-type moves by 1.5x", s16 SINGLE_BATTLE_TEST("Drizzle fails if Desolate Land is active") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_RED_ORB; } diff --git a/test/battle/weather/sandstorm.c b/test/battle/weather/sandstorm.c index d01bd72ce..d5737c6a7 100644 --- a/test/battle/weather/sandstorm.c +++ b/test/battle/weather/sandstorm.c @@ -10,19 +10,22 @@ SINGLE_BATTLE_TEST("Sandstorm deals 1/16 damage per turn") PLAYER(SPECIES_SANDSLASH); OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN {MOVE(player, MOVE_SANDSTORM);} + TURN { MOVE(player, MOVE_SANDSTORM); } } SCENE { MESSAGE("The opposing Wobbuffet is buffeted by the sandstorm!"); HP_BAR(opponent, captureDamage: &sandstormDamage); } THEN { EXPECT_EQ(sandstormDamage, opponent->maxHP / 16); } } -SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1.5x", s16 damage) +SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1.5x (Gen4+)", s16 damage) { - u16 move; - PARAMETRIZE { move = MOVE_SANDSTORM; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + enum Move move; + u32 config; + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_3; } + PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_3; } + PARAMETRIZE { move = MOVE_SANDSTORM; config = GEN_4; } GIVEN { + WITH_CONFIG(CONFIG_SANDSTORM_SPDEF_BOOST, config); ASSUME(GetMoveCategory(MOVE_SWIFT) == DAMAGE_CATEGORY_SPECIAL); PLAYER(SPECIES_WOBBUFFET) ; OPPONENT(SPECIES_NOSEPASS); @@ -32,7 +35,8 @@ SINGLE_BATTLE_TEST("Sandstorm multiplies the special defense of Rock-types by 1. } SCENE { HP_BAR(opponent, captureDamage: &results[i].damage); } FINALLY { - EXPECT_MUL_EQ(results[0].damage, Q_4_12(1.5), results[1].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[0].damage); + EXPECT_MUL_EQ(results[2].damage, Q_4_12(1.5), results[1].damage); } } diff --git a/test/battle/weather/snow.c b/test/battle/weather/snow.c index c8e0a4fbc..4df03111b 100644 --- a/test/battle/weather/snow.c +++ b/test/battle/weather/snow.c @@ -4,7 +4,8 @@ // Please add Snow interactions with move, item and ability effects on their respective files. ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_SNOWSCAPE); + ASSUME(GetMoveEffect(MOVE_SNOWSCAPE) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); ASSUME(GetSpeciesType(SPECIES_WOBBUFFET, 0) != TYPE_ICE && GetSpeciesType(SPECIES_WOBBUFFET, 1) != TYPE_ICE); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE || GetSpeciesType(SPECIES_GLALIE, 1) == TYPE_ICE); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); @@ -12,7 +13,7 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Snow multiplies the defense of Ice-types by 1.5x", s16 damage) { - u16 move; + enum Move move; PARAMETRIZE { move = MOVE_SNOWSCAPE; } PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { @@ -31,7 +32,7 @@ SINGLE_BATTLE_TEST("Snow multiplies the defense of Ice-types by 1.5x", s16 damag SINGLE_BATTLE_TEST("Snowscape fails if Desolate Land or Primordial Sea are active") { u32 species; - u32 item; + enum Item item; PARAMETRIZE { species = SPECIES_WOBBUFFET; item = ITEM_NONE; } PARAMETRIZE { species = SPECIES_GROUDON; item = ITEM_RED_ORB; } diff --git a/test/battle/weather/strong_winds.c b/test/battle/weather/strong_winds.c new file mode 100644 index 000000000..111fc1306 --- /dev/null +++ b/test/battle/weather/strong_winds.c @@ -0,0 +1,250 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Strong winds remove Flying-type weaknesses of all battlers") // Electric, Ice, Rock +{ + enum Move move; + bool32 targetPlayer; + + PARAMETRIZE { move = MOVE_THUNDER_SHOCK; targetPlayer = TRUE; } + PARAMETRIZE { move = MOVE_ICE_BEAM; targetPlayer = TRUE; } + PARAMETRIZE { move = MOVE_ROCK_THROW; targetPlayer = TRUE; } + PARAMETRIZE { move = MOVE_THUNDER_SHOCK; targetPlayer = FALSE; } + PARAMETRIZE { move = MOVE_ICE_BEAM; targetPlayer = FALSE; } + PARAMETRIZE { move = MOVE_ROCK_THROW; targetPlayer = FALSE; } + + GIVEN { + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_ICE_BEAM) == TYPE_ICE); + ASSUME(GetMoveType(MOVE_ROCK_THROW) == TYPE_ROCK); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + PLAYER(SPECIES_PIDGEY); + OPPONENT(SPECIES_PIDGEY); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + if (targetPlayer) + TURN { MOVE(opponentLeft, move, target: playerRight); } + else + TURN { MOVE(playerRight, move, target: opponentLeft); } + } SCENE { + if (targetPlayer) { + if (move == MOVE_THUNDER_SHOCK) + MESSAGE("The opposing Pidgey used Thunder Shock!"); + else if (move == MOVE_ICE_BEAM) + MESSAGE("The opposing Pidgey used Ice Beam!"); + else + MESSAGE("The opposing Pidgey used Rock Throw!"); + MESSAGE("The mysterious strong winds weakened the attack!"); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + } else { + if (move == MOVE_THUNDER_SHOCK) + MESSAGE("Pidgey used Thunder Shock!"); + else if (move == MOVE_ICE_BEAM) + MESSAGE("Pidgey used Ice Beam!"); + else + MESSAGE("Pidgey used Rock Throw!"); + MESSAGE("The mysterious strong winds weakened the attack!"); + ANIMATION(ANIM_TYPE_MOVE, move, playerRight); + } + } +} + +DOUBLE_BATTLE_TEST("Strong winds remove Flying-type weaknesses of all battlers - Inverse Battle", s16 damagePlayer, s16 damageOpponent) // Bug, Fighting, Grass +{ + enum Move move; + bool32 strongWinds; + + PARAMETRIZE { move = MOVE_BUG_BITE; strongWinds = FALSE; } + PARAMETRIZE { move = MOVE_BUG_BITE; strongWinds = TRUE; } + PARAMETRIZE { move = MOVE_KARATE_CHOP; strongWinds = FALSE; } + PARAMETRIZE { move = MOVE_KARATE_CHOP; strongWinds = TRUE; } + PARAMETRIZE { move = MOVE_VINE_WHIP; strongWinds = FALSE; } + PARAMETRIZE { move = MOVE_VINE_WHIP; strongWinds = TRUE; } + + GIVEN { + FLAG_SET(B_FLAG_INVERSE_BATTLE); + ASSUME(GetMoveType(MOVE_BUG_BITE) == TYPE_BUG); + ASSUME(GetMoveType(MOVE_KARATE_CHOP) == TYPE_FIGHTING); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 0) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 1) == TYPE_FLYING); + if (strongWinds) + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + else + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_TORNADUS); + OPPONENT(SPECIES_TORNADUS); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(opponentLeft, move, target: playerRight); + MOVE(playerRight, move, target: opponentLeft); + } + } SCENE { + HP_BAR(playerRight, captureDamage: &results[i].damagePlayer); + HP_BAR(opponentLeft, captureDamage: &results[i].damageOpponent); + } FINALLY { + EXPECT_GT(results[0].damagePlayer, results[1].damagePlayer); + EXPECT_GT(results[0].damageOpponent, results[1].damageOpponent); + EXPECT_GT(results[2].damagePlayer, results[3].damagePlayer); + EXPECT_GT(results[2].damageOpponent, results[3].damageOpponent); + EXPECT_GT(results[4].damagePlayer, results[5].damagePlayer); + EXPECT_GT(results[4].damageOpponent, results[5].damageOpponent); + } +} + +SINGLE_BATTLE_TEST("Strong winds prevent Weakness Policy from activating on Flying-type weaknesses") +{ + GIVEN { + ASSUME(GetItemHoldEffect(ITEM_WEAKNESS_POLICY) == HOLD_EFFECT_WEAKNESS_POLICY); + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); Moves(MOVE_THUNDER_SHOCK); } + OPPONENT(SPECIES_PIDGEY) { Item(ITEM_WEAKNESS_POLICY); } + } WHEN { + TURN { MOVE(player, MOVE_THUNDER_SHOCK); } + } SCENE { + MESSAGE("Rayquaza used Thunder Shock!"); + MESSAGE("The mysterious strong winds weakened the attack!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER_SHOCK, player); + HP_BAR(opponent); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} + +SINGLE_BATTLE_TEST("Anticipation still triggers with Strong Winds active") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_THUNDER_SHOCK) == TYPE_ELECTRIC); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); Moves(MOVE_THUNDER_SHOCK, MOVE_CELEBRATE); } + OPPONENT(SPECIES_PIDGEY) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ANTICIPATION); + MESSAGE("Rayquaza used Celebrate!"); + MESSAGE("The opposing Pidgey used Celebrate!"); + } +} + +SINGLE_BATTLE_TEST("Anticipation still triggers with Strong Winds active in Inverse Battle") +{ + GIVEN { + FLAG_SET(B_FLAG_INVERSE_BATTLE); + ASSUME(GetMoveType(MOVE_VINE_WHIP) == TYPE_GRASS); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 0) == TYPE_FLYING); + ASSUME(GetSpeciesType(SPECIES_TORNADUS, 1) == TYPE_FLYING); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); Moves(MOVE_VINE_WHIP, MOVE_CELEBRATE); } + OPPONENT(SPECIES_TORNADUS) { Ability(ABILITY_ANTICIPATION); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_ANTICIPATION); + MESSAGE("Rayquaza used Celebrate!"); + MESSAGE("The opposing Tornadus used Celebrate!"); + } +} + +SINGLE_BATTLE_TEST("Strong winds don't affect Stealth Rock's damage") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 0) == TYPE_NORMAL); + ASSUME(GetSpeciesType(SPECIES_PIDGEY, 1) == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_PIDGEY); + OPPONENT(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + } WHEN { + TURN { MOVE(opponent, MOVE_STEALTH_ROCK); } + TURN { SWITCH(player, 1); } + } SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[1], MON_DATA_MAX_HP); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponent); + HP_BAR(player, damage: maxHP / 4); + } +} + +SINGLE_BATTLE_TEST("Strong winds block weather-setting moves") +{ + enum Move move; + PARAMETRIZE { move = MOVE_SUNNY_DAY; } + PARAMETRIZE { move = MOVE_RAIN_DANCE; } + PARAMETRIZE { move = MOVE_SANDSTORM; } + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + + GIVEN { + ASSUME(GetMoveEffect(move) == EFFECT_WEATHER); + ASSUME(GetMoveWeatherType(MOVE_SUNNY_DAY) == BATTLE_WEATHER_SUN); + ASSUME(GetMoveWeatherType(MOVE_RAIN_DANCE) == BATTLE_WEATHER_RAIN); + ASSUME(GetMoveWeatherType(MOVE_SANDSTORM) == BATTLE_WEATHER_SANDSTORM); + ASSUME(GetMoveWeatherType(MOVE_HAIL) == BATTLE_WEATHER_HAIL); + ASSUME(GetMoveWeatherType(MOVE_SNOWSCAPE) == BATTLE_WEATHER_SNOW); + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, move, opponent); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_STRONG_WINDS); + } +} + +SINGLE_BATTLE_TEST("Strong winds prevent other weather abilities") +{ + u16 ability, species; + PARAMETRIZE { ability = ABILITY_DROUGHT; species = SPECIES_NINETALES; } + PARAMETRIZE { ability = ABILITY_DRIZZLE; species = SPECIES_POLITOED; } + PARAMETRIZE { ability = ABILITY_SAND_STREAM; species = SPECIES_HIPPOWDON; } + PARAMETRIZE { ability = ABILITY_SNOW_WARNING; species = SPECIES_ABOMASNOW; } + + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ability); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_STRONG_WINDS); + } +} + +SINGLE_BATTLE_TEST("Strong winds can be replaced by Desolate Land") +{ + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GROUDON) { Item(ITEM_RED_ORB); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_DESOLATE_LAND); + MESSAGE("The sunlight turned extremely harsh!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_SUN_PRIMAL); + } +} + +SINGLE_BATTLE_TEST("Strong winds can be replaced by Primordial Sea") +{ + GIVEN { + PLAYER(SPECIES_RAYQUAZA) { Ability(ABILITY_DELTA_STREAM); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_KYOGRE) { Item(ITEM_BLUE_ORB); } + } WHEN { + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_PRIMORDIAL_SEA); + MESSAGE("A heavy rain began to fall!"); + } THEN { + EXPECT(gBattleWeather & B_WEATHER_RAIN_PRIMAL); + } +} diff --git a/test/battle/weather/sunlight.c b/test/battle/weather/sunlight.c index 796ad3c3a..977a90dbb 100644 --- a/test/battle/weather/sunlight.c +++ b/test/battle/weather/sunlight.c @@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Sunlight multiplies the power of Water-type moves by 0.5x", SINGLE_BATTLE_TEST("Sunny Day fails if Primordial Sea is active") { - u32 item; + enum Item item; PARAMETRIZE { item = ITEM_NONE; } PARAMETRIZE { item = ITEM_BLUE_ORB; } diff --git a/test/pokemon.c b/test/pokemon.c index c902e56e4..65792bea2 100644 --- a/test/pokemon.c +++ b/test/pokemon.c @@ -18,7 +18,9 @@ TEST("Nature independent from Hidden Nature") PARAMETRIZE { nature = i; hiddenNature = j; } } } - CreateMonWithNature(&mon, SPECIES_WOBBUFFET, 100, 0, nature); + u32 species = SPECIES_WOBBUFFET; + u32 personality = GetMonPersonality(species, MON_GENDER_RANDOM, nature, RANDOM_UNOWN_LETTER); + CreateMon(&mon, species, 100, personality, OTID_STRUCT_PLAYER_ID); SetMonData(&mon, MON_DATA_HIDDEN_NATURE, &hiddenNature); EXPECT_EQ(GetNature(&mon), nature); EXPECT_EQ(GetMonData(&mon, MON_DATA_HIDDEN_NATURE), hiddenNature); @@ -30,7 +32,7 @@ TEST("Terastallization type defaults to primary or secondary type") enum Type teraType; struct Pokemon mon; for (i = 0; i < 128; i++) PARAMETRIZE {} - CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&mon, SPECIES_PIDGEY, 100, 0); teraType = GetMonData(&mon, MON_DATA_TERA_TYPE); EXPECT(teraType == GetSpeciesType(SPECIES_PIDGEY, 0) || teraType == GetSpeciesType(SPECIES_PIDGEY, 1)); @@ -45,7 +47,7 @@ TEST("Terastallization type can be set to any type except TYPE_NONE") { PARAMETRIZE { teraType = i; } } - CreateMon(&mon, SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&mon, SPECIES_WOBBUFFET, 100, 0); SetMonData(&mon, MON_DATA_TERA_TYPE, &teraType); EXPECT_EQ(teraType, GetMonData(&mon, MON_DATA_TERA_TYPE)); } @@ -59,7 +61,7 @@ TEST("Terastallization type is reset to the default types when setting Tera Type { PARAMETRIZE { teraType = i; typeNone = TYPE_NONE; } } - CreateMon(&mon, SPECIES_PIDGEY, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&mon, SPECIES_PIDGEY, 100, 0); SetMonData(&mon, MON_DATA_TERA_TYPE, &teraType); EXPECT_EQ(teraType, GetMonData(&mon, MON_DATA_TERA_TYPE)); if (typeNone == TYPE_NONE) @@ -76,7 +78,7 @@ TEST("Shininess independent from PID and OTID") bool32 isShiny; struct Pokemon mon; PARAMETRIZE { pid = 0; otId = 0; } - CreateMon(&mon, SPECIES_WOBBUFFET, 100, 0, TRUE, pid, OT_ID_PRESET, otId); + CreateMon(&mon, SPECIES_WOBBUFFET, 100, pid, OTID_STRUCT_PRESET(otId)); isShiny = IsMonShiny(&mon); data = !isShiny; SetMonData(&mon, MON_DATA_IS_SHINY, &data); @@ -89,8 +91,7 @@ TEST("Hyper Training increases stats without affecting IVs") { u32 data, hp, atk, def, speed, spatk, spdef, friendship = 0; struct Pokemon mon; - CreateMon(&mon, SPECIES_WOBBUFFET, 100, 3, TRUE, 0, OT_ID_PRESET, 0); - + CreateMonWithIVs(&mon, SPECIES_WOBBUFFET, 100, 0, OTID_STRUCT_PRESET(0), 3); // Consider B_FRIENDSHIP_BOOST. SetMonData(&mon, MON_DATA_FRIENDSHIP, &friendship); CalculateMonStats(&mon); @@ -143,7 +144,7 @@ TEST("Status1 round-trips through BoxPokemon") PARAMETRIZE { status1 = STATUS1_PARALYSIS; } PARAMETRIZE { status1 = STATUS1_TOXIC_POISON; } PARAMETRIZE { status1 = STATUS1_FROSTBITE; } - CreateMon(&mon1, SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&mon1, SPECIES_WOBBUFFET, 100, 0); SetMonData(&mon1, MON_DATA_STATUS, &status1); BoxMonToMon(&mon1.box, &mon2); EXPECT_EQ(GetMonData(&mon2, MON_DATA_STATUS), status1); @@ -152,7 +153,7 @@ TEST("Status1 round-trips through BoxPokemon") TEST("canhypertrain/hypertrain affect MON_DATA_HYPER_TRAINED_* and recalculate stats") { u32 atk, friendship = 0; - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0); // Consider B_FRIENDSHIP_BOOST. SetMonData(&gPlayerParty[0], MON_DATA_FRIENDSHIP, &friendship); @@ -176,7 +177,7 @@ TEST("canhypertrain/hypertrain affect MON_DATA_HYPER_TRAINED_* and recalculate s TEST("hasgigantamaxfactor/togglegigantamaxfactor affect MON_DATA_GIGANTAMAX_FACTOR") { - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0); RUN_OVERWORLD_SCRIPT( hasgigantamaxfactor 0; @@ -200,7 +201,7 @@ TEST("hasgigantamaxfactor/togglegigantamaxfactor affect MON_DATA_GIGANTAMAX_FACT TEST("togglegigantamaxfactor fails for Melmetal") { - CreateMon(&gPlayerParty[0], SPECIES_MELMETAL, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&gPlayerParty[0], SPECIES_MELMETAL, 100, 0); RUN_OVERWORLD_SCRIPT( hasgigantamaxfactor 0; @@ -270,6 +271,40 @@ TEST("givemon respects perfectIVCount") } } +TEST("givemon respects perfectIVCount but does overwrite fixed IVs (1)") +{ + ZeroPlayerPartyMons(); + + ASSUME(gSpeciesInfo[SPECIES_MEW].perfectIVCount == 3); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_MEW, 100, hpIv=7, atkIv=8, defIv=9, speedIv=10, spAtkIv=11, spDefIv=12 + ); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_IV), 7); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_IV), 8); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_IV), 9); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_IV), 10); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_IV), 11); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_IV), 12); +} + +TEST("givemon respects perfectIVCount but does overwrite fixed IVs (2)") +{ + ZeroPlayerPartyMons(); + + ASSUME(gSpeciesInfo[SPECIES_MEW].perfectIVCount == 3); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_MEW, 100, hpIv=7, atkIv=8, defIv=9 + ); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_HP_IV), 7); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_ATK_IV), 8); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_DEF_IV), 9); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPEED_IV), MAX_PER_STAT_IVS); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPATK_IV), MAX_PER_STAT_IVS); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPDEF_IV), MAX_PER_STAT_IVS); +} + TEST("givemon respects FORM_CHANGE_ITEM_HOLD") { ZeroPlayerPartyMons(); @@ -292,7 +327,7 @@ TEST("givemon [moves]") ZeroPlayerPartyMons(); RUN_OVERWORLD_SCRIPT( - givemon SPECIES_WOBBUFFET, 100, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_NONE; + givemon SPECIES_WOBBUFFET, 100, move1=MOVE_SCRATCH, move2=MOVE_SPLASH, move3=MOVE_NONE, move4=MOVE_NONE; ); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_WOBBUFFET); @@ -303,6 +338,28 @@ TEST("givemon [moves]") EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE4), MOVE_NONE); } +TEST("givemon [moves (default)]") +{ + ZeroPlayerPartyMons(); + + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PYUKUMUKU, 100, move1=MOVE_DEFAULT, move2=MOVE_DEFAULT, move3=MOVE_DEFAULT; + ); + + const struct LevelUpMove *learnset = GetSpeciesLevelUpLearnset(SPECIES_PYUKUMUKU); + u32 learnsetLength; + for (learnsetLength = 0; learnset[learnsetLength].move != LEVEL_UP_MOVE_END; learnsetLength++) + { + ; // we just want to get length of the learnset array + } + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_PYUKUMUKU); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_LEVEL), 100); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE1), learnset[learnsetLength - 1].move); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE2), learnset[learnsetLength - 2].move); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE3), learnset[learnsetLength - 3].move); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_MOVE4), learnset[learnsetLength - 4].move); +} + TEST("givemon [all]") { ZeroPlayerPartyMons(); @@ -407,7 +464,7 @@ TEST("givemon [vars]") TEST("checkteratype/setteratype work") { - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0, FALSE, 0, OT_ID_PRESET, 0); + CreateRandomMonWithIVs(&gPlayerParty[0], SPECIES_WOBBUFFET, 100, 0); RUN_OVERWORLD_SCRIPT( checkteratype 0; @@ -458,7 +515,7 @@ TEST("Pokémon level up learnsets fit within MAX_LEVEL_UP_MOVES and MAX_RELEARNE TEST("Optimised GetMonData") { - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, Random32(), OTID_STRUCT_PRESET(0x12345678)); u32 exp = 0x123456; SetMonData(&gPlayerParty[0], MON_DATA_EXP, &exp); struct Benchmark optimised, @@ -471,7 +528,7 @@ TEST("Optimised GetMonData") TEST("Optimised SetMonData") { - CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, 0, FALSE, 0, OT_ID_PRESET, 0x12345678); + CreateMon(&gPlayerParty[0], SPECIES_WOBBUFFET, 5, Random32(), OTID_STRUCT_PRESET(0x12345678)); u32 exp = 0x123456; struct Benchmark optimised, vanilla = (struct Benchmark) { .ticks = 205 }; // From prior testing diff --git a/test/pokerus.c b/test/pokerus.c new file mode 100644 index 000000000..74cc0552f --- /dev/null +++ b/test/pokerus.c @@ -0,0 +1,704 @@ +#include "global.h" +#include "malloc.h" +#include "event_data.h" +#include "pokemon.h" +#include "pokerus.h" +#include "generational_changes.h" +#include "random.h" +#include "test/overworld_script.h" +#include "test/test.h" +#include "config/pokerus.h" + +TEST("(Pokerus) No infection when POKERUS_ENABLED is false") +{ + bool32 enabled; + PARAMETRIZE { enabled = TRUE; } + PARAMETRIZE { enabled = FALSE; } + SetConfig(CONFIG_POKERUS_ENABLED, enabled); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + + SET_RNG(RNG_POKERUS_INFECTION, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ((GetMonData(&gPlayerParty[0], MON_DATA_POKERUS) > 0), enabled); +} + +TEST("(Pokerus) RandomlyGivePartyPokerus doesn't freeze if the party is empty") +{ + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + ZeroPlayerPartyMons(); + SET_RNG(RNG_POKERUS_INFECTION, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ(gPlayerPartyCount, 0); +} + +TEST("(Pokerus) Eggs can only be infected if POKERUS_INFECT_EGG is TRUE") +{ + bool32 infectEgg; + PARAMETRIZE { infectEgg = TRUE; } + PARAMETRIZE { infectEgg = FALSE; } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_INFECT_EGG, infectEgg); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + + bool32 isEgg = TRUE; + SetMonData(&gPlayerParty[0], MON_DATA_IS_EGG, &isEgg); + + SET_RNG(RNG_POKERUS_INFECTION, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ((GetMonData(&gPlayerParty[0], MON_DATA_POKERUS) > 0), infectEgg); +} + +TEST("(Pokerus) No infection when POKERUS_INFECT_AGAIN is false and you already have active pokerus in party") +{ + u32 infectAgain; + PARAMETRIZE { infectAgain = GEN_2; } + PARAMETRIZE { infectAgain = GEN_3; } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_INFECT_AGAIN, infectAgain); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + givemon SPECIES_PIKACHU, 100; + ); + + u8 pokerus = 1; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus); + + SET_RNG(RNG_POKERUS_INFECTION, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ((GetMonData(&gPlayerParty[1], MON_DATA_POKERUS) > 0), infectAgain == GEN_2); +} + +TEST("(Pokerus) Test POKERUS_HERD_IMMUNITY config in RandomlyGivePartyPokerus") +{ + u32 herdImmunity; + PARAMETRIZE { herdImmunity = TRUE; } + PARAMETRIZE { herdImmunity = FALSE; } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_HERD_IMMUNITY, herdImmunity); + SetConfig(CONFIG_POKERUS_INFECT_AGAIN, GEN_2); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + givemon SPECIES_PIKACHU, 100; + ); + + u8 pokerus = 1; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus); + + SET_RNG(RNG_POKERUS_INFECTION, 0); + SET_RNG(RNG_POKERUS_PARTY_MEMBER, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ((GetMonData(&gPlayerParty[1], MON_DATA_POKERUS) == 0), herdImmunity); +} + +#if P_POKERUS_FLAG_INFECTION +TEST("(Pokerus) No infection when P_POKERUS_FLAG_INFECTION is clear") +{ + u32 flag; + PARAMETRIZE { flag = TRUE; } + PARAMETRIZE { flag = FALSE; } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + givemon SPECIES_PIKACHU, 100; + ); + + u8 pokerus = 1; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus); + + if (flag) + FlagSet(P_POKERUS_FLAG_INFECTION); + else + FlagClear(P_POKERUS_FLAG_INFECTION); + + SET_RNG(RNG_POKERUS_INFECTION, 0); + + CalculatePlayerPartyCount(); + RandomlyGivePartyPokerus(); + + EXPECT_EQ((GetMonData(&gPlayerParty[1], MON_DATA_POKERUS) > 0), flag); +} +#endif + +TEST("(Pokerus) Test GetMonData for MON_DATA_POKERUS_DAYS_LEFT and MON_DATA_POKERUS_STRAIN") +{ + u32 strain = 0; + u32 daysLeft = 0; + for (u32 i = 0; i < 16; i++) + { + for (u32 j = 0; j < 16; j++) + { + PARAMETRIZE { strain = i; daysLeft = j;} + } + } + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + ); + + u8 pokerus = (strain << 4) | daysLeft; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus); + + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_DAYS_LEFT), daysLeft); +} + +TEST("(Pokerus) Test SetMonData for MON_DATA_POKERUS_DAYS_LEFT and MON_DATA_POKERUS_STRAIN") +{ + u32 strain = 0; + u32 daysLeft = 0; + for (u32 i = 0; i < 16; i++) + { + for (u32 j = 0; j < 16; j++) + { + PARAMETRIZE { strain = i; daysLeft = j; } + } + } + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + ); + + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN, &strain); + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); + + u8 pokerus = (strain << 4) | daysLeft; + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS), pokerus); +} + +TEST("(Pokerus) Test IsPokerusInParty general behavior") +{ + u32 enabled = 0; + u32 partyMember = 0; + u32 pokerus = 0; + for (u32 i = 0; i < PARTY_SIZE; i++) + { + for (u32 j = 0; j <= MAX_u8; j++) + { + if ((j & 0x0F) == 0) + continue; + PARAMETRIZE { enabled = TRUE; partyMember = i; pokerus = j; } + PARAMETRIZE { enabled = FALSE; partyMember = i, pokerus = j; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, enabled); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + EXPECT_EQ(IsPokerusInParty(), FALSE); + + u32 tmp = pokerus; + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &tmp); + + EXPECT_EQ(IsPokerusInParty(), enabled); +} + +TEST("(Pokerus) Test CheckMonPokerus general behavior") +{ + u32 enabled = 0; + u32 pokerus = 0; + for (u32 i = 0; i < PARTY_SIZE; i++) + { + for (u32 j = 0; j <= MAX_u8; j++) + { + if ((j & 0x0F) == 0) + continue; + PARAMETRIZE { enabled = TRUE; pokerus = j; } + PARAMETRIZE { enabled = FALSE; pokerus = j; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, enabled); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + + EXPECT_EQ(CheckMonPokerus(&gPlayerParty[0]), FALSE); + + u32 tmp = pokerus; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &tmp); + + EXPECT_EQ(CheckMonPokerus(&gPlayerParty[0]), enabled); +} + +TEST("(Pokerus) Test CheckMonHasHadPokerus general behavior") +{ + u32 enabled = 0; + u32 pokerus = 0; + for (u32 i = 0; i < PARTY_SIZE; i++) + { + for (u32 j = 1; j <= MAX_u8; j++) + { + PARAMETRIZE { enabled = TRUE; pokerus = j; } + PARAMETRIZE { enabled = FALSE; pokerus = j; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, enabled); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + + + EXPECT_EQ(CheckMonHasHadPokerus(&gPlayerParty[0]), FALSE); + + u32 tmp = pokerus; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &tmp); + + EXPECT_EQ(CheckMonHasHadPokerus(&gPlayerParty[0]), enabled); +} + +TEST("(Pokerus) Test UpdatePartyPokerusTime general behavior") +{ + u32 enabled = 0; + u32 strain = 0; + s32 daysLeft = 0; + s32 daysPassed = 0; + for (u32 i = 0; i < 16; i++) + { + for (u32 j = 0; j < 16; j++) + { + for (u32 k = 1; k < 4; k++) + { + PARAMETRIZE { enabled = TRUE; strain = i; daysLeft = j; daysPassed = k; } + PARAMETRIZE { enabled = FALSE; strain = i; daysLeft = j; daysPassed = k; } + } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, enabled); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + + + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN, &strain); + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); + UpdatePartyPokerusTime(daysPassed); + + if (enabled) + { + if ( (strain == 0) //Verify strain 0 is modified to strain 1 when timer is up + && (daysLeft > 0) + && ((daysLeft - daysPassed) <= 0) + ) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN), 1); + else + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_DAYS_LEFT), max(0, daysLeft - daysPassed)); + } + else + { + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS_DAYS_LEFT), daysLeft); + } +} + + +TEST("(Pokerus) Test PartySpreadPokerus general behavior") +{ + u32 partyMember = 0; + u32 pokerus = 0; + for (u32 i = 0; i <= MAX_u8; i++) + { + if ((i & 0x0F) == 0) + continue; + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE {pokerus = i; partyMember = k;} + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_SPREAD_DAYS_LEFT, GEN_3); + SetConfig(CONFIG_POKERUS_SPREAD_ADJACENCY, GEN_3); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &pokerus); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS), pokerus); + if (partyMember == 0) + { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS), pokerus); + for (u32 i = 2; i < PARTY_SIZE; i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + + } + else if (partyMember == PARTY_SIZE - 1) + { + EXPECT_EQ(GetMonData(&gPlayerParty[PARTY_SIZE - 2], MON_DATA_POKERUS), pokerus); + for (u32 i = 0; i < (PARTY_SIZE - 2); i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } + else + { + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if ((i < (partyMember - 1)) || (i > (partyMember + 1))) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + else + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), pokerus); + } + } +} + +TEST("(Pokerus) Test PartySpreadPokerus: Pokerus can spread to and from eggs") +{ + u32 partyMember = 0; + u32 pokerus = 0; + for (u32 i = 0; i <= MAX_u8; i++) + { + if ((i & 0x0F) == 0) + continue; + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE {pokerus = i; partyMember = k;} + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_SPREAD_DAYS_LEFT, GEN_3); + SetConfig(CONFIG_POKERUS_SPREAD_ADJACENCY, GEN_3); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + bool32 isEgg = TRUE; + SetMonData(&gPlayerParty[i], MON_DATA_IS_EGG, &isEgg); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &pokerus); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS), pokerus); + if (partyMember == 0) + { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS), pokerus); + for (u32 i = 2; i < PARTY_SIZE; i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + + } + else if (partyMember == PARTY_SIZE - 1) + { + EXPECT_EQ(GetMonData(&gPlayerParty[PARTY_SIZE - 2], MON_DATA_POKERUS), pokerus); + for (u32 i = 0; i < (PARTY_SIZE - 2); i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } + else + { + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if ((i < (partyMember - 1)) || (i > (partyMember + 1))) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + else + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), pokerus); + } + } +} + +TEST("(Pokerus) Test PartySpreadPokerus: do not spread inactive pokerus") +{ + u32 partyMember = 0; + u32 pokerus = 0; + for (u32 i = 0; i <= MAX_u8; i++) + { + if (i & 0x0F) + continue; + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE { pokerus = i; partyMember = k; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &pokerus); + SET_RNG(RNG_POKERUS_SPREAD, 0); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS), pokerus); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (i != partyMember) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } +} + + +TEST("(Pokerus) Test PartySpreadPokerus: do not spread if POKERUS_ENABLED is false") +{ + u32 partyMember = 0; + u32 pokerus = 0; + for (u32 i = 0; i <= MAX_u8; i++) + { + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE { pokerus = i; partyMember = k; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, FALSE); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &pokerus); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS), pokerus); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (i != partyMember) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } +} + +TEST("(Pokerus) Test PartySpreadPokerus: do not spread to pokemon who got pokerus before") +{ + u32 pokerus1 = 0; + u32 pokerus2 = 0; + for (u32 i = 1; i < 16; i++) + { + for (u32 j = 1; j < 16; j++) + { + PARAMETRIZE { pokerus1 = ((i << 4) | 1); pokerus2 = ((j << 4) | 0); } + PARAMETRIZE { pokerus1 = ((i << 4) | 2); pokerus2 = ((j << 4) | 1); } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + givemon SPECIES_PIKACHU, 100; + ); + + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus1); + SetMonData(&gPlayerParty[1], MON_DATA_POKERUS, &pokerus2); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS), GetMonData(&gPlayerParty[1], MON_DATA_POKERUS)); +} + +TEST("(Pokerus) Test PartySpreadPokerus: strain 0 can be spread to if POKERUS_WEAK_VARIANT is true") +{ + u32 weakVariant = 0; + u32 pokerus2 = 0; + for (u32 i = 2; i <= MAX_u8; i++) + { + if ((i & 0x0F) == 0) + continue; + PARAMETRIZE { weakVariant = TRUE; pokerus2 = i; } + PARAMETRIZE { weakVariant = FALSE; pokerus2 = i; } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_WEAK_VARIANT, weakVariant); + + ZeroPlayerPartyMons(); + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100; + givemon SPECIES_PIKACHU, 100; + ); + + u32 pokerus1 = 1; + SetMonData(&gPlayerParty[0], MON_DATA_POKERUS, &pokerus1); + SetMonData(&gPlayerParty[1], MON_DATA_POKERUS, &pokerus2); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + if (weakVariant) + EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS), GetMonData(&gPlayerParty[1], MON_DATA_POKERUS)); + else + EXPECT_NE(GetMonData(&gPlayerParty[0], MON_DATA_POKERUS), GetMonData(&gPlayerParty[1], MON_DATA_POKERUS)); +} + +TEST("(Pokerus) Test PartySpreadPokerus when POKERUS_SPREAD_DAYS_LEFT is set to GEN2") +{ + u32 partyMember = 0; + u32 strain = 0; + u32 daysLeft = 0; + for (u32 i = 0; i < 16; i++) + { + for (u32 j = 1; j < 16; j++) + { + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE {strain = i; daysLeft = j; partyMember = k;} + } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_SPREAD_DAYS_LEFT, GEN_2); + SetConfig(CONFIG_POKERUS_SPREAD_ADJACENCY, GEN_3); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS_STRAIN, &strain); + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS_DAYS_LEFT, &daysLeft); + SET_RNG(RNG_POKERUS_SPREAD, 0); + PartySpreadPokerus(); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS_DAYS_LEFT), daysLeft); + if (partyMember == 0) + { + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS_DAYS_LEFT), GetDaysLeftBasedOnStrain(strain)); + for (u32 i = 2; i < PARTY_SIZE; i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + + } + else if (partyMember == PARTY_SIZE - 1) + { + EXPECT_EQ(GetMonData(&gPlayerParty[PARTY_SIZE - 2], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[PARTY_SIZE - 2], MON_DATA_POKERUS_DAYS_LEFT), GetDaysLeftBasedOnStrain(strain)); + for (u32 i = 0; i < (PARTY_SIZE - 2); i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } + else + { + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if ((i < (partyMember - 1)) || (i > (partyMember + 1))) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + else if (i != partyMember) + { + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_STRAIN), strain); + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS_DAYS_LEFT), GetDaysLeftBasedOnStrain(strain)); + } + } + } +} + +TEST("(Pokerus) Test PartySpreadPokerus using gen2 adjacency") +{ + u32 partyMember = 0; + u32 pokerus = 0; + u32 spreadUp = 0; //spread in ascending order of party index + for (u32 i = 0; i <= MAX_u8; i++) + { + if ((i & 0x0F) == 0) + continue; + for (u32 k = 0; k < PARTY_SIZE; k++) + { + PARAMETRIZE { pokerus = i; partyMember = k; spreadUp = TRUE; } + PARAMETRIZE { pokerus = i; partyMember = k; spreadUp = FALSE; } + } + } + SetConfig(CONFIG_POKERUS_ENABLED, TRUE); + SetConfig(CONFIG_POKERUS_SPREAD_DAYS_LEFT, GEN_3); + SetConfig(CONFIG_POKERUS_SPREAD_ADJACENCY, GEN_2); + + ZeroPlayerPartyMons(); + for (u32 i = 0; i < PARTY_SIZE; i++) + { + RUN_OVERWORLD_SCRIPT( + givemon SPECIES_PIKACHU, 100 + ); + } + + SetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS, &pokerus); + + SET_RNG(RNG_POKERUS_SPREAD, 0); + SET_RNG(RNG_POKERUS_SPREAD_SIDE, spreadUp); + + PartySpreadPokerus(); + + EXPECT_EQ(GetMonData(&gPlayerParty[partyMember], MON_DATA_POKERUS), pokerus); + if (partyMember == 0) + { + if (spreadUp) + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS), pokerus); + else + EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKERUS), 0); + for (u32 i = 2; i < PARTY_SIZE; i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + + } + else if (partyMember == PARTY_SIZE - 1) + { + EXPECT_EQ(GetMonData(&gPlayerParty[PARTY_SIZE - 2], MON_DATA_POKERUS), pokerus); + for (u32 i = 0; i < (PARTY_SIZE - 2); i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } + else + { + for (u32 i = 0; i < PARTY_SIZE; i++) + { + if (!spreadUp && (i == (partyMember - 1))) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), pokerus); + else if (spreadUp && (i == (partyMember + 1))) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), pokerus); + else if (i != partyMember) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_POKERUS), 0); + } + } +} diff --git a/test/random.c b/test/random.c index 238a76467..cd37a9a7a 100644 --- a/test/random.c +++ b/test/random.c @@ -1,4 +1,5 @@ #include "global.h" +#include "malloc.h" #include "test/test.h" #include "random.h" @@ -79,19 +80,26 @@ TEST("RandomUniformExcept generates lo..hi") TEST("RandomWeighted generates 0..n-1") { u32 n, sum, i; - static const u8 ws[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + static const u16 ws[8] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + u16 *ws2 = Alloc(8 * sizeof(u16)); PARAMETRIZE { n = 1; } PARAMETRIZE { n = 2; } PARAMETRIZE { n = 3; } PARAMETRIZE { n = 4; } ASSUME(n <= ARRAY_COUNT(ws)); for (i = 0, sum = 0; i < n; i++) + { + ws2[i] = ws[i]; sum += ws[i]; + } for (i = 0; i < 1024; i++) { u32 r = RandomWeightedArrayDefault(RNG_NONE, sum, n, ws); EXPECT(0 <= r && r < n); + r = RandomWeightedArrayDefault(RNG_NONE, sum, n, ws2); + EXPECT(0 <= r && r < n); } + Free(ws2); } TEST("RandomElement generates an element") @@ -151,7 +159,7 @@ TEST("RandomUniformExcept generates uniform distribution") TEST("RandomWeighted generates distribution in proportion to the weights") { u32 i, sum, error; - static const u8 ws[4] = { 1, 2, 2, 3 }; + static const u16 ws[4] = { 1, 2, 2, 3 }; u16 distribution[ARRAY_COUNT(ws)]; for (i = 0, sum = 0; i < ARRAY_COUNT(ws); i++) diff --git a/test/species.c b/test/species.c index c4d91e60e..8a089af9f 100644 --- a/test/species.c +++ b/test/species.c @@ -59,6 +59,23 @@ TEST("Form change tables contain only forms in the form species ID table") } } +TEST("Forms have the appropriate species form changes") +{ + u32 i; + u32 species = SPECIES_NONE; + + for (i = 0; i < NUM_SPECIES; i++) + { + if (gSpeciesInfo[i].isMegaEvolution + || gSpeciesInfo[i].isGigantamax + || gSpeciesInfo[i].isUltraBurst) + { + PARAMETRIZE_LABEL("%S", gSpeciesInfo[i].speciesName) { species = i; } + } + } + EXPECT(DoesSpeciesHaveFormChangeMethod(species, FORM_CHANGE_END_BATTLE)); + } + TEST("Form change targets have the appropriate species flags") { u32 i; diff --git a/test/test_runner.c b/test/test_runner.c index b9a868561..fd7c53408 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -161,6 +161,9 @@ void TestRunner_CheckMemory(void) { Test_MgbaPrintf("%s: %d bytes not freed", location, block->size); gTestRunnerState.result = TEST_RESULT_FAIL; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; break; } } @@ -169,6 +172,9 @@ void TestRunner_CheckMemory(void) { Test_MgbaPrintf(": %d bytes not freed", block->size); gTestRunnerState.result = TEST_RESULT_FAIL; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; } } block = block->next; @@ -181,6 +187,9 @@ void TestRunner_CheckMemory(void) { Test_MgbaPrintf(":L%s:%d - %p: task not freed", gTestRunnerState.test->filename, SourceLine(0), gTasks[i].func); gTestRunnerState.result = TEST_RESULT_FAIL; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; } } } @@ -248,6 +257,9 @@ top: if (gPersistentTestRunnerState.expectCrash) gTestRunnerState.expectedResult = TEST_RESULT_CRASH; + + gTestRunnerState.expectedFailLine = 0; + gTestRunnerState.expectedFailState = NO_EXPECT_FAIL; } else { @@ -286,6 +298,8 @@ top: gTestRunnerState.result = TEST_RESULT_PASS; gTestRunnerState.expectedResult = TEST_RESULT_PASS; gTestRunnerState.expectLeaks = FALSE; + gTestRunnerState.expectedFailLine = 0; + gTestRunnerState.expectedFailState = NO_EXPECT_FAIL; if (gTestRunnerHeadless) gTestRunnerState.timeoutSeconds = TIMEOUT_SECONDS; else @@ -356,8 +370,23 @@ top: { const char *color; const char *result; + bool32 expectedFailOnCorrectLine = FALSE; - if (gTestRunnerState.result == gTestRunnerState.expectedResult + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SUCCESS) + { + // Failed within expected block; pass + expectedFailOnCorrectLine = TRUE; + color = "\e[32m"; + Test_MgbaPrintf(":N%s", gTestRunnerState.test->name); + } + else if (gTestRunnerState.expectedFailState == EXPECT_FAIL_CLOSED + && gTestRunnerState.result == TEST_RESULT_FAIL) + { + // Failed outside expected block; fail + gTestRunnerState.exitCode = 1; + color = "\e[31m"; + } + else if (gTestRunnerState.result == gTestRunnerState.expectedResult || (gTestRunnerState.result == TEST_RESULT_FAIL && gTestRunnerState.expectedResult == TEST_RESULT_KNOWN_FAIL)) { @@ -382,14 +411,29 @@ top: result = "KNOWN_FAILING"; color = "\e[33m"; } + else if (expectedFailOnCorrectLine) + { + color = "\e[32m"; + result = "EXPECTED_FAIL"; + } + else if (gTestRunnerState.expectedResult == TEST_RESULT_FAIL + && gTestRunnerState.expectedFailState != EXPECT_FAIL_SUCCESS) + { + // Failed on wrong line + result = "UNEXPECTED_FAIL_LINE"; + } else { result = "FAIL"; } break; case TEST_RESULT_PASS: - if (gTestRunnerState.result != gTestRunnerState.expectedResult) + if (gTestRunnerState.result != gTestRunnerState.expectedResult + && gTestRunnerState.expectedFailLine == 0) result = "KNOWN_FAILING_PASS"; + else if (gTestRunnerState.result != gTestRunnerState.expectedResult + && gTestRunnerState.expectedFailLine != 0) + result = "EXPECTED_FAIL_PASS"; else result = "PASS"; break; @@ -423,25 +467,39 @@ top: if (gTestRunnerState.result != gTestRunnerState.expectedResult) { Test_MgbaPrintf(":L%s:%d", gTestRunnerState.test->filename, SourceLine(0)); - Test_MgbaPrintf(":U%s%s\e[0m", color, result); + if (gTestRunnerState.expectedFailLine == 0) + Test_MgbaPrintf(":U%s%s\e[0m", color, result); + else + Test_MgbaPrintf(":V%s%s\e[0m", color, result); } else { Test_MgbaPrintf(":P%s%s\e[0m", color, result); } } + else if (expectedFailOnCorrectLine) + Test_MgbaPrintf(":E%s%s\e[0m", color, result); else if (gTestRunnerState.result == TEST_RESULT_ASSUMPTION_FAIL) Test_MgbaPrintf(":A%s%s\e[0m", color, result); else if (gTestRunnerState.result == TEST_RESULT_TODO) Test_MgbaPrintf(":T%s%s\e[0m", color, result); else if (gTestRunnerState.expectedResult == gTestRunnerState.result + && gTestRunnerState.result == TEST_RESULT_CRASH) + Test_MgbaPrintf(":E%s%s\e[0m", color, result); + else if (gTestRunnerState.expectedResult == gTestRunnerState.result + && gTestRunnerState.result == TEST_RESULT_FAIL + && gTestRunnerState.expectedFailLine == 0) + Test_MgbaPrintf(":K%s%s\e[0m", color, result); + else if ((gTestRunnerState.expectedResult == gTestRunnerState.result + && gTestRunnerState.expectedFailState == NO_EXPECT_FAIL) || (gTestRunnerState.result == TEST_RESULT_FAIL && gTestRunnerState.expectedResult == TEST_RESULT_KNOWN_FAIL)) Test_MgbaPrintf(":K%s%s\e[0m", color, result); else Test_MgbaPrintf(":F%s%s\e[0m", color, result); } - + gTestRunnerState.expectedFailLine = 0; + gTestRunnerState.expectedFailState = NO_EXPECT_FAIL; break; case STATE_NEXT_TEST: @@ -480,9 +538,30 @@ void Test_ExpectCrash(bool32 expectCrash) Test_ExpectedResult(TEST_RESULT_CRASH); } +void Test_ExpectFail(u32 failLine) +{ + // If expecting a fail and fail has not already been encountered + if ((gTestRunnerState.expectedFailState != EXPECT_FAIL_SUCCESS) + && (gTestRunnerState.expectedFailState != EXPECT_FAIL_TURN_OPEN) + && (gTestRunnerState.expectedFailState != EXPECT_FAIL_SCENE_OPEN)) + { + if (failLine == -1) + { + Test_ExpectedResult(TEST_RESULT_FAIL); + gTestRunnerState.expectedFailState = EXPECT_FAIL_OPEN; + } + else + { + gTestRunnerState.expectedFailLine = failLine; + gTestRunnerState.expectedFailState = EXPECT_FAIL_CLOSED; + } + } +} + static void FunctionTest_SetUp(void *data) { (void)data; + TestInitConfigData(); ClearRiggedRng(); gFunctionTestRunnerState = AllocZeroed(sizeof(*gFunctionTestRunnerState)); SeedRng(0); @@ -503,6 +582,7 @@ static void FunctionTest_Run(void *data) static void FunctionTest_TearDown(void *data) { (void)data; + TestFreeConfigData(); FREE_AND_SET_NULL(gFunctionTestRunnerState); } @@ -537,7 +617,7 @@ static u32 FunctionTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 return RandomUniformDefaultValue(tag, lo, hi, reject, caller); } -static u32 FunctionTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) +static u32 FunctionTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u16 *weights, void *caller) { //rigged for (u32 i = 0; i < RIGGED_RNG_COUNT; i++) @@ -658,6 +738,32 @@ void Test_ExitWithResult_(enum TestResult result, u32 stopLine, const void *retu { gTestRunnerState.result = result; gTestRunnerState.failedAssumptionsBlockLine = stopLine; + + if (result == TEST_RESULT_FAIL) + { + switch (gTestRunnerState.expectedFailState) + { + case EXPECT_FAIL_OPEN: + case EXPECT_FAIL_TURN_OPEN: + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; + break; + case EXPECT_FAIL_SCENE_OPEN: // EXPECT_FAIL_SUCCESS set in individual Queue functions + gTestRunnerState.expectedFailState = EXPECT_FAIL_CLOSED; + break; + default: + break; + } + } + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_CLOSED + && gTestRunnerState.expectedResult == TEST_RESULT_FAIL + && result == TEST_RESULT_FAIL) + { + Test_MgbaPrintf(":L%s:%d: Expected failure in block from line %d, but failed on line %d", + gTestRunnerState.test->filename, stopLine, + gTestRunnerState.expectedFailLine, stopLine); + } + ReinitCallbacks(); if (gTestRunnerState.state == STATE_REPORT_RESULT && gTestRunnerState.result != gTestRunnerState.expectedResult) @@ -665,6 +771,11 @@ void Test_ExitWithResult_(enum TestResult result, u32 stopLine, const void *retu if (!gTestRunnerState.test->runner->handleExitWithResult || !gTestRunnerState.test->runner->handleExitWithResult(gTestRunnerState.test->data, result)) { + if (result == TEST_RESULT_INVALID) + { + const void *return0 = __builtin_return_address(0); + Test_MgbaPrintf("in %p\nin %p", return1, return0); + } va_list va; va_start(va, fmt); MgbaVPrintf_(fmt, va); @@ -919,7 +1030,7 @@ u32 RandomUniformExcept(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32 return RandomUniformExceptDefault(tag, lo, hi, reject); } -u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights) +u32 RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u16 *weights) { void *caller = __builtin_extract_return_addr(__builtin_return_address(0)); if (gTestRunnerState.test->runner->randomWeightedArray) @@ -952,7 +1063,7 @@ u32 RandomUniformDefaultValue(enum RandomTag tag, u32 lo, u32 hi, bool32 (*rejec return default_; } -u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u8 *weights, void *caller) +u32 RandomWeightedArrayDefaultValue(enum RandomTag tag, u32 n, const u16 *weights, void *caller) { while (weights[n-1] == 0) { diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 48034526f..493069e21 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -23,6 +23,7 @@ #undef TestRunner_Battle_RecordAbilityPopUp #undef TestRunner_Battle_RecordAnimation #undef TestRunner_Battle_RecordHP +#undef TestRunner_Battle_RecordSubHit #undef TestRunner_Battle_RecordMessage #undef TestRunner_Battle_RecordStatus1 #undef TestRunner_Battle_AfterLastTurn @@ -54,7 +55,7 @@ STATIC_ASSERT(sizeof(struct BattleTestRunnerState) <= sizeof(sBackupMapData), sB static void CB2_BattleTest_NextParameter(void); static void CB2_BattleTest_NextTrial(void); static void PushBattlerAction(u32 sourceLine, s32 battlerId, u32 actionType, u32 byte); -static void PrintAiMoveLog(u32 battlerId, u32 moveSlot, u32 moveId, s32 totalScore); +static void PrintAiMoveLog(u32 battlerId, u32 moveSlot, enum Move moveId, s32 totalScore); static void ClearAiLog(u32 battlerId); static const char *BattlerIdentifier(s32 battlerId); @@ -235,6 +236,7 @@ static u32 BattleTest_EstimateCost(void *data) const struct BattleTest *test = data; memset(STATE, 0, sizeof(*STATE)); STATE->runRandomly = TRUE; + ResetStartingStatuses(); InvokeTestFunction(test); cost = 1; if (STATE->parametersCount != 0) @@ -377,7 +379,7 @@ static void BattleTest_Run(void *data) DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_AI_MULTI: - DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); DATA.recordedBattle.opponentA = TRAINER_PLAYER_LEAF; DATA.recordedBattle.opponentB = TRAINER_PLAYER_RED; @@ -388,7 +390,7 @@ static void BattleTest_Run(void *data) DATA.currentMonIndexes[3] = 3; // Opponent B first mon break; case BATTLE_TEST_AI_TWO_VS_ONE: - DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); DATA.recordedBattle.opponentA = TRAINER_PLAYER_LEAF; DATA.recordedBattle.opponentB = 0xFFFF; @@ -422,7 +424,7 @@ static void BattleTest_Run(void *data) DATA.currentMonIndexes[i] = i / 2; break; case BATTLE_TEST_MULTI: - DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; DATA.recordedBattle.opponentB = TRAINER_LINK_OPPONENT; @@ -432,7 +434,7 @@ static void BattleTest_Run(void *data) DATA.currentMonIndexes[3] = 3; // Opponent B first mon break; case BATTLE_TEST_TWO_VS_ONE: - DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; + DATA.recordedBattle.battleFlags = BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_RECORDED_IS_MASTER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI; DATA.recordedBattle.partnerId = TRAINER_PARTNER(PARTNER_STEVEN); DATA.recordedBattle.opponentA = TRAINER_LINK_OPPONENT; DATA.recordedBattle.opponentB = 0xFFFF; @@ -452,6 +454,8 @@ static void BattleTest_Run(void *data) break; } + gBattleTypeFlags = DATA.recordedBattle.battleFlags; + for (i = 0; i < MAX_LINK_PLAYERS; i++) { DATA.recordedBattle.playersName[i][0] = CHAR_1 + i; @@ -496,14 +500,14 @@ static void BattleTest_Run(void *data) for (i = 0; i < 3; i++) { - if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) revisedPlayerExplicitSpeeds |= 1 << i; } for (i = 3; i < PARTY_SIZE; i++) { - if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + if(GetMonData(&DATA.recordedBattle.playerParty[i], MON_DATA_SPECIES) != SPECIES_NONE) { - if(DATA.currentPosition == B_POSITION_PLAYER_LEFT) + if(DATA.battleTrainer == B_TRAINER_0) revisedPlayerExplicitSpeeds |= 1 << i; else revisedPartnerExplicitSpeeds |= 1 << i; @@ -512,23 +516,23 @@ static void BattleTest_Run(void *data) for (i = 0; i < 3; i++) { - if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES) != SPECIES_NONE) revisedOpponentAExplicitSpeeds |= 1 << i; } for (i = 3; i < PARTY_SIZE; i++) { - if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES, NULL) != SPECIES_NONE) + if(GetMonData(&DATA.recordedBattle.opponentParty[i], MON_DATA_SPECIES) != SPECIES_NONE) { - if(DATA.currentPosition == B_POSITION_OPPONENT_LEFT) + if(DATA.battleTrainer == B_TRAINER_1) revisedOpponentAExplicitSpeeds |= 1 << i; else revisedOpponentBExplicitSpeeds |= 1 << i; } } - if (((DATA.explicitSpeeds[B_POSITION_PLAYER_LEFT] + DATA.explicitSpeeds[B_POSITION_PLAYER_RIGHT]) != (revisedPlayerExplicitSpeeds + revisedPartnerExplicitSpeeds) - || (DATA.explicitSpeeds[B_POSITION_OPPONENT_LEFT] + DATA.explicitSpeeds[B_POSITION_OPPONENT_RIGHT]) != (revisedOpponentAExplicitSpeeds + revisedOpponentBExplicitSpeeds))) - + if (((DATA.explicitSpeeds[B_TRAINER_0] + DATA.explicitSpeeds[B_TRAINER_2]) != (revisedPlayerExplicitSpeeds + revisedPartnerExplicitSpeeds) + || (DATA.explicitSpeeds[B_TRAINER_1] + DATA.explicitSpeeds[B_TRAINER_3]) != (revisedOpponentAExplicitSpeeds + revisedOpponentBExplicitSpeeds))) + { Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":LSpeed required for all PLAYERs and OPPONENTs"); } @@ -554,6 +558,33 @@ static void BattleTest_Run(void *data) PrintTestName(); } +static bool32 IsTieBreakTag(enum RandomTag tag) +{ + switch (tag) + { + case RNG_AI_SCORE_TIE_SINGLES: + case RNG_AI_SCORE_TIE_DOUBLES_MOVE: + case RNG_AI_SCORE_TIE_DOUBLES_TARGET: + return TRUE; + default: + break; + } + return FALSE; +} + +static void SanitizeTieCounts(void) +{ + if (DATA.trial.scoreTieCount < 1) + DATA.trial.scoreTieCount = 1; + if (DATA.trial.scoreTieCount > MAX_MON_MOVES) + DATA.trial.scoreTieCount = MAX_MON_MOVES; + + if (DATA.trial.targetTieCount < 1) + DATA.trial.targetTieCount = 1; + if (DATA.trial.targetTieCount >= gBattlersCount) + DATA.trial.targetTieCount = (gBattlersCount - 1); +} + u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32), void *caller) { STATE->didRunRandomly = TRUE; @@ -575,7 +606,7 @@ u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32 if (!reject) { - if (STATE->trials != (hi - lo + 1)) + if ((STATE->trials != (hi - lo + 1)) && !(IsTieBreakTag(tag))) Test_ExitWithResult(TEST_RESULT_ERROR, SourceLine(0), ":LRandomUniform called from %p with tag %d and inconsistent trials %d and %d", caller, tag, STATE->trials, hi - lo + 1); return STATE->runTrial + lo; } @@ -591,7 +622,7 @@ u32 RandomUniformTrials(enum RandomTag tag, u32 lo, u32 hi, bool32 (*reject)(u32 } -u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) +u32 RandomWeightedArrayTrials(enum RandomTag tag, u32 sum, u32 n, const u16 *weights, void *caller) { //Detect inconsistent sum u32 weightSum = 0; @@ -649,15 +680,54 @@ static u32 BattleTest_RandomUniform(enum RandomTag tag, u32 lo, u32 hi, bool32 ( return turn->rng.value; } } + + if (IsTieBreakTag(tag)) + SanitizeTieCounts(); + //trials - if (tag == STATE->rngTag) + switch (tag) + { + case RNG_AI_SCORE_TIE_SINGLES: + case RNG_AI_SCORE_TIE_DOUBLES_MOVE: + switch (DATA.scoreTieResolution) + { + case SCORE_TIE_HI: + return (DATA.trial.scoreTieCount - 1); + case SCORE_TIE_RANDOM: + return RandomUniformTrials(tag, lo, hi, reject, caller); + case SCORE_TIE_CHOSEN: + if (DATA.scoreTieOverride >= DATA.trial.scoreTieCount) + return (DATA.trial.scoreTieCount - 1); + else + return DATA.scoreTieOverride; + default: + return 0; + } + case RNG_AI_SCORE_TIE_DOUBLES_TARGET: + switch (DATA.targetTieResolution) + { + case TARGET_TIE_HI: + return (DATA.trial.targetTieCount - 1); + case TARGET_TIE_RANDOM: + return RandomUniformTrials(tag, lo, hi, reject, caller); + case TARGET_TIE_CHOSEN: + if (DATA.targetTieOverride >= DATA.trial.targetTieCount) + return (DATA.trial.targetTieCount - 1); + else + return DATA.targetTieOverride; + default: + return 0; + } + default: + if (tag && tag == STATE->rngTag) return RandomUniformTrials(tag, lo, hi, reject, caller); + } //default return RandomUniformDefaultValue(tag, lo, hi, reject, caller); } -static u32 BattleTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u8 *weights, void *caller) +static u32 BattleTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, const u16 *weights, void *caller) { //rigged const struct BattlerTurn *turn = NULL; @@ -670,7 +740,7 @@ static u32 BattleTest_RandomWeightedArray(enum RandomTag tag, u32 sum, u32 n, co } //trials - if (tag == STATE->rngTag) + if (tag && tag == STATE->rngTag) return RandomWeightedArrayTrials(tag, sum, n, weights, caller); //default @@ -725,7 +795,7 @@ static const void *BattleTest_RandomElementArray(enum RandomTag tag, const void //trials - if (tag == STATE->rngTag) + if (tag && tag == STATE->rngTag) return RandomElementArrayTrials(tag, array, size, count, caller); //default @@ -775,6 +845,8 @@ void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched ABILITY_POPUP", filename, line); } @@ -838,6 +910,8 @@ void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched ANIMATION", filename, line); } @@ -928,6 +1002,8 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched HP_BAR", filename, line); } @@ -946,6 +1022,87 @@ void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP) } } +static s32 TrySubHit(s32 i, s32 n, u32 battlerId, u32 damage, bool32 broke) +{ + struct QueuedSubHitEvent *event; + s32 iMax = i + n; + for (; i < iMax; i++) + { + if (DATA.queuedEvents[i].type != QUEUED_SUB_HIT_EVENT) + continue; + + event = &DATA.queuedEvents[i].as.subHit; + + if (event->battlerId == battlerId) + { + if (event->checkBreak) + { + if (event->breakSub && !broke) + return -1; + else if (!event->breakSub && broke) + return -1; + } + + if (event->address <= 0xFFFF) + { + event->address = damage; + return i; + } + else + { + *(u16 *)(u32)(event->address) = damage; + return i; + } + } + } + return -1; +} + +void TestRunner_Battle_RecordSubHit(u32 battlerId, u32 damage, bool32 broke) +{ + s32 queuedEvent; + s32 match; + struct QueuedEvent *event; + + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) + return; + + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; + switch (event->groupType) + { + case QUEUE_GROUP_NONE: + case QUEUE_GROUP_ONE_OF: + if (TrySubHit(DATA.trial.queuedEvent, event->groupSize, battlerId, damage, broke) != -1) + DATA.trial.queuedEvent += event->groupSize; + break; + case QUEUE_GROUP_NONE_OF: + queuedEvent = DATA.trial.queuedEvent; + do + { + if ((match = TrySubHit(queuedEvent, event->groupSize, battlerId, damage, broke)) != -1) + { + const char *filename = gTestRunnerState.test->filename; + u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; + Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched SUB_HIT", filename, line); + } + + queuedEvent += event->groupSize; + if (queuedEvent == DATA.queuedEventsCount) + break; + + event = &DATA.queuedEvents[queuedEvent]; + if (event->groupType == QUEUE_GROUP_NONE_OF) + continue; + + if (TrySubHit(queuedEvent, event->groupSize, battlerId, damage, broke) != -1) + DATA.trial.queuedEvent = queuedEvent + event->groupSize; + } while (FALSE); + break; + } +} + static const char *const sBattleActionNames[] = { [B_ACTION_USE_MOVE] = "MOVE", @@ -978,7 +1135,7 @@ static u32 CountAiExpectMoves(struct ExpectedAIAction *expectedAction, u32 battl return countExpected; } -void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, enum Gimmick gimmick) +void TestRunner_Battle_CheckChosenMove(u32 battlerId, enum Move moveId, u32 target, enum Gimmick gimmick) { const char *filename = gTestRunnerState.test->filename; u32 id = DATA.trial.aiActionsPlayed[battlerId]; @@ -1000,6 +1157,9 @@ void TestRunner_Battle_CheckChosenMove(u32 battlerId, u32 moveId, u32 target, en if (expectedAction->explicitTarget && expectedAction->target != target) Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected target %s, got %s", filename, expectedAction->sourceLine, BattlerIdentifier(expectedAction->target), BattlerIdentifier(target)); + if ((DATA.targetTieOverride >= DATA.trial.targetTieCount) && (DATA.targetTieResolution == TARGET_TIE_CHOSEN)) + Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":L%s:%d: TIE_BREAK_TARGET override %d, greater than count %d of targets with tied best score", filename, expectedAction->sourceLine, DATA.targetTieOverride, DATA.trial.targetTieCount); + if (expectedAction->gimmick != GIMMICKS_COUNT && expectedAction->gimmick != gimmick) Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: Expected gimmick %s, got %s", filename, expectedAction->sourceLine, sGimmickIdentifiers[expectedAction->gimmick], sGimmickIdentifiers[gimmick]); @@ -1074,12 +1234,6 @@ void TestRunner_Battle_CheckSwitch(u32 battlerId, u32 partyIndex) DATA.trial.aiActionsPlayed[battlerId]++; } -void TestRunner_Battle_InvalidNoHPMon(u32 battlerId, u32 partyIndex) -{ - Test_ExitWithResult(TEST_RESULT_INVALID, SourceLine(0), ":L%s: INVALID: %s trying to send out a mon(id: %d) with 0 HP.", - gTestRunnerState.test->filename, BattlerIdentifier(battlerId), gBattlerPartyIndexes[battlerId]); -} - static bool32 CheckComparision(s32 val1, s32 val2, u32 cmp) { switch (cmp) @@ -1124,24 +1278,26 @@ static void CheckIfMaxScoreEqualExpectMove(u32 battlerId, s32 target, struct Exp if (scores[i] == scores[bestScoreId] && !aiAction->notMove && (aiAction->moveSlots & (1u << i)) - && !(aiAction->moveSlots & (1u << bestScoreId))) + && !(aiAction->moveSlots & (1u << bestScoreId)) + && (DATA.scoreTieResolution == SCORE_TIE_NONE)) { - Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: EXPECT_MOVE %S has the same best score(%d) as not expected MOVE %S", filename, + Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: EXPECT_MOVE %S has the same best score(%d) as not expected MOVE %S. Consider using TIE_BREAK_SCORE.", filename, aiAction->sourceLine, GetMoveName(moves[i]), scores[i], GetMoveName(moves[bestScoreId])); } // We DO NOT expect move 'i', but it has the same best score as another move. if (scores[i] == scores[bestScoreId] && aiAction->notMove && (aiAction->moveSlots & (1u << i)) - && !(aiAction->moveSlots & (1u << bestScoreId))) + && !(aiAction->moveSlots & (1u << bestScoreId)) + && (DATA.scoreTieResolution == SCORE_TIE_NONE)) { - Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: NOT_EXPECT_MOVE %S has the same best score(%d) as MOVE %S", filename, + Test_ExitWithResult(TEST_RESULT_FAIL, SourceLine(0), ":L%s:%d: NOT_EXPECT_MOVE %S has the same best score(%d) as MOVE %S. Consider using TIE_BREAK_SCORE.", filename, aiAction->sourceLine, GetMoveName(moves[i]), scores[i], GetMoveName(moves[bestScoreId])); } } } -static void PrintAiMoveLog(u32 battlerId, u32 moveSlot, u32 moveId, s32 totalScore) +static void PrintAiMoveLog(u32 battlerId, u32 moveSlot, enum Move moveId, s32 totalScore) { s32 i, scoreFromLogs = 0; @@ -1207,7 +1363,7 @@ void TestRunner_Battle_CheckAiMoveScores(u32 battlerId) struct ExpectedAiScore *scoreCtx = &DATA.expectedAiScores[battlerId][turn][i]; if (scoreCtx->set) { - u32 moveId1 = gBattleMons[battlerId].moves[scoreCtx->moveSlot1]; + enum Move moveId1 = gBattleMons[battlerId].moves[scoreCtx->moveSlot1]; s32 target = scoreCtx->target; s32 *scores = gAiBattleData->finalScore[battlerId][target]; @@ -1222,7 +1378,7 @@ void TestRunner_Battle_CheckAiMoveScores(u32 battlerId) } else { - u32 moveId2 = gBattleMons[battlerId].moves[scoreCtx->moveSlot2]; + enum Move moveId2 = gBattleMons[battlerId].moves[scoreCtx->moveSlot2]; PrintAiMoveLog(battlerId, scoreCtx->moveSlot1, moveId1, scores[scoreCtx->moveSlot1]); PrintAiMoveLog(battlerId, scoreCtx->moveSlot2, moveId2, scores[scoreCtx->moveSlot2]); if (!CheckComparision(scores[scoreCtx->moveSlot1], scores[scoreCtx->moveSlot2], scoreCtx->cmp)) @@ -1327,6 +1483,8 @@ void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched EXPERIENCE_BAR", filename, line); } @@ -1417,6 +1575,8 @@ void TestRunner_Battle_RecordMessage(const u8 *string) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched MESSAGE", filename, line); } @@ -1482,6 +1642,8 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1) { const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched STATUS_ICON", filename, line); } @@ -1500,14 +1662,75 @@ void TestRunner_Battle_RecordStatus1(u32 battlerId, u32 status1) } } +static s32 TryCatchChance(s32 i, s32 n, u32 catchChance) +{ + struct QueuedCaptureEvent *event; + s32 iMax = i + n; + for (; i < iMax; i++) + { + if (DATA.queuedEvents[i].type != QUEUED_CATCH_CHANCE_EVENT) + continue; + + event = &DATA.queuedEvents[i].as.capture; + *(u32 *)(u32)(event->address) = catchChance; + return i; + } + return -1; +} + +void TestRunner_Battle_RecordCatchChance(u32 catchChance) +{ + s32 queuedEvent; + s32 match; + struct QueuedEvent *event; + + if (DATA.trial.queuedEvent == DATA.queuedEventsCount) + return; + + event = &DATA.queuedEvents[DATA.trial.queuedEvent]; + switch (event->groupType) + { + case QUEUE_GROUP_NONE: + case QUEUE_GROUP_ONE_OF: + if (TryCatchChance(DATA.trial.queuedEvent, event->groupSize, catchChance) != -1) + DATA.trial.queuedEvent += event->groupSize; + break; + case QUEUE_GROUP_NONE_OF: + queuedEvent = DATA.trial.queuedEvent; + do + { + if ((match = TryCatchChance(DATA.trial.queuedEvent, event->groupSize, catchChance)) != -1) + { + const char *filename = gTestRunnerState.test->filename; + u32 line = SourceLine(DATA.queuedEvents[match].sourceLineOffset); + Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Matched CATCH CHANCE", filename, line); + } + + queuedEvent += event->groupSize; + if (queuedEvent == DATA.queuedEventsCount) + break; + + event = &DATA.queuedEvents[queuedEvent]; + if (event->groupType == QUEUE_GROUP_NONE_OF) + continue; + + if (TryCatchChance(DATA.trial.queuedEvent, event->groupSize, catchChance) != -1) + DATA.trial.queuedEvent = queuedEvent + event->groupSize; + } while (FALSE); + break; + } +} + static const char *const sEventTypeMacros[] = { [QUEUED_ABILITY_POPUP_EVENT] = "ABILITY_POPUP", [QUEUED_ANIMATION_EVENT] = "ANIMATION", [QUEUED_HP_EVENT] = "HP_BAR", + [QUEUED_SUB_HIT_EVENT] = "SUB_HIT", [QUEUED_EXP_EVENT] = "EXPERIENCE_BAR", [QUEUED_MESSAGE_EVENT] = "MESSAGE", [QUEUED_STATUS_EVENT] = "STATUS_ICON", + [QUEUED_CATCH_CHANCE_EVENT] = "CATCH_CHANCE", }; void TestRunner_Battle_AfterLastTurn(void) @@ -1530,6 +1753,8 @@ void TestRunner_Battle_AfterLastTurn(void) const char *filename = gTestRunnerState.test->filename; u32 line = SourceLine(DATA.queuedEvents[DATA.trial.queuedEvent].sourceLineOffset); const char *macro = sEventTypeMacros[DATA.queuedEvents[DATA.trial.queuedEvent].type]; + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_SCENE_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SUCCESS; Test_ExitWithResult(TEST_RESULT_FAIL, line, ":L%s:%d: Unmatched %s", filename, line, macro); } @@ -1547,10 +1772,17 @@ static void TearDownBattle(void) ZeroEnemyPartyMons(); SetCurrentDifficultyLevel(DIFFICULTY_NORMAL); + // Set Battle Controllers to BATTLE_CONTROLLER_NONE + for (u32 i = 0; i < MAX_BATTLERS_COUNT; i++) + { + gBattlerBattleController[i] = BATTLE_CONTROLLER_NONE; + } + FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); FreeAllWindowBuffers(); + gMain.inBattle = FALSE; // Necessary else some tests report incorrect results when running in same thread as an EXPECT_FAIL test } static void CB2_BattleTest_NextParameter(void) @@ -1560,6 +1792,7 @@ static void CB2_BattleTest_NextParameter(void) { SetMainCallback2(CB2_TestRunner); ClearFlagAfterTest(); + ClearVarAfterTest(); } else { @@ -1626,6 +1859,7 @@ static void BattleTest_TearDown(void *data) // Free resources that aren't cleaned up when the battle was // aborted unexpectedly. ClearFlagAfterTest(); + ClearVarAfterTest(); TestFreeConfigData(); if (!STATE->hasTornDownBattle) { @@ -1738,10 +1972,33 @@ void SetFlagForTest(u32 sourceLine, u16 flagId) FlagSet(flagId); } -void TestSetConfig(u32 sourceLine, enum GenConfigTag configTag, u32 value) +void SetVarForTest(u32 sourceLine, u16 varId, u16 value) +{ + INVALID_IF(DATA.varId != 0, "VAR can only be set once per test"); + DATA.varId = varId; + VarSet(varId, value); +} + +void TestSetConfig(u32 sourceLine, enum ConfigTag configTag, u32 value) { INVALID_IF(!STATE->runGiven, "WITH_CONFIG outside of GIVEN"); - SetGenConfig(configTag, value); + SetConfig(configTag, value); +} + +void TieBreakScore(u32 sourceLine, enum RandomTag rngTag, enum ScoreTieResolution scoreTieRes, u32 value) +{ + INVALID_IF((rngTag != RNG_AI_SCORE_TIE_DOUBLES_MOVE && rngTag != RNG_AI_SCORE_TIE_SINGLES), "TIE_BREAK_SCORE requires RNG_AI_SCORE_TIE_SINGLES or RNG_AI_SCORE_TIE_DOUBLES_MOVE"); + DATA.scoreTieResolution = scoreTieRes; + DATA.scoreTieTag = rngTag; + if (scoreTieRes == SCORE_TIE_CHOSEN) + DATA.scoreTieOverride = value; +} + +void TieBreakTarget(u32 sourceLine, enum TargetTieResolution targetTieRes, u32 value) +{ + DATA.targetTieResolution = targetTieRes; + if (targetTieRes == TARGET_TIE_CHOSEN) + DATA.targetTieOverride = value; } void ClearFlagAfterTest(void) @@ -1753,14 +2010,23 @@ void ClearFlagAfterTest(void) } } -void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species) +void ClearVarAfterTest(void) +{ + if (DATA.varId != 0) + { + VarSet(DATA.varId, 0); + DATA.varId = 0; + } +} + +void OpenPokemon(u32 sourceLine, enum BattleTrainer trainer, u32 species) { s32 i, data; u8 *partySize; struct Pokemon *party; INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); - if ((position & BIT_SIDE) == B_SIDE_PLAYER) + if ((trainer & BIT_SIDE) == B_SIDE_PLAYER) { partySize = &DATA.playerPartySize; party = DATA.recordedBattle.playerParty; @@ -1771,27 +2037,28 @@ void OpenPokemon(u32 sourceLine, enum BattlerPosition position, u32 species) party = DATA.recordedBattle.opponentParty; } INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); - DATA.currentPosition = position; + DATA.battleTrainer = trainer; DATA.currentPartyIndex = *partySize; DATA.currentMon = &party[DATA.currentPartyIndex]; DATA.gender = 0xFF; // Male DATA.nature = NATURE_HARDY; (*partySize)++; - CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); - data = MOVE_NONE; + CreateMon(DATA.currentMon, species, 100, 0, OTID_STRUCT_PRESET(0)); for (i = 0; i < MAX_MON_MOVES; i++) - SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &data); - data = 0; - if (B_FRIENDSHIP_BOOST) { - // This way, we avoid the boost affecting tests unless explicitly stated. - SetMonData(DATA.currentMon, MON_DATA_FRIENDSHIP, &data); - CalculateMonStats(DATA.currentMon); + data = MOVE_NONE; + SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &data); + data = 0x7F; // Max PP possible + SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &data); } + data = 0; + if (B_FRIENDSHIP_BOOST) // This way, we avoid the boost affecting tests unless explicitly stated. + SetMonData(DATA.currentMon, MON_DATA_FRIENDSHIP, &data); + CalculateMonStats(DATA.currentMon); } -void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species) +void OpenPokemonMulti(u32 sourceLine, enum BattleTrainer trainer, u32 species) { s32 i, data; @@ -1799,32 +2066,32 @@ void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species struct Pokemon *party; INVALID_IF(species >= SPECIES_EGG, "Invalid species: %d", species); ASSUMPTION_FAIL_IF(!IsSpeciesEnabled(species), "Species disabled: %d", species); - if (position == B_POSITION_PLAYER_LEFT) // MULTI_PLAYER + if (trainer == B_TRAINER_0) // MULTI_PLAYER { partySize = &DATA.playerPartySize; party = DATA.recordedBattle.playerParty; } - else if (position == B_POSITION_PLAYER_RIGHT) // MULTI_PARTNER + else if (trainer == B_TRAINER_2) // MULTI_PARTNER { partySize = &DATA.playerPartySize; if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) *partySize = 3; party = DATA.recordedBattle.playerParty; - } - else if (position == B_POSITION_OPPONENT_LEFT) // MULTI_OPPONENT_A + } + else if (trainer == B_TRAINER_1) // MULTI_OPPONENT_A { partySize = &DATA.opponentPartySize; party = DATA.recordedBattle.opponentParty; - } - else // MULTI_OPPONENT_B + } + else // MULTI_OPPONENT_B - B_TRAINER_3 { partySize = &DATA.opponentPartySize; if ((*partySize == 0) || (*partySize == 1) || (*partySize == 2)) *partySize = 3; party = DATA.recordedBattle.opponentParty; - } + } INVALID_IF(*partySize >= PARTY_SIZE, "Too many Pokemon in party"); - DATA.currentPosition = position; + DATA.battleTrainer = trainer; DATA.currentPartyIndex = *partySize; DATA.currentMon = &party[DATA.currentPartyIndex]; DATA.gender = 0xFF; // Male @@ -1832,7 +2099,8 @@ void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species DATA.isShiny = FALSE; (*partySize)++; - CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); + CreateMon(DATA.currentMon, species, 100, 0, OTID_STRUCT_PRESET(0)); + // Reset move IDs, but force PP to be non-zero. This is a safeguard against test species that only learn 1 move having test moves with 0 PP for (i = 0; i < MAX_MON_MOVES; i++) { @@ -1842,12 +2110,9 @@ void OpenPokemonMulti(u32 sourceLine, enum BattlerPosition position, u32 species SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &data); } data = 0; - if (B_FRIENDSHIP_BOOST) - { - // This way, we avoid the boost affecting tests unless explicitly stated. + if (B_FRIENDSHIP_BOOST) // This way, we avoid the boost affecting tests unless explicitly stated. SetMonData(DATA.currentMon, MON_DATA_FRIENDSHIP, &data); - CalculateMonStats(DATA.currentMon); - } + CalculateMonStats(DATA.currentMon); } // (sNaturePersonalities[i] % NUM_NATURES) == i @@ -1875,10 +2140,10 @@ void ClosePokemon(u32 sourceLine) { s32 i; u32 data; - INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.currentPosition] & (1 << DATA.currentPartyIndex)), "Speed required"); + INVALID_IF(DATA.hasExplicitSpeeds && !(DATA.explicitSpeeds[DATA.battleTrainer] & (1 << DATA.currentPartyIndex)), "Speed required"); for (i = 0; i < STATE->battlersCount; i++) { - if (i == DATA.currentPosition + if (i == DATA.battleTrainer && DATA.currentMonIndexes[i] == DATA.currentPartyIndex) { INVALID_IF(GetMonData(DATA.currentMon, MON_DATA_HP) == 0, "Battlers cannot be fainted"); @@ -1890,15 +2155,15 @@ void ClosePokemon(u32 sourceLine) DATA.currentMon = NULL; } -static void SetGimmick(u32 sourceLine, u32 side, u32 partyIndex, enum Gimmick gimmick) +static void SetGimmick(u32 sourceLine, u32 battler, u32 partyIndex, enum Gimmick gimmick) { - enum Gimmick currentGimmick = DATA.chosenGimmick[side][partyIndex]; + enum Gimmick currentGimmick = DATA.chosenGimmick[GetBattlerTrainer(battler)][partyIndex]; if (!((currentGimmick == GIMMICK_ULTRA_BURST && gimmick == GIMMICK_Z_MOVE) || (currentGimmick == GIMMICK_Z_MOVE && gimmick == GIMMICK_ULTRA_BURST))) { INVALID_IF(currentGimmick != GIMMICK_NONE && currentGimmick != gimmick, "Cannot set %s because %s already set", sGimmickIdentifiers[gimmick], sGimmickIdentifiers[currentGimmick]); } - DATA.chosenGimmick[side][partyIndex] = gimmick; + DATA.chosenGimmick[GetBattlerTrainer(battler)][partyIndex] = gimmick; } void Gender_(u32 sourceLine, u32 gender) @@ -1949,7 +2214,7 @@ void Ability_(u32 sourceLine, enum Ability ability) // Store forced ability to be set when the battle starts if invalid. if (i == NUM_ABILITY_SLOTS) { - DATA.forcedAbilities[DATA.currentPosition][DATA.currentPartyIndex] = ability; + DATA.forcedAbilities[DATA.battleTrainer][DATA.currentPartyIndex] = ability; } } @@ -2027,7 +2292,7 @@ void Speed_(u32 sourceLine, u32 speed) bool32 hyperTrainingFlag = TRUE; SetMonData(DATA.currentMon, MON_DATA_HYPER_TRAINED_SPEED, &hyperTrainingFlag); DATA.hasExplicitSpeeds = TRUE; - DATA.explicitSpeeds[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; + DATA.explicitSpeeds[DATA.battleTrainer] |= 1 << DATA.currentPartyIndex; } void HPIV_(u32 sourceLine, u32 hpIV) @@ -2080,10 +2345,10 @@ void Item_(u32 sourceLine, u32 item) switch (GetItemHoldEffect(item)) { case HOLD_EFFECT_MEGA_STONE: - SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_MEGA); + SetGimmick(sourceLine, DATA.battleTrainer, DATA.currentPartyIndex, GIMMICK_MEGA); break; case HOLD_EFFECT_Z_CRYSTAL: - SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_Z_MOVE); + SetGimmick(sourceLine, DATA.battleTrainer, DATA.currentPartyIndex, GIMMICK_Z_MOVE); break; default: break; @@ -2103,7 +2368,7 @@ void Moves_(u32 sourceLine, u16 moves[MAX_MON_MOVES]) u32 pp = GetMovePP(moves[i]); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); } - DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.battleTrainer] |= 1 << DATA.currentPartyIndex; } void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) @@ -2118,7 +2383,7 @@ void MovesWithPP_(u32 sourceLine, struct moveWithPP moveWithPP[MAX_MON_MOVES]) SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &moveWithPP[i].moveId); SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &moveWithPP[i].pp); } - DATA.explicitMoves[DATA.currentPosition] |= 1 << DATA.currentPartyIndex; + DATA.explicitMoves[DATA.battleTrainer] |= 1 << DATA.currentPartyIndex; } void Friendship_(u32 sourceLine, u32 friendship) @@ -2140,25 +2405,26 @@ void OTName_(u32 sourceLine, const u8 *otName) SetMonData(DATA.currentMon, MON_DATA_OT_NAME, &otName); } -void DynamaxLevel_(u32 sourceLine, u32 dynamaxLevel) +void DynamaxLevel_(u32 sourceLine, s16 dynamaxLevel) { INVALID_IF(!DATA.currentMon, "DynamaxLevel outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_DYNAMAX_LEVEL, &dynamaxLevel); - SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); + if (dynamaxLevel >= 0) + SetGimmick(sourceLine, DATA.battleTrainer, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void GigantamaxFactor_(u32 sourceLine, bool32 gigantamaxFactor) { INVALID_IF(!DATA.currentMon, "GigantamaxFactor outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_GIGANTAMAX_FACTOR, &gigantamaxFactor); - SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_DYNAMAX); + SetGimmick(sourceLine, DATA.battleTrainer, DATA.currentPartyIndex, GIMMICK_DYNAMAX); } void TeraType_(u32 sourceLine, enum Type teraType) { INVALID_IF(!DATA.currentMon, "TeraType outside of PLAYER/OPPONENT"); SetMonData(DATA.currentMon, MON_DATA_TERA_TYPE, &teraType); - SetGimmick(sourceLine, DATA.currentPosition, DATA.currentPartyIndex, GIMMICK_TERA); + SetGimmick(sourceLine, DATA.battleTrainer, DATA.currentPartyIndex, GIMMICK_TERA); } void Shadow_(u32 sourceLine, bool32 isShadow) @@ -2211,7 +2477,7 @@ static const char *BattlerIdentifier(s32 battlerId) case BATTLE_TEST_AI_TWO_VS_ONE: case BATTLE_TEST_ONE_VS_TWO: case BATTLE_TEST_AI_ONE_VS_TWO: - return sBattlerIdentifiersDoubles[battlerId]; + return sBattlerIdentifiersDoubles[battlerId]; } return ""; } @@ -2351,7 +2617,7 @@ void CloseTurn(u32 sourceLine) for (i = 0; i < STATE->battlersCount; i++) { if (!(DATA.actionBattlers & (1 << i))) - { // Multi test partner trainers want setting to RecordedPartner controller if no move set in this case. + { // Multi test partner trainers want setting to RecordedPartner controller if no move set in this case; EXPECT_XXXX will set to PlayerPartner. if (IsAITest() && (i & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. SetAiActionToPass(sourceLine, i); else @@ -2365,14 +2631,14 @@ void CloseTurn(u32 sourceLine) static struct Pokemon *CurrentMon(s32 battlerId) { struct Pokemon *party; - if (battlerId == B_POSITION_PLAYER_LEFT || battlerId == B_POSITION_PLAYER_RIGHT) + if ((battlerId & BIT_SIDE) == B_SIDE_PLAYER) party = DATA.recordedBattle.playerParty; else party = DATA.recordedBattle.opponentParty; return &party[DATA.currentMonIndexes[battlerId]]; } -s32 MoveGetTarget(s32 battlerId, u32 moveId, struct MoveContext *ctx, u32 sourceLine) +s32 MoveGetTarget(s32 battlerId, enum Move moveId, struct MoveContext *ctx, u32 sourceLine) { s32 target = battlerId; if (ctx->explicitTarget) @@ -2381,16 +2647,16 @@ s32 MoveGetTarget(s32 battlerId, u32 moveId, struct MoveContext *ctx, u32 source } else { - u32 moveTarget = GetMoveTarget(moveId); - if (moveTarget == MOVE_TARGET_RANDOM - || moveTarget == MOVE_TARGET_BOTH - || moveTarget == MOVE_TARGET_DEPENDS - || moveTarget == MOVE_TARGET_FOES_AND_ALLY - || moveTarget == MOVE_TARGET_OPPONENTS_FIELD) + enum MoveTarget moveTarget = GetMoveTarget(moveId); + if (moveTarget == TARGET_RANDOM + || moveTarget == TARGET_BOTH + || moveTarget == TARGET_DEPENDS + || moveTarget == TARGET_FOES_AND_ALLY + || moveTarget == TARGET_OPPONENTS_FIELD) { target = BATTLE_OPPOSITE(battlerId); } - else if (moveTarget == MOVE_TARGET_SELECTED || moveTarget == MOVE_TARGET_OPPONENT) + else if (moveTarget == TARGET_SELECTED || moveTarget == TARGET_SMART || moveTarget == TARGET_OPPONENT) { // In AI Doubles not specified target allows any target for EXPECT_MOVE. if (GetBattleTest()->type != BATTLE_TEST_AI_DOUBLES) @@ -2400,11 +2666,14 @@ s32 MoveGetTarget(s32 battlerId, u32 moveId, struct MoveContext *ctx, u32 source target = BATTLE_OPPOSITE(battlerId); } - else if (moveTarget == MOVE_TARGET_USER || moveTarget == MOVE_TARGET_ALL_BATTLERS) + else if (moveTarget == TARGET_USER + || moveTarget == TARGET_ALL_BATTLERS + || moveTarget == TARGET_FIELD + || moveTarget == TARGET_USER_AND_ALLY) { target = battlerId; } - else if (moveTarget == MOVE_TARGET_ALLY) + else if (moveTarget == TARGET_ALLY) { target = BATTLE_PARTNER(battlerId); } @@ -2441,7 +2710,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * INVALID_IF(DATA.explicitMoves[battlerId & BIT_SIDE] & (1 << DATA.currentMonIndexes[battlerId]), "Missing explicit %S", GetMoveName(ctx->move)); SetMonData(mon, MON_DATA_MOVE1 + i, &ctx->move); u32 pp = GetMovePP(ctx->move); - SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); + SetMonData(mon, MON_DATA_PP1 + i, &pp); *moveSlot = i; *moveId = ctx->move; INVALID_IF(GetMovePP(ctx->move) == 0, "%S has 0 PP!", GetMoveName(ctx->move)); @@ -2463,10 +2732,9 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitGimmick && ctx->gimmick != GIMMICK_NONE) { - u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); + enum Item item = GetMonData(mon, MON_DATA_HELD_ITEM); enum HoldEffect holdEffect = GetItemHoldEffect(item); u32 species = GetMonData(mon, MON_DATA_SPECIES); - u32 side = battlerId & BIT_SIDE; // Check invalid item usage. INVALID_IF(ctx->gimmick == GIMMICK_MEGA && holdEffect != HOLD_EFFECT_MEGA_STONE && species != SPECIES_RAYQUAZA, "Cannot Mega Evolve without a Mega Stone"); @@ -2479,7 +2747,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * INVALID_IF(ctx->gimmick != GIMMICK_Z_MOVE && ctx->gimmick != GIMMICK_ULTRA_BURST && holdEffect == HOLD_EFFECT_Z_CRYSTAL, "Cannot use another gimmick while holding a Z-Crystal"); // Check multiple gimmick use. - SetGimmick(sourceLine, side, DATA.currentMonIndexes[battlerId], ctx->gimmick); + SetGimmick(sourceLine, battlerId, DATA.currentMonIndexes[battlerId], ctx->gimmick); *moveSlot |= RET_GIMMICK; } } @@ -2519,7 +2787,8 @@ u32 MoveGetFirstFainted(s32 battlerId) void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) { s32 battlerId = battler - gBattleMons; - u32 moveId, moveSlot; + u32 moveId; + u32 moveSlot; s32 target; bool32 requirePartyIndex = FALSE; @@ -2599,7 +2868,8 @@ void ForcedMove(u32 sourceLine, struct BattlePokemon *battler) static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext *ctx) { s32 battlerId = battler - gBattleMons; - u32 moveId, moveSlot, id; + u32 moveId; + u32 moveSlot, id; s32 target; INVALID_IF(DATA.turnState == TURN_CLOSED, "EXPECT_MOVE outside TURN"); @@ -2620,6 +2890,9 @@ static void TryMarkExpectMove(u32 sourceLine, struct BattlePokemon *battler, str DATA.actionBattlers |= 1 << battlerId; DATA.moveBattlers |= 1 << battlerId; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_TURN_OPEN; } void ExpectMove(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) @@ -2644,7 +2917,7 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex if (!(DATA.actionBattlers & (1 << battlerId))) { // Multi test partner trainers want setting to PlayerPartner controller even if no move set in this case. if (IsAITest() && (((battlerId & BIT_SIDE) == B_SIDE_OPPONENT) // If Move was not specified, allow any move used. - || (IsMultibattleTest() && battlerId == B_POSITION_PLAYER_RIGHT))) + || (IsMultibattleTest() && battlerId == B_BATTLER_2))) SetAiActionToPass(sourceLine, battlerId); else Move(sourceLine, battler, (struct MoveContext) { move: MOVE_CELEBRATE, explicitMove: TRUE }); @@ -2659,9 +2932,12 @@ void ExpectSendOut(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex DATA.expectedAiActions[battlerId][id].sourceLine = sourceLine; DATA.expectedAiActions[battlerId][id].actionSet = TRUE; DATA.expectedAiActionIndex[battlerId]++; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_TURN_OPEN; } -s32 GetAiMoveTargetForScoreCompare(u32 battlerId, u32 moveId, struct MoveContext *ctx, u32 sourceLine) +s32 GetAiMoveTargetForScoreCompare(u32 battlerId, enum Move moveId, struct MoveContext *ctx, u32 sourceLine) { s32 target; @@ -2790,6 +3066,9 @@ void ExpectSwitch(u32 sourceLine, struct BattlePokemon *battler, u32 partyIndex) DATA.expectedAiActions[battlerId][id].sourceLine = sourceLine; DATA.expectedAiActions[battlerId][id].actionSet = TRUE; DATA.expectedAiActionIndex[battlerId]++; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_TURN_OPEN; } void SkipTurn(u32 sourceLine, struct BattlePokemon *battler) @@ -2821,7 +3100,9 @@ void UseItem(u32 sourceLine, struct BattlePokemon *battler, struct ItemContext c { s32 i; s32 battlerId = battler - gBattleMons; - bool32 requirePartyIndex = GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU || GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES; + bool32 requirePartyIndex = GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU + || GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES + || (GetItemType(ctx.itemId) == ITEM_USE_BATTLER && GetBattleTest()->type != BATTLE_TEST_AI_DOUBLES && STATE->battlersCount > 2); // Check general bad use. INVALID_IF(DATA.turnState == TURN_CLOSED, "USE_ITEM outside TURN"); INVALID_IF(DATA.actionBattlers & (1 << battlerId), "Multiple battler actions"); @@ -2836,7 +3117,7 @@ void UseItem(u32 sourceLine, struct BattlePokemon *battler, struct ItemContext c INVALID_IF(!ctx.explicitMove, "%S requires an explicit move", GetItemName(ctx.itemId)); for (i = 0; i < MAX_MON_MOVES; i++) { - if (GetMonData(CurrentMon(battlerId), MON_DATA_MOVE1 + i, NULL) == ctx.move) + if (GetMonData(CurrentMon(battlerId), MON_DATA_MOVE1 + i) == ctx.move) break; } INVALID_IF(i == MAX_MON_MOVES, "USE_ITEM on invalid move: %d", ctx.move); @@ -2894,6 +3175,10 @@ void CloseQueueGroup(u32 sourceLine) void QueueAbility(u32 sourceLine, struct BattlePokemon *battler, struct AbilityEventContext ctx) { s32 battlerId = battler - gBattleMons; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "ABILITY_POPUP outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: ABILITY exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -2913,6 +3198,9 @@ void QueueAnimation(u32 sourceLine, u32 type, u32 id, struct AnimationEventConte { s32 attackerId, targetId; + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "ANIMATION outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: ANIMATION exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -2948,6 +3236,9 @@ void QueueHP(u32 sourceLine, struct BattlePokemon *battler, struct HPEventContex u32 type; uintptr_t address; + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "HP_BAR outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: HP_BAR exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -2995,12 +3286,58 @@ void QueueHP(u32 sourceLine, struct BattlePokemon *battler, struct HPEventContex }; } +void QueueSubHit(u32 sourceLine, struct BattlePokemon *battler, struct SubHitEventContext ctx) +{ + s32 battlerId = battler - gBattleMons; + bool32 breakSub = FALSE; + bool32 checkBreak = FALSE; + uintptr_t address; + + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + + INVALID_IF(!STATE->runScene, "SUB_HIT outside of SCENE"); + if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) + Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: SUB_HIT exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); + + address = 0; + if (ctx.explicitCaptureDamage) + { + INVALID_IF(ctx.captureDamage == NULL, "captureDamage is NULL"); + *ctx.captureDamage = 0; + address = (uintptr_t)ctx.captureDamage; + } + + if (ctx.explicitSubBreak) + { + checkBreak = TRUE; + if (ctx.subBreak) + breakSub = TRUE; + } + + DATA.queuedEvents[DATA.queuedEventsCount++] = (struct QueuedEvent) { + .type = QUEUED_SUB_HIT_EVENT, + .sourceLineOffset = SourceLineOffset(sourceLine), + .groupType = QUEUE_GROUP_NONE, + .groupSize = 1, + .as = { .subHit = { + .battlerId = battlerId, + .checkBreak = checkBreak, + .breakSub = breakSub, + .address = address, + }}, + }; +} + void QueueExp(u32 sourceLine, struct BattlePokemon *battler, struct ExpEventContext ctx) { s32 battlerId = battler - gBattleMons; u32 type; uintptr_t address; + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "EXPERIENCE_BAR outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: EXPERIENCE_BAR exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -3038,6 +3375,9 @@ void QueueExp(u32 sourceLine, struct BattlePokemon *battler, struct ExpEventCont void QueueMessage(u32 sourceLine, const u8 *pattern) { + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "MESSAGE outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: MESSAGE exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -3057,6 +3397,9 @@ void QueueStatus(u32 sourceLine, struct BattlePokemon *battler, struct StatusEve s32 battlerId = battler - gBattleMons; u32 mask; + if (gTestRunnerState.expectedFailState == EXPECT_FAIL_OPEN) + gTestRunnerState.expectedFailState = EXPECT_FAIL_SCENE_OPEN; + INVALID_IF(!STATE->runScene, "STATUS_ICON outside of SCENE"); if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: STATUS_ICON exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); @@ -3092,15 +3435,32 @@ void QueueStatus(u32 sourceLine, struct BattlePokemon *battler, struct StatusEve }; } +void QueueCatchingChance(u32 sourceLine, u32 *captureAddress) +{ + INVALID_IF(!STATE->runScene, "CAPTURE outside of SCENE"); + if (DATA.queuedEventsCount == MAX_QUEUED_EVENTS) + Test_ExitWithResult(TEST_RESULT_ERROR, sourceLine, ":L%s:%d: CAPTURE exceeds MAX_QUEUED_EVENTS", gTestRunnerState.test->filename, sourceLine); + u32 address = (u32)captureAddress; + DATA.queuedEvents[DATA.queuedEventsCount++] = (struct QueuedEvent) { + .type = QUEUED_CATCH_CHANCE_EVENT, + .sourceLineOffset = SourceLineOffset(sourceLine), + .groupType = QUEUE_GROUP_NONE, + .groupSize = 1, + .as = { .capture = { + .address = address, + }}, + }; +} + void ValidateFinally(u32 sourceLine) { // Defer this error until after estimating the cost. INVALID_IF(STATE->parametersCount == 0, "FINALLY without PARAMETRIZE"); } -u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex) +u32 TestRunner_Battle_GetForcedAbility(enum BattleTrainer trainer, u32 partyIndex) { - return DATA.forcedAbilities[side][partyIndex]; + return DATA.forcedAbilities[trainer][partyIndex]; } u32 TestRunner_Battle_GetForcedEnvironment(void) @@ -3108,9 +3468,9 @@ u32 TestRunner_Battle_GetForcedEnvironment(void) return DATA.forcedEnvironment; } -u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex) +u32 TestRunner_Battle_GetChosenGimmick(enum BattleTrainer trainer, u32 partyIndex) { - return DATA.chosenGimmick[side][partyIndex]; + return DATA.chosenGimmick[trainer][partyIndex]; } // TODO: Consider storing the last successful i and searching from i+1 diff --git a/test/test_test_runner.c b/test/test_test_runner.c index 670be2767..b94bdf162 100644 --- a/test/test_test_runner.c +++ b/test/test_test_runner.c @@ -1,5 +1,7 @@ #include "global.h" +#include "test/battle.h" #include "test/test.h" +#include "test/battle.h" TEST("Tests resume after CRASH") { @@ -7,3 +9,166 @@ TEST("Tests resume after CRASH") void (*f)(void) = NULL; f(); } + +MULTI_BATTLE_TEST("Forced Abilities are set correctly in multi battle tests") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_DRIZZLE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_SAND_STREAM); } + MULTI_OPPONENT_B(SPECIES_WYNAUT); + MULTI_OPPONENT_B(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { SWITCH(opponentLeft, 1); SWITCH(playerRight, 4); SWITCH(opponentRight, 4); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_DRIZZLE); + ABILITY_POPUP(opponentRight, ABILITY_DROUGHT); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break TRUE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: TRUE); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, break FALSE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, subBreak: FALSE); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage); + } THEN { + EXPECT_GT(damage, 0); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage, break FALSE") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage, subBreak: FALSE); + } THEN { + EXPECT_GT(damage, 0); + } +} + +SINGLE_BATTLE_TEST("Substitute hits are detected by SUB_HIT, records damage, break TRUE") +{ + u16 damage; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + SUB_HIT(player, captureDamage: &damage, subBreak: TRUE); + } THEN { + EXPECT_GT(damage, 0); + } +} + +TEST("EXPECT_FAIL allows expected failing tests to pass") +{ + EXPECT_FAIL { + // Test should fail but be considered a pass + EXPECT_EQ(1, 2); + } +} + +AI_SINGLE_BATTLE_TEST("EXPECT_FAIL detects failures caused by EXPECT_MOVE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_FAKE_OUT, MOVE_BODY_SLAM); } + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_FAKE_OUT); } + EXPECT_FAIL { + TURN { EXPECT_MOVE(opponent, MOVE_BODY_SLAM); } + } + } +} + +AI_SINGLE_BATTLE_TEST("EXPECT_FAIL detects failures caused by EXPECT_SWITCH") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_FAKE_OUT, MOVE_BODY_SLAM); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { EXPECT_MOVE(opponent, MOVE_FAKE_OUT); } + EXPECT_FAIL { + TURN { EXPECT_SWITCH(opponent, 1); } + } + } +} + +SINGLE_BATTLE_TEST("EXPECT_FAIL: Incorrect use of SUB_HIT results in test failure, break TRUE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(100); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } EXPECT_FAIL { + SCENE { + SUB_HIT(player, subBreak: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("EXPECT_FAIL: Incorrect use of SUB_HIT results in test failure, break FALSE") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SUBSTITUTE); MOVE(opponent, MOVE_SCRATCH); } + } EXPECT_FAIL { + SCENE { + SUB_HIT(player, subBreak: FALSE); + } + } +} diff --git a/tools/learnset_helpers/make_teachables.py b/tools/learnset_helpers/make_teachables.py index a0e94124f..fa0253071 100644 --- a/tools/learnset_helpers/make_teachables.py +++ b/tools/learnset_helpers/make_teachables.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 """ -Usage: python3 make_teachable.py SOURCE_LEARNSETS_JSON +Usage: python3 make_teachable.py SOURCE_DIR Build a C-header defining the set of teachable moves for each configured-on -species-family based on the learnable moves defined in SOURCE_LEARNSETS_JSON. +species-family based on the learnable moves defined in SOURCE_DIR/all_learnables.json. A move is "teachable" if it is: 1. Can be taught by some Move Tutor in the overworld, which is identified by @@ -12,13 +12,13 @@ A move is "teachable" if it is: to the offered MOVE constant. (e.g., MOVE_SWAGGER) 2. Assigned to some TM or HM in include/constants/tms_hms.h using the FOREACH_TM macro. - 3. Not a universal move, as defined by sUniversalMoves in src/pokemon.c. + 3. A universal move, as defined by universalMoves in + src/data/pokemon/special_movesets.json For a given species, a move is considered teachable to that species if: - 1. The species is not NONE -- which learns nothing -- nor MEW -- which - learns everything. - 2. The species can learn the move via *any* method within any Expansion- + 1. The species can learn the move via *any* method within any Expansion- supported game. + 2. The species rule defined by their teachingType in the species_info folder """ from itertools import chain @@ -33,14 +33,10 @@ import typing CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") -INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") -INCFILE_MOVE_PAT = re.compile(r"setvar VAR_0x8005, (MOVE_.*)") +ALPHABETICAL_ORDER_ENABLED_PAT = re.compile(r"#define HGSS_SORT_TMS_BY_NUM\s+(?P[^ ]*)") +TM_LITTERACY_PAT = re.compile(r"#define P_TM_LITERACY\s+GEN_(?P[^ ]*)") TMHM_MACRO_PAT = re.compile(r"F\((\w+)\)") -UNIVERSAL_MOVES_PAT = re.compile(r"static const u16 sUniversalMoves\[\]\s*=\s*{((.|\n)*?)\n};") -TEACHABLE_ARRAY_DECL_PAT = re.compile(r"(?Pstatic const u16 s(?P\w+)TeachableLearnset\[\]) = {[\s\S]*?};") SNAKIFY_PAT = re.compile(r"(?!^)([A-Z]+)") -TUTOR_ARRAY_ENABLED_PAT = re.compile(r"#define\s+P_TUTOR_MOVES_ARRAY\s+(?P[^ ]*)") - def enabled() -> bool: """ @@ -51,22 +47,6 @@ def enabled() -> bool: cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") - -def extract_repo_tutors() -> typing.Generator[str, None, None]: - """ - Yield MOVE constants which are *likely* assigned to a move tutor. This isn't - foolproof, but it's suitable. - """ - for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): - with open(inc_fname, "r") as inc_fp: - incfile = inc_fp.read() - if not INCFILE_HAS_TUTOR_PAT.search(incfile): - continue - - for move in INCFILE_MOVE_PAT.finditer(incfile): - yield move.group(1) - - def extract_repo_tms() -> typing.Generator[str, None, None]: """ Yield MOVE constants assigned to a TM or HM in the user's repo. @@ -80,24 +60,23 @@ def extract_repo_tms() -> typing.Generator[str, None, None]: for match in match_it: yield f"MOVE_{match.group(1)}" +def extract_tm_litteracy_config() -> bool: + config = False + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = TM_LITTERACY_PAT.search(cfg_pokemon) + if cfg_defined: + cfg_val = cfg_defined.group("cfg_val") + if ((cfg_val == "LATEST") or (int(cfg_val) > 6)): + config = True + return config -def extract_repo_universals() -> list[str]: - """ - Return a list of MOVE constants which are deemed to be universal and can - thus be learned by any species. - """ - with open("./src/pokemon.c", "r") as pokemon_fp: - if match := UNIVERSAL_MOVES_PAT.search(pokemon_fp.read()): - return list(filter(lambda s: s, map(lambda s: s.strip(), match.group(1).split(',')))) - return list() - - -def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str], header: str) -> str: +def prepare_output(all_learnables: dict[str, set[str]], tms: list[str], tutors: list[str], special_movesets, repo_teaching_types, header: str) -> str: """ Build the file content for teachable_learnsets.h. """ - with open("./src/data/pokemon/teachable_learnsets.h", "r") as teachables_fp: - old = teachables_fp.read() + + tm_litteracy_config = extract_tm_litteracy_config() cursor = 0 new = header + dedent(""" @@ -107,63 +86,45 @@ def prepare_output(all_learnables: dict[str, set[str]], repo_teachables: set[str """) joinpat = ",\n " - for species in TEACHABLE_ARRAY_DECL_PAT.finditer(old): - match_b, match_e = species.span() - species_upper = SNAKIFY_PAT.sub(r"_\1", species.group("name")).upper() - if species_upper == "NONE": - # NONE is hard-coded to be at the start of the file to keep this code simple. - cursor = match_e + 1 + for species_data in repo_teaching_types: + if isinstance(species_data, str): + new += (species_data) continue + species = species_data["name"] + teaching_type = species_data["teaching_type"] + new += f"static const u16 s{species}TeachableLearnset[] = " + new += "{\n" + species_upper = SNAKIFY_PAT.sub(r"_\1", species).upper() + if teaching_type == "ALL_TEACHABLES": + part1 = list(filter(lambda m: m not in special_movesets["signatureTeachables"], tms)) + part2 = list(filter(lambda m: m not in special_movesets["signatureTeachables"], tutors)) + else: + if teaching_type == "TM_ILLITERATE": + learnables = all_learnables[species_upper] + if not tm_litteracy_config: + learnables = filter(lambda m: m not in special_movesets["universalMoves"], learnables) + else: + learnables = all_learnables[species_upper] + special_movesets["universalMoves"] + part1 = list(filter(lambda m: m in learnables, tms)) + part2 = list(filter(lambda m: m in learnables, tutors)) - if species_upper == "MEW": - new += old[cursor:match_e + 1] # copy the original content and skip. - cursor = match_e + 1 - continue - repo_species_teachables = filter(lambda m: m in repo_teachables, all_learnables[species_upper]) + repo_species_teachables = part1 + part2 + if species_upper == "TERAPAGOS": + repo_species_teachables = filter(lambda m: m != "MOVE_TERA_BLAST", repo_species_teachables) - new += old[cursor:match_b] + repo_species_teachables = list(dict.fromkeys(repo_species_teachables)) new += "\n".join([ - f"{species.group('decl')} = {{", f" {joinpat.join(chain(repo_species_teachables, ('MOVE_UNAVAILABLE',)))},", "};\n", ]) - cursor = match_e + 1 - - new += old[cursor:] return new -def create_tutor_moves_array(tutors: list[str]) -> None: - """ - Generate gTutorMoves[] if P_TUTOR_MOVES_ARRAY is enabled. - """ - # Check if the config is enabled - with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: - cfg_pokemon = cfg_pokemon_fp.read() - cfg_defined = TUTOR_ARRAY_ENABLED_PAT.search(cfg_pokemon) - if not (cfg_defined and cfg_defined.group("cfg_val") in ("TRUE", "1")): - return - - # If enabled, generate the tutor moves array - header = dedent("""\ - // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py - // Set the config P_TUTOR_MOVES_ARRAY in include/config/pokemon.h to TRUE to enable this array! - // Also need by tutor moves relearner! - - const u16 gTutorMoves[] = { - """) - - lines = [f" {move}," for move in sorted(tutors)] - lines.append(" MOVE_UNAVAILABLE\n};\n") - - with open("./src/data/tutor_moves.h", "w") as f: - f.write(header + "\n".join(lines)) - def prepare_header(h_align: int, tmshms: list[str], tutors: list[str], universals: list[str]) -> str: - universals_title = "Near-universal moves found from sUniversalMoves:" + universals_title = "Near-universal moves found in data/special_movesets.json:" tmhm_title = "TM/HM moves found in \"include/constants/tms_hms.h\":" tutor_title = "Tutor moves found from map scripts:" h_align = max(h_align, len(universals_title), len(tmhm_title), len(tutor_title)) @@ -194,6 +155,21 @@ def prepare_header(h_align: int, tmshms: list[str], tutors: list[str], universal return "\n".join(lines) +def create_tutor_moves_array(tutors): + """ + Generate gTutorMoves[]. + """ + header = dedent("""\ + // DO NOT MODIFY THIS FILE! It is auto-generated by tools/learnset_helpers/make_teachables.py + // Needed by tutor moves relearner! + + const u16 gTutorMoves[] = { + """) + + lines = [f" {move}," for move in tutors] + lines.append(" MOVE_UNAVAILABLE\n};\n") + with open("./src/data/tutor_moves.h", "w") as f: + f.write(header + "\n".join(lines)) def main(): if not enabled(): @@ -204,31 +180,49 @@ def main(): print(__doc__, file=sys.stderr) quit(1) - SOURCE_LEARNSETS_JSON = pathlib.Path(sys.argv[1]) + SOURCE_DIR = pathlib.Path(sys.argv[1]) + SOURCE_LEARNSETS_JSON = pathlib.Path("./src/data/pokemon/all_learnables.json") + SOURCE_TUTORS_JSON = SOURCE_DIR / "all_tutors.json" + SOURCE_TEACHING_TYPES_JSON = SOURCE_DIR / "all_teaching_types.json" assert SOURCE_LEARNSETS_JSON.exists(), f"{SOURCE_LEARNSETS_JSON=} does not exist" assert SOURCE_LEARNSETS_JSON.is_file(), f"{SOURCE_LEARNSETS_JSON=} is not a file" - repo_universals = extract_repo_universals() + assert SOURCE_TUTORS_JSON.exists(), f"{SOURCE_TUTORS_JSON=} does not exist" + assert SOURCE_TUTORS_JSON.is_file(), f"{SOURCE_TUTORS_JSON=} is not a file" + + assert SOURCE_TEACHING_TYPES_JSON.exists(), f"{SOURCE_TEACHING_TYPES_JSON=} does not exist" + assert SOURCE_TEACHING_TYPES_JSON.is_file(), f"{SOURCE_TEACHING_TYPES_JSON=} is not a file" + repo_tms = list(extract_repo_tms()) - repo_tutors = list(extract_repo_tutors()) - repo_teachables = set(filter( - lambda move: move not in set(repo_universals), - chain(repo_tms, repo_tutors) - )) + order_alphabetically = False + with open("./include/config/pokedex_plus_hgss.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = ALPHABETICAL_ORDER_ENABLED_PAT.search(cfg_pokemon) + if cfg_defined is None or cfg_defined.group("cfg_val") in ("FALSE", "0"): + repo_tms = sorted(repo_tms) + + with open(SOURCE_TUTORS_JSON, "r") as fp: + repo_tutors = json.load(fp) + + with open("src/data/pokemon/special_movesets.json", "r") as file: + special_movesets = json.load(file) + + repo_tutors = sorted(repo_tutors + special_movesets["extraTutors"]) create_tutor_moves_array(repo_tutors) - - h_align = max(map(lambda move: len(move), chain(repo_universals, repo_teachables))) + 2 - header = prepare_header(h_align, repo_tms, repo_tutors, repo_universals) + h_align = max(map(lambda move: len(move), chain(special_movesets["universalMoves"], repo_tms, repo_tutors))) + 2 + header = prepare_header(h_align, repo_tms, repo_tutors, special_movesets["universalMoves"]) with open(SOURCE_LEARNSETS_JSON, "r") as source_fp: all_learnables = json.load(source_fp) - content = prepare_output(all_learnables, repo_teachables, header) + with open(SOURCE_TEACHING_TYPES_JSON, "r") as source_fp: + repo_teaching_types = json.load(source_fp) + + content = prepare_output(all_learnables, repo_tms, repo_tutors, special_movesets, repo_teaching_types, header) with open("./src/data/pokemon/teachable_learnsets.h", "w") as teachables_fp: teachables_fp.write(content) - if __name__ == "__main__": main() diff --git a/tools/learnset_helpers/make_teaching_types.py b/tools/learnset_helpers/make_teaching_types.py new file mode 100644 index 000000000..96d4fc281 --- /dev/null +++ b/tools/learnset_helpers/make_teaching_types.py @@ -0,0 +1,115 @@ +import glob +import json +import pathlib +import re +import sys +import typing + +CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") + +TEACHING_TYPE_PAT = re.compile(r"\s*\.teachingType\s*=\s*(?P[A-Z_]+),") +LEARNSET_PAT = re.compile(r"\s*\.teachableLearnset\s*=\s*s(?P\w+?)TeachableLearnset") +PREPROC_START_PAT = re.compile(r"#if(def)?\s+\w+") +PREPROC_END_PAT = re.compile(r"#endif\s*(//\s*\w+)?") + +def enabled() -> bool: + """ + Check if the user has explicitly enabled this opt-in helper. + """ + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) + return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") + +def is_valid_preprocessor(line: str) -> bool: + match = re.match(PREPROC_START_PAT, line) + if match: + return True + match = re.match(PREPROC_END_PAT, line) + if match: + return True + return False + +def extract_repo_species_data() -> list: + species_data = [] + pokemon_list = [] + teaching_type = "DEFAULT_LEARNING" + file_list = sorted(glob.glob("src/data/pokemon/species_info/*_families.h")) + file_list.append(pathlib.Path("./src/data/pokemon/species_info.h")) + for families_fname in file_list: + with open(families_fname, "r") as family_fp: + species_lines = family_fp.readlines() + is_last_line_preprocessor = False + for line in species_lines: + if is_valid_preprocessor(line): + is_last_line_preprocessor = True + if line.startswith("#endif") and (isinstance(species_data[-1], str) and species_data[-1].startswith("#if")): + del species_data[-1] + else: + species_data.append(line) + continue + + match = re.match(LEARNSET_PAT, line) + if match: + if match.group("name") == "None": + continue + if match.group("name") not in pokemon_list: + if not is_last_line_preprocessor: + species_data.append("\n") + is_last_line_preprocessor = False + species_data.append({"name": match.group("name"), "teaching_type": teaching_type}) + pokemon_list.append(match.group("name")) + teaching_type = "DEFAULT_LEARNING" + continue + match = re.match(TEACHING_TYPE_PAT, line) + if match: + teaching_type = match.group("teaching_type") + return species_data + +def add_whitesspaces(parsed_list) ->list: + for i, item in enumerate(parsed_list): + if i == 0: + continue + if not isinstance(item, str): + continue + if item.startswith("#if"): + if not isinstance(parsed_list[i - 1], str): + parsed_list[i] = "\n" + item + elif parsed_list[i - 1].startswith("#endif"): + parsed_list[i] = "\n" + item + return parsed_list + + +def dump_output(file, data): + with open(file, "w") as fp: + fp.write(data) + +def main(): + if not enabled(): + quit() + + if len(sys.argv) < 2: + print("Missing required arguments", file=sys.stderr) + print(__doc__, file=sys.stderr) + quit(1) + + OUTPUT_FILE = pathlib.Path(sys.argv[1]) + + assert OUTPUT_FILE.parent.exists(), f"parent of {OUTPUT_FILE=} does not exist" + + teaching_types_list = extract_repo_species_data() + teaching_types_list = add_whitesspaces(teaching_types_list) + new_teaching_types = json.dumps(teaching_types_list, indent=2) + old_teaching_types = "" + if OUTPUT_FILE.exists() and OUTPUT_FILE.is_file(): + with open(OUTPUT_FILE, "r") as fp: + old_teaching_types = fp.read() + + dump_output(OUTPUT_FILE, new_teaching_types) + + if new_teaching_types != old_teaching_types: + pathlib.Path("./tools/learnset_helpers/make_teachables.py").touch() + + +if __name__ == "__main__": + main() diff --git a/tools/learnset_helpers/make_tutors.py b/tools/learnset_helpers/make_tutors.py new file mode 100644 index 000000000..fc9ad3fc2 --- /dev/null +++ b/tools/learnset_helpers/make_tutors.py @@ -0,0 +1,68 @@ +from itertools import chain +from textwrap import dedent + +import glob +import json +import pathlib +import re +import sys +import typing + +CONFIG_ENABLED_PAT = re.compile(r"#define P_LEARNSET_HELPER_TEACHABLE\s+(?P[^ ]*)") +INCFILE_HAS_TUTOR_PAT = re.compile(r"special ChooseMonForMoveTutor") +INCFILE_MOVE_PAT = re.compile(r"setvar VAR_ITEM_ID, (MOVE_.*)") + +def enabled() -> bool: + """ + Check if the user has explicitly enabled this opt-in helper. + """ + with open("./include/config/pokemon.h", "r") as cfg_pokemon_fp: + cfg_pokemon = cfg_pokemon_fp.read() + cfg_defined = CONFIG_ENABLED_PAT.search(cfg_pokemon) + return cfg_defined is not None and cfg_defined.group("cfg_val") in ("TRUE", "1") + +def extract_repo_tutors() -> typing.Generator[str, None, None]: + """ + Yield MOVE constants which are *likely* assigned to a move tutor. This isn't + foolproof, but it's suitable. + """ + for inc_fname in chain(glob.glob("./data/scripts/*.inc"), glob.glob("./data/maps/*/scripts.inc")): + with open(inc_fname, "r") as inc_fp: + incfile = inc_fp.read() + if not INCFILE_HAS_TUTOR_PAT.search(incfile): + continue + + for move in INCFILE_MOVE_PAT.finditer(incfile): + yield move.group(1) + +def dump_output(file, data): + with open(file, "w") as fp: + fp.write(data) + +def main(): + if not enabled(): + quit() + + if len(sys.argv) < 2: + print("Missing required arguments", file=sys.stderr) + print(__doc__, file=sys.stderr) + quit(1) + + OUTPUT_FILE = pathlib.Path(sys.argv[1]) + + assert OUTPUT_FILE.parent.exists(), f"parent of {OUTPUT_FILE=} does not exist" + + tutors_list = sorted(list(extract_repo_tutors())) + new_tutors = json.dumps(tutors_list, indent=2) + old_tutors = "" + if OUTPUT_FILE.exists() and OUTPUT_FILE.is_file(): + with open(OUTPUT_FILE, "r") as fp: + old_tutors = fp.read() + + dump_output(OUTPUT_FILE, new_tutors) + + if new_tutors != old_tutors: + pathlib.Path("./tools/learnset_helpers/make_teachables.py").touch() + +if __name__ == "__main__": + main() diff --git a/tools/learnset_helpers/porymoves_files/za.json b/tools/learnset_helpers/porymoves_files/za.json index cda070084..db82ea502 100644 --- a/tools/learnset_helpers/porymoves_files/za.json +++ b/tools/learnset_helpers/porymoves_files/za.json @@ -63,18 +63,39 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_GIGA_DRAIN", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_LEECH_SEED", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -144,19 +165,40 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_GIGA_DRAIN", + "MOVE_GROWL", + "MOVE_GROWTH", + "MOVE_LEECH_SEED", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_ROAR", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -226,24 +268,47 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FRENZY_PLANT", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GROWTH", "MOVE_HYPER_BEAM", + "MOVE_LEECH_SEED", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_OUTRAGE", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_ROAR", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", "MOVE_WORK_UP" ], "TutorMoves": [ @@ -299,16 +364,28 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_CRUNCH", "MOVE_DIG", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", "MOVE_FOCUS_BLAST", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_IRON_TAIL", "MOVE_OUTRAGE", @@ -318,9 +395,12 @@ "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_THUNDER_PUNCH", "MOVE_WILL_O_WISP" ], @@ -375,16 +455,28 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_CRUNCH", "MOVE_DIG", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", "MOVE_FOCUS_BLAST", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_IRON_TAIL", "MOVE_OUTRAGE", @@ -394,9 +486,12 @@ "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_THUNDER_PUNCH", "MOVE_WILL_O_WISP" ], @@ -455,33 +550,59 @@ } ], "TMMoves": [ + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_CRUNCH", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", "MOVE_FLY", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_HYPER_BEAM", "MOVE_IRON_TAIL", + "MOVE_OMINOUS_WIND", "MOVE_OUTRAGE", "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SMOKESCREEN", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_THUNDER_PUNCH", "MOVE_WILL_O_WISP" ], @@ -535,27 +656,43 @@ } ], "TMMoves": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", "MOVE_AURA_SPHERE", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FLIP_TURN", "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", "MOVE_PROTECT", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP", @@ -608,27 +745,43 @@ } ], "TMMoves": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", "MOVE_AURA_SPHERE", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FLIP_TURN", "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", "MOVE_PROTECT", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP", @@ -681,10 +834,15 @@ } ], "TMMoves": [ + "MOVE_AQUA_JET", + "MOVE_AQUA_RING", "MOVE_AURA_SPHERE", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", @@ -692,24 +850,39 @@ "MOVE_DRAGON_PULSE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", "MOVE_FLIP_TURN", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP", @@ -733,7 +906,10 @@ } ], "TMMoves": [ - "MOVE_ELECTROWEB" + "MOVE_ELECTROWEB", + "MOVE_FACADE", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT" ], "TutorMoves": [], "EggMoves": [] @@ -755,7 +931,11 @@ ], "TMMoves": [ "MOVE_ELECTROWEB", - "MOVE_IRON_DEFENSE" + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_STING", + "MOVE_STRING_SHOT" ], "TutorMoves": [], "EggMoves": [] @@ -811,21 +991,38 @@ "MOVE_AERIAL_ACE", "MOVE_AGILITY", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BUZZ", + "MOVE_DOUBLE_HIT", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", + "MOVE_LUNGE", "MOVE_OUTRAGE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", "MOVE_ROCK_SMASH", + "MOVE_SILVER_WIND", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", "MOVE_TOXIC", - "MOVE_U_TURN" + "MOVE_TOXIC_SPIKES", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" ], "TutorMoves": [ "MOVE_PIN_MISSILE" @@ -885,15 +1082,29 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FLY", + "MOVE_GROWL", + "MOVE_GUST", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TWISTER", "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -952,15 +1163,32 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FLY", + "MOVE_GROWL", + "MOVE_GUST", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", + "MOVE_SKY_ATTACK", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TWISTER", "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -1019,17 +1247,34 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FLY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", "MOVE_HYPER_BEAM", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", + "MOVE_SKY_ATTACK", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TWISTER", "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -1087,24 +1332,43 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", "MOVE_BULLDOZE", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", "MOVE_GIGA_DRAIN", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", "MOVE_ICE_FANG", "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEER", "MOVE_MUD_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", - "MOVE_THUNDER_FANG" + "MOVE_TACKLE", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE" ], "TutorMoves": [], "EggMoves": [] @@ -1161,27 +1425,47 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", "MOVE_HYPER_BEAM", "MOVE_ICE_FANG", "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LEER", "MOVE_MUD_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", - "MOVE_THUNDER_FANG" + "MOVE_TACKLE", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE" ], "TutorMoves": [ "MOVE_CRUNCH" @@ -1239,29 +1523,41 @@ "Move": "MOVE_THUNDER" }, { - "Level": "99", + "Level": "55", "Move": "MOVE_VOLT_TACKLE" } ], "TMMoves": [ - "MOVE_AGILITY", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_DOUBLE_TEAM", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_GROWL", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", "MOVE_NASTY_PLOT", + "MOVE_NUZZLE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", "MOVE_WILD_CHARGE" ], "TutorMoves": [], @@ -1326,116 +1622,56 @@ "MOVE_AGILITY", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", "MOVE_NASTY_PLOT", + "MOVE_NUZZLE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", + "MOVE_SKULL_BASH", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", "MOVE_WILD_CHARGE" ], "TutorMoves": [ + "MOVE_DRAINING_KISS", "MOVE_EERIE_IMPULSE", "MOVE_THUNDER_PUNCH" ], "EggMoves": [] }, - "RAICHU_ALOLA": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TAIL_WHIP" - }, - { - "Level": "1", - "Move": "MOVE_GROWL" - }, - { - "Level": "1", - "Move": "MOVE_THUNDER_SHOCK" - }, - { - "Level": "1", - "Move": "MOVE_QUICK_ATTACK" - }, - { - "Level": "4", - "Move": "MOVE_THUNDER_WAVE" - }, - { - "Level": "12", - "Move": "MOVE_NUZZLE" - }, - { - "Level": "16", - "Move": "MOVE_SPARK" - }, - { - "Level": "20", - "Move": "MOVE_CHARM" - }, - { - "Level": "25", - "Move": "MOVE_THUNDERBOLT" - }, - { - "Level": "30", - "Move": "MOVE_CHARGE" - }, - { - "Level": "35", - "Move": "MOVE_LIGHT_SCREEN" - }, - { - "Level": "40", - "Move": "MOVE_THUNDER" - }, - { - "Level": "99", - "Move": "MOVE_VOLT_TACKLE" - } - ], - "TMMoves": [ - "MOVE_AGILITY", - "MOVE_BODY_SLAM", - "MOVE_BRICK_BREAK", - "MOVE_CALM_MIND", - "MOVE_DIG", - "MOVE_DISCHARGE", - "MOVE_DOUBLE_TEAM", - "MOVE_ELECTROWEB", - "MOVE_ENDURE", - "MOVE_GIGA_IMPACT", - "MOVE_HYPER_BEAM", - "MOVE_IRON_TAIL", - "MOVE_NASTY_PLOT", - "MOVE_PLAY_ROUGH", - "MOVE_PROTECT", - "MOVE_PSYSHOCK", - "MOVE_REFLECT", - "MOVE_SUBSTITUTE", - "MOVE_SURF", - "MOVE_SWIFT", - "MOVE_THUNDER_PUNCH", - "MOVE_VOLT_SWITCH", - "MOVE_WILD_CHARGE" - ], - "TutorMoves": [ - "MOVE_EERIE_IMPULSE", - "MOVE_PSYCHIC" - ], - "EggMoves": [] - }, "CLEFAIRY": { "LevelMoves": [ { @@ -1500,11 +1736,25 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", @@ -1515,6 +1765,12 @@ "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METEOR_BEAM", + "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MYSTICAL_FIRE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", @@ -1522,14 +1778,18 @@ "MOVE_REFLECT", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SING", "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", "MOVE_STEALTH_ROCK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], @@ -1604,11 +1864,26 @@ } ], "TMMoves": [ + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", @@ -1622,6 +1897,12 @@ "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METEOR_BEAM", + "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MYSTICAL_FIRE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", @@ -1629,20 +1910,1021 @@ "MOVE_REFLECT", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SING", "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", "MOVE_STEALTH_ROCK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] }, + "JIGGLYPUFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SING" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "14", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "18", + "Move": "MOVE_FACADE" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "28", + "Move": "MOVE_MIMIC" + }, + { + "Level": "36", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "40", + "Move": "MOVE_WISH" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "50", + "Move": "MOVE_PERISH_SONG" + }, + { + "Level": "53", + "Move": "MOVE_MOONBLAST" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_HEADBUTT", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROLLOUT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "WIGGLYTUFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SING" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "14", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "18", + "Move": "MOVE_FACADE" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "28", + "Move": "MOVE_MIMIC" + }, + { + "Level": "36", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "40", + "Move": "MOVE_WISH" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "50", + "Move": "MOVE_PERISH_SONG" + }, + { + "Level": "53", + "Move": "MOVE_MOONBLAST" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_NASTY_PLOT", + "MOVE_PERISH_SONG", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROLLOUT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ZUBAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "5", + "Move": "MOVE_GUST" + }, + { + "Level": "8", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "18", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "22", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "26", + "Move": "MOVE_HAZE" + }, + { + "Level": "30", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "34", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "42", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "50", + "Move": "MOVE_LEECH_LIFE" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BITE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_GIGA_DRAIN", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOLBAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "5", + "Move": "MOVE_GUST" + }, + { + "Level": "8", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "18", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "22", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "26", + "Move": "MOVE_HAZE" + }, + { + "Level": "30", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "34", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "42", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "50", + "Move": "MOVE_LEECH_LIFE" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BITE", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LEECH_LIFE", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MEOWTH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PAY_DAY" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "13", + "Move": "MOVE_TAUNT" + }, + { + "Level": "15", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "17", + "Move": "MOVE_SCREECH" + }, + { + "Level": "22", + "Move": "MOVE_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "30", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "34", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "37", + "Move": "MOVE_CHARM" + }, + { + "Level": "40", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "44", + "Move": "MOVE_MIMIC" + }, + { + "Level": "48", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PERSIAN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PAY_DAY" + }, + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_SNARL" + }, + { + "Level": "6", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "13", + "Move": "MOVE_TAUNT" + }, + { + "Level": "15", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "17", + "Move": "MOVE_SCREECH" + }, + { + "Level": "22", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "30", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "34", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "37", + "Move": "MOVE_CHARM" + }, + { + "Level": "40", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "44", + "Move": "MOVE_MIMIC" + }, + { + "Level": "48", + "Move": "MOVE_PLAY_ROUGH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SNARL", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_POWER_GEM" + ], + "EggMoves": [] + }, + "MANKEY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "13", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_LOW_SWEEP" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_FACADE" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PRIMEAPE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "13", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_LOW_SWEEP" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_FACADE" + }, + { + "Level": "35", + "Move": "MOVE_RAGE_FIST" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAY_DAY", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE_FIST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, "ABRA": { "LevelMoves": [ { @@ -1655,8 +2937,11 @@ "MOVE_CALM_MIND", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", @@ -1670,8 +2955,10 @@ "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -1722,22 +3009,38 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", + "MOVE_FUTURE_SIGHT", "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", "MOVE_METRONOME", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -1790,12 +3093,19 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", @@ -1803,12 +3113,21 @@ "MOVE_METRONOME", "MOVE_NASTY_PLOT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -1873,20 +3192,39 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SUBSTITUTE", "MOVE_THUNDER_PUNCH", @@ -1952,20 +3290,39 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SUBSTITUTE", "MOVE_THUNDER_PUNCH", @@ -2035,24 +3392,45 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", "MOVE_SUBSTITUTE", "MOVE_THUNDER_PUNCH", "MOVE_WORK_UP" @@ -2124,16 +3502,35 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", "MOVE_BULLET_SEED", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_REFLECT", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLUDGE_WAVE", "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP" ], "TutorMoves": [], "EggMoves": [] @@ -2202,16 +3599,36 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", "MOVE_BULLET_SEED", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_REFLECT", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLUDGE_WAVE", "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP" ], "TutorMoves": [ "MOVE_LUNGE" @@ -2286,18 +3703,39 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", "MOVE_BULLET_SEED", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MAGICAL_LEAF", + "MOVE_POISON_JAB", + "MOVE_POISON_POWDER", + "MOVE_POWER_WHIP", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_REFLECT", + "MOVE_SEED_BOMB", + "MOVE_SLEEP_POWDER", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", "MOVE_SOLAR_BEAM", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP" ], "TutorMoves": [ "MOVE_SLUDGE_BOMB" @@ -2356,14 +3794,22 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_CURSE", "MOVE_DIG", + "MOVE_DREAM_EATER", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FLAMETHROWER", + "MOVE_GROWL", + "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICY_WIND", @@ -2372,111 +3818,28 @@ "MOVE_LIQUIDATION", "MOVE_MUD_SHOT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", + "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_WATERFALL", - "MOVE_WHIRLPOOL" + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] }, "SLOWBRO": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_CONFUSION" - }, - { - "Level": "1", - "Move": "MOVE_CURSE" - }, - { - "Level": "3", - "Move": "MOVE_GROWL" - }, - { - "Level": "6", - "Move": "MOVE_WATER_GUN" - }, - { - "Level": "14", - "Move": "MOVE_PSYBEAM" - }, - { - "Level": "18", - "Move": "MOVE_WATER_PULSE" - }, - { - "Level": "21", - "Move": "MOVE_HEADBUTT" - }, - { - "Level": "24", - "Move": "MOVE_ZEN_HEADBUTT" - }, - { - "Level": "27", - "Move": "MOVE_AMNESIA" - }, - { - "Level": "36", - "Move": "MOVE_SURF" - }, - { - "Level": "42", - "Move": "MOVE_PSYCHIC" - }, - { - "Level": "45", - "Move": "MOVE_FUTURE_SIGHT" - } - ], - "TMMoves": [ - "MOVE_BLIZZARD", - "MOVE_BODY_SLAM", - "MOVE_CALM_MIND", - "MOVE_DIG", - "MOVE_EARTHQUAKE", - "MOVE_ENDURE", - "MOVE_FIRE_BLAST", - "MOVE_FLAMETHROWER", - "MOVE_FOCUS_BLAST", - "MOVE_GIGA_IMPACT", - "MOVE_HEAL_BLOCK", - "MOVE_HYDRO_PUMP", - "MOVE_HYPER_BEAM", - "MOVE_ICE_BEAM", - "MOVE_ICE_PUNCH", - "MOVE_ICY_WIND", - "MOVE_IRON_TAIL", - "MOVE_LIGHT_SCREEN", - "MOVE_LIQUIDATION", - "MOVE_METRONOME", - "MOVE_MUD_SHOT", - "MOVE_NASTY_PLOT", - "MOVE_POWER_GEM", - "MOVE_PROTECT", - "MOVE_PSYSHOCK", - "MOVE_SAFEGUARD", - "MOVE_SHADOW_BALL", - "MOVE_SUBSTITUTE", - "MOVE_SWIFT", - "MOVE_THUNDER_WAVE", - "MOVE_WATERFALL", - "MOVE_WHIRLPOOL" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "SLOWBRO_GALAR": { "LevelMoves": [ { "Level": "1", @@ -2540,19 +3903,31 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", @@ -2562,20 +3937,152 @@ "MOVE_LIGHT_SCREEN", "MOVE_LIQUIDATION", "MOVE_METRONOME", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", + "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_SAFEGUARD", + "MOVE_SCALD", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", + "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", "MOVE_TOXIC", "MOVE_TOXIC_SPIKES", + "MOVE_TRI_ATTACK", "MOVE_WATERFALL", - "MOVE_WHIRLPOOL" + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FARFETCH\u00c2\u20ac\u2122D": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "1", + "Move": "MOVE_DETECT" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "12", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "16", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "20", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_FALSE_SWIPE" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "30", + "Move": "MOVE_SLASH" + }, + { + "Level": "34", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "36", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "40", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "42", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "47", + "Move": "MOVE_AGILITY" + }, + { + "Level": "55", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_SMASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -2628,16 +4135,30 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_NASTY_PLOT", + "MOVE_PERISH_SONG", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", "MOVE_TAUNT", @@ -2709,20 +4230,38 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_GIGA_DRAIN", "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_METRONOME", "MOVE_NASTY_PLOT", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", "MOVE_SUBSTITUTE", "MOVE_TAUNT", "MOVE_THUNDER", @@ -2795,23 +4334,43 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", + "MOVE_HAZE", "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_METRONOME", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", "MOVE_SUBSTITUTE", "MOVE_TAUNT", "MOVE_THUNDER", @@ -2889,20 +4448,277 @@ } ], "TMMoves": [ + "MOVE_BREAKING_SWIPE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_PULSE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_HEAD_SMASH", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", "MOVE_PROTECT", "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", "MOVE_SELF_DESTRUCT", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", "MOVE_TAUNT" ], + "TutorMoves": [ + "MOVE_ROCK_BLAST" + ], + "EggMoves": [] + }, + "CUBONE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "7", + "Move": "MOVE_LEER" + }, + { + "Level": "8", + "Move": "MOVE_FALSE_SWIPE" + }, + { + "Level": "12", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "18", + "Move": "MOVE_DETECT" + }, + { + "Level": "24", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "29", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "32", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "40", + "Move": "MOVE_BONEMERANG" + }, + { + "Level": "44", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "48", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BONEMERANG", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_PERISH_SONG", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_PUNCH" + ], "TutorMoves": [], "EggMoves": [] }, + "MAROWAK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "4", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "7", + "Move": "MOVE_LEER" + }, + { + "Level": "8", + "Move": "MOVE_FALSE_SWIPE" + }, + { + "Level": "12", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "18", + "Move": "MOVE_DETECT" + }, + { + "Level": "24", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "29", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "32", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "40", + "Move": "MOVE_BONEMERANG" + }, + { + "Level": "44", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "48", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_PERISH_SONG" + }, + { + "Level": "58", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BONEMERANG", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PERISH_SONG", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_BONE", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_FLAME_WHEEL", + "MOVE_SHADOW_BONE" + ], + "EggMoves": [] + }, "KANGASKHAN": { "LevelMoves": [ { @@ -2952,23 +4768,38 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_COMET_PUNCH", + "MOVE_CRUNCH", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", + "MOVE_OUTRAGE", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROAR", @@ -2980,6 +4811,9 @@ "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", @@ -3049,22 +4883,39 @@ } ], "TMMoves": [ + "MOVE_AQUA_JET", "MOVE_BLIZZARD", + "MOVE_BUBBLE_BEAM", + "MOVE_CONFUSE_RAY", "MOVE_DAZZLING_GLEAM", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FLIP_TURN", + "MOVE_HARDEN", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_SAFEGUARD", + "MOVE_SCALD", "MOVE_SELF_DESTRUCT", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL" ], @@ -3140,29 +4991,55 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", "MOVE_BLIZZARD", + "MOVE_BUBBLE_BEAM", "MOVE_BULK_UP", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FLIP_TURN", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_SAFEGUARD", + "MOVE_SCALD", "MOVE_SELF_DESTRUCT", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", + "MOVE_TRI_ATTACK", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_ZEN_HEADBUTT" @@ -3170,6 +5047,153 @@ "TutorMoves": [], "EggMoves": [] }, + "MR. MIME": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "17", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "28", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "32", + "Move": "MOVE_MIMIC" + }, + { + "Level": "36", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "36", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "44", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "48", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRIPLE_AXEL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_HAZE", + "MOVE_MIST", + "MOVE_SMOKESCREEN" + ], + "EggMoves": [] + }, "SCYTHER": { "LevelMoves": [ { @@ -3224,19 +5248,40 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BUZZ", "MOVE_CLOSE_COMBAT", "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SILVER_WIND", + "MOVE_SLASH", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_U_TURN" + "MOVE_SWORDS_DANCE", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" ], "TutorMoves": [], "EggMoves": [] @@ -3291,21 +5336,38 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", "MOVE_BULK_UP", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", + "MOVE_LUNGE", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", - "MOVE_SUBSTITUTE" + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_X_SCISSOR" ], "TutorMoves": [], "EggMoves": [] @@ -3322,7 +5384,10 @@ } ], "TMMoves": [ - "MOVE_HYDRO_PUMP" + "MOVE_FACADE", + "MOVE_HYDRO_PUMP", + "MOVE_SPLASH", + "MOVE_TACKLE" ], "TutorMoves": [], "EggMoves": [] @@ -3379,32 +5444,54 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_BOUNCE", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FLAMETHROWER", "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MUDDY_WATER", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_ROAR", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SKULL_BASH", + "MOVE_SPLASH", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", - "MOVE_WATER_PULSE" + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" ], "TutorMoves": [ "MOVE_BITE", @@ -3427,13 +5514,25 @@ "Level": "1", "Move": "MOVE_GROWL" }, + { + "Level": "1", + "Move": "MOVE_HELPING_HAND" + }, + { + "Level": "1", + "Move": "MOVE_COVET" + }, + { + "Level": "5", + "Move": "MOVE_SAND_ATTACK" + }, { "Level": "10", "Move": "MOVE_QUICK_ATTACK" }, { "Level": "15", - "Move": "MOVE_DISARMING_VOICE" + "Move": "MOVE_BABY_DOLL_EYES" }, { "Level": "20", @@ -3445,7 +5544,11 @@ }, { "Level": "30", - "Move": "MOVE_WISH" + "Move": "MOVE_COPYCAT" + }, + { + "Level": "35", + "Move": "MOVE_BATON_PASS" }, { "Level": "40", @@ -3458,19 +5561,60 @@ { "Level": "50", "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_LAST_RESORT" } ], "TMMoves": [ + "MOVE_ATTRACT", + "MOVE_BABY_DOLL_EYES", + "MOVE_BATON_PASS", + "MOVE_BITE", "MOVE_BODY_SLAM", - "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_COPYCAT", + "MOVE_COVET", + "MOVE_CURSE", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_KICK", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FLAIL", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HELPING_HAND", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_LAST_RESORT", + "MOVE_MUD_SLAP", + "MOVE_PAY_DAY", "MOVE_PROTECT", - "MOVE_ROAR", + "MOVE_QUICK_ATTACK", + "MOVE_RAIN_DANCE", + "MOVE_REST", + "MOVE_RETALIATE", + "MOVE_ROUND", + "MOVE_SAND_ATTACK", "MOVE_SHADOW_BALL", - "MOVE_SUBSTITUTE" + "MOVE_SLEEP_TALK", + "MOVE_SNORE", + "MOVE_STORED_POWER", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TICKLE", + "MOVE_WEATHER_BALL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_YAWN" ], "TutorMoves": [], "EggMoves": [] @@ -3531,27 +5675,53 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_AQUA_RING", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HAZE", "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", "MOVE_IRON_TAIL", "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROAR", + "MOVE_SCALD", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", + "MOVE_TRAILBLAZE", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", - "MOVE_WHIRLPOOL" + "MOVE_WHIRLPOOL", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -3620,23 +5790,49 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_PIN_MISSILE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROAR", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", - "MOVE_WILD_CHARGE" + "MOVE_WILD_CHARGE", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -3701,25 +5897,49 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_MIMIC", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROAR", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", - "MOVE_WILL_O_WISP" + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -3731,6 +5951,114 @@ ], "EggMoves": [] }, + "PORYGON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_CONVERSION" + }, + { + "Level": "1", + "Move": "MOVE_CHARGE" + }, + { + "Level": "10", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "15", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_CONVERSION_2" + }, + { + "Level": "30", + "Move": "MOVE_AGILITY" + }, + { + "Level": "35", + "Move": "MOVE_RECOVER" + }, + { + "Level": "40", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "45", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "50", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "55", + "Move": "MOVE_ZAP_CANNON" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "AERODACTYL": { "LevelMoves": [ { @@ -3788,27 +6116,48 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_CRUNCH", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", "MOVE_FLY", + "MOVE_GIGA_IMPACT", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SKY_ATTACK", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_WING", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_FANG", - "MOVE_WHIRLWIND" + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" ], "TutorMoves": [], "EggMoves": [] @@ -3867,23 +6216,38 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CHILLING_WATER", "MOVE_DRACO_METEOR", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", "MOVE_GIGA_IMPACT", "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TWISTER", "MOVE_WATERFALL", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL" @@ -3945,23 +6309,38 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", + "MOVE_BRUTAL_SWING", + "MOVE_CHILLING_WATER", "MOVE_DRACO_METEOR", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", "MOVE_GIGA_IMPACT", "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TWISTER", "MOVE_WATERFALL", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL" @@ -4027,40 +6406,64 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CHILLING_WATER", "MOVE_DRACO_METEOR", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", "MOVE_FLY", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", "MOVE_METRONOME", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_RAZOR_WIND", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SKULL_BASH", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TWISTER", + "MOVE_VACUUM_WAVE", "MOVE_WATERFALL", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", - "MOVE_WHIRLWIND" + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" ], "TutorMoves": [ "MOVE_FIRE_PUNCH", @@ -4124,21 +6527,31 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", "MOVE_BLIZZARD", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSION", "MOVE_DARK_PULSE", "MOVE_DISCHARGE", "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", "MOVE_HEAL_BLOCK", "MOVE_HURRICANE", @@ -4147,20 +6560,30 @@ "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", + "MOVE_MIST", "MOVE_NASTY_PLOT", + "MOVE_PAY_DAY", "MOVE_POISON_JAB", "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", "MOVE_PSYSHOCK", + "MOVE_PSYSTRIKE", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", "MOVE_SELF_DESTRUCT", "MOVE_SHADOW_BALL", "MOVE_SOLAR_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER", @@ -4168,12 +6591,247 @@ "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_VACUUM_WAVE", "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] }, + "MEW": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_POUND" + }, + { + "Level": "1", + "Move": "MOVE_REFLECT_TYPE" + }, + { + "Level": "10", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "20", + "Move": "MOVE_BATON_PASS" + }, + { + "Level": "30", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "40", + "Move": "MOVE_LIFE_DEW" + }, + { + "Level": "50", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "60", + "Move": "MOVE_METRONOME" + }, + { + "Level": "70", + "Move": "MOVE_IMPRISON" + }, + { + "Level": "80", + "Move": "MOVE_TRANSFORM" + }, + { + "Level": "90", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "100", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_ACROBATICS", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_CUTTER", + "MOVE_AIR_SLASH", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AURA_SPHERE", + "MOVE_AVALANCHE", + "MOVE_BATON_PASS", + "MOVE_BLAST_BURN", + "MOVE_BLIZZARD", + "MOVE_BODY_PRESS", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BUZZ", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_DANCE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_TAIL", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTRIC_TERRAIN", + "MOVE_ELECTRO_BALL", + "MOVE_ENCORE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PLEDGE", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FLING", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_FOUL_PLAY", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GRASSY_TERRAIN", + "MOVE_GRASS_KNOT", + "MOVE_GRASS_PLEDGE", + "MOVE_GUNK_SHOT", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HELPING_HAND", + "MOVE_HEX", + "MOVE_HURRICANE", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SPINNER", + "MOVE_ICY_WIND", + "MOVE_IMPRISON", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEAF_STORM", + "MOVE_LEECH_LIFE", + "MOVE_LIFE_DEW", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LOW_KICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_MISTY_TERRAIN", + "MOVE_MUD_SHOT", + "MOVE_MUD_SLAP", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SHADE", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", + "MOVE_POISON_TAIL", + "MOVE_POLLEN_PUFF", + "MOVE_POUNCE", + "MOVE_POUND", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHIC_TERRAIN", + "MOVE_PSYSHOCK", + "MOVE_RAIN_DANCE", + "MOVE_REFLECT", + "MOVE_REFLECT_TYPE", + "MOVE_REST", + "MOVE_REVERSAL", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SANDSTORM", + "MOVE_SCARY_FACE", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKILL_SWAP", + "MOVE_SLEEP_TALK", + "MOVE_SLUDGE_BOMB", + "MOVE_SMART_STRIKE", + "MOVE_SNARL", + "MOVE_SNOWSCAPE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STOMPING_TANTRUM", + "MOVE_STONE_EDGE", + "MOVE_STORED_POWER", + "MOVE_STRUGGLE_BUG", + "MOVE_SUBSTITUTE", + "MOVE_SUNNY_DAY", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAILWIND", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TERA_BLAST", + "MOVE_THIEF", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRANSFORM", + "MOVE_TRICK", + "MOVE_TRICK_ROOM", + "MOVE_U_TURN", + "MOVE_VENOSHOCK", + "MOVE_VOLT_SWITCH", + "MOVE_WATERFALL", + "MOVE_WATER_PLEDGE", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "CHIKORITA": { "LevelMoves": [ { @@ -4230,21 +6888,39 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_CURSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_HEADBUTT", "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TRAILBLAZE", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -4306,22 +6982,41 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_CURSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", "MOVE_HEADBUTT", "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", "MOVE_ROCK_SMASH", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TRAILBLAZE", "MOVE_WORK_UP" ], "TutorMoves": [ @@ -4385,26 +7080,48 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_CURSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LIGHT_SCREEN", "MOVE_OUTRAGE", + "MOVE_PETAL_DANCE", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_REFLECT", "MOVE_ROCK_SMASH", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TRAILBLAZE", "MOVE_WORK_UP" ], "TutorMoves": [ @@ -4461,25 +7178,42 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BITE", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_TEAM", "MOVE_DRAGON_CLAW", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCREECH", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP" @@ -4535,27 +7269,45 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BITE", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_TEAM", "MOVE_DRAGON_CLAW", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_SLASH", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP" @@ -4618,9 +7370,16 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BITE", "MOVE_BLIZZARD", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", @@ -4628,21 +7387,38 @@ "MOVE_DRAGON_CLAW", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_RAZOR_WIND", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SLASH", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE", "MOVE_WHIRLPOOL", "MOVE_WORK_UP" @@ -4716,20 +7492,38 @@ } ], "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BUG_BUZZ", "MOVE_DIG", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", "MOVE_HEADBUTT", + "MOVE_INFESTATION", "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SCREECH", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", "MOVE_SUBSTITUTE", "MOVE_TOXIC", - "MOVE_TOXIC_SPIKES" + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" ], "TutorMoves": [], "EggMoves": [] @@ -4802,28 +7596,168 @@ } ], "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BUG_BUZZ", "MOVE_DIG", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_LUNGE", + "MOVE_MEGAHORN", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SCREECH", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", "MOVE_TOXIC", - "MOVE_TOXIC_SPIKES" + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR" ], "TutorMoves": [ "MOVE_SWORDS_DANCE" ], "EggMoves": [] }, + "CROBAT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "5", + "Move": "MOVE_GUST" + }, + { + "Level": "8", + "Move": "MOVE_BITE" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "18", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "22", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "26", + "Move": "MOVE_HAZE" + }, + { + "Level": "30", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "34", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "42", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "50", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "53", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ACID_SPRAY", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BITE", + "MOVE_BRAVE_BIRD", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HAZE", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_KNOCK_OFF", + "MOVE_LEECH_LIFE", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_POISON_FANG", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SKY_ATTACK", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "PICHU": { "LevelMoves": [ { @@ -4882,21 +7816,37 @@ "TMMoves": [ "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_DOUBLE_TEAM", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_GROWL", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", "MOVE_NASTY_PLOT", + "MOVE_NUZZLE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", + "MOVE_VOLT_TACKLE", "MOVE_WILD_CHARGE" ], "TutorMoves": [], @@ -4962,12 +7912,21 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_FIRE_BLAST", "MOVE_FLAMETHROWER", "MOVE_HEADBUTT", @@ -4975,6 +7934,11 @@ "MOVE_ICE_BEAM", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_MYSTICAL_FIRE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", @@ -4982,10 +7946,13 @@ "MOVE_REFLECT", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SING", "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", "MOVE_STEALTH_ROCK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", @@ -4995,6 +7962,105 @@ "TutorMoves": [], "EggMoves": [] }, + "IGGLYBUFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SING" + }, + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "12", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "14", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "18", + "Move": "MOVE_FACADE" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "28", + "Move": "MOVE_MIMIC" + }, + { + "Level": "40", + "Move": "MOVE_WISH" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROLLOUT", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WILD_CHARGE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "MAREEP": { "LevelMoves": [ { @@ -5044,15 +8110,29 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GROWL", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_REFLECT", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", "MOVE_WILD_CHARGE" ], @@ -5109,18 +8189,32 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", + "MOVE_GROWL", "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_REFLECT", "MOVE_ROAR", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", "MOVE_WILD_CHARGE" ], @@ -5185,28 +8279,49 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_PULSE", + "MOVE_DUAL_CHOP", + "MOVE_EERIE_IMPULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FLASH_CANNON", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", "MOVE_OUTRAGE", + "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_REFLECT", "MOVE_ROAR", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_VOLT_SWITCH", - "MOVE_WILD_CHARGE" + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" ], "TutorMoves": [ "MOVE_EERIE_IMPULSE", @@ -5266,25 +8381,49 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSION", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MORNING_SUN", "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", "MOVE_ROAR", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", - "MOVE_THUNDER_WAVE" + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -5348,25 +8487,52 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", "MOVE_CURSE", + "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MOONLIGHT", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", "MOVE_ROAR", + "MOVE_SCREECH", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SNARL", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_WAVE", - "MOVE_TOXIC" + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -5379,103 +8545,6 @@ "EggMoves": [] }, "SLOWKING": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_CURSE" - }, - { - "Level": "1", - "Move": "MOVE_POWER_GEM" - }, - { - "Level": "1", - "Move": "MOVE_NASTY_PLOT" - }, - { - "Level": "3", - "Move": "MOVE_GROWL" - }, - { - "Level": "6", - "Move": "MOVE_WATER_GUN" - }, - { - "Level": "14", - "Move": "MOVE_PSYBEAM" - }, - { - "Level": "18", - "Move": "MOVE_WATER_PULSE" - }, - { - "Level": "21", - "Move": "MOVE_HEADBUTT" - }, - { - "Level": "24", - "Move": "MOVE_ZEN_HEADBUTT" - }, - { - "Level": "27", - "Move": "MOVE_AMNESIA" - }, - { - "Level": "36", - "Move": "MOVE_SURF" - }, - { - "Level": "42", - "Move": "MOVE_PSYCHIC" - }, - { - "Level": "45", - "Move": "MOVE_FUTURE_SIGHT" - } - ], - "TMMoves": [ - "MOVE_BLIZZARD", - "MOVE_BODY_SLAM", - "MOVE_CALM_MIND", - "MOVE_DIG", - "MOVE_EARTHQUAKE", - "MOVE_ENDURE", - "MOVE_FIRE_BLAST", - "MOVE_FLAMETHROWER", - "MOVE_FOCUS_BLAST", - "MOVE_GIGA_IMPACT", - "MOVE_HEAL_BLOCK", - "MOVE_HYDRO_PUMP", - "MOVE_HYPER_BEAM", - "MOVE_ICE_BEAM", - "MOVE_ICE_PUNCH", - "MOVE_ICY_WIND", - "MOVE_IRON_TAIL", - "MOVE_LIGHT_SCREEN", - "MOVE_LIQUIDATION", - "MOVE_METRONOME", - "MOVE_MUD_SHOT", - "MOVE_PROTECT", - "MOVE_PSYSHOCK", - "MOVE_REFLECT", - "MOVE_SAFEGUARD", - "MOVE_SHADOW_BALL", - "MOVE_SUBSTITUTE", - "MOVE_SWIFT", - "MOVE_THUNDER_WAVE", - "MOVE_WATERFALL", - "MOVE_WHIRLPOOL" - ], - "TutorMoves": [ - "MOVE_CONFUSION" - ], - "EggMoves": [] - }, - "SLOWKING_GALAR": { "LevelMoves": [ { "Level": "1", @@ -5539,18 +8608,30 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_CURSE", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", @@ -5559,22 +8640,39 @@ "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", "MOVE_LIQUIDATION", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", "MOVE_POISON_JAB", + "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES", + "MOVE_TRI_ATTACK", "MOVE_WATERFALL", - "MOVE_WHIRLPOOL" + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_CONFUSION", @@ -5650,32 +8748,173 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CRUNCH", + "MOVE_CURSE", "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_PULSE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_FISSURE", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", "MOVE_HYPER_BEAM", "MOVE_ICE_FANG", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", "MOVE_SELF_DESTRUCT", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER_FANG" ], "TutorMoves": [ - "MOVE_IRON_TAIL" + "MOVE_IRON_TAIL", + "MOVE_ROCK_BLAST" ], "EggMoves": [] }, + "QWILFISH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "4", + "Move": "MOVE_HARDEN" + }, + { + "Level": "8", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "12", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "15", + "Move": "MOVE_HAZE" + }, + { + "Level": "17", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "20", + "Move": "MOVE_SPIKES" + }, + { + "Level": "28", + "Move": "MOVE_BARB_BARRAGE" + }, + { + "Level": "30", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "32", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "44", + "Move": "MOVE_TOXIC" + }, + { + "Level": "46", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BARB_BARRAGE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MUD_SHOT", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_SCALE_SHOT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, "SCIZOR": { "LevelMoves": [ { @@ -5742,22 +8981,49 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BUZZ", + "MOVE_BULLET_PUNCH", "MOVE_CLOSE_COMBAT", "MOVE_CURSE", "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_BOMB", "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_SAFEGUARD", + "MOVE_SILVER_WIND", + "MOVE_SLASH", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_U_TURN" + "MOVE_SWORDS_DANCE", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" ], "TutorMoves": [ "MOVE_BULLET_PUNCH" @@ -5824,30 +9090,51 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUG_BUZZ", "MOVE_BULK_UP", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", "MOVE_CURSE", + "MOVE_DETECT", "MOVE_DIG", "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LUNGE", + "MOVE_MEGAHORN", "MOVE_MUD_SHOT", "MOVE_NIGHT_SLASH", "MOVE_OUTRAGE", + "MOVE_PIN_MISSILE", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", + "MOVE_SILVER_WIND", + "MOVE_SKULL_BASH", "MOVE_SPIKES", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -5893,19 +9180,39 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CHILLING_WATER", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FEATHER_DANCE", "MOVE_FLY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_SEED_BOMB", + "MOVE_SHEER_COLD", "MOVE_SPIKES", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", "MOVE_WATER_PULSE" ], "TutorMoves": [], @@ -5969,26 +9276,48 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DOUBLE_TEAM", + "MOVE_DRILL_RUN", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FLY", "MOVE_GIGA_IMPACT", "MOVE_HURRICANE", "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_RAZOR_WIND", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SPIKES", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", "MOVE_TAUNT", "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", "MOVE_X_SCISSOR" ], "TutorMoves": [ @@ -6040,24 +9369,39 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DOUBLE_EDGE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", "MOVE_HYPER_VOICE", + "MOVE_LEER", "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", "MOVE_SHADOW_BALL", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", "MOVE_WILL_O_WISP" ], "TutorMoves": [], @@ -6119,31 +9463,163 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_LEER", "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", "MOVE_SHADOW_BALL", "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_FANG", + "MOVE_TORMENT", "MOVE_TOXIC", + "MOVE_TRAILBLAZE", "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] }, + "PORYGON2": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_CONVERSION" + }, + { + "Level": "1", + "Move": "MOVE_CHARGE" + }, + { + "Level": "10", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "15", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_CONVERSION_2" + }, + { + "Level": "30", + "Move": "MOVE_AGILITY" + }, + { + "Level": "35", + "Move": "MOVE_RECOVER" + }, + { + "Level": "40", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "45", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "50", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "55", + "Move": "MOVE_ZAP_CANNON" + }, + { + "Level": "60", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "LARVITAR": { "LevelMoves": [ { @@ -6196,25 +9672,39 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCREECH", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", "MOVE_TAUNT" ], "TutorMoves": [], @@ -6273,24 +9763,39 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCREECH", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", "MOVE_TAUNT" ], "TutorMoves": [ @@ -6359,37 +9864,59 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_CURSE", + "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", @@ -6403,6 +9930,1133 @@ ], "EggMoves": [] }, + "TREECKO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "3", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_ABSORB" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "21", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "27", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "33", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "35", + "Move": "MOVE_SLASH" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "50", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "55", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GROVYLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "3", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_ABSORB" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "21", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "27", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "33", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "35", + "Move": "MOVE_SLASH" + }, + { + "Level": "38", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "50", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "55", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_GIGA_DRAIN", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SCEPTILE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "3", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_ABSORB" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "14", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "21", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "27", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "30", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "33", + "Move": "MOVE_ENERGY_BALL" + }, + { + "Level": "35", + "Move": "MOVE_SLASH" + }, + { + "Level": "38", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "50", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "55", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_BLAST", + "MOVE_FRENZY_PLANT", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LEAFAGE", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHED_TAIL", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_SHED_TAIL" + ], + "EggMoves": [] + }, + "TORCHIC": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "3", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "18", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "33", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "50", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "55", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "COMBUSKEN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "3", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "18", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "33", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "40", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "44", + "Move": "MOVE_BLAZE_KICK" + }, + { + "Level": "50", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "55", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_CHOP", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BLAZIKEN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "3", + "Move": "MOVE_EMBER" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "9", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "12", + "Move": "MOVE_DETECT" + }, + { + "Level": "18", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "33", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "40", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "44", + "Move": "MOVE_BLAZE_KICK" + }, + { + "Level": "50", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "55", + "Move": "MOVE_FLARE_BLITZ" + }, + { + "Level": "58", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLAST_BURN", + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_EARTHQUAKE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_OVERHEAT", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER_PUNCH", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MUDKIP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "6", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "11", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "26", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "38", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "46", + "Move": "MOVE_MUDDY_WATER" + }, + { + "Level": "55", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GROWL", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MARSHTOMP": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "6", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "11", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "26", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "33", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "38", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "46", + "Move": "MOVE_MUDDY_WATER" + }, + { + "Level": "50", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "55", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GROWL", + "MOVE_HYDRO_PUMP", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_SAND_TOMB" + ], + "EggMoves": [] + }, + "SWAMPERT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "3", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "6", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "11", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_PROTECT" + }, + { + "Level": "18", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "22", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "26", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "28", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "33", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "36", + "Move": "MOVE_SURF" + }, + { + "Level": "38", + "Move": "MOVE_SCREECH" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "46", + "Move": "MOVE_MUDDY_WATER" + }, + { + "Level": "50", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "55", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "60", + "Move": "MOVE_SLUDGE_WAVE" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_MUD_SHOT" + ], + "EggMoves": [] + }, "RALTS": { "LevelMoves": [ { @@ -6468,20 +11122,38 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", @@ -6556,24 +11228,44 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", + "MOVE_VACUUM_WAVE", "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], @@ -6654,29 +11346,55 @@ "TMMoves": [ "MOVE_AURA_SPHERE", "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWIFT", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRIPLE_AXEL", + "MOVE_VACUUM_WAVE", "MOVE_WILL_O_WISP", + "MOVE_WISH", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -6757,33 +11475,57 @@ "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PARTING_SHOT", + "MOVE_PHANTOM_FORCE", "MOVE_POISON_JAB", + "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", "MOVE_WILL_O_WISP", - "MOVE_X_SCISSOR" + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -6840,13 +11582,24 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DYNAMIC_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", @@ -6858,8 +11611,14 @@ "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", @@ -6867,9 +11626,12 @@ "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", "MOVE_THUNDER_FANG", "MOVE_THUNDER_PUNCH" ], @@ -6951,13 +11713,32 @@ "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", "MOVE_STEALTH_ROCK", - "MOVE_SUBSTITUTE" + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" ], "TutorMoves": [], "EggMoves": [] @@ -7037,14 +11818,33 @@ "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", - "MOVE_SUBSTITUTE" + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" ], "TutorMoves": [], "EggMoves": [] @@ -7121,6 +11921,7 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", @@ -7128,28 +11929,52 @@ "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", "MOVE_MUD_SHOT", "MOVE_OUTRAGE", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", @@ -7215,25 +12040,42 @@ "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSION", + "MOVE_DETECT", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_ICE_PUNCH", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", - "MOVE_THUNDER_PUNCH" + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -7295,27 +12137,51 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLAZE_KICK", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CALM_MIND", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSION", + "MOVE_DETECT", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", + "MOVE_RECOVER", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_TAUNT" + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_FIRE_PUNCH", @@ -7389,20 +12255,37 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CHARGE", "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", "MOVE_HEADBUTT", "MOVE_ICE_FANG", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_ROAR", + "MOVE_SNARL", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_VOLT_SWITCH" + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" ], "TutorMoves": [], "EggMoves": [] @@ -7476,23 +12359,45 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_FANG", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROAR", + "MOVE_SNARL", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_VOLT_SWITCH" + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" ], "TutorMoves": [], "EggMoves": [] @@ -7561,26 +12466,255 @@ } ], "TMMoves": [ + "MOVE_ABSORB", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_CHARM", "MOVE_DAZZLING_GLEAM", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", "MOVE_MUD_SHOT", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", + "MOVE_SLEEP_POWDER", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_SWORDS_DANCE" + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" ], "TutorMoves": [ "MOVE_POISON_STING" ], "EggMoves": [] }, + "GULPIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "12", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "14", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "15", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "17", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "20", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "28", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "35", + "Move": "MOVE_TOXIC" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "49", + "Move": "MOVE_GUNK_SHOT" + }, + { + "Level": "55", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "60", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SWALOT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "12", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "14", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "15", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "17", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "20", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "28", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "35", + "Move": "MOVE_TOXIC" + }, + { + "Level": "40", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "49", + "Move": "MOVE_GUNK_SHOT" + }, + { + "Level": "55", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "60", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_BULLET_SEED", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATER_PULSE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "CARVANHA": { "LevelMoves": [ { @@ -7630,17 +12764,35 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BITE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_POISON_FANG", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWAGGER", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_WATERFALL", "MOVE_WHIRLPOOL", @@ -7705,23 +12857,45 @@ } ], "TMMoves": [ + "MOVE_AGILITY", + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_JET", + "MOVE_BITE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_FANG", "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_FANG", "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SKULL_BASH", + "MOVE_SLASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWAGGER", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_WATERFALL", "MOVE_WHIRLPOOL", @@ -7792,24 +12966,43 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", + "MOVE_GROWL", "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", "MOVE_HEAT_WAVE", "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], @@ -7876,26 +13069,47 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_FLASH_CANNON", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HEADBUTT", + "MOVE_HEAT_CRASH", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_ROAR", + "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_SELF_DESTRUCT", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], @@ -7904,6 +13118,222 @@ ], "EggMoves": [] }, + "SPOINK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "7", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "10", + "Move": "MOVE_GROWL" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "22", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "25", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "29", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "33", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "38", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "44", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "50", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "55", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_MUD_SHOT", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GRUMPIG": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "7", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "10", + "Move": "MOVE_GROWL" + }, + { + "Level": "14", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "18", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "22", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "25", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "27", + "Move": "MOVE_SNARL" + }, + { + "Level": "29", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "33", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "38", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "44", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "50", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "55", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PAY_DAY", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SNARL", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_WHIRLWIND", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "SWABLU": { "LevelMoves": [ { @@ -7967,20 +13397,39 @@ "MOVE_AERIAL_ACE", "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FLY", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", + "MOVE_MIST", + "MOVE_MOONBLAST", "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PERISH_SONG", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_SAFEGUARD", + "MOVE_SING", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER" ], "TutorMoves": [], "EggMoves": [] @@ -8048,28 +13497,52 @@ "MOVE_AERIAL_ACE", "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", "MOVE_BULLDOZE", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", "MOVE_FLY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", + "MOVE_MIST", + "MOVE_MOONBLAST", "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PERISH_SONG", + "MOVE_PETAL_DANCE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SILVER_WIND", + "MOVE_SING", + "MOVE_SKY_ATTACK", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", + "MOVE_TWISTER", "MOVE_WILL_O_WISP" ], "TutorMoves": [ @@ -8077,6 +13550,507 @@ ], "EggMoves": [] }, + "ZANGOOSE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "5", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "19", + "Move": "MOVE_SLASH" + }, + { + "Level": "24", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "29", + "Move": "MOVE_FALSE_SWIPE" + }, + { + "Level": "33", + "Move": "MOVE_DIG" + }, + { + "Level": "36", + "Move": "MOVE_DETECT" + }, + { + "Level": "40", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "43", + "Move": "MOVE_TAUNT" + }, + { + "Level": "47", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "50", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SEVIPER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "6", + "Move": "MOVE_LICK" + }, + { + "Level": "14", + "Move": "MOVE_SCREECH" + }, + { + "Level": "17", + "Move": "MOVE_SNARL" + }, + { + "Level": "19", + "Move": "MOVE_GLARE" + }, + { + "Level": "21", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "24", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "28", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "31", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "34", + "Move": "MOVE_HAZE" + }, + { + "Level": "39", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "46", + "Move": "MOVE_SLUDGE_BOMB" + }, + { + "Level": "52", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_GUNK_SHOT", + "MOVE_HAZE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FEEBAS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "15", + "Move": "MOVE_TACKLE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_CHILLING_WATER", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MILOTIC": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "4", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "8", + "Move": "MOVE_TWISTER" + }, + { + "Level": "12", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "14", + "Move": "MOVE_WHIRLPOOL" + }, + { + "Level": "15", + "Move": "MOVE_TACKLE" + }, + { + "Level": "16", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "20", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "24", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "28", + "Move": "MOVE_RECOVER" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "44", + "Move": "MOVE_SURF" + }, + { + "Level": "52", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_AQUA_RING", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_PULSE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TRIPLE_AXEL", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [ + "MOVE_HAZE", + "MOVE_MIST", + "MOVE_WATER_PULSE" + ], + "EggMoves": [] + }, + "KECLEON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_LICK" + }, + { + "Level": "1", + "Move": "MOVE_CONVERSION" + }, + { + "Level": "1", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "7", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "10", + "Move": "MOVE_SHED_TAIL" + }, + { + "Level": "14", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "18", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "21", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "25", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "33", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "38", + "Move": "MOVE_SCREECH" + }, + { + "Level": "42", + "Move": "MOVE_CONVERSION_2" + }, + { + "Level": "54", + "Move": "MOVE_POWER_WHIP" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CHARGE_BEAM", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_PUNCH", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAMETHROWER", + "MOVE_GIGA_IMPACT", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SHED_TAIL", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, "SHUPPET": { "LevelMoves": [ { @@ -8131,19 +14105,34 @@ "TMMoves": [ "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GUNK_SHOT", "MOVE_HEADBUTT", + "MOVE_KNOCK_OFF", + "MOVE_LICK", "MOVE_METRONOME", "MOVE_NASTY_PLOT", + "MOVE_PHANTOM_FORCE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -8207,27 +14196,156 @@ "TMMoves": [ "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DAZZLING_GLEAM", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_KNOCK_OFF", + "MOVE_LICK", "MOVE_METRONOME", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_WIND", + "MOVE_SCREECH", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] }, + "CHIMECHO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "7", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "10", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_SCREECH" + }, + { + "Level": "23", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "25", + "Move": "MOVE_WISH" + }, + { + "Level": "29", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "34", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "38", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "48", + "Move": "MOVE_BOOMBURST" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BOOMBURST", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_METEOR_BEAM", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_PSYBEAM" + ], + "EggMoves": [] + }, "ABSOL": { "LevelMoves": [ { @@ -8238,6 +14356,14 @@ "Level": "1", "Move": "MOVE_QUICK_ATTACK" }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_SHADOW_SNEAK" + }, { "Level": "10", "Move": "MOVE_KNOCK_OFF" @@ -8289,26 +14415,48 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", "MOVE_DARK_PULSE", + "MOVE_DETECT", "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PERISH_SONG", + "MOVE_PHANTOM_FORCE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SNARL", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", @@ -8316,7 +14464,10 @@ "MOVE_X_SCISSOR", "MOVE_ZEN_HEADBUTT" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_PHANTOM_FORCE", + "MOVE_SNARL" + ], "EggMoves": [] }, "SNORUNT": { @@ -8371,13 +14522,30 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FROST_BREATH", + "MOVE_HEADBUTT", "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_PROTECT", "MOVE_SHADOW_BALL", "MOVE_SPIKES", "MOVE_SUBSTITUTE", + "MOVE_TRAILBLAZE", "MOVE_WATER_PULSE" ], "TutorMoves": [], @@ -8439,19 +14607,41 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_HEAD", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", "MOVE_SELF_DESTRUCT", "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SKULL_BASH", "MOVE_SPIKES", "MOVE_SUBSTITUTE", + "MOVE_TRAILBLAZE", "MOVE_WATER_PULSE" ], "TutorMoves": [ @@ -8511,25 +14701,38 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_HYPER_VOICE", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", "MOVE_SUBSTITUTE", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -8586,24 +14789,38 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", + "MOVE_HEADBUTT", "MOVE_HYDRO_PUMP", "MOVE_HYPER_VOICE", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", "MOVE_SUBSTITUTE", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_PROTECT" @@ -8671,30 +14888,51 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DUAL_WINGBEAT", "MOVE_EARTHQUAKE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HURRICANE", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_FLY" @@ -8710,9 +14948,12 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_FACADE", "MOVE_HEADBUTT", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_STEEL_BEAM", + "MOVE_TACKLE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -8765,14 +15006,26 @@ "MOVE_AGILITY", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BULLET_PUNCH", + "MOVE_CONFUSION", "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", @@ -8781,9 +15034,14 @@ "MOVE_SHADOW_BALL", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_THUNDER_PUNCH" + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_CONFUSION", @@ -8850,28 +15108,53 @@ "MOVE_AGILITY", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_PUNCH", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSION", "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METEOR_BEAM", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", + "MOVE_PSYCHO_CUT", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SELF_DESTRUCT", "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SKULL_BASH", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWIFT", - "MOVE_THUNDER_PUNCH" + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ "MOVE_EXPLOSION", @@ -8879,6 +15162,911 @@ ], "EggMoves": [] }, + "LATIAS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CHARM" + }, + { + "Level": "1", + "Move": "MOVE_MIST_BALL" + }, + { + "Level": "5", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "10", + "Move": "MOVE_RECOVER" + }, + { + "Level": "15", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "30", + "Move": "MOVE_WISH" + }, + { + "Level": "35", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "45", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "50", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "55", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "60", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "65", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAINING_KISS", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MIST_BALL", + "MOVE_MYSTICAL_FIRE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RAZOR_WIND", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "LATIOS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LUSTER_PURGE" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "5", + "Move": "MOVE_TWISTER" + }, + { + "Level": "10", + "Move": "MOVE_RECOVER" + }, + { + "Level": "15", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "30", + "Move": "MOVE_WISH" + }, + { + "Level": "35", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "40", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "45", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "50", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "55", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "60", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "65", + "Move": "MOVE_AIR_SLASH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSION", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_FLY", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_LUSTER_PURGE", + "MOVE_MYSTICAL_FIRE", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RAZOR_WIND", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KYOGRE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "1", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "1", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "12", + "Move": "MOVE_WHIRLPOOL" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "34", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "36", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "42", + "Move": "MOVE_SURF" + }, + { + "Level": "45", + "Move": "MOVE_SHEER_COLD" + }, + { + "Level": "50", + "Move": "MOVE_ORIGIN_PULSE" + }, + { + "Level": "54", + "Move": "MOVE_AQUA_RING" + }, + { + "Level": "58", + "Move": "MOVE_BLIZZARD" + }, + { + "Level": "64", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "72", + "Move": "MOVE_HYDRO_PUMP" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_AQUA_RING", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_ORIGIN_PULSE", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GROUDON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "1", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "1", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "9", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "18", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "28", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "30", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "34", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "40", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "43", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "45", + "Move": "MOVE_FISSURE" + }, + { + "Level": "50", + "Move": "MOVE_PRECIPICE_BLADES" + }, + { + "Level": "62", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "68", + "Move": "MOVE_FIRE_BLAST" + }, + { + "Level": "75", + "Move": "MOVE_HEAT_CRASH" + }, + { + "Level": "81", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FISSURE", + "MOVE_FLAMETHROWER", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LAVA_PLUME", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PRECIPICE_BLADES", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "RAYQUAZA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TWISTER" + }, + { + "Level": "1", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "1", + "Move": "MOVE_DRAGON_ASCENT" + }, + { + "Level": "9", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "15", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "27", + "Move": "MOVE_EXTREME_SPEED" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "45", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "58", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "63", + "Move": "MOVE_FLY" + }, + { + "Level": "72", + "Move": "MOVE_HURRICANE" + }, + { + "Level": "81", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "90", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_ASCENT", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FLAMETHROWER", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SHADOW_CLAW", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TWISTER", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STARLY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "19", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "23", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "28", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "33", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_AGILITY" + }, + { + "Level": "49", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRAVE_BIRD", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_KNOCK_OFF", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_U_TURN", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STARAVIA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "19", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "23", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "28", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "33", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_AGILITY" + }, + { + "Level": "49", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BRAVE_BIRD", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_KNOCK_OFF", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "STARAPTOR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "8", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "19", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "23", + "Move": "MOVE_WHIRLWIND" + }, + { + "Level": "28", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "33", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "41", + "Move": "MOVE_AGILITY" + }, + { + "Level": "44", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "49", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BLAZE_KICK", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUST", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_CLOSE_COMBAT" + ], + "EggMoves": [] + }, "BUDEW": { "LevelMoves": [ { @@ -8899,17 +16087,23 @@ } ], "TMMoves": [ + "MOVE_ABSORB", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_CHARM", "MOVE_DAZZLING_GLEAM", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GROWTH", "MOVE_MUD_SHOT", "MOVE_PROTECT", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE" @@ -8981,24 +16175,46 @@ } ], "TMMoves": [ + "MOVE_ABSORB", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_CHARM", "MOVE_DAZZLING_GLEAM", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", "MOVE_HYPER_BEAM", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MORTAL_SPIN", "MOVE_MUD_SHOT", + "MOVE_PETAL_DANCE", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_RAZOR_WIND", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", + "MOVE_SLEEP_POWDER", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_SWORDS_DANCE" + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" ], "TutorMoves": [ + "MOVE_MORTAL_SPIN", "MOVE_POISON_STING" ], "EggMoves": [] @@ -9051,24 +16267,42 @@ } ], "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_CHARM", + "MOVE_CIRCLE_THROW", "MOVE_CLOSE_COMBAT", + "MOVE_COTTON_GUARD", "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", + "MOVE_HEADBUTT", "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_TAIL", + "MOVE_LOW_SWEEP", "MOVE_PLAY_ROUGH", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_SHADOW_BALL", "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", "MOVE_WORK_UP" ], "TutorMoves": [], @@ -9138,34 +16372,262 @@ } ], "TMMoves": [ + "MOVE_AGILITY", "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BRUTAL_SWING", + "MOVE_CHARM", + "MOVE_CIRCLE_THROW", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_COTTON_GUARD", "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_SHADOW_BALL", "MOVE_SOLAR_BEAM", + "MOVE_SPLASH", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", "MOVE_U_TURN", "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] }, + "CHINGLING": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "7", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "10", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "15", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_SCREECH" + }, + { + "Level": "23", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "25", + "Move": "MOVE_WISH" + }, + { + "Level": "29", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "34", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_VOICE", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_WATER_PULSE", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MIME JR.": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "17", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "28", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "32", + "Move": "MOVE_MIMIC" + }, + { + "Level": "36", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "36", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "44", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "48", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRST_IMPRESSION", + "MOVE_FUTURE_SIGHT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_HAZE", + "MOVE_MIST", + "MOVE_SMOKESCREEN" + ], + "EggMoves": [] + }, "GIBLE": { "LevelMoves": [ { @@ -9210,12 +16672,20 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", @@ -9224,12 +16694,18 @@ "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_FANG" ], "TutorMoves": [], @@ -9280,14 +16756,22 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", "MOVE_CRUNCH", + "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", @@ -9297,13 +16781,19 @@ "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_SPIKES", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_FANG" ], "TutorMoves": [], @@ -9354,13 +16844,23 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", "MOVE_FLAMETHROWER", @@ -9369,12 +16869,19 @@ "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", "MOVE_LIQUIDATION", + "MOVE_NASTY_PLOT", "MOVE_OUTRAGE", "MOVE_POISON_JAB", + "MOVE_POWER_GEM", "MOVE_PROTECT", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_SPIKES", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", @@ -9382,7 +16889,10 @@ "MOVE_SURF", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", - "MOVE_THUNDER_FANG" + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_FANG", + "MOVE_VACUUM_WAVE" ], "TutorMoves": [ "MOVE_CRUNCH" @@ -9437,21 +16947,37 @@ "MOVE_AGILITY", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CIRCLE_THROW", "MOVE_CLOSE_COMBAT", "MOVE_CRUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FOCUS_BLAST", "MOVE_ICE_PUNCH", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", "MOVE_NASTY_PLOT", "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -9523,13 +17049,26 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BLAZE_KICK", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", "MOVE_CALM_MIND", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DRAGON_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", @@ -9537,21 +17076,33 @@ "MOVE_ICE_PUNCH", "MOVE_IRON_DEFENSE", "MOVE_IRON_TAIL", + "MOVE_LOW_SWEEP", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", "MOVE_METRONOME", "MOVE_NASTY_PLOT", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", "MOVE_ROAR", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SCREECH", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", "MOVE_WATER_PULSE", + "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -9607,17 +17158,32 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_FISSURE", "MOVE_ICE_FANG", + "MOVE_MUDDY_WATER", "MOVE_PROTECT", + "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_FANG", "MOVE_WHIRLWIND" ], @@ -9672,22 +17238,37 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_CRUNCH", "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_FISSURE", "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_FANG", "MOVE_IRON_HEAD", + "MOVE_MUDDY_WATER", "MOVE_PROTECT", + "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_FANG", "MOVE_WHIRLWIND" ], @@ -9742,19 +17323,37 @@ } ], "TMMoves": [ + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", "MOVE_MAGICAL_LEAF", + "MOVE_MIST", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_SEED_BOMB", + "MOVE_SHEER_COLD", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWORDS_DANCE", - "MOVE_WATER_PULSE" + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WOOD_HAMMER" ], "TutorMoves": [], "EggMoves": [] @@ -9807,31 +17406,53 @@ } ], "TMMoves": [ + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLET_SEED", + "MOVE_CHILLING_WATER", "MOVE_CURSE", "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FOCUS_BLAST", + "MOVE_FROST_BREATH", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_ICE_HAMMER", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEAFAGE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", "MOVE_MAGICAL_LEAF", + "MOVE_MIST", "MOVE_OUTRAGE", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SEED_BOMB", + "MOVE_SHEER_COLD", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWORDS_DANCE", - "MOVE_WATER_PULSE" + "MOVE_TRAILBLAZE", + "MOVE_WATER_PULSE", + "MOVE_WOOD_HAMMER" ], "TutorMoves": [ + "MOVE_ICE_HAMMER", "MOVE_ICE_PUNCH" ], "EggMoves": [] @@ -9893,22 +17514,48 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BULLET_SEED", "MOVE_CALM_MIND", + "MOVE_CHARM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_LEAF_BLADE", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_MAGICAL_LEAF", + "MOVE_MIMIC", + "MOVE_PETAL_DANCE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_LEAF", "MOVE_ROAR", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_WISH", "MOVE_X_SCISSOR" ], "TutorMoves": [ @@ -9973,19 +17620,46 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_TAIL", + "MOVE_MIMIC", + "MOVE_MIST", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROAR", "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", - "MOVE_TAUNT" + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -9997,6 +17671,121 @@ ], "EggMoves": [] }, + "PORYGON-Z": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_CONVERSION" + }, + { + "Level": "1", + "Move": "MOVE_CHARGE" + }, + { + "Level": "10", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "15", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_CONVERSION_2" + }, + { + "Level": "30", + "Move": "MOVE_AGILITY" + }, + { + "Level": "35", + "Move": "MOVE_RECOVER" + }, + { + "Level": "40", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "45", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "50", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "55", + "Move": "MOVE_ZAP_CANNON" + }, + { + "Level": "60", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLIZZARD", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONVERSION", + "MOVE_CONVERSION_2", + "MOVE_DARK_PULSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_EDGE", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_TAIL", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, "GALLADE": { "LevelMoves": [ { @@ -10053,37 +17842,73 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_AGILITY", "MOVE_AURA_SPHERE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_PUNCH", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", + "MOVE_NIGHT_SLASH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", "MOVE_PSYSHOCK", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", "MOVE_ROCK_TOMB", + "MOVE_SACRED_SWORD", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", "MOVE_TAUNT", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", + "MOVE_VACUUM_WAVE", "MOVE_WILL_O_WISP", "MOVE_X_SCISSOR", "MOVE_ZEN_HEADBUTT" @@ -10098,6 +17923,7 @@ "MOVE_MYSTICAL_FIRE", "MOVE_NIGHT_SLASH", "MOVE_PSYCHIC", + "MOVE_SACRED_SWORD", "MOVE_SLASH" ], "EggMoves": [] @@ -10166,23 +17992,51 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FROST_BREATH", "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", "MOVE_NASTY_PLOT", + "MOVE_PETAL_DANCE", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", "MOVE_SPIKES", "MOVE_SUBSTITUTE", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", - "MOVE_WATER_PULSE" + "MOVE_TRAILBLAZE", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_PULSE", + "MOVE_WILL_O_WISP" ], "TutorMoves": [ "MOVE_CRUNCH", @@ -10193,6 +18047,359 @@ ], "EggMoves": [] }, + "ROTOM": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "1", + "Move": "MOVE_LEAF_STORM" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_CHARGE" + }, + { + "Level": "15", + "Move": "MOVE_PARABOLIC_CHARGE" + }, + { + "Level": "17", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "20", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "23", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "25", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "30", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "34", + "Move": "MOVE_TAUNT" + }, + { + "Level": "40", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "44", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "50", + "Move": "MOVE_DISCHARGE" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEAF_STORM", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PARABOLIC_CHARGE", + "MOVE_PARTING_SHOT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HEATRAN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "1", + "Move": "MOVE_HEAT_CRASH" + }, + { + "Level": "6", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "12", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "18", + "Move": "MOVE_FIRE_FANG" + }, + { + "Level": "24", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "30", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "36", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "42", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "48", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "50", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "54", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "59", + "Move": "MOVE_LUNGE" + }, + { + "Level": "64", + "Move": "MOVE_HEAT_WAVE" + }, + { + "Level": "66", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "72", + "Move": "MOVE_MAGMA_STORM" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_CRASH", + "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LUNGE", + "MOVE_MAGMA_STORM", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_OVERHEAT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DARKRAI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "10", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "11", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_SNARL" + }, + { + "Level": "20", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "32", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "47", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "50", + "Move": "MOVE_FUTURE_SIGHT" + }, + { + "Level": "57", + "Move": "MOVE_HAZE" + }, + { + "Level": "66", + "Move": "MOVE_DARK_VOID" + }, + { + "Level": "70", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "75", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "84", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "93", + "Move": "MOVE_DARK_PULSE" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DARK_VOID", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SLUDGE_BOMB", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, "TEPIG": { "LevelMoves": [ { @@ -10247,15 +18454,30 @@ "TMMoves": [ "MOVE_DIG", "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_ENERGY", "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", "MOVE_HEAT_WAVE", "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_ROAR", + "MOVE_ROLLOUT", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", + "MOVE_TRAILBLAZE", "MOVE_WILD_CHARGE", "MOVE_WILL_O_WISP", "MOVE_WORK_UP" @@ -10320,26 +18542,45 @@ ], "TMMoves": [ "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", "MOVE_HEAT_WAVE", "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", "MOVE_OVERHEAT", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SMOKESCREEN", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", + "MOVE_TRAILBLAZE", "MOVE_WILD_CHARGE", "MOVE_WILL_O_WISP", "MOVE_WORK_UP", @@ -10410,33 +18651,62 @@ } ], "TMMoves": [ + "MOVE_BLAST_BURN", "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAT_CRASH", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", "MOVE_OVERHEAT", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SCALD", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BLADE", "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", "MOVE_WILD_CHARGE", "MOVE_WILL_O_WISP", "MOVE_WORK_UP", @@ -10492,18 +18762,30 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_DETECT", "MOVE_DIG", "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", "MOVE_GUNK_SHOT", + "MOVE_HYPNOSIS", + "MOVE_LEER", "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", "MOVE_PROTECT", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_THUNDERBOLT", "MOVE_TOXIC", + "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -10565,29 +18847,46 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", "MOVE_ICE_PUNCH", + "MOVE_IRON_TAIL", + "MOVE_LEER", "MOVE_LIGHT_SCREEN", "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SMASH", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", "MOVE_TOXIC", + "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -10595,6 +18894,221 @@ ], "EggMoves": [] }, + "PURRLOIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_MIMIC" + }, + { + "Level": "1", + "Move": "MOVE_FAKE_OUT" + }, + { + "Level": "9", + "Move": "MOVE_LICK" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "16", + "Move": "MOVE_TORMENT" + }, + { + "Level": "19", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "26", + "Move": "MOVE_SCREECH" + }, + { + "Level": "32", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "38", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "44", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "52", + "Move": "MOVE_PLAY_ROUGH" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRST_IMPRESSION", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_VOICE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_U_TURN" + ], + "TutorMoves": [ + "MOVE_SNARL" + ], + "EggMoves": [] + }, + "LIEPARD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_MIMIC" + }, + { + "Level": "1", + "Move": "MOVE_FAKE_OUT" + }, + { + "Level": "9", + "Move": "MOVE_LICK" + }, + { + "Level": "12", + "Move": "MOVE_BITE" + }, + { + "Level": "16", + "Move": "MOVE_TORMENT" + }, + { + "Level": "19", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "26", + "Move": "MOVE_SCREECH" + }, + { + "Level": "32", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "38", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "44", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "52", + "Move": "MOVE_PLAY_ROUGH" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FIRST_IMPRESSION", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LICK", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_SNARL" + ], + "EggMoves": [] + }, "PANSAGE": { "LevelMoves": [ { @@ -10651,25 +19165,43 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", "MOVE_DIG", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_DRAIN", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_IRON_TAIL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SEED_BOMB", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", - "MOVE_TOXIC" + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -10730,27 +19262,48 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_IRON_TAIL", + "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_SWEEP", + "MOVE_MAGICAL_LEAF", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SEED_BOMB", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", - "MOVE_TOXIC" + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -10811,15 +19364,28 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BITE", "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", "MOVE_DIG", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_WHEEL", "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_OVERHEAT", @@ -10831,8 +19397,10 @@ "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", - "MOVE_WILL_O_WISP" + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -10893,17 +19461,33 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BITE", + "MOVE_BLAZE_KICK", "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", "MOVE_DIG", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", "MOVE_FLARE_BLITZ", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_OVERHEAT", @@ -10911,12 +19495,15 @@ "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", - "MOVE_WILL_O_WISP" + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -10977,27 +19564,44 @@ } ], "TMMoves": [ + "MOVE_AQUA_RING", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", "MOVE_DIG", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALD", "MOVE_SHADOW_CLAW", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", - "MOVE_WATERFALL" + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -11058,30 +19662,219 @@ } ], "TMMoves": [ + "MOVE_AQUA_RING", + "MOVE_BITE", "MOVE_BLIZZARD", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", "MOVE_DIG", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LICK", "MOVE_LIQUIDATION", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", "MOVE_NASTY_PLOT", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALD", "MOVE_SHADOW_CLAW", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", - "MOVE_WATERFALL" + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MUNNA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "8", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "12", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "16", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "21", + "Move": "MOVE_CHARM" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "28", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "32", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "36", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "40", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "48", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPNOSIS", + "MOVE_LIGHT_SCREEN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MUSHARNA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "8", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "12", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "16", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "21", + "Move": "MOVE_CHARM" + }, + { + "Level": "24", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "28", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "32", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "36", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "40", + "Move": "MOVE_MOONBLAST" + }, + { + "Level": "48", + "Move": "MOVE_FUTURE_SIGHT" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LIGHT_SCREEN", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -11140,15 +19933,30 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_METAL_CLAW", + "MOVE_MUD_SHOT", "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_X_SCISSOR" ], "TutorMoves": [], @@ -11220,21 +20028,42 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_DRILL_RUN", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUD_SHOT", "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SKULL_BASH", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", - "MOVE_SUBSTITUTE" + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_X_SCISSOR" ], "TutorMoves": [ "MOVE_METAL_SOUND" @@ -11289,19 +20118,28 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", "MOVE_POWER_UP_PUNCH", @@ -11314,12 +20152,225 @@ "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_WILD_CHARGE", - "MOVE_WORK_UP" + "MOVE_WISH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "THROH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_CIRCLE_THROW" + }, + { + "Level": "5", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "10", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "13", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "25", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "28", + "Move": "MOVE_LOW_SWEEP" + }, + { + "Level": "33", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "36", + "Move": "MOVE_ENDURE" + }, + { + "Level": "41", + "Move": "MOVE_AMNESIA" + }, + { + "Level": "43", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "52", + "Move": "MOVE_STORM_THROW" + }, + { + "Level": "58", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_DIG", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SAWK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "5", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "10", + "Move": "MOVE_DETECT" + }, + { + "Level": "12", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "15", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "18", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "20", + "Move": "MOVE_LOW_SWEEP" + }, + { + "Level": "25", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "33", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "36", + "Move": "MOVE_ENDURE" + }, + { + "Level": "43", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "52", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "58", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BLAZE_KICK", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_OUTRAGE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -11376,13 +20427,26 @@ } ], "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_INFESTATION", "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SCREECH", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES" ], "TutorMoves": [], @@ -11440,16 +20504,32 @@ } ], "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_INFESTATION", "MOVE_IRON_DEFENSE", + "MOVE_LEER", + "MOVE_MORTAL_SPIN", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SCREECH", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_MORTAL_SPIN" + ], "EggMoves": [] }, "SCOLIPEDE": { @@ -11520,23 +20600,48 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_MORTAL_SPIN", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SCREECH", + "MOVE_SKULL_BASH", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES", - "MOVE_U_TURN" + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_MORTAL_SPIN" ], - "TutorMoves": [], "EggMoves": [] }, "SANDILE": { @@ -11584,25 +20689,39 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LEER", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_TORMENT" ], "TutorMoves": [], "EggMoves": [] @@ -11652,27 +20771,43 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_TORMENT" ], "TutorMoves": [], "EggMoves": [] @@ -11726,34 +20861,53 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_BULLDOZE", "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_FISSURE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HYPER_BEAM", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", "MOVE_SHADOW_CLAW", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", - "MOVE_THUNDER_FANG" + "MOVE_THUNDER_FANG", + "MOVE_TORMENT" ], "TutorMoves": [ "MOVE_BREAKING_SWIPE" @@ -11816,26 +20970,47 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BRICK_BREAK", "MOVE_BULK_UP", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", + "MOVE_DETECT", "MOVE_DIG", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", "MOVE_ICE_PUNCH", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_PARTING_SHOT", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", "MOVE_SLUDGE_BOMB", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], @@ -11898,41 +21073,263 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DARK_PULSE", + "MOVE_DETECT", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", "MOVE_METRONOME", "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SKULL_BASH", "MOVE_SLUDGE_BOMB", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] }, + "YAMASK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "4", + "Move": "MOVE_HAZE" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "22", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "30", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "36", + "Move": "MOVE_CURSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "46", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "48", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_BRUTAL_SWING", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PARTING_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "COFAGRIGUS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "4", + "Move": "MOVE_HAZE" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "22", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "30", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "36", + "Move": "MOVE_CURSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "44", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "46", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "48", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PARTING_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_SAFEGUARD", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_SHADOW_CLAW" + ], + "EggMoves": [] + }, "TRUBBISH": { "LevelMoves": [ { @@ -11993,15 +21390,33 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_BRUTAL_SWING", "MOVE_BULLET_SEED", "MOVE_DARK_PULSE", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_ROCK_BLAST", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", "MOVE_SPIKES", - "MOVE_SUBSTITUTE" + "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" ], "TutorMoves": [], "EggMoves": [] @@ -12070,23 +21485,44 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", + "MOVE_BRUTAL_SWING", "MOVE_BULLET_SEED", "MOVE_DARK_PULSE", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", "MOVE_MUD_SHOT", + "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_ROCK_BLAST", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", - "MOVE_THUNDERBOLT" + "MOVE_TAKE_DOWN", + "MOVE_THUNDERBOLT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" ], "TutorMoves": [], "EggMoves": [] @@ -12139,13 +21575,28 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_BLIZZARD", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_HARDEN", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_DEFENSE", "MOVE_LIGHT_SCREEN", + "MOVE_MIST", "MOVE_PROTECT", - "MOVE_SUBSTITUTE" + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAUNT" ], "TutorMoves": [], "EggMoves": [] @@ -12198,13 +21649,28 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_BLIZZARD", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FLASH_CANNON", + "MOVE_FROST_BREATH", + "MOVE_HARDEN", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_DEFENSE", "MOVE_LIGHT_SCREEN", + "MOVE_MIST", "MOVE_PROTECT", - "MOVE_SUBSTITUTE" + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAUNT" ], "TutorMoves": [], "EggMoves": [] @@ -12261,15 +21727,32 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_BLIZZARD", + "MOVE_CHILLING_WATER", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_DEFENSE", "MOVE_LIGHT_SCREEN", + "MOVE_MIST", "MOVE_PROTECT", - "MOVE_SUBSTITUTE" + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAUNT" ], "TutorMoves": [], "EggMoves": [] @@ -12335,20 +21818,208 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EERIE_IMPULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_NUZZLE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_SOLAR_BEAM", + "MOVE_SPARK", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAIL_WHIP", "MOVE_TAUNT", "MOVE_THUNDER", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", "MOVE_THUNDER_WAVE", "MOVE_U_TURN", - "MOVE_WILD_CHARGE" + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FOONGUS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "14", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "22", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "28", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC" + }, + { + "Level": "48", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "54", + "Move": "MOVE_SPORE" + }, + { + "Level": "62", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_HEAL_BLOCK", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SYNTHESIS", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "AMOONGUSS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_GROWTH" + }, + { + "Level": "1", + "Move": "MOVE_STUN_SPORE" + }, + { + "Level": "10", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "14", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "22", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "28", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC" + }, + { + "Level": "48", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "54", + "Move": "MOVE_SPORE" + }, + { + "Level": "62", + "Move": "MOVE_LEAF_STORM" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_BODY_SLAM", + "MOVE_BULLET_SEED", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_LEAF_STORM", + "MOVE_MAGICAL_LEAF", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPORE", + "MOVE_STUN_SPORE", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SYNTHESIS", + "MOVE_TORMENT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" ], "TutorMoves": [], "EggMoves": [] @@ -12369,7 +22040,12 @@ } ], "TMMoves": [ - "MOVE_PROTECT" + "MOVE_CHARGE_BEAM", + "MOVE_FACADE", + "MOVE_PROTECT", + "MOVE_SPARK", + "MOVE_TACKLE", + "MOVE_THUNDER_WAVE" ], "TutorMoves": [], "EggMoves": [] @@ -12426,17 +22102,33 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", "MOVE_BODY_SLAM", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_GIGA_DRAIN", + "MOVE_HEADBUTT", "MOVE_LIGHT_SCREEN", "MOVE_PROTECT", + "MOVE_SPARK", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_FANG", + "MOVE_THUNDER_WAVE", "MOVE_U_TURN", - "MOVE_VOLT_SWITCH" + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON" ], "TutorMoves": [ "MOVE_CRUNCH" @@ -12503,33 +22195,55 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", "MOVE_BODY_SLAM", "MOVE_BULK_UP", "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_CRUNCH", + "MOVE_DISCHARGE", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FLASH_CANNON", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", "MOVE_OUTRAGE", + "MOVE_POISON_FANG", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SPARK", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_FANG", "MOVE_THUNDER_PUNCH", "MOVE_THUNDER_WAVE", "MOVE_U_TURN", "MOVE_VOLT_SWITCH", "MOVE_WATERFALL", + "MOVE_WILD_CHARGE", + "MOVE_ZAP_CANNON", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -12591,19 +22305,34 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", "MOVE_HEAT_WAVE", + "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SMOKESCREEN", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_TAUNT" + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] @@ -12664,19 +22393,35 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", "MOVE_HEAT_WAVE", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SMOKESCREEN", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_TAUNT" + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] @@ -12737,102 +22482,151 @@ } ], "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DOUBLE_TEAM", + "MOVE_EMBER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", "MOVE_FLARE_BLITZ", "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SMOKESCREEN", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_TAUNT" + "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CRYOGONAL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "4", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "16", + "Move": "MOVE_MIST" + }, + { + "Level": "16", + "Move": "MOVE_HAZE" + }, + { + "Level": "28", + "Move": "MOVE_SLASH" + }, + { + "Level": "32", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "36", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "40", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "40", + "Move": "MOVE_REFLECT" + }, + { + "Level": "44", + "Move": "MOVE_RECOVER" + }, + { + "Level": "48", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "52", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "56", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "60", + "Move": "MOVE_EXPLOSION" + }, + { + "Level": "65", + "Move": "MOVE_SHEER_COLD" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CHILLING_WATER", + "MOVE_CONFUSE_RAY", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MIST", + "MOVE_NIGHT_SLASH", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHEER_COLD", + "MOVE_SLASH", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TRIPLE_AXEL", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] }, "STUNFISK": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_WATER_GUN" - }, - { - "Level": "1", - "Move": "MOVE_THUNDER_SHOCK" - }, - { - "Level": "5", - "Move": "MOVE_ENDURE" - }, - { - "Level": "10", - "Move": "MOVE_MUD_SHOT" - }, - { - "Level": "15", - "Move": "MOVE_ROCK_TOMB" - }, - { - "Level": "20", - "Move": "MOVE_CHARGE" - }, - { - "Level": "25", - "Move": "MOVE_SPARK" - }, - { - "Level": "30", - "Move": "MOVE_EARTHQUAKE" - }, - { - "Level": "35", - "Move": "MOVE_DISCHARGE" - }, - { - "Level": "40", - "Move": "MOVE_BOUNCE" - }, - { - "Level": "45", - "Move": "MOVE_EERIE_IMPULSE" - }, - { - "Level": "50", - "Move": "MOVE_SLUDGE_WAVE" - } - ], - "TMMoves": [ - "MOVE_BULLDOZE", - "MOVE_CURSE", - "MOVE_DIG", - "MOVE_EARTH_POWER", - "MOVE_ELECTROWEB", - "MOVE_PROTECT", - "MOVE_ROCK_SLIDE", - "MOVE_SLUDGE_BOMB", - "MOVE_STEALTH_ROCK", - "MOVE_STONE_EDGE", - "MOVE_SUBSTITUTE", - "MOVE_SURF", - "MOVE_THUNDER", - "MOVE_THUNDERBOLT", - "MOVE_THUNDER_WAVE" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "STUNFISK_GALAR": { "LevelMoves": [ { "Level": "1", @@ -12892,20 +22686,952 @@ } ], "TMMoves": [ + "MOVE_BOUNCE", "MOVE_BULLDOZE", + "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DIG", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", "MOVE_FLASH_CANNON", "MOVE_ICE_FANG", + "MOVE_IRON_DEFENSE", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SCREECH", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", "MOVE_THUNDER_WAVE", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_WATER_GUN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOLETT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_PUNCH" + }, + { + "Level": "16", + "Move": "MOVE_CURSE" + }, + { + "Level": "18", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "22", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "28", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "36", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "42", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "48", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "55", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "65", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_BOMB", + "MOVE_MUD_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_THUNDER_PUNCH" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOLURK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_PUNCH" + }, + { + "Level": "16", + "Move": "MOVE_CURSE" + }, + { + "Level": "18", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "22", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "28", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "36", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "42", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "48", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "55", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "65", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_BOMB", + "MOVE_MUD_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "COBALION": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "7", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "14", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "30", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "34", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "38", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "49", + "Move": "MOVE_SACRED_SWORD" + }, + { + "Level": "56", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "63", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "70", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_METAL_CLAW", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_VACUUM_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TERRAKION": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "7", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "30", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "34", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "38", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "42", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "49", + "Move": "MOVE_SACRED_SWORD" + }, + { + "Level": "56", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "63", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "70", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "78", + "Move": "MOVE_HEAD_SMASH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MEGAHORN", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "VIRIZION": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_SYNTHESIS" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "7", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "14", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "30", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "34", + "Move": "MOVE_HORN_LEECH" + }, + { + "Level": "38", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "49", + "Move": "MOVE_SACRED_SWORD" + }, + { + "Level": "56", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "63", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "70", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HORN_LEECH", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_SYNTHESIS", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KELDEO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "1", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "1", + "Move": "MOVE_SECRET_SWORD" + }, + { + "Level": "7", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "14", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "26", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "30", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "34", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "38", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_MEGAHORN" + }, + { + "Level": "49", + "Move": "MOVE_SACRED_SWORD" + }, + { + "Level": "56", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "63", + "Move": "MOVE_HYDRO_PUMP" + }, + { + "Level": "70", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_AQUA_JET", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LIQUIDATION", + "MOVE_MEGAHORN", + "MOVE_MUDDY_WATER", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROAR", + "MOVE_SACRED_SWORD", + "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SECRET_SWORD", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MELOETTA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_SING" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "11", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "14", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "22", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "31", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "43", + "Move": "MOVE_U_TURN" + }, + { + "Level": "50", + "Move": "MOVE_RELIC_SONG" + }, + { + "Level": "57", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "64", + "Move": "MOVE_HYPER_VOICE" + }, + { + "Level": "78", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "85", + "Move": "MOVE_PERISH_SONG" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_PUNCH", + "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_PERISH_SONG", + "MOVE_PETAL_DANCE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RELIC_SONG", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SING", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TRIPLE_AXEL", + "MOVE_U_TURN", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GENESECT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_TECHNO_BLAST" + }, + { + "Level": "7", + "Move": "MOVE_SCREECH" + }, + { + "Level": "14", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "21", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "28", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "35", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "42", + "Move": "MOVE_LUNGE" + }, + { + "Level": "45", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "49", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "56", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "62", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "70", + "Move": "MOVE_ZAP_CANNON" + }, + { + "Level": "91", + "Move": "MOVE_SELF_DESTRUCT" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLAZE_KICK", + "MOVE_BLIZZARD", + "MOVE_BUG_BUZZ", + "MOVE_CHARGE_BEAM", + "MOVE_DARK_PULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEECH_LIFE", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_REFLECT", + "MOVE_SCREECH", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TECHNO_BLAST", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_X_SCISSOR", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -12959,28 +23685,43 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_CURSE", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWL", + "MOVE_GROWTH", "MOVE_HEADBUTT", "MOVE_IRON_HEAD", + "MOVE_LEECH_SEED", "MOVE_MUD_SHOT", + "MOVE_PIN_MISSILE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_REFLECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WOOD_HAMMER", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -13035,17 +23776,27 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_CURSE", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWL", + "MOVE_GROWTH", "MOVE_HEADBUTT", "MOVE_IRON_HEAD", + "MOVE_LEECH_SEED", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", + "MOVE_PIN_MISSILE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_REFLECT", @@ -13053,12 +23804,18 @@ "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_SPIKES", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WOOD_HAMMER", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -13125,23 +23882,38 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", "MOVE_BULLDOZE", "MOVE_BULLET_SEED", + "MOVE_CLOSE_COMBAT", "MOVE_CRUNCH", "MOVE_CURSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", "MOVE_DRAGON_CLAW", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FRENZY_PLANT", "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GROWTH", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LEECH_SEED", + "MOVE_LOW_SWEEP", "MOVE_MUD_SHOT", + "MOVE_PIN_MISSILE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_REFLECT", @@ -13149,14 +23921,23 @@ "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WOOD_HAMMER", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -13218,13 +23999,27 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", + "MOVE_LIGHT_SCREEN", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] @@ -13285,17 +24080,32 @@ } ], "TMMoves": [ + "MOVE_AGILITY", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_HEAT_WAVE", + "MOVE_LIGHT_SCREEN", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_THUNDER_PUNCH" + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] @@ -13356,27 +24166,52 @@ } ], "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BLAST_BURN", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DREAM_EATER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", "MOVE_HEAL_BLOCK", "MOVE_HEAT_WAVE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", "MOVE_METRONOME", + "MOVE_MYSTICAL_FIRE", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SILVER_WIND", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_THUNDER_PUNCH", + "MOVE_WILL_O_WISP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -13440,21 +24275,37 @@ "TMMoves": [ "MOVE_AERIAL_ACE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DIG", + "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_GROWL", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_LIQUIDATION", + "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SMOKESCREEN", "MOVE_SPIKES", + "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", "MOVE_U_TURN", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE" ], "TutorMoves": [], @@ -13520,30 +24371,48 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLIP_TURN", + "MOVE_GROWL", "MOVE_GUNK_SHOT", "MOVE_HEADBUTT", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_LIQUIDATION", "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SHADOW_SNEAK", + "MOVE_SMOKESCREEN", "MOVE_SPIKES", + "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", "MOVE_U_TURN", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_WATER_PULSE" ], "TutorMoves": [], @@ -13609,34 +24478,57 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLIP_TURN", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_GUNK_SHOT", "MOVE_HEADBUTT", + "MOVE_HYDRO_CANNON", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_ICE_PUNCH", "MOVE_ICY_WIND", + "MOVE_LICK", "MOVE_LIQUIDATION", + "MOVE_LOW_SWEEP", "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", "MOVE_PROTECT", "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SHADOW_SNEAK", + "MOVE_SMOKESCREEN", "MOVE_SPIKES", + "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", "MOVE_WATERFALL", - "MOVE_WATER_PULSE" + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WATER_SHURIKEN" ], "TutorMoves": [ "MOVE_WATER_SHURIKEN" @@ -13688,14 +24580,22 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BOUNCE", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", "MOVE_BULK_UP", "MOVE_BULLDOZE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_HEADBUTT", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MUD_SHOT", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", @@ -13703,8 +24603,11 @@ "MOVE_SPIKES", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_U_TURN", "MOVE_WILD_CHARGE" ], @@ -13757,27 +24660,45 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BOUNCE", "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_COMET_PUNCH", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_MUD_SHOT", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SKULL_BASH", "MOVE_SLUDGE_BOMB", "MOVE_SPIKES", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_PUNCH", "MOVE_U_TURN", "MOVE_WILD_CHARGE" @@ -13836,17 +24757,31 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_FLY", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_OVERHEAT", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_STEEL_WING", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", "MOVE_U_TURN", + "MOVE_WHIRLWIND", "MOVE_WILL_O_WISP" ], "TutorMoves": [], @@ -13901,22 +24836,38 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_FLY", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_OVERHEAT", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_STEEL_WING", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", "MOVE_U_TURN", - "MOVE_WILL_O_WISP" + "MOVE_VACUUM_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK" ], "TutorMoves": [ "MOVE_WING_ATTACK" @@ -13976,26 +24927,45 @@ ], "TMMoves": [ "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BLAZE_KICK", + "MOVE_BRAVE_BIRD", "MOVE_BULK_UP", "MOVE_DOUBLE_EDGE", "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLAME_WHEEL", + "MOVE_FLARE_BLITZ", "MOVE_FLY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_HYPER_BEAM", "MOVE_OVERHEAT", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SKY_ATTACK", "MOVE_SOLAR_BEAM", + "MOVE_STEEL_WING", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_SWORDS_DANCE", "MOVE_U_TURN", - "MOVE_WILL_O_WISP" + "MOVE_VACUUM_WAVE", + "MOVE_WHIRLWIND", + "MOVE_WILL_O_WISP", + "MOVE_WING_ATTACK" ], "TutorMoves": [ "MOVE_BRAVE_BIRD" @@ -14018,7 +24988,12 @@ } ], "TMMoves": [ - "MOVE_PROTECT" + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_PROTECT", + "MOVE_STRING_SHOT", + "MOVE_STUN_SPORE", + "MOVE_TACKLE" ], "TutorMoves": [], "EggMoves": [] @@ -14051,7 +25026,16 @@ } ], "TMMoves": [ - "MOVE_IRON_DEFENSE" + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_STRING_SHOT", + "MOVE_STUN_SPORE", + "MOVE_TACKLE" ], "TutorMoves": [ "MOVE_PROTECT" @@ -14118,17 +25102,41 @@ } ], "TMMoves": [ + "MOVE_AIR_SLASH", + "MOVE_BUG_BUZZ", "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HARDEN", + "MOVE_HURRICANE", "MOVE_HYPER_BEAM", + "MOVE_INFESTATION", "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_OMINOUS_WIND", + "MOVE_PETAL_DANCE", + "MOVE_POISON_POWDER", + "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", + "MOVE_SAFEGUARD", + "MOVE_SILVER_WIND", + "MOVE_SLEEP_POWDER", "MOVE_SOLAR_BEAM", + "MOVE_STRING_SHOT", + "MOVE_STUN_SPORE", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SUPERSONIC", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_U_TURN", + "MOVE_WHIRLWIND" ], "TutorMoves": [ "MOVE_GUST", @@ -14196,22 +25204,39 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CRUNCH", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", + "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", + "MOVE_HYPER_VOICE", + "MOVE_LEER", "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SNARL", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", "MOVE_WILD_CHARGE", - "MOVE_WILL_O_WISP" + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -14273,23 +25298,42 @@ ], "TMMoves": [ "MOVE_BODY_SLAM", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DOUBLE_EDGE", + "MOVE_EARTH_POWER", + "MOVE_EMBER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_FLARE_BLITZ", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEER", + "MOVE_OVERHEAT", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SNARL", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", "MOVE_WILD_CHARGE", - "MOVE_WILL_O_WISP" + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP" ], "TutorMoves": [ "MOVE_HYPER_BEAM", @@ -14297,7 +25341,7 @@ ], "EggMoves": [] }, - "FLAB\u00c9B\u00c9": { + "FLAB\u00c3\u00a9B\u00c3\u00a9": { "LevelMoves": [ { "Level": "1", @@ -14350,89 +25394,37 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_GIGA_DRAIN", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_PETAL_DANCE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WISH" ], "TutorMoves": [], "EggMoves": [] }, "FLOETTE": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_VINE_WHIP" - }, - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_FAIRY_WIND" - }, - { - "Level": "10", - "Move": "MOVE_SAFEGUARD" - }, - { - "Level": "15", - "Move": "MOVE_RAZOR_LEAF" - }, - { - "Level": "18", - "Move": "MOVE_DRAINING_KISS" - }, - { - "Level": "20", - "Move": "MOVE_WISH" - }, - { - "Level": "22", - "Move": "MOVE_MAGICAL_LEAF" - }, - { - "Level": "26", - "Move": "MOVE_CHARM" - }, - { - "Level": "33", - "Move": "MOVE_SYNTHESIS" - }, - { - "Level": "40", - "Move": "MOVE_ENERGY_BALL" - }, - { - "Level": "54", - "Move": "MOVE_SOLAR_BEAM" - } - ], - "TMMoves": [ - "MOVE_CALM_MIND", - "MOVE_DAZZLING_GLEAM", - "MOVE_DOUBLE_TEAM", - "MOVE_ENDURE", - "MOVE_GIGA_DRAIN", - "MOVE_LIGHT_SCREEN", - "MOVE_METRONOME", - "MOVE_PROTECT", - "MOVE_PSYCHIC", - "MOVE_SUBSTITUTE", - "MOVE_SWIFT" - ], - "TutorMoves": [ - "MOVE_MOONBLAST" - ], - "EggMoves": [] - }, - "FLOETTE_ETERNAL": { "LevelMoves": [ { "Level": "1", @@ -14489,17 +25481,39 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_GIGA_DRAIN", "MOVE_HYPER_BEAM", + "MOVE_LIGHT_OF_RUIN", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_OMINOUS_WIND", + "MOVE_PETAL_DANCE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_MOONBLAST" @@ -14563,17 +25577,39 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", "MOVE_GIGA_DRAIN", "MOVE_HYPER_BEAM", "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_OMINOUS_WIND", + "MOVE_PETAL_DANCE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", + "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", - "MOVE_SWIFT" + "MOVE_SWIFT", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_DISARMING_VOICE" @@ -14646,20 +25682,38 @@ "TMMoves": [ "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_HORN_LEECH", + "MOVE_LEAF_BLADE", "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_MUD_SHOT", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_ROAR", "MOVE_ROCK_SLIDE", + "MOVE_SEED_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", "MOVE_WILD_CHARGE", "MOVE_ZEN_HEADBUTT" ], @@ -14734,24 +25788,46 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", "MOVE_BULLET_SEED", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", + "MOVE_HORN_LEECH", "MOVE_HYPER_BEAM", + "MOVE_LEAF_BLADE", "MOVE_LEAF_STORM", + "MOVE_LEECH_SEED", "MOVE_MAGICAL_LEAF", + "MOVE_MEGAHORN", + "MOVE_MUD_SHOT", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", "MOVE_ROAR", "MOVE_ROCK_SLIDE", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SYNTHESIS", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TRAILBLAZE", + "MOVE_VINE_WHIP", "MOVE_WILD_CHARGE", "MOVE_ZEN_HEADBUTT" ], @@ -14804,23 +25880,40 @@ } ], "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_COMET_PUNCH", + "MOVE_CRUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_PUNCH", "MOVE_HYPER_VOICE", "MOVE_ICE_PUNCH", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_PARTING_SHOT", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", - "MOVE_THUNDER_PUNCH" + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] @@ -14865,11 +25958,11 @@ }, { "Level": "34", - "Move": "MOVE_BRUTAL_SWING" + "Move": "MOVE_CRUNCH" }, { - "Level": "38", - "Move": "MOVE_CRUNCH" + "Level": "34", + "Move": "MOVE_BRUTAL_SWING" }, { "Level": "44", @@ -14889,15 +25982,29 @@ } ], "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", "MOVE_BULK_UP", "MOVE_BULLDOZE", + "MOVE_BULLET_PUNCH", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", + "MOVE_DETECT", "MOVE_DIG", "MOVE_DRAGON_CLAW", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", @@ -14906,6 +26013,11 @@ "MOVE_ICE_PUNCH", "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", @@ -14913,12 +26025,17 @@ "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", + "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ @@ -14982,21 +26099,41 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_COTTON_GUARD", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", "MOVE_ICE_FANG", "MOVE_IRON_TAIL", + "MOVE_MIMIC", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", "MOVE_ROCK_SMASH", + "MOVE_SKULL_BASH", + "MOVE_SNARL", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", "MOVE_THUNDER_FANG", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", "MOVE_U_TURN", "MOVE_WILD_CHARGE", "MOVE_WORK_UP", @@ -15015,6 +26152,10 @@ "Level": "1", "Move": "MOVE_LEER" }, + { + "Level": "1", + "Move": "MOVE_TELEPORT" + }, { "Level": "6", "Move": "MOVE_DISARMING_VOICE" @@ -15050,16 +26191,30 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", "MOVE_DARK_PULSE", + "MOVE_DISARMING_VOICE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", "MOVE_NASTY_PLOT", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", "MOVE_SAFEGUARD", "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", "MOVE_WORK_UP", @@ -15068,93 +26223,7 @@ "TutorMoves": [], "EggMoves": [] }, - "MEOWSTIC_M": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_LEER" - }, - { - "Level": "6", - "Move": "MOVE_DISARMING_VOICE" - }, - { - "Level": "9", - "Move": "MOVE_CONFUSION" - }, - { - "Level": "13", - "Move": "MOVE_FAKE_TEARS" - }, - { - "Level": "15", - "Move": "MOVE_SWIFT" - }, - { - "Level": "18", - "Move": "MOVE_CHARM" - }, - { - "Level": "21", - "Move": "MOVE_PSYBEAM" - }, - { - "Level": "30", - "Move": "MOVE_LIGHT_SCREEN" - }, - { - "Level": "30", - "Move": "MOVE_REFLECT" - }, - { - "Level": "36", - "Move": "MOVE_PSYSHOCK" - }, - { - "Level": "44", - "Move": "MOVE_PSYCHIC" - }, - { - "Level": "46", - "Move": "MOVE_HEAL_BLOCK" - }, - { - "Level": "50", - "Move": "MOVE_WISH" - } - ], - "TMMoves": [ - "MOVE_CALM_MIND", - "MOVE_DARK_PULSE", - "MOVE_DIG", - "MOVE_DOUBLE_TEAM", - "MOVE_ENDURE", - "MOVE_ENERGY_BALL", - "MOVE_GIGA_IMPACT", - "MOVE_HYPER_BEAM", - "MOVE_NASTY_PLOT", - "MOVE_PLAY_ROUGH", - "MOVE_PROTECT", - "MOVE_SAFEGUARD", - "MOVE_SHADOW_BALL", - "MOVE_SPIKES", - "MOVE_STEALTH_ROCK", - "MOVE_SUBSTITUTE", - "MOVE_TAUNT", - "MOVE_THUNDERBOLT", - "MOVE_THUNDER_WAVE", - "MOVE_TOXIC_SPIKES", - "MOVE_WORK_UP", - "MOVE_ZEN_HEADBUTT" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "MEOWSTIC_F": { + "MEOWSTIC": { "LevelMoves": [ { "Level": "1", @@ -15219,24 +26288,51 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", + "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DISARMING_VOICE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_MOONBLAST", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PAY_DAY", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TELEPORT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", "MOVE_WATER_PULSE", "MOVE_WORK_UP", "MOVE_ZEN_HEADBUTT" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_MOONBLAST", + "MOVE_TELEPORT" + ], "EggMoves": [] }, "HONEDGE": { @@ -15287,17 +26383,35 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BRICK_BREAK", "MOVE_CLOSE_COMBAT", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLASH_CANNON", "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METAL_SOUND", "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", - "MOVE_SUBSTITUTE" + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE" + ], + "TutorMoves": [ + "MOVE_SACRED_SWORD" ], - "TutorMoves": [], "EggMoves": [] }, "DOUBLADE": { @@ -15348,19 +26462,40 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BRICK_BREAK", "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_HIT", + "MOVE_DUAL_CHOP", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLASH_CANNON", "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METAL_SOUND", "MOVE_NIGHT_SLASH", "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_ZEN_HEADBUTT" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_SACRED_SWORD" + ], "EggMoves": [] }, "AEGISLASH": { @@ -15415,23 +26550,46 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_BRICK_BREAK", "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_HIT", + "MOVE_DUAL_CHOP", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", + "MOVE_HEAD_SMASH", "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KING\u00c2\u20ac\u2122S_SHIELD", + "MOVE_METAL_SOUND", "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAZOR_WIND", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_SACRED_SWORD", + "MOVE_SCREECH", "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [ - "MOVE_KINGS_SHIELD" + "MOVE_KING\u00c2\u20ac\u2122S_SHIELD", + "MOVE_SACRED_SWORD" ], "EggMoves": [] }, @@ -15491,15 +26649,29 @@ } ], "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", "MOVE_FLASH_CANNON", + "MOVE_HEAL_BLOCK", + "MOVE_HYPNOSIS", "MOVE_LIGHT_SCREEN", + "MOVE_MOONBLAST", "MOVE_NASTY_PLOT", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_REFLECT", "MOVE_SUBSTITUTE", - "MOVE_THUNDERBOLT" + "MOVE_THUNDERBOLT", + "MOVE_WISH" ], "TutorMoves": [], "EggMoves": [] @@ -15560,19 +26732,38 @@ } ], "TMMoves": [ + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", "MOVE_LIGHT_SCREEN", "MOVE_METRONOME", + "MOVE_MOONBLAST", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", + "MOVE_SILVER_WIND", "MOVE_SUBSTITUTE", - "MOVE_THUNDERBOLT" + "MOVE_THUNDERBOLT", + "MOVE_WISH" ], "TutorMoves": [], "EggMoves": [] @@ -15629,19 +26820,32 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", "MOVE_FLAMETHROWER", "MOVE_LIGHT_SCREEN", + "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SAFEGUARD", "MOVE_SELF_DESTRUCT", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", - "MOVE_THUNDERBOLT" + "MOVE_TACKLE", + "MOVE_THUNDERBOLT", + "MOVE_WISH" ], "TutorMoves": [], "EggMoves": [] @@ -15698,22 +26902,39 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_CALM_MIND", + "MOVE_CHARM", + "MOVE_COTTON_GUARD", "MOVE_DAZZLING_GLEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_TEARS", "MOVE_FLAMETHROWER", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_LIGHT_SCREEN", "MOVE_METRONOME", + "MOVE_OMINOUS_WIND", + "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_SAFEGUARD", "MOVE_SELF_DESTRUCT", + "MOVE_SILVER_WIND", + "MOVE_STICKY_WEB", + "MOVE_STRING_SHOT", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", - "MOVE_THUNDERBOLT" + "MOVE_TACKLE", + "MOVE_THUNDERBOLT", + "MOVE_WISH" ], "TutorMoves": [], "EggMoves": [] @@ -15771,21 +26992,36 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", "MOVE_DARK_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", "MOVE_FLAMETHROWER", "MOVE_FUTURE_SIGHT", "MOVE_HEADBUTT", + "MOVE_HYPNOSIS", + "MOVE_KNOCK_OFF", "MOVE_LIGHT_SCREEN", "MOVE_LIQUIDATION", + "MOVE_MIMIC", "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_SLASH", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDERBOLT", + "MOVE_TOPSY_TURVY", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -15845,30 +27081,53 @@ "TMMoves": [ "MOVE_BULK_UP", "MOVE_CALM_MIND", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", "MOVE_DOUBLE_TEAM", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", "MOVE_FLAMETHROWER", "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", "MOVE_HEADBUTT", "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_KNOCK_OFF", "MOVE_LIGHT_SCREEN", "MOVE_LIQUIDATION", + "MOVE_MIMIC", "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_OCTOLOCK", + "MOVE_PECK", "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_PSYBEAM", "MOVE_PSYCHIC", + "MOVE_PSYCHO_CUT", + "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_SLASH", "MOVE_STEALTH_ROCK", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_THUNDERBOLT", + "MOVE_TOPSY_TURVY", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", "MOVE_ZEN_HEADBUTT" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_OCTOLOCK" + ], "EggMoves": [] }, "BINACLE": { @@ -15923,27 +27182,43 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULLDOZE", "MOVE_DIG", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_ICE_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIQUIDATION", "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", "MOVE_TAUNT", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_X_SCISSOR" ], "TutorMoves": [], @@ -16009,31 +27284,55 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", "MOVE_DIG", + "MOVE_DOUBLE_HIT", "MOVE_DRAGON_CLAW", + "MOVE_DUAL_CHOP", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIQUIDATION", + "MOVE_METEOR_BEAM", + "MOVE_MUDDY_WATER", "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", "MOVE_POISON_JAB", "MOVE_POWER_UP_PUNCH", "MOVE_PROTECT", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", + "MOVE_SCALD", + "MOVE_SCREECH", "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", "MOVE_SLUDGE_BOMB", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SURF", "MOVE_SWORDS_DANCE", "MOVE_TAUNT", "MOVE_WATERFALL", + "MOVE_WATER_GUN", "MOVE_X_SCISSOR" ], "TutorMoves": [], @@ -16099,19 +27398,39 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", "MOVE_GUNK_SHOT", + "MOVE_HYDRO_PUMP", "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_THUNDERBOLT", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES", - "MOVE_WATERFALL" + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] @@ -16176,22 +27495,42 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_DOUBLE_TEAM", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLIP_TURN", "MOVE_FOCUS_BLAST", "MOVE_GUNK_SHOT", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_OUTRAGE", "MOVE_PLAY_ROUGH", + "MOVE_POISON_JAB", "MOVE_PROTECT", + "MOVE_SCALD", + "MOVE_SCALE_SHOT", "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SMOKESCREEN", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_THUNDERBOLT", + "MOVE_TOXIC", "MOVE_TOXIC_SPIKES", - "MOVE_WATERFALL" + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] @@ -16248,18 +27587,33 @@ } ], "TMMoves": [ + "MOVE_AQUA_JET", + "MOVE_AURA_SPHERE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FLIP_TURN", + "MOVE_HYDRO_PUMP", "MOVE_ICE_BEAM", "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_SPLASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWORDS_DANCE", "MOVE_U_TURN", - "MOVE_WATERFALL" + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] @@ -16320,20 +27674,38 @@ } ], "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AQUA_JET", + "MOVE_AURA_SPHERE", "MOVE_BLIZZARD", + "MOVE_BOUNCE", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FLIP_TURN", + "MOVE_FOCUS_BLAST", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_SCALD", "MOVE_SHADOW_BALL", + "MOVE_SPLASH", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWORDS_DANCE", "MOVE_U_TURN", - "MOVE_WATERFALL" + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] @@ -16395,18 +27767,35 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CHARGE", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MORNING_SUN", + "MOVE_PARABOLIC_CHARGE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SEED_BOMB", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", "MOVE_WILD_CHARGE" ], "TutorMoves": [], @@ -16469,12 +27858,17 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_BREAKING_SWIPE", + "MOVE_BULLDOZE", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DISCHARGE", "MOVE_DRAGON_PULSE", "MOVE_ELECTROWEB", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", @@ -16482,17 +27876,34 @@ "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MORNING_SUN", + "MOVE_PARABOLIC_CHARGE", "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", + "MOVE_SEED_BOMB", + "MOVE_SHED_TAIL", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", "MOVE_WILD_CHARGE" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_SHED_TAIL" + ], "EggMoves": [] }, "TYRUNT": { @@ -16543,28 +27954,45 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CHARM", "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", "MOVE_HYPER_VOICE", "MOVE_ICE_FANG", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", "MOVE_OUTRAGE", "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_THUNDER_FANG", "MOVE_ZEN_HEADBUTT" ], @@ -16631,30 +28059,50 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", "MOVE_BULLDOZE", + "MOVE_CHARM", "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_HEAD_SMASH", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_ICE_FANG", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_METEOR_BEAM", "MOVE_OUTRAGE", "MOVE_PLAY_ROUGH", + "MOVE_POISON_FANG", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", + "MOVE_SCALE_SHOT", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", "MOVE_THUNDER_FANG", "MOVE_ZEN_HEADBUTT" ], @@ -16717,26 +28165,42 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_CALM_MIND", "MOVE_DARK_PULSE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", + "MOVE_GROWL", + "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", + "MOVE_MIST", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_REFLECT", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -16798,34 +28262,57 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BULLDOZE", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHILLING_WATER", "MOVE_DARK_PULSE", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", + "MOVE_FREEZE_DRY", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_ICE_BEAM", + "MOVE_ICE_HAMMER", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", + "MOVE_MIST", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_REFLECT", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", + "MOVE_SHEER_COLD", "MOVE_STEALTH_ROCK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", "MOVE_ZEN_HEADBUTT" ], - "TutorMoves": [], + "TutorMoves": [ + "MOVE_ICE_HAMMER" + ], "EggMoves": [] }, "SYLVEON": { @@ -16880,22 +28367,43 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARM", "MOVE_CURSE", + "MOVE_DAZZLING_GLEAM", "MOVE_DIG", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", "MOVE_GIGA_IMPACT", + "MOVE_GROWL", "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_MOONBLAST", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", + "MOVE_QUICK_ATTACK", "MOVE_REFLECT", "MOVE_ROAR", "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", - "MOVE_TAUNT" + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_TRAILBLAZE", + "MOVE_WISH" ], "TutorMoves": [ "MOVE_CHARM", @@ -16962,27 +28470,50 @@ } ], "TMMoves": [ + "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", "MOVE_BULK_UP", "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", "MOVE_FIRE_PUNCH", "MOVE_FLY", + "MOVE_FLYING_PRESS", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_IRON_HEAD", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", "MOVE_THUNDER_PUNCH", + "MOVE_TRAILBLAZE", "MOVE_U_TURN", + "MOVE_WING_ATTACK", "MOVE_X_SCISSOR", "MOVE_ZEN_HEADBUTT" ], @@ -17046,19 +28577,38 @@ ], "TMMoves": [ "MOVE_AGILITY", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", "MOVE_DAZZLING_GLEAM", "MOVE_DIG", "MOVE_DISCHARGE", + "MOVE_EERIE_IMPULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_NUZZLE", + "MOVE_PARABOLIC_CHARGE", + "MOVE_PLAY_ROUGH", "MOVE_PROTECT", + "MOVE_SEED_BOMB", "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_U_TURN", + "MOVE_VOLT_SWITCH", "MOVE_WILD_CHARGE" ], "TutorMoves": [], @@ -17120,22 +28670,39 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_EDGE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METEOR_BEAM", + "MOVE_MOONBLAST", + "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_REFLECT", "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SELF_DESTRUCT", "MOVE_SPIKES", - "MOVE_SUBSTITUTE" + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" ], "TutorMoves": [], "EggMoves": [] @@ -17196,14 +28763,30 @@ } ], "TMMoves": [ + "MOVE_ABSORB", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_OUTRAGE", + "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_SLUDGE_BOMB", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDERBOLT", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [], "EggMoves": [] @@ -17268,94 +28851,40 @@ } ], "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_ICE_BEAM", - "MOVE_OUTRAGE", - "MOVE_ROCK_SLIDE", - "MOVE_SLUDGE_BOMB", - "MOVE_SUBSTITUTE", - "MOVE_THUNDER", - "MOVE_THUNDERBOLT", - "MOVE_TOXIC" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "SLIGGOO_HISUI": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_ABSORB" - }, - { - "Level": "1", - "Move": "MOVE_ACID_ARMOR" - }, - { - "Level": "5", - "Move": "MOVE_WATER_GUN" - }, - { - "Level": "8", - "Move": "MOVE_CHARM" - }, - { - "Level": "10", - "Move": "MOVE_DRAGON_BREATH" - }, - { - "Level": "15", - "Move": "MOVE_PROTECT" - }, - { - "Level": "18", - "Move": "MOVE_MUD_SHOT" - }, - { - "Level": "25", - "Move": "MOVE_WATER_PULSE" - }, - { - "Level": "30", - "Move": "MOVE_DRAGON_PULSE" - }, - { - "Level": "35", - "Move": "MOVE_TAKE_DOWN" - }, - { - "Level": "41", - "Move": "MOVE_CURSE" - }, - { - "Level": "45", - "Move": "MOVE_BODY_SLAM" - }, - { - "Level": "56", - "Move": "MOVE_SURF" - } - ], - "TMMoves": [ - "MOVE_BLIZZARD", - "MOVE_DRACO_METEOR", - "MOVE_ENDURE", - "MOVE_ICE_BEAM", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_MAGNET_BOMB", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_OUTRAGE", + "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SLUDGE_BOMB", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [ "MOVE_IRON_DEFENSE" @@ -17363,102 +28892,6 @@ "EggMoves": [] }, "GOODRA": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_TACKLE" - }, - { - "Level": "1", - "Move": "MOVE_ABSORB" - }, - { - "Level": "1", - "Move": "MOVE_ACID_ARMOR" - }, - { - "Level": "1", - "Move": "MOVE_BREAKING_SWIPE" - }, - { - "Level": "5", - "Move": "MOVE_WATER_GUN" - }, - { - "Level": "8", - "Move": "MOVE_CHARM" - }, - { - "Level": "10", - "Move": "MOVE_DRAGON_BREATH" - }, - { - "Level": "15", - "Move": "MOVE_PROTECT" - }, - { - "Level": "18", - "Move": "MOVE_MUD_SHOT" - }, - { - "Level": "25", - "Move": "MOVE_WATER_PULSE" - }, - { - "Level": "30", - "Move": "MOVE_DRAGON_PULSE" - }, - { - "Level": "35", - "Move": "MOVE_TAKE_DOWN" - }, - { - "Level": "41", - "Move": "MOVE_CURSE" - }, - { - "Level": "45", - "Move": "MOVE_BODY_SLAM" - }, - { - "Level": "56", - "Move": "MOVE_SURF" - }, - { - "Level": "58", - "Move": "MOVE_POWER_WHIP" - } - ], - "TMMoves": [ - "MOVE_BLIZZARD", - "MOVE_BULLDOZE", - "MOVE_DRACO_METEOR", - "MOVE_DRAGON_CLAW", - "MOVE_EARTHQUAKE", - "MOVE_ENDURE", - "MOVE_FIRE_BLAST", - "MOVE_FIRE_PUNCH", - "MOVE_FLAMETHROWER", - "MOVE_FOCUS_BLAST", - "MOVE_GIGA_DRAIN", - "MOVE_GIGA_IMPACT", - "MOVE_HYDRO_PUMP", - "MOVE_HYPER_BEAM", - "MOVE_ICE_BEAM", - "MOVE_KNOCK_OFF", - "MOVE_OUTRAGE", - "MOVE_ROCK_SLIDE", - "MOVE_SLUDGE_BOMB", - "MOVE_SUBSTITUTE", - "MOVE_THUNDER", - "MOVE_THUNDERBOLT", - "MOVE_THUNDER_PUNCH", - "MOVE_TOXIC" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "GOODRA_HISUI": { "LevelMoves": [ { "Level": "1", @@ -17534,31 +28967,57 @@ } ], "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ANCIENT_POWER", "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_PUNCH", "MOVE_FLAMETHROWER", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_IRON_DEFENSE", "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", "MOVE_KNOCK_OFF", + "MOVE_MAGNET_BOMB", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", "MOVE_OUTRAGE", + "MOVE_PROTECT", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", - "MOVE_TOXIC" + "MOVE_TOXIC", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" ], "TutorMoves": [ "MOVE_BREAKING_SWIPE" @@ -17606,21 +29065,34 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_DAZZLING_GLEAM", "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FLASH_CANNON", "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_SPIKES", + "MOVE_STEEL_BEAM", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_THUNDER_WAVE" + "MOVE_TACKLE", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT" ], "TutorMoves": [], "EggMoves": [] @@ -17653,7 +29125,7 @@ }, { "Level": "32", - "Move": "MOVE_FORESTS_CURSE" + "Move": "MOVE_FOREST\u00c2\u20ac\u2122S_CURSE" }, { "Level": "36", @@ -17669,23 +29141,36 @@ } ], "TMMoves": [ + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DIG", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FOREST\u00c2\u20ac\u2122S_CURSE", "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", "MOVE_HEAL_BLOCK", + "MOVE_HORN_LEECH", + "MOVE_LEECH_SEED", "MOVE_MAGICAL_LEAF", + "MOVE_PHANTOM_FORCE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", - "MOVE_SUBSTITUTE" + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER" ], "TutorMoves": [], "EggMoves": [] @@ -17722,7 +29207,7 @@ }, { "Level": "32", - "Move": "MOVE_FORESTS_CURSE" + "Move": "MOVE_FOREST\u00c2\u20ac\u2122S_CURSE" }, { "Level": "36", @@ -17739,26 +29224,44 @@ ], "TMMoves": [ "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_EARTHQUAKE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FOCUS_BLAST", + "MOVE_FOREST\u00c2\u20ac\u2122S_CURSE", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", "MOVE_HEAL_BLOCK", + "MOVE_HORN_LEECH", "MOVE_HYPER_BEAM", + "MOVE_LEECH_SEED", "MOVE_MAGICAL_LEAF", + "MOVE_PHANTOM_FORCE", "MOVE_POISON_JAB", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER", "MOVE_X_SCISSOR" ], "TutorMoves": [], @@ -17816,23 +29319,37 @@ } ], "TMMoves": [ + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", "MOVE_GIGA_DRAIN", + "MOVE_HYPNOSIS", + "MOVE_LEECH_SEED", "MOVE_LIGHT_SCREEN", + "MOVE_MYSTICAL_FIRE", + "MOVE_POWER_WHIP", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", "MOVE_ROCK_SLIDE", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TRICK_OR_TREAT", "MOVE_WILL_O_WISP" ], "TutorMoves": [], @@ -17902,27 +29419,47 @@ } ], "TMMoves": [ + "MOVE_BRUTAL_SWING", + "MOVE_BULLET_SEED", + "MOVE_CONFUSE_RAY", "MOVE_CURSE", "MOVE_DARK_PULSE", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", "MOVE_GIGA_DRAIN", "MOVE_GIGA_IMPACT", "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_LEECH_SEED", "MOVE_LIGHT_SCREEN", + "MOVE_MOONBLAST", + "MOVE_MYSTICAL_FIRE", "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", + "MOVE_POWER_WHIP", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_LEAF", "MOVE_ROCK_SLIDE", "MOVE_SAFEGUARD", + "MOVE_SEED_BOMB", "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SILVER_WIND", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TRICK_OR_TREAT", "MOVE_WILL_O_WISP" ], "TutorMoves": [], @@ -17984,101 +29521,35 @@ } ], "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_PROTECT", + "MOVE_RECOVER", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", "MOVE_STONE_EDGE", - "MOVE_SUBSTITUTE" + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" ], "TutorMoves": [], "EggMoves": [] }, "AVALUGG": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_HARDEN" - }, - { - "Level": "1", - "Move": "MOVE_HEAVY_SLAM" - }, - { - "Level": "3", - "Move": "MOVE_TACKLE" - }, - { - "Level": "9", - "Move": "MOVE_CURSE" - }, - { - "Level": "12", - "Move": "MOVE_ICY_WIND" - }, - { - "Level": "15", - "Move": "MOVE_PROTECT" - }, - { - "Level": "21", - "Move": "MOVE_BITE" - }, - { - "Level": "24", - "Move": "MOVE_ICE_FANG" - }, - { - "Level": "27", - "Move": "MOVE_IRON_DEFENSE" - }, - { - "Level": "30", - "Move": "MOVE_RECOVER" - }, - { - "Level": "33", - "Move": "MOVE_CRUNCH" - }, - { - "Level": "36", - "Move": "MOVE_TAKE_DOWN" - }, - { - "Level": "39", - "Move": "MOVE_ICICLE_CRASH" - }, - { - "Level": "42", - "Move": "MOVE_DOUBLE_EDGE" - }, - { - "Level": "54", - "Move": "MOVE_BLIZZARD" - } - ], - "TMMoves": [ - "MOVE_BODY_SLAM", - "MOVE_BULLDOZE", - "MOVE_EARTHQUAKE", - "MOVE_ENDURE", - "MOVE_FLASH_CANNON", - "MOVE_GIGA_IMPACT", - "MOVE_HYDRO_PUMP", - "MOVE_HYPER_BEAM", - "MOVE_ICE_BEAM", - "MOVE_ROCK_SLIDE", - "MOVE_ROCK_TOMB", - "MOVE_STONE_EDGE", - "MOVE_SUBSTITUTE", - "MOVE_SURF" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "AVALUGG_HISUI": { "LevelMoves": [ { "Level": "1", @@ -18150,21 +29621,45 @@ } ], "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BITE", + "MOVE_BLIZZARD", "MOVE_BODY_SLAM", "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", "MOVE_DIG", + "MOVE_DOUBLE_EDGE", "MOVE_EARTHQUAKE", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEAVY_SLAM", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_ROCK_BLAST", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SHEER_COLD", + "MOVE_SKULL_BASH", "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", - "MOVE_SURF" + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" ], "TutorMoves": [], "EggMoves": [] @@ -18225,28 +29720,43 @@ } ], "TMMoves": [ + "MOVE_ABSORB", "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BITE", "MOVE_BRICK_BREAK", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", "MOVE_DRACO_METEOR", "MOVE_DRAGON_CLAW", "MOVE_DRAGON_PULSE", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLY", + "MOVE_GUST", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", "MOVE_HYPER_VOICE", + "MOVE_LEECH_LIFE", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_SCREECH", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", "MOVE_U_TURN", - "MOVE_WILD_CHARGE" + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK" ], "TutorMoves": [], "EggMoves": [] @@ -18315,34 +29825,56 @@ } ], "TMMoves": [ + "MOVE_ABSORB", "MOVE_AERIAL_ACE", "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BOOMBURST", "MOVE_BRICK_BREAK", "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", "MOVE_DRACO_METEOR", "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLAMETHROWER", "MOVE_FLY", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GUST", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_TAIL", + "MOVE_LEECH_LIFE", + "MOVE_MOONLIGHT", "MOVE_OUTRAGE", "MOVE_PROTECT", "MOVE_PSYCHIC", + "MOVE_RAZOR_WIND", + "MOVE_SCALE_SHOT", + "MOVE_SCREECH", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", "MOVE_SOLAR_BEAM", "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SUPER_FANG", "MOVE_SWIFT", + "MOVE_TACKLE", "MOVE_TAUNT", + "MOVE_TORMENT", "MOVE_U_TURN", "MOVE_WATER_PULSE", - "MOVE_WILD_CHARGE" + "MOVE_WHIRLWIND", + "MOVE_WILD_CHARGE", + "MOVE_WING_ATTACK" ], "TutorMoves": [ "MOVE_DRAGON_PULSE" @@ -18399,23 +29931,40 @@ "TMMoves": [ "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", "MOVE_DAZZLING_GLEAM", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLASH_CANNON", "MOVE_FOCUS_BLAST", + "MOVE_GEOMANCY", + "MOVE_GIGA_IMPACT", + "MOVE_HORN_LEECH", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MEGAHORN", + "MOVE_MOONBLAST", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PETAL_DANCE", "MOVE_PLAY_ROUGH", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_SLIDE", + "MOVE_SEED_BOMB", + "MOVE_SILVER_WIND", + "MOVE_SOLAR_BLADE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -18477,21 +30026,41 @@ } ], "TMMoves": [ + "MOVE_AIR_SLASH", "MOVE_BODY_SLAM", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_TEAM", "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_RUSH", + "MOVE_DREAM_EATER", + "MOVE_DUAL_WINGBEAT", "MOVE_ENDURE", + "MOVE_FACADE", "MOVE_FLY", + "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GUST", "MOVE_HEAL_BLOCK", "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", + "MOVE_OBLIVION_WING", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", + "MOVE_SKY_ATTACK", + "MOVE_SNARL", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_TAUNT", "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -18521,7 +30090,7 @@ }, { "Level": "1", - "Move": "MOVE_LANDS_WRATH" + "Move": "MOVE_LAND\u00c2\u20ac\u2122S_WRATH" }, { "Level": "1", @@ -18573,21 +30142,47 @@ } ], "TMMoves": [ + "MOVE_BITE", "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CORE_ENFORCER", + "MOVE_CRUNCH", + "MOVE_DIG", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_PULSE", + "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_EXTREME_SPEED", + "MOVE_FACADE", + "MOVE_FISSURE", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GLARE", + "MOVE_HAZE", "MOVE_HYPER_BEAM", "MOVE_HYPER_VOICE", "MOVE_IRON_HEAD", + "MOVE_LAND\u00c2\u20ac\u2122S_WRATH", + "MOVE_MAGNET_BOMB", + "MOVE_OUTRAGE", + "MOVE_POISON_FANG", "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", + "MOVE_SCORCHING_SANDS", + "MOVE_SLUDGE_WAVE", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", + "MOVE_THOUSAND_ARROWS", + "MOVE_THOUSAND_WAVES", + "MOVE_TRI_ATTACK", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], @@ -18649,103 +30244,50 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", + "MOVE_ANCIENT_POWER", "MOVE_BODY_SLAM", "MOVE_CALM_MIND", "MOVE_DAZZLING_GLEAM", + "MOVE_DIAMOND_STORM", + "MOVE_DRAINING_KISS", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", "MOVE_FLASH_CANNON", "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", "MOVE_HYPER_BEAM", "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METEOR_BEAM", "MOVE_METRONOME", + "MOVE_MOONBLAST", "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", "MOVE_PROTECT", "MOVE_PSYCHIC", "MOVE_PSYSHOCK", "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", "MOVE_ROCK_TOMB", "MOVE_SAFEGUARD", + "MOVE_SCORCHING_SANDS", + "MOVE_SILVER_WIND", "MOVE_SPIKES", - "MOVE_SUBSTITUTE", - "MOVE_SWIFT" - ], - "TutorMoves": [], - "EggMoves": [] - }, - "HOOPA_CONFINED": { - "LevelMoves": [ - { - "Level": "1", - "Move": "MOVE_CONFUSION" - }, - { - "Level": "15", - "Move": "MOVE_LIGHT_SCREEN" - }, - { - "Level": "19", - "Move": "MOVE_PSYBEAM" - }, - { - "Level": "22", - "Move": "MOVE_KNOCK_OFF" - }, - { - "Level": "35", - "Move": "MOVE_PHANTOM_FORCE" - }, - { - "Level": "38", - "Move": "MOVE_ZEN_HEADBUTT" - }, - { - "Level": "42", - "Move": "MOVE_SHADOW_BALL" - }, - { - "Level": "45", - "Move": "MOVE_NASTY_PLOT" - }, - { - "Level": "52", - "Move": "MOVE_PSYCHIC" - }, - { - "Level": "60", - "Move": "MOVE_HYPERSPACE_HOLE" - } - ], - "TMMoves": [ - "MOVE_BRICK_BREAK", - "MOVE_CALM_MIND", - "MOVE_DARK_PULSE", - "MOVE_ENDURE", - "MOVE_ENERGY_BALL", - "MOVE_FIRE_PUNCH", - "MOVE_FOCUS_BLAST", - "MOVE_FUTURE_SIGHT", - "MOVE_GIGA_IMPACT", - "MOVE_GUNK_SHOT", - "MOVE_HEAL_BLOCK", - "MOVE_HYPER_BEAM", - "MOVE_ICE_PUNCH", - "MOVE_PROTECT", - "MOVE_PSYSHOCK", - "MOVE_REFLECT", - "MOVE_ROCK_TOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", "MOVE_SWIFT", - "MOVE_TAKE_DOWN", - "MOVE_TAUNT", - "MOVE_THUNDERBOLT", - "MOVE_THUNDER_PUNCH", - "MOVE_THUNDER_WAVE" + "MOVE_TACKLE" ], "TutorMoves": [], "EggMoves": [] }, - "HOOPA_UNBOUND": { + "HOOPA": { "LevelMoves": [ { "Level": "1", @@ -18791,28 +30333,46 @@ "TMMoves": [ "MOVE_BRICK_BREAK", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CONFUSION", "MOVE_DARK_PULSE", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_PUNCH", "MOVE_FOCUS_BLAST", "MOVE_FUTURE_SIGHT", "MOVE_GIGA_IMPACT", "MOVE_GUNK_SHOT", "MOVE_HEAL_BLOCK", + "MOVE_HYPERSPACE_FURY", "MOVE_HYPER_BEAM", "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYCHIC_FANGS", "MOVE_PSYSHOCK", "MOVE_REFLECT", "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_SILVER_WIND", "MOVE_SUBSTITUTE", "MOVE_SWIFT", "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDERBOLT", "MOVE_THUNDER_PUNCH", - "MOVE_THUNDER_WAVE" + "MOVE_THUNDER_WAVE", + "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] @@ -18887,32 +30447,674 @@ "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", "MOVE_FLASH_CANNON", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEAT_CRASH", "MOVE_HEAT_WAVE", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", + "MOVE_LEER", "MOVE_LIQUIDATION", + "MOVE_MIST", + "MOVE_MUD_SHOT", + "MOVE_OVERHEAT", "MOVE_PROTECT", "MOVE_ROAR", "MOVE_ROCK_SLIDE", "MOVE_ROCK_TOMB", + "MOVE_SCALD", + "MOVE_SCORCHING_SANDS", "MOVE_SELF_DESTRUCT", "MOVE_SLUDGE_BOMB", "MOVE_SOLAR_BEAM", + "MOVE_STEAM_ERUPTION", "MOVE_STONE_EDGE", "MOVE_SUBSTITUTE", + "MOVE_TAKE_DOWN", "MOVE_TAUNT", "MOVE_THUNDER_FANG", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", "MOVE_WILD_CHARGE", "MOVE_WILL_O_WISP" ], "TutorMoves": [], "EggMoves": [] }, + "CRABRAWLER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "9", + "Move": "MOVE_LEER" + }, + { + "Level": "13", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "17", + "Move": "MOVE_PROTECT" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "22", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "25", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "30", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "42", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "45", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "49", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MACH_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CRABOMINABLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "9", + "Move": "MOVE_LEER" + }, + { + "Level": "13", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "17", + "Move": "MOVE_PROTECT" + }, + { + "Level": "20", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "22", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "25", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "30", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "34", + "Move": "MOVE_ICE_HAMMER" + }, + { + "Level": "42", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "45", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "49", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BUBBLE_BEAM", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DIG", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_HAMMER", + "MOVE_ICE_PUNCH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MACH_PUNCH", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_ICE_PUNCH" + ], + "EggMoves": [] + }, + "WIMPOD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_ROLLOUT" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_HARDEN", + "MOVE_MUD_SHOT", + "MOVE_PROTECT", + "MOVE_ROLLOUT", + "MOVE_SCALD", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_WATERFALL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GOLISOPOD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "4", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "12", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "16", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "20", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "22", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "26", + "Move": "MOVE_SCREECH" + }, + { + "Level": "28", + "Move": "MOVE_SLASH" + }, + { + "Level": "30", + "Move": "MOVE_DRILL_RUN" + }, + { + "Level": "32", + "Move": "MOVE_LEECH_LIFE" + }, + { + "Level": "36", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "42", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "48", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "53", + "Move": "MOVE_LIQUIDATION" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BLIZZARD", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_HIT", + "MOVE_DRILL_RUN", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEECH_LIFE", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NIGHT_SLASH", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_ROLLOUT", + "MOVE_SCALD", + "MOVE_SCREECH", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_FIRST_IMPRESSION" + ], + "EggMoves": [] + }, + "SANDYGAST": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "10", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "13", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "24", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "30", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "35", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "41", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "46", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "50", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "52", + "Move": "MOVE_SHORE_UP" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ANCIENT_POWER", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_DRAIN", + "MOVE_HARDEN", + "MOVE_HYPNOSIS", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SHORE_UP", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "PALOSSAND": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ABSORB" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "10", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "13", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "18", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "24", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "30", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "35", + "Move": "MOVE_GIGA_DRAIN" + }, + { + "Level": "41", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "46", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "50", + "Move": "MOVE_EARTH_POWER" + }, + { + "Level": "52", + "Move": "MOVE_SHORE_UP" + } + ], + "TMMoves": [ + "MOVE_ABSORB", + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAND_TOMB", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SHORE_UP", + "MOVE_SLUDGE_BOMB", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TORMENT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MIMIKYU": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "6", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "12", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "24", + "Move": "MOVE_MIMIC" + }, + { + "Level": "28", + "Move": "MOVE_SLASH" + }, + { + "Level": "34", + "Move": "MOVE_SHADOW_CLAW" + }, + { + "Level": "42", + "Move": "MOVE_WOOD_HAMMER" + }, + { + "Level": "48", + "Move": "MOVE_CHARM" + }, + { + "Level": "54", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "60", + "Move": "MOVE_PHANTOM_FORCE" + } + ], + "TMMoves": [ + "MOVE_BULK_UP", + "MOVE_CHARM", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DAZZLING_GLEAM", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_LIGHT_SCREEN", + "MOVE_MIMIC", + "MOVE_NIGHT_SLASH", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SLASH", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_WOOD_HAMMER", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, "DRAMPA": { "LevelMoves": [ { @@ -18977,25 +31179,43 @@ } ], "TMMoves": [ + "MOVE_AMNESIA", "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", "MOVE_EARTHQUAKE", "MOVE_EARTH_POWER", "MOVE_ENDURE", "MOVE_ENERGY_BALL", + "MOVE_FACADE", "MOVE_FIRE_BLAST", "MOVE_FLAMETHROWER", + "MOVE_FLY", "MOVE_FOCUS_BLAST", "MOVE_GIGA_IMPACT", + "MOVE_GLARE", "MOVE_HEAT_WAVE", "MOVE_HURRICANE", "MOVE_HYDRO_PUMP", "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_OUTRAGE", "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", "MOVE_ROCK_SLIDE", + "MOVE_SAFEGUARD", + "MOVE_SCALE_SHOT", "MOVE_SHADOW_BALL", "MOVE_SHADOW_CLAW", "MOVE_SOLAR_BEAM", @@ -19005,12 +31225,1862 @@ "MOVE_THUNDER", "MOVE_THUNDERBOLT", "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_TWISTER", "MOVE_WHIRLWIND", "MOVE_WORK_UP" ], "TutorMoves": [], "EggMoves": [] }, + "MAGEARNA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "1", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "14", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "24", + "Move": "MOVE_CHARGE_BEAM" + }, + { + "Level": "28", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "30", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "36", + "Move": "MOVE_TRI_ATTACK" + }, + { + "Level": "42", + "Move": "MOVE_MAGNET_BOMB" + }, + { + "Level": "50", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "60", + "Move": "MOVE_IRON_HEAD" + }, + { + "Level": "66", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "72", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "80", + "Move": "MOVE_FLEUR_CANNON" + }, + { + "Level": "84", + "Move": "MOVE_ZAP_CANNON" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DRAINING_KISS", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_FLEUR_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_PETAL_DANCE", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_ROLLOUT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SKULL_BASH", + "MOVE_SOLAR_BEAM", + "MOVE_SOLAR_BLADE", + "MOVE_SPIKES", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRI_ATTACK", + "MOVE_VACUUM_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_ZAP_CANNON", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MARSHADOW": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_FIRE_PUNCH" + }, + { + "Level": "1", + "Move": "MOVE_ICE_PUNCH" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_PUNCH" + }, + { + "Level": "1", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "14", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "18", + "Move": "MOVE_SHADOW_PUNCH" + }, + { + "Level": "24", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "28", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "32", + "Move": "MOVE_AURA_SPHERE" + }, + { + "Level": "40", + "Move": "MOVE_DUAL_CHOP" + }, + { + "Level": "54", + "Move": "MOVE_DRAIN_PUNCH" + }, + { + "Level": "64", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "72", + "Move": "MOVE_SPECTRAL_THIEF" + }, + { + "Level": "80", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_AURA_SPHERE", + "MOVE_BLAZE_KICK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_MACH_PUNCH", + "MOVE_OMINOUS_WIND", + "MOVE_OUTRAGE", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_SHADOW_SNEAK", + "MOVE_SPECTRAL_THIEF", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_THUNDER_PUNCH", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ZERAORA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "1", + "Move": "MOVE_SPARK" + }, + { + "Level": "1", + "Move": "MOVE_FAKE_OUT" + }, + { + "Level": "10", + "Move": "MOVE_SNARL" + }, + { + "Level": "15", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "18", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "32", + "Move": "MOVE_VOLT_SWITCH" + }, + { + "Level": "40", + "Move": "MOVE_CHARGE" + }, + { + "Level": "48", + "Move": "MOVE_THUNDER_PUNCH" + }, + { + "Level": "56", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "64", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "72", + "Move": "MOVE_WILD_CHARGE" + }, + { + "Level": "80", + "Move": "MOVE_AGILITY" + }, + { + "Level": "84", + "Move": "MOVE_PLASMA_FISTS" + }, + { + "Level": "96", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BLAZE_KICK", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CALM_MIND", + "MOVE_CHARGE", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DISCHARGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_TAIL", + "MOVE_LOW_SWEEP", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_PLASMA_FISTS", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_SLASH", + "MOVE_SNARL", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_VACUUM_WAVE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MELTAN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "8", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "11", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "32", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "40", + "Move": "MOVE_FLASH_CANNON" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_BRUTAL_SWING", + "MOVE_CHARGE_BEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNET_BOMB", + "MOVE_PROTECT", + "MOVE_SELF_DESTRUCT", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MELMETAL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "8", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "11", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "24", + "Move": "MOVE_THUNDER_WAVE" + }, + { + "Level": "32", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "40", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "64", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "72", + "Move": "MOVE_DYNAMIC_PUNCH" + }, + { + "Level": "80", + "Move": "MOVE_DOUBLE_IRON_BASH" + }, + { + "Level": "96", + "Move": "MOVE_HYPER_BEAM" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_DOUBLE_IRON_BASH", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_MAGNET_BOMB", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SOLAR_BEAM", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [ + "MOVE_HEAVY_SLAM", + "MOVE_THUNDER_PUNCH" + ], + "EggMoves": [] + }, + "ROOKIDEE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "14", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_TAUNT" + }, + { + "Level": "24", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "32", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "36", + "Move": "MOVE_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_DUAL_WINGBEAT" + }, + { + "Level": "47", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GUST", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_SMASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WING_ATTACK" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CORVISQUIRE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "14", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_TAUNT" + }, + { + "Level": "24", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "32", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "36", + "Move": "MOVE_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_DUAL_WINGBEAT" + }, + { + "Level": "47", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GUST", + "MOVE_HURRICANE", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_SMASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CORVIKNIGHT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "1", + "Move": "MOVE_SCREECH" + }, + { + "Level": "1", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "10", + "Move": "MOVE_GUST" + }, + { + "Level": "14", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "18", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "20", + "Move": "MOVE_TAUNT" + }, + { + "Level": "24", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "32", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "36", + "Move": "MOVE_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_DUAL_WINGBEAT" + }, + { + "Level": "47", + "Move": "MOVE_BRAVE_BIRD" + }, + { + "Level": "53", + "Move": "MOVE_HEAVY_SLAM" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLASH_CANNON", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GUST", + "MOVE_HEAVY_SLAM", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_ROCK_SMASH", + "MOVE_SCREECH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_STEEL_BEAM", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_U_TURN", + "MOVE_WING_ATTACK", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_STEEL_WING" + ], + "EggMoves": [] + }, + "NICKIT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_ROAR" + }, + { + "Level": "12", + "Move": "MOVE_SNARL" + }, + { + "Level": "15", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "17", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "22", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "26", + "Move": "MOVE_MIMIC" + }, + { + "Level": "34", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "38", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "52", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRST_IMPRESSION", + "MOVE_HEAL_BLOCK", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROAR", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "THIEVUL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_ROAR" + }, + { + "Level": "12", + "Move": "MOVE_SNARL" + }, + { + "Level": "15", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "17", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "22", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "26", + "Move": "MOVE_MIMIC" + }, + { + "Level": "34", + "Move": "MOVE_NIGHT_SLASH" + }, + { + "Level": "38", + "Move": "MOVE_DARK_PULSE" + }, + { + "Level": "44", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "52", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_TEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRE_FANG", + "MOVE_FIRST_IMPRESSION", + "MOVE_GIGA_IMPACT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICY_WIND", + "MOVE_KNOCK_OFF", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_PARTING_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TORMENT", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TOXEL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_NUZZLE" + } + ], + "TMMoves": [ + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GROWL", + "MOVE_NUZZLE", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TOXTRICITY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_NUZZLE" + }, + { + "Level": "4", + "Move": "MOVE_CHARGE" + }, + { + "Level": "8", + "Move": "MOVE_SNARL" + }, + { + "Level": "10", + "Move": "MOVE_ACID_SPRAY" + }, + { + "Level": "16", + "Move": "MOVE_TAUNT" + }, + { + "Level": "24", + "Move": "MOVE_SCREECH" + }, + { + "Level": "28", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "30", + "Move": "MOVE_DISCHARGE" + }, + { + "Level": "32", + "Move": "MOVE_TOXIC" + }, + { + "Level": "36", + "Move": "MOVE_EERIE_IMPULSE" + }, + { + "Level": "40", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "44", + "Move": "MOVE_OVERDRIVE" + }, + { + "Level": "48", + "Move": "MOVE_BOOMBURST" + }, + { + "Level": "50", + "Move": "MOVE_PARABOLIC_CHARGE" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BOOMBURST", + "MOVE_BRICK_BREAK", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_DISCHARGE", + "MOVE_DRAIN_PUNCH", + "MOVE_EERIE_IMPULSE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_LEER", + "MOVE_MAGNET_BOMB", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NUZZLE", + "MOVE_OVERDRIVE", + "MOVE_PARABOLIC_CHARGE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_SCREECH", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SNARL", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [ + "MOVE_METAL_SOUND", + "MOVE_SLUDGE_WAVE", + "MOVE_SPARK", + "MOVE_THUNDER_SHOCK" + ], + "EggMoves": [] + }, + "CLOBBOPUS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "10", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "12", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "15", + "Move": "MOVE_DETECT" + }, + { + "Level": "18", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "20", + "Move": "MOVE_CIRCLE_THROW" + }, + { + "Level": "24", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "30", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "32", + "Move": "MOVE_DOUBLE_HIT" + }, + { + "Level": "35", + "Move": "MOVE_TAUNT" + }, + { + "Level": "46", + "Move": "MOVE_CLOSE_COMBAT" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CHILLING_WATER", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_BLAST", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MACH_PUNCH", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GRAPPLOCT": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "10", + "Move": "MOVE_POWER_UP_PUNCH" + }, + { + "Level": "12", + "Move": "MOVE_BULLET_PUNCH" + }, + { + "Level": "15", + "Move": "MOVE_DETECT" + }, + { + "Level": "18", + "Move": "MOVE_MACH_PUNCH" + }, + { + "Level": "20", + "Move": "MOVE_CIRCLE_THROW" + }, + { + "Level": "24", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_BULK_UP" + }, + { + "Level": "30", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "32", + "Move": "MOVE_DOUBLE_HIT" + }, + { + "Level": "35", + "Move": "MOVE_TAUNT" + }, + { + "Level": "46", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "53", + "Move": "MOVE_TOPSY_TURVY" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLET_PUNCH", + "MOVE_CHILLING_WATER", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DETECT", + "MOVE_DIG", + "MOVE_DOUBLE_HIT", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIQUIDATION", + "MOVE_MACH_PUNCH", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_OCTOLOCK", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TAUNT", + "MOVE_TOPSY_TURVY", + "MOVE_VACUUM_WAVE", + "MOVE_WATERFALL", + "MOVE_WHIRLPOOL", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_OCTOLOCK" + ], + "EggMoves": [] + }, + "PERRSERKER": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PAY_DAY" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "10", + "Move": "MOVE_BITE" + }, + { + "Level": "13", + "Move": "MOVE_TAUNT" + }, + { + "Level": "15", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "17", + "Move": "MOVE_SCREECH" + }, + { + "Level": "22", + "Move": "MOVE_SLASH" + }, + { + "Level": "27", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "30", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "34", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "37", + "Move": "MOVE_CHARM" + }, + { + "Level": "40", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "44", + "Move": "MOVE_MIMIC" + }, + { + "Level": "48", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_CHOP", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_HYPNOSIS", + "MOVE_ICY_WIND", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_METAL_CLAW", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_NASTY_PLOT", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_PAY_DAY", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SKULL_BASH", + "MOVE_SLASH", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TAIL_WHIP", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_WAVE", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WATER_PULSE", + "MOVE_WORK_UP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_IRON_HEAD" + ], + "EggMoves": [] + }, + "SIRFETCH\u00c2\u20ac\u2122D": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "1", + "Move": "MOVE_DETECT" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "12", + "Move": "MOVE_STEEL_WING" + }, + { + "Level": "16", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "20", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_FALSE_SWIPE" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "30", + "Move": "MOVE_SLASH" + }, + { + "Level": "34", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "36", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "40", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "42", + "Move": "MOVE_LEAF_BLADE" + }, + { + "Level": "47", + "Move": "MOVE_AGILITY" + }, + { + "Level": "55", + "Move": "MOVE_BRAVE_BIRD" + }, + { + "Level": "60", + "Move": "MOVE_METEOR_ASSAULT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BODY_SLAM", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_CLOSE_COMBAT", + "MOVE_CURSE", + "MOVE_DETECT", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FEATHER_DANCE", + "MOVE_FIRST_IMPRESSION", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_LEAF_BLADE", + "MOVE_LEER", + "MOVE_METEOR_ASSAULT", + "MOVE_NIGHT_SLASH", + "MOVE_PECK", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_SMASH", + "MOVE_SACRED_SWORD", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SLASH", + "MOVE_SOLAR_BLADE", + "MOVE_STEEL_WING", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_IRON_DEFENSE" + ], + "EggMoves": [] + }, + "MR. RIME": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HYPNOSIS" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "1", + "Move": "MOVE_ICE_SHARD" + }, + { + "Level": "8", + "Move": "MOVE_CHARM" + }, + { + "Level": "12", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "15", + "Move": "MOVE_DREAM_EATER" + }, + { + "Level": "17", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "20", + "Move": "MOVE_PROTECT" + }, + { + "Level": "24", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "28", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "32", + "Move": "MOVE_MIMIC" + }, + { + "Level": "36", + "Move": "MOVE_LIGHT_SCREEN" + }, + { + "Level": "36", + "Move": "MOVE_REFLECT" + }, + { + "Level": "36", + "Move": "MOVE_SAFEGUARD" + }, + { + "Level": "40", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "44", + "Move": "MOVE_DAZZLING_GLEAM" + }, + { + "Level": "48", + "Move": "MOVE_PSYCHIC" + } + ], + "TMMoves": [ + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CALM_MIND", + "MOVE_CHARGE_BEAM", + "MOVE_CHARM", + "MOVE_CHILLING_WATER", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_DAZZLING_GLEAM", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FIRST_IMPRESSION", + "MOVE_FOCUS_BLAST", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_FUTURE_SIGHT", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEADBUTT", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_HYPNOSIS", + "MOVE_ICE_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MIST", + "MOVE_NASTY_PLOT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SHEER_COLD", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_STEALTH_ROCK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_TRIPLE_AXEL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_FAKE_TEARS", + "MOVE_HAZE", + "MOVE_MIST", + "MOVE_SMOKESCREEN" + ], + "EggMoves": [] + }, + "RUNERIGUS": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_CONFUSION" + }, + { + "Level": "1", + "Move": "MOVE_PROTECT" + }, + { + "Level": "1", + "Move": "MOVE_SAND_TOMB" + }, + { + "Level": "4", + "Move": "MOVE_HAZE" + }, + { + "Level": "8", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_TOMB" + }, + { + "Level": "12", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "16", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "20", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "22", + "Move": "MOVE_INFESTATION" + }, + { + "Level": "30", + "Move": "MOVE_PSYSHOCK" + }, + { + "Level": "36", + "Move": "MOVE_CURSE" + }, + { + "Level": "40", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "44", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "46", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "48", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_CONFUSION", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_PULSE", + "MOVE_DREAM_EATER", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_TEARS", + "MOVE_FISSURE", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_HAZE", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_BEAM", + "MOVE_ICY_WIND", + "MOVE_INFESTATION", + "MOVE_IRON_DEFENSE", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_PARTING_SHOT", + "MOVE_PHANTOM_FORCE", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_TOMB", + "MOVE_SAFEGUARD", + "MOVE_SAND_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC_SPIKES", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_SHADOW_CLAW" + ], + "EggMoves": [] + }, "FALINKS": { "LevelMoves": [ { @@ -19069,18 +33139,3608 @@ "TMMoves": [ "MOVE_AGILITY", "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_DOUBLE_HIT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FALSE_SWIPE", + "MOVE_FIRST_IMPRESSION", "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", "MOVE_KNOCK_OFF", + "MOVE_LOW_SWEEP", + "MOVE_MEGAHORN", + "MOVE_NO_RETREAT", "MOVE_POISON_JAB", + "MOVE_PROTECT", "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", "MOVE_ROCK_TOMB", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", "MOVE_SUBSTITUTE", "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TRAILBLAZE", "MOVE_ZEN_HEADBUTT" ], "TutorMoves": [], "EggMoves": [] + }, + "INDEEDEE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "10", + "Move": "MOVE_DISARMING_VOICE" + }, + { + "Level": "12", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "15", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "22", + "Move": "MOVE_MOONLIGHT" + }, + { + "Level": "28", + "Move": "MOVE_TRI_ATTACK" + }, + { + "Level": "35", + "Move": "MOVE_PSYCHIC" + }, + { + "Level": "38", + "Move": "MOVE_WISH" + }, + { + "Level": "42", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "52", + "Move": "MOVE_MOONBLAST" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_DAZZLING_GLEAM", + "MOVE_DISARMING_VOICE", + "MOVE_DOUBLE_TEAM", + "MOVE_DRAINING_KISS", + "MOVE_DRAIN_PUNCH", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FUTURE_SIGHT", + "MOVE_GROWL", + "MOVE_HEAL_BLOCK", + "MOVE_HYPER_VOICE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGICAL_LEAF", + "MOVE_METRONOME", + "MOVE_MOONBLAST", + "MOVE_MOONLIGHT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SAFEGUARD", + "MOVE_SHADOW_BALL", + "MOVE_SING", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_TRI_ATTACK", + "MOVE_WISH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MORPEKO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "1", + "Move": "MOVE_THUNDER_SHOCK" + }, + { + "Level": "5", + "Move": "MOVE_LEER" + }, + { + "Level": "7", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "12", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "18", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_CHARGE" + }, + { + "Level": "30", + "Move": "MOVE_SPARK" + }, + { + "Level": "33", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "38", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "40", + "Move": "MOVE_TORMENT" + }, + { + "Level": "44", + "Move": "MOVE_AGILITY" + }, + { + "Level": "48", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "52", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "57", + "Move": "MOVE_AURA_WHEEL" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_AURA_WHEEL", + "MOVE_BITE", + "MOVE_BRICK_BREAK", + "MOVE_BULLET_SEED", + "MOVE_CHARGE", + "MOVE_CHARGE_BEAM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ELECTROWEB", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAKE_OUT", + "MOVE_FIRE_FANG", + "MOVE_ICE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PARTING_SHOT", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_QUICK_ATTACK", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SPARK", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TAIL_WHIP", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_SHOCK", + "MOVE_THUNDER_WAVE", + "MOVE_TORMENT", + "MOVE_VOLT_SWITCH", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "KLEAVOR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "16", + "Move": "MOVE_DOUBLE_TEAM" + }, + { + "Level": "20", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "24", + "Move": "MOVE_SLASH" + }, + { + "Level": "28", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "32", + "Move": "MOVE_X_SCISSOR" + }, + { + "Level": "34", + "Move": "MOVE_BUG_BUZZ" + }, + { + "Level": "36", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "46", + "Move": "MOVE_LUNGE" + }, + { + "Level": "50", + "Move": "MOVE_ROCK_BLAST" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_ANCIENT_POWER", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BUG_BUZZ", + "MOVE_CLOSE_COMBAT", + "MOVE_DOUBLE_EDGE", + "MOVE_DOUBLE_HIT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_CHOP", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LUNGE", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_RAZOR_WIND", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_TOMB", + "MOVE_SILVER_WIND", + "MOVE_SLASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_AXE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WING_ATTACK", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_STONE_AXE" + ], + "EggMoves": [] + }, + "OVERQWIL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_POISON_STING" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "4", + "Move": "MOVE_HARDEN" + }, + { + "Level": "8", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "12", + "Move": "MOVE_BUBBLE_BEAM" + }, + { + "Level": "15", + "Move": "MOVE_HAZE" + }, + { + "Level": "17", + "Move": "MOVE_AQUA_JET" + }, + { + "Level": "20", + "Move": "MOVE_SPIKES" + }, + { + "Level": "28", + "Move": "MOVE_BARB_BARRAGE" + }, + { + "Level": "30", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "32", + "Move": "MOVE_PIN_MISSILE" + }, + { + "Level": "36", + "Move": "MOVE_TOXIC_SPIKES" + }, + { + "Level": "44", + "Move": "MOVE_TOXIC" + }, + { + "Level": "46", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_GUNK_SHOT" + }, + { + "Level": "53", + "Move": "MOVE_MORTAL_SPIN" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_AGILITY", + "MOVE_AQUA_JET", + "MOVE_BARB_BARRAGE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BUBBLE_BEAM", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HAZE", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_LIQUIDATION", + "MOVE_MORTAL_SPIN", + "MOVE_MUD_SHOT", + "MOVE_PIN_MISSILE", + "MOVE_POISON_JAB", + "MOVE_POISON_STING", + "MOVE_PROTECT", + "MOVE_SCALE_SHOT", + "MOVE_SELF_DESTRUCT", + "MOVE_SHADOW_BALL", + "MOVE_SLUDGE_BOMB", + "MOVE_SPIKES", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_SWIFT", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_WAVE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GREAVARD": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "1", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "3", + "Move": "MOVE_LICK" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_BITE" + }, + { + "Level": "9", + "Move": "MOVE_ROAR" + }, + { + "Level": "12", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "16", + "Move": "MOVE_DIG" + }, + { + "Level": "20", + "Move": "MOVE_SNARL" + }, + { + "Level": "28", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "32", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "41", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "46", + "Move": "MOVE_CHARM" + }, + { + "Level": "52", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_ICE_FANG", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_SNEAK", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_FANG", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "HOUNDSTONE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "1", + "Move": "MOVE_SHADOW_SNEAK" + }, + { + "Level": "3", + "Move": "MOVE_LICK" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "6", + "Move": "MOVE_BITE" + }, + { + "Level": "9", + "Move": "MOVE_ROAR" + }, + { + "Level": "12", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "16", + "Move": "MOVE_DIG" + }, + { + "Level": "20", + "Move": "MOVE_SNARL" + }, + { + "Level": "28", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "32", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "41", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "46", + "Move": "MOVE_CHARM" + }, + { + "Level": "52", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BULLDOZE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DREAM_EATER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LAST_RESPECTS", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_OMINOUS_WIND", + "MOVE_PHANTOM_FORCE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SMOKESCREEN", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_FANG", + "MOVE_WILL_O_WISP", + "MOVE_WORK_UP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_LAST_RESPECTS" + ], + "EggMoves": [] + }, + "DONDOZO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_SUPERSONIC" + }, + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "8", + "Move": "MOVE_LICK" + }, + { + "Level": "12", + "Move": "MOVE_CURSE" + }, + { + "Level": "18", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "24", + "Move": "MOVE_BODY_SLAM" + }, + { + "Level": "32", + "Move": "MOVE_LIQUIDATION" + }, + { + "Level": "38", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "44", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "50", + "Move": "MOVE_ORDER_UP" + }, + { + "Level": "56", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "67", + "Move": "MOVE_FISSURE" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CHILLING_WATER", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_GIGA_IMPACT", + "MOVE_HEAVY_SLAM", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_IRON_TAIL", + "MOVE_LICK", + "MOVE_LIQUIDATION", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_ORDER_UP", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_ROCK_SLIDE", + "MOVE_SUBSTITUTE", + "MOVE_SUPERSONIC", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CAPSAKID": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "4", + "Move": "MOVE_BITE" + }, + { + "Level": "8", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "10", + "Move": "MOVE_GROWTH" + }, + { + "Level": "13", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "21", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "24", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "28", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "35", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "38", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_SEED_BOMB" + }, + { + "Level": "48", + "Move": "MOVE_SOLAR_BEAM" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_GIGA_DRAIN", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_LEAFAGE", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SCOVILLAIN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_LEAFAGE" + }, + { + "Level": "4", + "Move": "MOVE_BITE" + }, + { + "Level": "8", + "Move": "MOVE_ROLLOUT" + }, + { + "Level": "10", + "Move": "MOVE_GROWTH" + }, + { + "Level": "13", + "Move": "MOVE_RAZOR_LEAF" + }, + { + "Level": "16", + "Move": "MOVE_LEECH_SEED" + }, + { + "Level": "21", + "Move": "MOVE_BULLET_SEED" + }, + { + "Level": "24", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "28", + "Move": "MOVE_ZEN_HEADBUTT" + }, + { + "Level": "32", + "Move": "MOVE_MAGICAL_LEAF" + }, + { + "Level": "35", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "38", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "44", + "Move": "MOVE_SEED_BOMB" + }, + { + "Level": "48", + "Move": "MOVE_SOLAR_BEAM" + }, + { + "Level": "48", + "Move": "MOVE_OVERHEAT" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BULLET_SEED", + "MOVE_CRUNCH", + "MOVE_DOUBLE_HIT", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_FANG", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_DRAIN", + "MOVE_GIGA_IMPACT", + "MOVE_GROWTH", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_LEAFAGE", + "MOVE_LEECH_SEED", + "MOVE_LEER", + "MOVE_MAGICAL_LEAF", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_RAZOR_LEAF", + "MOVE_ROLLOUT", + "MOVE_SEED_BOMB", + "MOVE_SOLAR_BEAM", + "MOVE_SPICY_EXTRACT", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WILL_O_WISP", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_FLAMETHROWER", + "MOVE_SPICY_EXTRACT" + ], + "EggMoves": [] + }, + "FRIGIBAX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "24", + "Move": "MOVE_BITE" + }, + { + "Level": "29", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "32", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "44", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "54", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ARCTIBAX": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "6", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "24", + "Move": "MOVE_BITE" + }, + { + "Level": "29", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "32", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "44", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "54", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "BAXCALIBUR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "6", + "Move": "MOVE_ICY_WIND" + }, + { + "Level": "12", + "Move": "MOVE_DRAGON_BREATH" + }, + { + "Level": "18", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "24", + "Move": "MOVE_BITE" + }, + { + "Level": "29", + "Move": "MOVE_ICE_FANG" + }, + { + "Level": "32", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "36", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "40", + "Move": "MOVE_ICE_BEAM" + }, + { + "Level": "44", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "50", + "Move": "MOVE_FREEZE_DRY" + }, + { + "Level": "54", + "Move": "MOVE_ICICLE_CRASH" + }, + { + "Level": "60", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "65", + "Move": "MOVE_ICE_HAMMER" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_BITE", + "MOVE_BLIZZARD", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CRUNCH", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_BREATH", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FOCUS_ENERGY", + "MOVE_FREEZE_DRY", + "MOVE_FROST_BREATH", + "MOVE_GIGA_IMPACT", + "MOVE_GLAIVE_RUSH", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICE_FANG", + "MOVE_ICE_HAMMER", + "MOVE_ICE_SHARD", + "MOVE_ICICLE_CRASH", + "MOVE_ICICLE_SPEAR", + "MOVE_ICY_WIND", + "MOVE_IRON_HEAD", + "MOVE_LEER", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_SCALE_SHOT", + "MOVE_SHEER_COLD", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_FANG", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_GLAIVE_RUSH", + "MOVE_ICE_SHARD" + ], + "EggMoves": [] + }, + "TATSUGIRI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_WATER_GUN" + }, + { + "Level": "1", + "Move": "MOVE_SPLASH" + }, + { + "Level": "6", + "Move": "MOVE_HARDEN" + }, + { + "Level": "12", + "Move": "MOVE_RAZOR_WIND" + }, + { + "Level": "17", + "Move": "MOVE_WATER_PULSE" + }, + { + "Level": "21", + "Move": "MOVE_WHIRLPOOL" + }, + { + "Level": "25", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "28", + "Move": "MOVE_TAUNT" + }, + { + "Level": "34", + "Move": "MOVE_MIMIC" + }, + { + "Level": "39", + "Move": "MOVE_MUDDY_WATER" + }, + { + "Level": "43", + "Move": "MOVE_NASTY_PLOT" + }, + { + "Level": "47", + "Move": "MOVE_DRAGON_RUSH" + }, + { + "Level": "52", + "Move": "MOVE_DRAGON_PULSE" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_CALM_MIND", + "MOVE_CHILLING_WATER", + "MOVE_DARK_PULSE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLIP_TURN", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HYDRO_PUMP", + "MOVE_HYPER_BEAM", + "MOVE_ICE_BEAM", + "MOVE_ICY_WIND", + "MOVE_MIMIC", + "MOVE_MUDDY_WATER", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_OUTRAGE", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_SCALD", + "MOVE_SPLASH", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TAUNT", + "MOVE_TRIPLE_AXEL", + "MOVE_WATERFALL", + "MOVE_WATER_GUN", + "MOVE_WATER_PULSE", + "MOVE_WHIRLPOOL" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "CYCLIZAR": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "11", + "Move": "MOVE_TAUNT" + }, + { + "Level": "14", + "Move": "MOVE_BREAKING_SWIPE" + }, + { + "Level": "18", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "23", + "Move": "MOVE_BITE" + }, + { + "Level": "25", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "27", + "Move": "MOVE_U_TURN" + }, + { + "Level": "31", + "Move": "MOVE_SHED_TAIL" + }, + { + "Level": "36", + "Move": "MOVE_DRAGON_CLAW" + }, + { + "Level": "40", + "Move": "MOVE_IRON_TAIL" + }, + { + "Level": "45", + "Move": "MOVE_DRAGON_PULSE" + }, + { + "Level": "51", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "55", + "Move": "MOVE_POWER_WHIP" + }, + { + "Level": "57", + "Move": "MOVE_DRAGON_RUSH" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BREAKING_SWIPE", + "MOVE_CRUNCH", + "MOVE_DOUBLE_EDGE", + "MOVE_DRACO_METEOR", + "MOVE_DRAGON_CLAW", + "MOVE_DRAGON_PULSE", + "MOVE_DRAGON_RUSH", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAME_CHARGE", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_IRON_TAIL", + "MOVE_KNOCK_OFF", + "MOVE_MUD_SHOT", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_POWER_WHIP", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SCALE_SHOT", + "MOVE_SHED_TAIL", + "MOVE_SKULL_BASH", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "SQUAWKABILLY": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "6", + "Move": "MOVE_QUICK_ATTACK" + }, + { + "Level": "10", + "Move": "MOVE_TORMENT" + }, + { + "Level": "13", + "Move": "MOVE_AERIAL_ACE" + }, + { + "Level": "20", + "Move": "MOVE_TAUNT" + }, + { + "Level": "24", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "27", + "Move": "MOVE_MIMIC" + }, + { + "Level": "30", + "Move": "MOVE_FLY" + }, + { + "Level": "34", + "Move": "MOVE_FACADE" + }, + { + "Level": "38", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "40", + "Move": "MOVE_LUNGE" + }, + { + "Level": "42", + "Move": "MOVE_BRAVE_BIRD" + }, + { + "Level": "46", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "52", + "Move": "MOVE_PARTING_SHOT" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_BULK_UP", + "MOVE_DOUBLE_EDGE", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HEADBUTT", + "MOVE_HEAT_WAVE", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_IRON_HEAD", + "MOVE_KNOCK_OFF", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_PARTING_SHOT", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_QUICK_ATTACK", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SKY_ATTACK", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TAUNT", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FLAMIGO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_PECK" + }, + { + "Level": "1", + "Move": "MOVE_MIMIC" + }, + { + "Level": "9", + "Move": "MOVE_DETECT" + }, + { + "Level": "12", + "Move": "MOVE_WING_ATTACK" + }, + { + "Level": "15", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "18", + "Move": "MOVE_LUNGE" + }, + { + "Level": "21", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "26", + "Move": "MOVE_DUAL_WINGBEAT" + }, + { + "Level": "30", + "Move": "MOVE_FEATHER_DANCE" + }, + { + "Level": "35", + "Move": "MOVE_AIR_SLASH" + }, + { + "Level": "42", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "47", + "Move": "MOVE_FLY" + }, + { + "Level": "54", + "Move": "MOVE_BRAVE_BIRD" + } + ], + "TMMoves": [ + "MOVE_AERIAL_ACE", + "MOVE_AGILITY", + "MOVE_AIR_SLASH", + "MOVE_BRAVE_BIRD", + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_CHILLING_WATER", + "MOVE_CLOSE_COMBAT", + "MOVE_DETECT", + "MOVE_DOUBLE_TEAM", + "MOVE_DUAL_WINGBEAT", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FEATHER_DANCE", + "MOVE_FLY", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HURRICANE", + "MOVE_HYPER_BEAM", + "MOVE_KNOCK_OFF", + "MOVE_LIQUIDATION", + "MOVE_LOW_SWEEP", + "MOVE_LUNGE", + "MOVE_MIMIC", + "MOVE_PECK", + "MOVE_PROTECT", + "MOVE_ROCK_SMASH", + "MOVE_SKY_ATTACK", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TRIPLE_AXEL", + "MOVE_U_TURN", + "MOVE_WATERFALL", + "MOVE_WATER_PULSE", + "MOVE_WHIRLWIND", + "MOVE_WING_ATTACK" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "NACLI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "5", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "7", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "12", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "24", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "28", + "Move": "MOVE_RECOVER" + }, + { + "Level": "35", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "38", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "40", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "47", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "54", + "Move": "MOVE_STONE_EDGE" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "NACLSTACK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "5", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "7", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "12", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "24", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "28", + "Move": "MOVE_RECOVER" + }, + { + "Level": "35", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "38", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "40", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "47", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "54", + "Move": "MOVE_STONE_EDGE" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SALT_CURE", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_SALT_CURE" + ], + "EggMoves": [] + }, + "GARGANACL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "5", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "7", + "Move": "MOVE_MUD_SHOT" + }, + { + "Level": "12", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "20", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "24", + "Move": "MOVE_IRON_DEFENSE" + }, + { + "Level": "28", + "Move": "MOVE_RECOVER" + }, + { + "Level": "35", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "38", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "40", + "Move": "MOVE_HEAVY_SLAM" + }, + { + "Level": "47", + "Move": "MOVE_EARTHQUAKE" + }, + { + "Level": "54", + "Move": "MOVE_STONE_EDGE" + }, + { + "Level": "60", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_ANCIENT_POWER", + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULLDOZE", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FISSURE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_HARDEN", + "MOVE_HEADBUTT", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_RECOVER", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SALT_CURE", + "MOVE_SKULL_BASH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_THUNDER_PUNCH", + "MOVE_ZEN_HEADBUTT" + ], + "TutorMoves": [ + "MOVE_DYNAMIC_PUNCH", + "MOVE_ROCK_BLAST", + "MOVE_SALT_CURE" + ], + "EggMoves": [] + }, + "GLIMMET": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "7", + "Move": "MOVE_ACID_SPRAY" + }, + { + "Level": "11", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "14", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "18", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "25", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "29", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "33", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "37", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "41", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "46", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "55", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ANCIENT_POWER", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METEOR_BEAM", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SPIKES", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GLIMMORA": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "1", + "Move": "MOVE_HARDEN" + }, + { + "Level": "1", + "Move": "MOVE_SPIKY_SHIELD" + }, + { + "Level": "7", + "Move": "MOVE_ACID_SPRAY" + }, + { + "Level": "11", + "Move": "MOVE_ANCIENT_POWER" + }, + { + "Level": "14", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "18", + "Move": "MOVE_STEALTH_ROCK" + }, + { + "Level": "25", + "Move": "MOVE_ROCK_BLAST" + }, + { + "Level": "29", + "Move": "MOVE_SELF_DESTRUCT" + }, + { + "Level": "33", + "Move": "MOVE_ROCK_SLIDE" + }, + { + "Level": "37", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "41", + "Move": "MOVE_ACID_ARMOR" + }, + { + "Level": "46", + "Move": "MOVE_SLUDGE_WAVE" + }, + { + "Level": "55", + "Move": "MOVE_EXPLOSION" + } + ], + "TMMoves": [ + "MOVE_ACID_ARMOR", + "MOVE_ACID_SPRAY", + "MOVE_ANCIENT_POWER", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_EARTH_POWER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_EXPLOSION", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HARDEN", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LIGHT_SCREEN", + "MOVE_MAGNET_BOMB", + "MOVE_METEOR_BEAM", + "MOVE_MORTAL_SPIN", + "MOVE_MUD_SHOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_BLAST", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SELF_DESTRUCT", + "MOVE_SLUDGE_BOMB", + "MOVE_SLUDGE_WAVE", + "MOVE_SOLAR_BEAM", + "MOVE_SPIKES", + "MOVE_SPIKY_SHIELD", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES" + ], + "TutorMoves": [ + "MOVE_METEOR_BEAM", + "MOVE_MORTAL_SPIN", + "MOVE_TOXIC_SPIKES" + ], + "EggMoves": [] + }, + "SHROODLE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "5", + "Move": "MOVE_ACID_SPRAY" + }, + { + "Level": "10", + "Move": "MOVE_MIMIC" + }, + { + "Level": "14", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "18", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "23", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_U_TURN" + }, + { + "Level": "29", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "33", + "Move": "MOVE_TAUNT" + }, + { + "Level": "36", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "40", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "54", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BITE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SLASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_U_TURN" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GRAFAIAI": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_BITE" + }, + { + "Level": "5", + "Move": "MOVE_ACID_SPRAY" + }, + { + "Level": "10", + "Move": "MOVE_MIMIC" + }, + { + "Level": "14", + "Move": "MOVE_POISON_FANG" + }, + { + "Level": "18", + "Move": "MOVE_SUPER_FANG" + }, + { + "Level": "21", + "Move": "MOVE_SLASH" + }, + { + "Level": "23", + "Move": "MOVE_PARTING_SHOT" + }, + { + "Level": "25", + "Move": "MOVE_U_TURN" + }, + { + "Level": "29", + "Move": "MOVE_POISON_JAB" + }, + { + "Level": "33", + "Move": "MOVE_TAUNT" + }, + { + "Level": "36", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "40", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "54", + "Move": "MOVE_GUNK_SHOT" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_BITE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRST_IMPRESSION", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEAL_BLOCK", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_MIMIC", + "MOVE_MUD_SHOT", + "MOVE_NASTY_PLOT", + "MOVE_PARTING_SHOT", + "MOVE_POISON_FANG", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_CLAW", + "MOVE_SLASH", + "MOVE_SLUDGE_BOMB", + "MOVE_SUBSTITUTE", + "MOVE_SUPER_FANG", + "MOVE_SWAGGER", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_TOXIC", + "MOVE_TOXIC_SPIKES", + "MOVE_TRAILBLAZE", + "MOVE_TRI_ATTACK", + "MOVE_U_TURN", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "FIDOUGH": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_LICK" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "11", + "Move": "MOVE_BITE" + }, + { + "Level": "14", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "22", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "26", + "Move": "MOVE_SNARL" + }, + { + "Level": "30", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "33", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "36", + "Move": "MOVE_CHARM" + }, + { + "Level": "40", + "Move": "MOVE_ROAR" + }, + { + "Level": "44", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "47", + "Move": "MOVE_WISH" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAME_CHARGE", + "MOVE_GROWL", + "MOVE_ICE_FANG", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "DACHSBUN": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_GROWL" + }, + { + "Level": "3", + "Move": "MOVE_LICK" + }, + { + "Level": "6", + "Move": "MOVE_TAIL_WHIP" + }, + { + "Level": "11", + "Move": "MOVE_BITE" + }, + { + "Level": "14", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "18", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "22", + "Move": "MOVE_WORK_UP" + }, + { + "Level": "26", + "Move": "MOVE_SNARL" + }, + { + "Level": "30", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "33", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "36", + "Move": "MOVE_CHARM" + }, + { + "Level": "40", + "Move": "MOVE_ROAR" + }, + { + "Level": "44", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "47", + "Move": "MOVE_WISH" + } + ], + "TMMoves": [ + "MOVE_AGILITY", + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DAZZLING_GLEAM", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FLAME_CHARGE", + "MOVE_GIGA_IMPACT", + "MOVE_GROWL", + "MOVE_HYPER_BEAM", + "MOVE_ICE_FANG", + "MOVE_LICK", + "MOVE_MUD_SHOT", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_SEED_BOMB", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE", + "MOVE_TAIL_WHIP", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WISH", + "MOVE_WORK_UP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MASCHIFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_LICK" + }, + { + "Level": "7", + "Move": "MOVE_SNARL" + }, + { + "Level": "12", + "Move": "MOVE_CHARM" + }, + { + "Level": "14", + "Move": "MOVE_BITE" + }, + { + "Level": "18", + "Move": "MOVE_ROAR" + }, + { + "Level": "22", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "30", + "Move": "MOVE_TAUNT" + }, + { + "Level": "35", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "38", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "42", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "45", + "Move": "MOVE_LUNGE" + }, + { + "Level": "49", + "Move": "MOVE_DOUBLE_EDGE" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_HEADBUTT", + "MOVE_ICE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LUNGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_SEED_BOMB", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "MABOSSTIFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "4", + "Move": "MOVE_LICK" + }, + { + "Level": "7", + "Move": "MOVE_SNARL" + }, + { + "Level": "12", + "Move": "MOVE_CHARM" + }, + { + "Level": "14", + "Move": "MOVE_BITE" + }, + { + "Level": "18", + "Move": "MOVE_ROAR" + }, + { + "Level": "22", + "Move": "MOVE_HEADBUTT" + }, + { + "Level": "27", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "30", + "Move": "MOVE_TAUNT" + }, + { + "Level": "35", + "Move": "MOVE_SWAGGER" + }, + { + "Level": "38", + "Move": "MOVE_BOUNCE" + }, + { + "Level": "42", + "Move": "MOVE_CRUNCH" + }, + { + "Level": "45", + "Move": "MOVE_LUNGE" + }, + { + "Level": "49", + "Move": "MOVE_DOUBLE_EDGE" + }, + { + "Level": "56", + "Move": "MOVE_OUTRAGE" + } + ], + "TMMoves": [ + "MOVE_BITE", + "MOVE_BODY_SLAM", + "MOVE_BOUNCE", + "MOVE_CHARM", + "MOVE_CRUNCH", + "MOVE_CURSE", + "MOVE_DARK_PULSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_FANG", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_HYPER_VOICE", + "MOVE_ICE_FANG", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LICK", + "MOVE_LUNGE", + "MOVE_OUTRAGE", + "MOVE_PLAY_ROUGH", + "MOVE_PROTECT", + "MOVE_PSYCHIC_FANGS", + "MOVE_ROAR", + "MOVE_ROCK_SMASH", + "MOVE_SEED_BOMB", + "MOVE_SKULL_BASH", + "MOVE_SNARL", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_TACKLE", + "MOVE_TAUNT", + "MOVE_THUNDER_FANG", + "MOVE_TRAILBLAZE", + "MOVE_WILD_CHARGE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GIMMIGHOUL": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + } + ], + "TMMoves": [ + "MOVE_CONFUSE_RAY", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_LIGHT_SCREEN", + "MOVE_NASTY_PLOT", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SUBSTITUTE", + "MOVE_TACKLE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "GHOLDENGO": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_SHADOW_PUNCH" + }, + { + "Level": "15", + "Move": "MOVE_SUBSTITUTE" + }, + { + "Level": "23", + "Move": "MOVE_METAL_SOUND" + }, + { + "Level": "27", + "Move": "MOVE_OMINOUS_WIND" + }, + { + "Level": "33", + "Move": "MOVE_SHADOW_BALL" + }, + { + "Level": "38", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "42", + "Move": "MOVE_RECOVER" + }, + { + "Level": "49", + "Move": "MOVE_POWER_GEM" + }, + { + "Level": "56", + "Move": "MOVE_MAKE_IT_RAIN" + }, + { + "Level": "63", + "Move": "MOVE_NASTY_PLOT" + } + ], + "TMMoves": [ + "MOVE_CHARGE_BEAM", + "MOVE_COMET_PUNCH", + "MOVE_CONFUSE_RAY", + "MOVE_DAZZLING_GLEAM", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_GIGA_IMPACT", + "MOVE_HYPER_BEAM", + "MOVE_IRON_HEAD", + "MOVE_LIGHT_SCREEN", + "MOVE_LOW_SWEEP", + "MOVE_MAGNET_BOMB", + "MOVE_MAKE_IT_RAIN", + "MOVE_METAL_SOUND", + "MOVE_METRONOME", + "MOVE_NASTY_PLOT", + "MOVE_OMINOUS_WIND", + "MOVE_POWER_GEM", + "MOVE_PROTECT", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_RECOVER", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_PUNCH", + "MOVE_STEEL_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_SURF", + "MOVE_TACKLE", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TINKATINK": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "17", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "31", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "35", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "40", + "Move": "MOVE_KNOCK_OFF" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULLDOZE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TINKATUFF": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "17", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "31", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "35", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "40", + "Move": "MOVE_KNOCK_OFF" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THUNDER_WAVE" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "TINKATON": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_FAIRY_WIND" + }, + { + "Level": "8", + "Move": "MOVE_METAL_CLAW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "14", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "17", + "Move": "MOVE_DRAINING_KISS" + }, + { + "Level": "20", + "Move": "MOVE_SCREECH" + }, + { + "Level": "24", + "Move": "MOVE_BRUTAL_SWING" + }, + { + "Level": "25", + "Move": "MOVE_FAKE_TEARS" + }, + { + "Level": "31", + "Move": "MOVE_FLASH_CANNON" + }, + { + "Level": "35", + "Move": "MOVE_PLAY_ROUGH" + }, + { + "Level": "40", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "44", + "Move": "MOVE_HEAVY_SLAM" + } + ], + "TMMoves": [ + "MOVE_BRICK_BREAK", + "MOVE_BRUTAL_SWING", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_DRAINING_KISS", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FAIRY_WIND", + "MOVE_FAKE_OUT", + "MOVE_FAKE_TEARS", + "MOVE_FALSE_SWIPE", + "MOVE_FLASH_CANNON", + "MOVE_GIGATON_HAMMER", + "MOVE_HEAVY_SLAM", + "MOVE_HYPER_BEAM", + "MOVE_ICE_HAMMER", + "MOVE_KNOCK_OFF", + "MOVE_LIGHT_SCREEN", + "MOVE_METAL_CLAW", + "MOVE_METRONOME", + "MOVE_PLAY_ROUGH", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_REFLECT", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_STEALTH_ROCK", + "MOVE_STEEL_BEAM", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TACKLE", + "MOVE_THUNDER_WAVE", + "MOVE_WOOD_HAMMER" + ], + "TutorMoves": [ + "MOVE_GIGATON_HAMMER", + "MOVE_ICE_HAMMER", + "MOVE_WOOD_HAMMER" + ], + "EggMoves": [] + }, + "CHARCADET": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "32", + "Move": "MOVE_LAVA_PLUME" + } + ], + "TMMoves": [ + "MOVE_CONFUSE_RAY", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_HEAT_WAVE", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_SMOKESCREEN", + "MOVE_SUBSTITUTE", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [], + "EggMoves": [] + }, + "ARMAROUGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "1", + "Move": "MOVE_MYSTICAL_FIRE" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "20", + "Move": "MOVE_PSYBEAM" + }, + { + "Level": "24", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "32", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "37", + "Move": "MOVE_CALM_MIND" + }, + { + "Level": "48", + "Move": "MOVE_ARMOR_CANNON" + }, + { + "Level": "54", + "Move": "MOVE_FLAMETHROWER" + }, + { + "Level": "62", + "Move": "MOVE_AURA_SPHERE" + } + ], + "TMMoves": [ + "MOVE_ACID_SPRAY", + "MOVE_ARMOR_CANNON", + "MOVE_AURA_SPHERE", + "MOVE_CALM_MIND", + "MOVE_CONFUSE_RAY", + "MOVE_DARK_PULSE", + "MOVE_DRAGON_PULSE", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_ENERGY_BALL", + "MOVE_FACADE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_FLASH_CANNON", + "MOVE_FOCUS_BLAST", + "MOVE_FUTURE_SIGHT", + "MOVE_HEAT_WAVE", + "MOVE_HYPER_BEAM", + "MOVE_IRON_DEFENSE", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_METEOR_BEAM", + "MOVE_MYSTICAL_FIRE", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PROTECT", + "MOVE_PSYBEAM", + "MOVE_PSYCHIC", + "MOVE_PSYSHOCK", + "MOVE_REFLECT", + "MOVE_SCORCHING_SANDS", + "MOVE_SHADOW_BALL", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BEAM", + "MOVE_SUBSTITUTE", + "MOVE_TAUNT", + "MOVE_WILL_O_WISP" + ], + "TutorMoves": [ + "MOVE_PSYSHOCK" + ], + "EggMoves": [] + }, + "CERULEDGE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_EMBER" + }, + { + "Level": "8", + "Move": "MOVE_SMOKESCREEN" + }, + { + "Level": "10", + "Move": "MOVE_CONFUSE_RAY" + }, + { + "Level": "12", + "Move": "MOVE_FIRE_SPIN" + }, + { + "Level": "16", + "Move": "MOVE_WILL_O_WISP" + }, + { + "Level": "24", + "Move": "MOVE_FLAME_CHARGE" + }, + { + "Level": "32", + "Move": "MOVE_LAVA_PLUME" + }, + { + "Level": "37", + "Move": "MOVE_SWORDS_DANCE" + }, + { + "Level": "44", + "Move": "MOVE_SOLAR_BLADE" + }, + { + "Level": "48", + "Move": "MOVE_BITTER_BLADE" + }, + { + "Level": "54", + "Move": "MOVE_PSYCHO_CUT" + }, + { + "Level": "58", + "Move": "MOVE_PHANTOM_FORCE" + }, + { + "Level": "62", + "Move": "MOVE_FLARE_BLITZ" + } + ], + "TMMoves": [ + "MOVE_BITTER_BLADE", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_CLOSE_COMBAT", + "MOVE_CONFUSE_RAY", + "MOVE_CURSE", + "MOVE_DRAGON_CLAW", + "MOVE_EMBER", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FALSE_SWIPE", + "MOVE_FIRE_BLAST", + "MOVE_FIRE_SPIN", + "MOVE_FLAMETHROWER", + "MOVE_FLAME_CHARGE", + "MOVE_FLARE_BLITZ", + "MOVE_GIGA_IMPACT", + "MOVE_HEAT_WAVE", + "MOVE_IRON_DEFENSE", + "MOVE_IRON_HEAD", + "MOVE_LAVA_PLUME", + "MOVE_LEER", + "MOVE_LIGHT_SCREEN", + "MOVE_NIGHT_SLASH", + "MOVE_OMINOUS_WIND", + "MOVE_OVERHEAT", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_PROTECT", + "MOVE_PSYCHO_CUT", + "MOVE_RAZOR_WIND", + "MOVE_REFLECT", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK", + "MOVE_SMOKESCREEN", + "MOVE_SOLAR_BLADE", + "MOVE_STONE_EDGE", + "MOVE_SUBSTITUTE", + "MOVE_SWORDS_DANCE", + "MOVE_TAUNT", + "MOVE_VACUUM_WAVE", + "MOVE_WILL_O_WISP", + "MOVE_X_SCISSOR" + ], + "TutorMoves": [ + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_SNEAK" + ], + "EggMoves": [] + }, + "ANNIHILAPE": { + "LevelMoves": [ + { + "Level": "1", + "Move": "MOVE_TACKLE" + }, + { + "Level": "1", + "Move": "MOVE_LEER" + }, + { + "Level": "1", + "Move": "MOVE_FOCUS_ENERGY" + }, + { + "Level": "8", + "Move": "MOVE_ROCK_THROW" + }, + { + "Level": "10", + "Move": "MOVE_ROCK_SMASH" + }, + { + "Level": "13", + "Move": "MOVE_TAKE_DOWN" + }, + { + "Level": "16", + "Move": "MOVE_LOW_SWEEP" + }, + { + "Level": "18", + "Move": "MOVE_KNOCK_OFF" + }, + { + "Level": "22", + "Move": "MOVE_BULLDOZE" + }, + { + "Level": "25", + "Move": "MOVE_BRICK_BREAK" + }, + { + "Level": "28", + "Move": "MOVE_FACADE" + }, + { + "Level": "35", + "Move": "MOVE_RAGE_FIST" + }, + { + "Level": "40", + "Move": "MOVE_SCREECH" + }, + { + "Level": "44", + "Move": "MOVE_CLOSE_COMBAT" + }, + { + "Level": "50", + "Move": "MOVE_OUTRAGE" + }, + { + "Level": "54", + "Move": "MOVE_DYNAMIC_PUNCH" + } + ], + "TMMoves": [ + "MOVE_BODY_SLAM", + "MOVE_BRICK_BREAK", + "MOVE_BULK_UP", + "MOVE_BULLDOZE", + "MOVE_CIRCLE_THROW", + "MOVE_CLOSE_COMBAT", + "MOVE_COMET_PUNCH", + "MOVE_CURSE", + "MOVE_DIG", + "MOVE_DOUBLE_EDGE", + "MOVE_DRAIN_PUNCH", + "MOVE_DUAL_CHOP", + "MOVE_DYNAMIC_PUNCH", + "MOVE_EARTHQUAKE", + "MOVE_ENDURE", + "MOVE_FACADE", + "MOVE_FIRE_PUNCH", + "MOVE_FOCUS_BLAST", + "MOVE_FOCUS_ENERGY", + "MOVE_GIGA_IMPACT", + "MOVE_GUNK_SHOT", + "MOVE_HEADBUTT", + "MOVE_HYPER_BEAM", + "MOVE_ICE_PUNCH", + "MOVE_KNOCK_OFF", + "MOVE_LEER", + "MOVE_LOW_SWEEP", + "MOVE_METRONOME", + "MOVE_NIGHT_SLASH", + "MOVE_OUTRAGE", + "MOVE_OVERHEAT", + "MOVE_PAY_DAY", + "MOVE_PHANTOM_FORCE", + "MOVE_POISON_JAB", + "MOVE_POWER_UP_PUNCH", + "MOVE_PROTECT", + "MOVE_RAGE_FIST", + "MOVE_ROAR", + "MOVE_ROCK_SLIDE", + "MOVE_ROCK_SMASH", + "MOVE_ROCK_THROW", + "MOVE_ROCK_TOMB", + "MOVE_SCREECH", + "MOVE_SEED_BOMB", + "MOVE_SHADOW_BALL", + "MOVE_SHADOW_CLAW", + "MOVE_SHADOW_PUNCH", + "MOVE_STEALTH_ROCK", + "MOVE_STONE_EDGE", + "MOVE_STORM_THROW", + "MOVE_SUBSTITUTE", + "MOVE_SWAGGER", + "MOVE_SWIFT", + "MOVE_TACKLE", + "MOVE_TAKE_DOWN", + "MOVE_TAUNT", + "MOVE_THUNDER", + "MOVE_THUNDERBOLT", + "MOVE_THUNDER_PUNCH", + "MOVE_TORMENT", + "MOVE_U_TURN", + "MOVE_VACUUM_WAVE", + "MOVE_WORK_UP" + ], + "TutorMoves": [ + "MOVE_PHANTOM_FORCE", + "MOVE_SHADOW_PUNCH" + ], + "EggMoves": [] } } \ No newline at end of file diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 10330f177..6cfc4cbdb 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -633,7 +633,11 @@ bool AsmFile::ParseEnum() RaiseError("%s:%ld: empty enum is invalid", headerFilename.c_str(), currentHeaderLine); } - if (m_buffer[m_pos] != ',') + if (m_buffer[m_pos] == '#') + { + currentHeaderLine = ParseLineSkipInEnum(); + } + else if (m_buffer[m_pos] != ',') { currentHeaderLine += SkipWhitespaceAndEol(); if (m_buffer[m_pos++] == '}' && m_buffer[m_pos++] == ';') @@ -737,6 +741,50 @@ int AsmFile::SkipWhitespaceAndEol() return newlines; } +int AsmFile::ParseLineSkipInEnum(void) +{ + m_pos++; + while (m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\t') + m_pos++; + + if (!IsAsciiDigit(m_buffer[m_pos])) + RaiseError("malformatted line indicator found inside `enum`, expected line number"); + + unsigned n = 0; + int digit = 0; + while ((digit = ConvertDigit(m_buffer[m_pos++], 10)) != -1) + n = 10 * n + digit; + + while (m_buffer[m_pos] == ' ' || m_buffer[m_pos] == '\t') + m_pos++; + + if (m_buffer[m_pos++] != '"') + RaiseError("malformatted line indicator found before `enum`, expected filename"); + + while (m_buffer[m_pos] != '"') + { + unsigned char c = m_buffer[m_pos++]; + + if (c == 0) + { + if (m_pos >= m_size) + RaiseError("unexpected EOF in line indicator"); + else + RaiseError("unexpected null character in line indicator"); + } + + if (!IsAsciiPrintable(c)) + RaiseError("unexpected character '\\x%02X' in line indicator", c); + + if (c == '\\') + { + c = m_buffer[m_pos]; + RaiseError("unexpected escape '\\%c' in line indicator", c); + } + } + return n - 1; +} + // returns the last line indicator and its corresponding file name without modifying the token index int AsmFile::FindLastLineNumber(std::string& filename) { diff --git a/tools/preproc/asm_file.h b/tools/preproc/asm_file.h index 33e6ce5c4..9cab32a97 100644 --- a/tools/preproc/asm_file.h +++ b/tools/preproc/asm_file.h @@ -73,6 +73,7 @@ private: void VerifyStringLength(int length); int SkipWhitespaceAndEol(); int FindLastLineNumber(std::string& filename); + int ParseLineSkipInEnum(void); std::string ReadIdentifier(); long ReadInteger(std::string filename, long line); }; diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index c3a39dc5a..4a55da061 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -19,6 +19,7 @@ #define PARTY_SIZE 255 #define MAX_MON_MOVES 4 #define MAX_MON_TAGS 32 +#define STARTING_STATUS_COUNT 64 struct String { @@ -114,7 +115,7 @@ struct Trainer struct String encounter_music; int encounter_music_line; - enum Gender gender; + struct String gender; int gender_line; struct String pic; @@ -132,7 +133,8 @@ struct Trainer struct String mugshot; int mugshot_line; - struct String starting_status; + struct String starting_status[STARTING_STATUS_COUNT]; + int starting_status_n; int starting_status_line; struct String difficulty; @@ -1204,8 +1206,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct if (trainer->gender_line) any_error = !set_show_parse_error(p, key.location, "duplicate 'Gender'"); trainer->gender_line = value.location.line; - if (!token_gender(p, &value, &trainer->gender)) - any_error = !show_parse_error(p); + trainer->gender = token_string(&value); } else if (is_literal_token(&key, "Pic")) { @@ -1251,7 +1252,8 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct if (trainer->starting_status_line) any_error = !set_show_parse_error(p, key.location, "duplicate 'Starting Status'"); trainer->starting_status_line = value.location.line; - trainer->starting_status = token_string(&value); + if (!token_human_identifiers(p, &value, trainer->starting_status, &trainer->starting_status_n, STARTING_STATUS_COUNT)) + any_error = !show_parse_error(p); } else if (is_literal_token(&key, "Difficulty")) { @@ -1660,6 +1662,38 @@ static void fprint_constant(FILE *f, const char *prefix, struct String s) } } +static void fprint_symbol(FILE *f, struct String s) +{ + if (s.string_n > 0) + { + bool upper = false; + for (int i = 0; i < s.string_n; i++) + { + unsigned char c = s.string[i]; + if ('A' <= c && c <= 'Z') + { + if (upper) + { + fputc(c, f); + upper = false; + continue; + } + fputc(c + 'a' - 'A', f); + } + else if (('a' <= c && c <= 'z') || ('0' <= c && c <= '9')) + fputc(c, f); + else if (c == '\'') + ; + else + upper = true; + } + } + else + { + fprintf(f, "NONE"); + } +} + // This is a really stupid helper for 'fprint_species'. static bool is_utf8_character(struct String s, int *i, const unsigned char *utf8) { @@ -1790,23 +1824,21 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } - fprintf(f, " .encounterMusic_gender =\n"); - if (trainer->gender == GENDER_FEMALE) + if (!is_empty_string(trainer->gender)) { fprintf(f, "#line %d\n", trainer->gender_line); - fprintf(f, "F_TRAINER_FEMALE | \n"); + fprintf(f, " .gender = "); + fprint_constant(f, "TRAINER_GENDER", trainer->gender); + fprintf(f, ",\n"); } + if (!is_empty_string(trainer->encounter_music)) { fprintf(f, "#line %d\n", trainer->encounter_music_line); - fprintf(f, " "); + fprintf(f, " .encounterMusic = "); fprint_constant(f, "TRAINER_ENCOUNTER_MUSIC", trainer->encounter_music); + fprintf(f, ",\n"); } - else - { - fprintf(f, "0"); - } - fprintf(f, ",\n"); if (trainer->items_n > 0) { @@ -1852,12 +1884,17 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, ",\n"); } - if (!is_empty_string(trainer->starting_status)) + if (trainer->starting_status_n > 0) { fprintf(f, "#line %d\n", trainer->starting_status_line); - fprintf(f, " .startingStatus = "); - fprint_constant(f, "STARTING_STATUS", trainer->starting_status); - fprintf(f, ",\n"); + fprintf(f, " .startingStatus = { "); + for (int i = 0; i < trainer->starting_status_n; i++) + { + fprintf(f, "."); + fprint_symbol(f, trainer->starting_status[i]); + fprintf(f, " = TRUE, "); + } + fprintf(f, "},\n"); } if (!is_empty_string(trainer->pool_rules)) @@ -1905,7 +1942,7 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprint_constant(f, "TRAINER_PIC", trainer->pic); fprintf(f, ",\n"); } - + if (trainer->macro_line) { fprintf(f, "#line %d\n", trainer->macro_line);